diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000000000000000000000000000000000000..dccf841d49b6dbcf7a9add99a614386f844fbb92
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,19 @@
+root = true
+
+[*]
+charset=utf-8
+end_of_line=lf
+insert_final_newline=true
+indent_style=space
+indent_size=2
+max_line_length = 100
+
+[*.{yml,yaml,json}]
+indent_style = space
+indent_size = 2
+
+[*.md]
+trim_trailing_whitespace = false
+
+[Makefile]
+indent_style = tab
diff --git a/.env.test b/.env.test
new file mode 100644
index 0000000000000000000000000000000000000000..d4b06f10c51137e0c32d1a05b96ce842ebe78dc2
--- /dev/null
+++ b/.env.test
@@ -0,0 +1,36 @@
+NODE_ENV=production
+# Whether to open mock
+VITE_USE_MOCK = false
+
+# public path
+VITE_PUBLIC_PATH = /
+
+# Delete console
+VITE_DROP_CONSOLE = true
+
+# Whether to enable gzip or brotli compression
+# Optional: gzip | brotli | none
+# If you need multiple forms, you can use `,` to separate
+VITE_BUILD_COMPRESS = 'none'
+
+# Whether to delete origin files when using compress, default false
+VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE = false
+
+# Basic interface address SPA
+VITE_GLOB_API_URL=/test-api
+
+# File upload address, optional
+# It can be forwarded by nginx or write the actual address directly
+VITE_GLOB_UPLOAD_URL=/upload
+
+# Interface prefix
+VITE_GLOB_API_URL_PREFIX=
+
+# Whether to enable image compression
+VITE_USE_IMAGEMIN= true
+
+# use pwa
+VITE_USE_PWA = false
+
+# Is it compatible with older browsers
+VITE_LEGACY = false
diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 0000000000000000000000000000000000000000..348631b27b0cf9027fcc4c89f4c790f9799bc014
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1,15 @@
+
+*.sh
+node_modules
+*.md
+*.woff
+*.ttf
+.vscode
+.idea
+dist
+/public
+/docs
+.husky
+.local
+/bin
+Dockerfile
diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 0000000000000000000000000000000000000000..7f10db399b2accfd2b987cbe48ac72145cfa3e38
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,76 @@
+module.exports = {
+  root: true,
+  env: {
+    browser: true,
+    node: true,
+    es6: true,
+  },
+  parser: "vue-eslint-parser",
+  parserOptions: {
+    parser: "@typescript-eslint/parser",
+    ecmaVersion: 2020,
+    sourceType: "module",
+    jsxPragma: "React",
+    ecmaFeatures: {
+      jsx: true,
+    },
+  },
+  extends: [
+    "plugin:vue/vue3-recommended",
+    "plugin:@typescript-eslint/recommended",
+    "plugin:prettier/recommended",
+  ],
+  rules: {
+    "vue/script-setup-uses-vars": "error",
+    "@typescript-eslint/ban-ts-ignore": "off",
+    "@typescript-eslint/explicit-function-return-type": "off",
+    "@typescript-eslint/no-explicit-any": "off",
+    "@typescript-eslint/no-var-requires": "off",
+    "@typescript-eslint/no-empty-function": "off",
+    "vue/custom-event-name-casing": "off",
+    "no-use-before-define": "off",
+    "@typescript-eslint/no-use-before-define": "off",
+    "@typescript-eslint/ban-ts-comment": "off",
+    "@typescript-eslint/ban-types": "off",
+    "@typescript-eslint/no-non-null-assertion": "off",
+    "@typescript-eslint/explicit-module-boundary-types": "off",
+    "@typescript-eslint/no-unused-vars": [
+      "error",
+      {
+        argsIgnorePattern: "^_",
+        varsIgnorePattern: "^_",
+      },
+    ],
+    "no-unused-vars": [
+      "error",
+      {
+        argsIgnorePattern: "^_",
+        varsIgnorePattern: "^_",
+      },
+    ],
+    "space-before-function-paren": "off",
+
+    "vue/attributes-order": "off",
+    "vue/one-component-per-file": "off",
+    "vue/html-closing-bracket-newline": "off",
+    "vue/max-attributes-per-line": "off",
+    "vue/multiline-html-element-content-newline": "off",
+    "vue/singleline-html-element-content-newline": "off",
+    "vue/attribute-hyphenation": "off",
+    "vue/require-default-prop": "off",
+    "vue/require-explicit-emits": "off",
+    "vue/html-self-closing": [
+      "error",
+      {
+        html: {
+          void: "always",
+          normal: "never",
+          component: "always",
+        },
+        svg: "always",
+        math: "always",
+      },
+    ],
+    "vue/multi-word-component-names": "off",
+  },
+};
diff --git a/.github/ISSUE_TEMPLATE/1-bug.md b/.github/ISSUE_TEMPLATE/1-bug.md
new file mode 100644
index 0000000000000000000000000000000000000000..b0614043706310937a02025e14ff48ba7d64c8a2
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/1-bug.md
@@ -0,0 +1,39 @@
+---
+name: 🐛 Bug report
+about: Create a report to help us improve
+title: ""
+labels: "bug: pending triage"
+assignees: ""
+---
+
+<!--
+抱歉,您遇到了一个错误。感谢您抽出宝贵的时间进行举报!
+
+请尽可能填写以下模板。
+
+Ouch, sorry you’ve run into a bug.  Thank for taking the time to report it!
+
+Please fill in as much of the template below as you’re able.
+
+P.S. have you seen our support and contributing docs?
+-->
+
+**⚠️ IMPORTANT ⚠️ Please check the following list before proceeding. If you ignore this issue template, your issue will be directly closed.**
+
+- [ ] Read [the docs](https://anncwb.github.io/vue-vben-admin-doc/).
+- [ ] Make sure the code is up to date. (Some bugs have been fixed in the latest code)
+- [ ] This is a concrete bug. For Q&A open a [GitHub Discussion](https://github.com/anncwb/vue-vben-admin/discussions) or join our [Discord](https://discord.gg/8GuAdwDhj6) Chat Server.
+
+### Describe the bug
+
+A clear and concise description of what the bug is..
+
+### Reproduction
+
+Please describe the steps of the problem in detail to ensure that we can restore the correct problem
+
+## System Info
+
+- Operating System:
+- Node version:
+- Package manager (npm/yarn/pnpm) and version:
diff --git a/.github/ISSUE_TEMPLATE/2-feature.md b/.github/ISSUE_TEMPLATE/2-feature.md
new file mode 100644
index 0000000000000000000000000000000000000000..c34f1c0864c6f68d678ec27d53213ded74f29e33
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/2-feature.md
@@ -0,0 +1,32 @@
+---
+name: 🚀 Feature request
+about: Suggest an idea for this project
+title: ""
+labels: ""
+assignees: ""
+---
+
+<!--
+感谢您提出使这个项目更好的想法!
+请尽可能填写以下模板。
+
+Thank you for suggesting an idea to make this project better!
+Please fill in as much of the template below as you’re able.
+
+-->
+
+### Subject of the feature
+
+Describe your issue here.
+
+### Problem
+
+If the feature requests relates to a problem, please describe the problem you are trying to solve here.
+
+### Expected behaviour
+
+What should happen? Please describe the desired behaviour.
+
+### Alternatives
+
+What are the alternative solutions? Please describe what else you have considered?
diff --git a/.github/ISSUE_TEMPLATE/3-bug-cn.md b/.github/ISSUE_TEMPLATE/3-bug-cn.md
new file mode 100644
index 0000000000000000000000000000000000000000..5a6871737242e1f7315a8869d9b3379eac25164b
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/3-bug-cn.md
@@ -0,0 +1,28 @@
+---
+name: 🐛 Bug 报告
+about: 向我们报告一个Bug以帮助我们改进
+title: ""
+labels: "bug: pending triage"
+assignees: ""
+---
+
+**⚠️ 重要 ⚠️ 在进一步操作之前,请检查下列选项。如果您忽视此模板或者没有提供关键信息,您的 Issue 将直接被关闭**
+
+- [ ] 已阅读 [文档](https://anncwb.github.io/vue-vben-admin-doc/).
+- [ ] 确保您的代码已是最新或者所报告的 Bug 在最新版本中可以重现. (部分 Bug 可能已经在最近的代码中修复)
+- [ ] 已在 Issues 中搜索了相关的关键词
+- [ ] 不是 ant design vue 组件库的 Bug
+
+### 描述 Bug
+
+请清晰地描述此 Bug 的具体表现。
+
+### 复现 Bug
+
+请描述在演示页面中复现 Bug 的详细步骤,以确保我们可以理解并定位问题。部分 Bug 如果未在 Demo 中涉及,请务必提供关键代码
+
+## 系统信息
+
+- 操作系统:
+- Node 版本:
+- 包管理器 (npm/yarn/pnpm) 及其版本:
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b83ccbf24d316231c3a9f62b49b452cec0ca9c92
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,8 @@
+blank_issues_enabled: false
+contact_links:
+  - name: Discord Chat
+    url: https://discord.gg/8GuAdwDhj6
+    about: Ask questions and discuss with other Vben users in real time.
+  - name: Questions & Discussions
+    url: https://github.com/anncwb/vue-vben-admin/discussions
+    about: Use GitHub discussions for message-board style questions and discussions.
diff --git a/.github/commit-convention.md b/.github/commit-convention.md
new file mode 100644
index 0000000000000000000000000000000000000000..a1a969e99b6cb6df6e8f08dc2f8f3fc2a45e8940
--- /dev/null
+++ b/.github/commit-convention.md
@@ -0,0 +1,89 @@
+## Git Commit Message Convention
+
+> This is adapted from [Angular's commit convention](https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-angular).
+
+#### TL;DR:
+
+Messages must be matched by the following regex:
+
+```js
+/^(revert: )?(feat|fix|docs|style|refactor|perf|test|workflow|build|ci|chore|types|wip): .{1,50}/;
+```
+
+#### Examples
+
+Appears under "Features" header, `dev` subheader:
+
+```
+feat(dev): add 'comments' option
+```
+
+Appears under "Bug Fixes" header, `dev` subheader, with a link to issue #28:
+
+```
+fix(dev): fix dev error
+
+close #28
+```
+
+Appears under "Performance Improvements" header, and under "Breaking Changes" with the breaking change explanation:
+
+```
+perf(build): remove 'foo' option
+
+BREAKING CHANGE: The 'foo' option has been removed.
+```
+
+The following commit and commit `667ecc1` do not appear in the changelog if they are under the same release. If not, the revert commit appears under the "Reverts" header.
+
+```
+revert: feat(compiler): add 'comments' option
+
+This reverts commit 667ecc1654a317a13331b17617d973392f415f02.
+```
+
+### Full Message Format
+
+A commit message consists of a **header**, **body** and **footer**. The header has a **type**, **scope** and **subject**:
+
+```
+<type>(<scope>): <subject>
+<BLANK LINE>
+<body>
+<BLANK LINE>
+<footer>
+```
+
+The **header** is mandatory and the **scope** of the header is optional.
+
+### Revert
+
+If the commit reverts a previous commit, it should begin with `revert: `, followed by the header of the reverted commit. In the body, it should say: `This reverts commit <hash>.`, where the hash is the SHA of the commit being reverted.
+
+### Type
+
+If the prefix is `feat`, `fix` or `perf`, it will appear in the changelog. However, if there is any [BREAKING CHANGE](#footer), the commit will always appear in the changelog.
+
+Other prefixes are up to your discretion. Suggested prefixes are `docs`, `chore`, `style`, `refactor`, and `test` for non-changelog related tasks.
+
+### Scope
+
+The scope could be anything specifying the place of the commit change. For example `dev`, `build`, `workflow`, `cli` etc...
+
+### Subject
+
+The subject contains a succinct description of the change:
+
+- use the imperative, present tense: "change" not "changed" nor "changes"
+- don't capitalize the first letter
+- no dot (.) at the end
+
+### Body
+
+Just as in the **subject**, use the imperative, present tense: "change" not "changed" nor "changes". The body should include the motivation for the change and contrast this with previous behavior.
+
+### Footer
+
+The footer should contain any information about **Breaking Changes** and is also the place to reference GitHub issues that this commit **Closes**.
+
+**Breaking Changes** should start with the word `BREAKING CHANGE:` with a space or two newlines. The rest of the commit message is then used for this.
diff --git a/.github/contributing.md b/.github/contributing.md
new file mode 100644
index 0000000000000000000000000000000000000000..9a5211b2a5a0b8c91929bf16c0c93fbbf789dcfd
--- /dev/null
+++ b/.github/contributing.md
@@ -0,0 +1,5 @@
+# Contributing Guide
+
+1. Make sure you put things in the right category!
+2. Always add your items to the end of a list. To be fair, the order is first-come-first-serve.
+3. If you think something belongs in the wrong category, or think there needs to be a new category, feel free to edit things too.
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
new file mode 100644
index 0000000000000000000000000000000000000000..82692117dfab30dfa8b97b3422577d0e5ebccf3c
--- /dev/null
+++ b/.github/pull_request_template.md
@@ -0,0 +1,34 @@
+### `General`
+
+> ✏️ Mark the necessary items without changing the structure of the PR template.
+
+- [ ] Pull request template structure not broken
+
+### `Type`
+
+> ℹ️ What types of changes does your code introduce?
+
+> 👉 _Put an `x` in the boxes that apply_
+
+- [ ] Bug fix (non-breaking change which fixes an issue)
+- [ ] New feature (non-breaking change which adds functionality)
+- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
+- [ ] This change requires a documentation update
+
+### `Checklist`
+
+> ℹ️ Check all checkboxes - this will indicate that you have done everything in accordance with the rules in [CONTRIBUTING](contributing.md).
+
+> 👉 _Put an `x` in the boxes that apply._
+
+- [ ] My code follows the style guidelines of this project
+- [ ] Is the code format correct
+- [ ] Is the git submission information standard?
+- [ ] My code follows the style guidelines of this project
+- [ ] I have performed a self-review of my own code
+- [ ] I have commented my code, particularly in hard-to-understand areas
+- [ ] I have made corresponding changes to the documentation
+- [ ] My changes generate no new warnings
+- [ ] I have added tests that prove my fix is effective or that my feature works
+- [ ] New and existing unit tests pass locally with my changes
+- [ ] Any dependent changes have been merged and published in downstream modules
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b974f5ef7e40c0181f1e15e5a2f3c18a269b42eb
--- /dev/null
+++ b/.github/workflows/deploy.yml
@@ -0,0 +1,118 @@
+name: deploy
+
+on:
+  push:
+    branches:
+      - main
+
+jobs:
+  # push-to-ftp:
+  #   if: "contains(github.event.head_commit.message, '[deploy]')"
+  #   runs-on: ubuntu-latest
+  #   steps:
+  #     - name: Checkout
+  #       uses: actions/checkout@v2
+
+  #     - name: Sed Config Base
+  #       shell: bash
+  #       run: |
+  #         sed -i  's#VITE_PUBLIC_PATH\s*=.*#VITE_PUBLIC_PATH = /next/#g' ./.env.production
+  #         sed -i  "s#VITE_BUILD_COMPRESS\s*=.*#VITE_BUILD_COMPRESS = 'gzip'#g" ./.env.production
+  #         cat ./.env.production
+
+  #     - name: use Node.js 14
+  #       uses: actions/setup-node@v2.1.2
+  #       with:
+  #         node-version: '14.x'
+
+  #     - name: Get yarn cache
+  #       id: yarn-cache
+  #       run: echo "::set-output name=dir::$(yarn cache dir)"
+
+  #     - name: Cache dependencies
+  #       uses: actions/cache@v2
+  #       with:
+  #         path: ${{ steps.yarn-cache.outputs.dir }}
+  #         key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
+  #         restore-keys: |
+  #           ${{ runner.os }}-yarn-
+
+  #     - name: Build
+  #       run: |
+  #         yarn install
+  #         yarn run build
+
+  #     - name: Deploy
+  #       uses: SamKirkland/FTP-Deploy-Action@2.0.0
+  #       env:
+  #         FTP_SERVER: ${{ secrets.FTP_SERVER }}
+  #         FTP_USERNAME: ${{ secrets.FTP_USERNAME }}
+  #         FTP_PASSWORD: ${{ secrets.FTP_PASSWORD }}
+  #         METHOD: sftp
+  #         PORT: ${{ secrets.FTP_PORT }}
+  #         LOCAL_DIR: dist
+  #         REMOTE_DIR: /srv/www/vben-admin
+  #         ARGS: --delete --verbose --parallel=80
+
+  push-to-gh-pages:
+    if: "contains(github.event.head_commit.message, '[release]')"
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v2
+
+      - name: Sed Config Base
+        shell: bash
+        run: |
+          sed -i  's#VITE_PUBLIC_PATH\s*=.*#VITE_PUBLIC_PATH = /vue-vben-admin/#g' ./.env.production
+          sed -i  "s#VITE_BUILD_COMPRESS\s*=.*#VITE_BUILD_COMPRESS = 'gzip'#g" ./.env.production
+          cat ./.env.production
+
+      - name: use Node.js 16
+        uses: actions/setup-node@v2.1.2
+        with:
+          node-version: '16.x'
+
+      - name: Get yarn cache
+        id: yarn-cache
+        run: echo "::set-output name=dir::$(yarn cache dir)"
+
+      - name: Cache dependencies
+        uses: actions/cache@v2
+        with:
+          path: ${{ steps.yarn-cache.outputs.dir }}
+          key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
+          restore-keys: |
+            ${{ runner.os }}-yarn-
+
+      - name: Set SSH Environment
+        env:
+          DOCS_DEPLOY_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }}
+        run: |
+          mkdir -p ~/.ssh/
+          echo "$ACTIONS_DEPLOY_KEY" > ~/.ssh/id_rsa
+          chmod 600 ~/.ssh/id_rsa
+          ssh-keyscan github.com > ~/.ssh/known_hosts
+          chmod 700 ~/.ssh && chmod 600 ~/.ssh/*
+          git config --local user.email "vbenadmin@163.com"
+          git config --local user.name "vbenAdmin"
+
+      - name: Delete gh-pages branch
+        run: |
+          git push origin --delete gh-pages
+
+      - name: Build
+        run: |
+          yarn install
+          yarn run build
+          touch dist/.nojekyll
+          cp dist/index.html dist/404.html
+
+      - name: Deploy
+        uses: peaceiris/actions-gh-pages@v2.5.0
+        env:
+          ACTIONS_DEPLOY_KEY: ${{secrets.ACTIONS_DEPLOY_KEY}}
+          PUBLISH_BRANCH: gh-pages
+          PUBLISH_DIR: ./dist
+        with:
+          forceOrphan: true
diff --git a/.github/workflows/ftp-schedule.yml b/.github/workflows/ftp-schedule.yml
new file mode 100644
index 0000000000000000000000000000000000000000..6db8dc8b5d55f6d8418ebe10b9432b8175470b98
--- /dev/null
+++ b/.github/workflows/ftp-schedule.yml
@@ -0,0 +1,56 @@
+name: schedule-push-to-ftp
+
+# Timed deployment project
+on:
+  push:
+  schedule:
+    - cron: '0 20 * * *'
+
+jobs:
+  schedule-push-to-ftp:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v2
+
+      - name: Sed Config Base
+        shell: bash
+        run: |
+          sed -i  's#VITE_PUBLIC_PATH\s*=.*#VITE_PUBLIC_PATH = /next/#g' ./.env.production
+          sed -i  "s#VITE_BUILD_COMPRESS\s*=.*#VITE_BUILD_COMPRESS = 'gzip'#g" ./.env.production
+          sed -i  "s#VITE_DROP_CONSOLE\s*=.*#VITE_DROP_CONSOLE = true#g" ./.env.production
+          cat ./.env.production
+
+      - name: use Node.js 16
+        uses: actions/setup-node@v2.1.2
+        with:
+          node-version: '16.x'
+
+      - name: Get yarn cache
+        id: yarn-cache
+        run: echo "::set-output name=dir::$(yarn cache dir)"
+
+      - name: Cache dependencies
+        uses: actions/cache@v2
+        with:
+          path: ${{ steps.yarn-cache.outputs.dir }}
+          key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
+          restore-keys: |
+            ${{ runner.os }}-yarn-
+
+      - name: Build
+        run: |
+          yarn install
+          yarn run build
+
+      - name: Deploy
+        uses: SamKirkland/FTP-Deploy-Action@2.0.0
+        env:
+          FTP_SERVER: ${{ secrets.FTP_SERVER }}
+          FTP_USERNAME: ${{ secrets.FTP_USERNAME }}
+          FTP_PASSWORD: ${{ secrets.FTP_PASSWORD }}
+          METHOD: sftp
+          PORT: ${{ secrets.FTP_PORT }}
+          LOCAL_DIR: dist
+          REMOTE_DIR: /srv/www/vben-admin
+          ARGS: --delete --verbose --parallel=80
diff --git a/.github/workflows/issue-close-require.yml b/.github/workflows/issue-close-require.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a5fb0a4002316e350c291a474898158a54a336cf
--- /dev/null
+++ b/.github/workflows/issue-close-require.yml
@@ -0,0 +1,17 @@
+name: Issue Close Require
+
+on:
+  schedule:
+    - cron: '0 0 * * *'
+
+jobs:
+  close-issues:
+    runs-on: ubuntu-latest
+    steps:
+      - name: need reproduction
+        uses: actions-cool/issues-helper@v2.1.1
+        with:
+          actions: 'close-issues'
+          token: ${{ secrets.OPER_TOKEN }}
+          labels: 'need reproduction'
+          inactive-day: 3
diff --git a/.github/workflows/issue-labeled.yml b/.github/workflows/issue-labeled.yml
new file mode 100644
index 0000000000000000000000000000000000000000..43a7a624a407671fb9b5c5c5485a4daaef1d4ec4
--- /dev/null
+++ b/.github/workflows/issue-labeled.yml
@@ -0,0 +1,29 @@
+name: Issue Labeled
+
+on:
+  issues:
+    types: [labeled]
+
+jobs:
+  reply-labeled:
+    runs-on: ubuntu-latest
+    steps:
+      - name: remove pending
+        if: github.event.label.name == 'enhancement' || github.event.label.name == 'bug'
+        uses: actions-cool/issues-helper@v2.1.1
+        with:
+          actions: 'remove-labels'
+          token: ${{ secrets.OPER_TOKEN }}
+          issue-number: ${{ github.event.issue.number }}
+          labels: 'bug: pending triage'
+
+      - name: need reproduction
+        if: github.event.label.name == 'need reproduction'
+        uses: actions-cool/issues-helper@v2.1.1
+        with:
+          actions: 'create-comment, remove-labels'
+          token: ${{ secrets.OPER_TOKEN }}
+          issue-number: ${{ github.event.issue.number }}
+          body: |
+            Hello @${{ github.event.issue.user.login }}. Please provide the complete reproduction steps and code. Issues labeled by `need reproduction` will be closed if no activities in 3 days.
+          labels: 'bug: pending triage'
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000000000000000000000000000000000000..74ab4a3d1c99a8b21d6087b376d6a2fc4c0a51de
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,24 @@
+name: Create Release
+
+on:
+  push:
+    tags:
+      - v*
+
+jobs:
+  build:
+    name: Create Release
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout code
+        uses: actions/checkout@master
+
+      - name: Create Release for Tag
+        id: release_tag
+        uses: yyx990803/release-tag@master
+        env:
+          GITHUB_TOKEN: ${{ secrets.OPER_TOKEN }}
+        with:
+          tag_name: ${{ github.ref }}
+          body: |
+            Please refer to [CHANGELOG.md](https://github.com/anncwb/vue-vben-admin/blob/main/CHANGELOG.md) for details.
diff --git a/.gitignore b/.gitignore
index 76add878f8dd778c3381fb3da45c8140db7db510..d3bf44b550df70a56e0df55d08d6cd301e9d2870 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,34 @@
 node_modules
-dist
\ No newline at end of file
+.DS_Store
+dist
+.npmrc
+.cache
+
+tests/server/static
+tests/server/static/upload
+
+.local
+# local env files
+.env.local
+.env.*.local
+.eslintcache
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+
+# Editor directories and files
+.idea
+.vscode
+# .vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+package-lock.json
+pnpm-lock.yaml
+
diff --git a/.gitpod.yml b/.gitpod.yml
new file mode 100644
index 0000000000000000000000000000000000000000..866381fccdc485a1293a2e119d1381ca87e23e28
--- /dev/null
+++ b/.gitpod.yml
@@ -0,0 +1,6 @@
+ports:
+  - port: 3344
+    onOpen: open-preview
+tasks:
+  - init: pnpm install
+    command: pnpm run dev
diff --git a/.husky/commit-msg b/.husky/commit-msg
new file mode 100644
index 0000000000000000000000000000000000000000..567ff71f040175c9de46b2349b8c70d838c884ee
--- /dev/null
+++ b/.husky/commit-msg
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+# shellcheck source=./_/husky.sh
+. "$(dirname "$0")/_/husky.sh"
+
+npx --no-install commitlint --edit "$1"
diff --git a/.husky/common.sh b/.husky/common.sh
new file mode 100644
index 0000000000000000000000000000000000000000..9d5129bd72629aefed28912a9bfef31650be0dcd
--- /dev/null
+++ b/.husky/common.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+command_exists () {
+  command -v "$1" >/dev/null 2>&1
+}
+
+# Workaround for Windows 10, Git Bash and Yarn
+if command_exists winpty && test -t 1; then
+  exec < /dev/tty
+fi
diff --git a/.husky/pre-commit b/.husky/pre-commit
new file mode 100644
index 0000000000000000000000000000000000000000..35f92427c2dbc6d88a29d190cd0b8d0151aff062
--- /dev/null
+++ b/.husky/pre-commit
@@ -0,0 +1,8 @@
+#!/bin/sh
+. "$(dirname "$0")/_/husky.sh"
+. "$(dirname "$0")/common.sh"
+
+[ -n "$CI" ] && exit 0
+
+# Format and submit code according to lintstagedrc.js configuration
+npm run lint:lint-staged
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 0000000000000000000000000000000000000000..f7e39e60ba820b877e5d2023e44712246c97dd64
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,9 @@
+/dist/*
+.local
+.output.js
+/node_modules/**
+
+**/*.svg
+**/*.sh
+
+/public/*
diff --git a/.stylelintignore b/.stylelintignore
new file mode 100644
index 0000000000000000000000000000000000000000..0517076123bcc029eedcdfff60731527913f920d
--- /dev/null
+++ b/.stylelintignore
@@ -0,0 +1,3 @@
+/dist/*
+/public/*
+public/*
diff --git a/LICENSE b/LICENSE
index 635b3b56e8b559cb9402c5c344ebc001d3ef29c9..ba2fe3b14c1dbbfe2690cd7be82e5a8337d5f11b 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,6 @@
 MIT License
 
-Copyright (c) 2021-2022 the original author or authors.
+Copyright (c) 2020-present, Vben
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/build/generate/icon/index.ts b/build/generate/icon/index.ts
index c78cb09f2a4c730fcc4ff20a1a66f51279dc0186..d71c4476afff89ac8b722284d940cbafe02d74d2 100644
--- a/build/generate/icon/index.ts
+++ b/build/generate/icon/index.ts
@@ -1,13 +1,13 @@
-import path from 'path';
-import fs from 'fs-extra';
-import inquirer from 'inquirer';
-import chalk from 'chalk';
-import pkg from '../../../package.json';
+import path from "path";
+import fs from "fs-extra";
+import inquirer from "inquirer";
+import colors from "picocolors";
+import pkg from "../../../package.json";
 
 async function generateIcon() {
-  const dir = path.resolve(process.cwd(), 'node_modules/@iconify/json');
+  const dir = path.resolve(process.cwd(), "node_modules/@iconify/json");
 
-  const raw = await fs.readJSON(path.join(dir, 'collections.json'));
+  const raw = await fs.readJSON(path.join(dir, "collections.json"));
 
   const collections = Object.entries(raw).map(([id, v]) => ({
     ...(v as any),
@@ -19,25 +19,25 @@ async function generateIcon() {
   inquirer
     .prompt([
       {
-        type: 'list',
-        name: 'useType',
+        type: "list",
+        name: "useType",
         choices: [
-          { key: 'local', value: 'local', name: 'Local' },
-          { key: 'onLine', value: 'onLine', name: 'OnLine' },
+          { key: "local", value: "local", name: "Local" },
+          { key: "onLine", value: "onLine", name: "OnLine" },
         ],
-        message: 'How to use icons?',
+        message: "How to use icons?",
       },
       {
-        type: 'list',
-        name: 'iconSet',
+        type: "list",
+        name: "iconSet",
         choices: choices,
-        message: 'Select the icon set that needs to be generated?',
+        message: "Select the icon set that needs to be generated?",
       },
       {
-        type: 'input',
-        name: 'output',
-        message: 'Select the icon set that needs to be generated?',
-        default: 'src/components/Icon/data',
+        type: "input",
+        name: "output",
+        message: "Select the icon set that needs to be generated?",
+        default: "src/components/Icon/data",
       },
     ])
     .then(async (answers) => {
@@ -47,12 +47,12 @@ async function generateIcon() {
       const genCollections = collections.filter((item) => [iconSet].includes(item.id));
       const prefixSet: string[] = [];
       for (const info of genCollections) {
-        const data = await fs.readJSON(path.join(dir, 'json', `${info.id}.json`));
+        const data = await fs.readJSON(path.join(dir, "json", `${info.id}.json`));
         if (data) {
           const { prefix } = data;
-          const isLocal = useType === 'local';
+          const isLocal = useType === "local";
           const icons = Object.keys(data.icons).map(
-            (item) => `${isLocal ? prefix + ':' : ''}${item}`,
+            (item) => `${isLocal ? prefix + ":" : ""}${item}`,
           );
 
           await fs.writeFileSync(
@@ -62,9 +62,9 @@ async function generateIcon() {
           prefixSet.push(prefix);
         }
       }
-      fs.emptyDir(path.join(process.cwd(), 'node_modules/.vite'));
+      fs.emptyDir(path.join(process.cwd(), "node_modules/.vite"));
       console.log(
-        `✨ ${chalk.cyan(`[${pkg.name}]`)}` + ' - Icon generated successfully:' + `[${prefixSet}]`,
+        `✨ ${colors.cyan(`[${pkg.name}]`)}` + " - Icon generated successfully:" + `[${prefixSet}]`,
       );
     });
 }
diff --git a/build/script/buildConf.ts b/build/script/buildConf.ts
index 342c154118bd801bc62afb41937845aadb70b014..63d0ec067179d0fac6ae02f624a7b40c27c8671d 100644
--- a/build/script/buildConf.ts
+++ b/build/script/buildConf.ts
@@ -1,14 +1,14 @@
 /**
  * Generate additional configuration files when used for packaging. The file can be configured with some global variables, so that it can be changed directly externally without repackaging
  */
-import { GLOB_CONFIG_FILE_NAME, OUTPUT_DIR } from '../constant';
-import fs, { writeFileSync } from 'fs-extra';
-import chalk from 'chalk';
+import { GLOB_CONFIG_FILE_NAME, OUTPUT_DIR } from "../constant";
+import fs, { writeFileSync } from "fs-extra";
+import colors from "picocolors";
 
-import { getEnvConfig, getRootPath } from '../utils';
-import { getConfigFileName } from '../getConfigFileName';
+import { getEnvConfig, getRootPath } from "../utils";
+import { getConfigFileName } from "../getConfigFileName";
 
-import pkg from '../../package.json';
+import pkg from "../../package.json";
 
 interface CreateConfigParams {
   configName: string;
@@ -21,20 +21,22 @@ function createConfig(params: CreateConfigParams) {
   try {
     const windowConf = `window.${configName}`;
     // Ensure that the variable will not be modified
-    const configStr = `${windowConf}=${JSON.stringify(config)};
+    let configStr = `${windowConf}=${JSON.stringify(config)};`;
+    configStr += `
       Object.freeze(${windowConf});
       Object.defineProperty(window, "${configName}", {
         configurable: false,
         writable: false,
       });
-    `.replace(/\s/g, '');
+    `.replace(/\s/g, "");
+
     fs.mkdirp(getRootPath(OUTPUT_DIR));
     writeFileSync(getRootPath(`${OUTPUT_DIR}/${configFileName}`), configStr);
 
-    console.log(chalk.cyan(`✨ [${pkg.name}]`) + ` - configuration file is build successfully:`);
-    console.log(chalk.gray(OUTPUT_DIR + '/' + chalk.green(configFileName)) + '\n');
+    console.log(colors.cyan(`✨ [${pkg.name}]`) + ` - configuration file is build successfully:`);
+    console.log(colors.gray(OUTPUT_DIR + "/" + colors.green(configFileName)) + "\n");
   } catch (error) {
-    console.log(chalk.red('configuration file configuration file failed to package:\n' + error));
+    console.log(colors.red("configuration file configuration file failed to package:\n" + error));
   }
 }
 
diff --git a/build/script/postBuild.ts b/build/script/postBuild.ts
index e1554bff7c07f110b79b182f1a6464272aede92d..3f7e628f42f75fd3a98d8a65fb8cd7153daa649d 100644
--- a/build/script/postBuild.ts
+++ b/build/script/postBuild.ts
@@ -1,22 +1,22 @@
 // #!/usr/bin/env node
 
-import { runBuildConfig } from './buildConf';
-import chalk from 'chalk';
+import { runBuildConfig } from "./buildConf";
+import colors from "picocolors";
 
-import pkg from '../../package.json';
+import pkg from "../../package.json";
 
 export const runBuild = async () => {
   try {
     const argvList = process.argv.splice(2);
 
     // Generate configuration file
-    if (!argvList.includes('disabled-config')) {
+    if (!argvList.includes("disabled-config")) {
       runBuildConfig();
     }
 
-    console.log(`✨ ${chalk.cyan(`[${pkg.name}]`)}` + ' - build successfully!');
+    console.log(`✨ ${colors.cyan(`[${pkg.name}]`)}` + " - build successfully!");
   } catch (error) {
-    console.log(chalk.red('vite build error:\n' + error));
+    console.log(colors.red("vite build error:\n" + error));
     process.exit(1);
   }
 };
diff --git a/build/vite/optimizer.ts b/build/vite/optimizer.ts
deleted file mode 100644
index 8bb0fec190b42449ace98cc5ff8a42c9c87ffb5c..0000000000000000000000000000000000000000
--- a/build/vite/optimizer.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-// TODO
-import type { GetManualChunk } from 'rollup';
-
-//
-const vendorLibs: { match: string[]; output: string }[] = [
-  // {
-  //   match: ['xlsx'],
-  //   output: 'xlsx',
-  // },
-];
-
-// @ts-ignore
-export const configManualChunk: GetManualChunk = (id: string) => {
-  if (/[\\/]node_modules[\\/]/.test(id)) {
-    const matchItem = vendorLibs.find((item) => {
-      const reg = new RegExp(`[\\/]node_modules[\\/]_?(${item.match.join('|')})(.*)`, 'ig');
-      return reg.test(id);
-    });
-    return matchItem ? matchItem.output : null;
-  }
-};
diff --git a/build/vite/plugin/compress.ts b/build/vite/plugin/compress.ts
index 3ad32be1297200a78a87842ebc6611517132069c..a5c89dc75f633feca5b479bf4dcbeaa56d789de0 100644
--- a/build/vite/plugin/compress.ts
+++ b/build/vite/plugin/compress.ts
@@ -2,31 +2,31 @@
  * Used to package and output gzip. Note that this does not work properly in Vite, the specific reason is still being investigated
  * https://github.com/anncwb/vite-plugin-compression
  */
-import type { Plugin } from 'vite';
-import compressPlugin from 'vite-plugin-compression';
+import type { PluginOption } from "vite";
+import compressPlugin from "vite-plugin-compression";
 
 export function configCompressPlugin(
-  compress: 'gzip' | 'brotli' | 'none',
+  compress: "gzip" | "brotli" | "none",
   deleteOriginFile = false,
-): Plugin | Plugin[] {
-  const compressList = compress.split(',');
+): PluginOption | PluginOption[] {
+  const compressList = compress.split(",");
 
-  const plugins: Plugin[] = [];
+  const plugins: PluginOption[] = [];
 
-  if (compressList.includes('gzip')) {
+  if (compressList.includes("gzip")) {
     plugins.push(
       compressPlugin({
-        ext: '.gz',
+        ext: ".gz",
         deleteOriginFile,
       }),
     );
   }
 
-  if (compressList.includes('brotli')) {
+  if (compressList.includes("brotli")) {
     plugins.push(
       compressPlugin({
-        ext: '.br',
-        algorithm: 'brotliCompress',
+        ext: ".br",
+        algorithm: "brotliCompress",
         deleteOriginFile,
       }),
     );
diff --git a/build/vite/plugin/hmr.ts b/build/vite/plugin/hmr.ts
deleted file mode 100644
index 807fdb96a2cf421fd8e13e6f7ac2bb62c24bad03..0000000000000000000000000000000000000000
--- a/build/vite/plugin/hmr.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import type { Plugin } from 'vite';
-
-/**
- * TODO
- * Temporarily solve the Vite circular dependency problem, and wait for a better solution to fix it later. I don't know what problems this writing will bring.
- * @returns
- */
-
-export function configHmrPlugin(): Plugin {
-  return {
-    name: 'singleHMR',
-    handleHotUpdate({ modules, file }) {
-      if (file.match(/xml$/)) return [];
-
-      modules.forEach((m) => {
-        if (!m.url.match(/\.(css|less)/)) {
-          m.importedModules = new Set();
-          m.importers = new Set();
-        }
-      });
-
-      return modules;
-    },
-  };
-}
diff --git a/build/vite/plugin/html.ts b/build/vite/plugin/html.ts
index 848190bd8f7e12ebb4cc2c08418b0dbfd977d97d..811fde64af7ab5b6455ded5b46915a8fd522fa01 100644
--- a/build/vite/plugin/html.ts
+++ b/build/vite/plugin/html.ts
@@ -2,21 +2,21 @@
  * Plugin to minimize and use ejs template syntax in index.html.
  * https://github.com/anncwb/vite-plugin-html
  */
-import type { Plugin } from 'vite';
-import html from 'vite-plugin-html';
-import pkg from '../../../package.json';
-import { GLOB_CONFIG_FILE_NAME } from '../../constant';
+import type { PluginOption } from "vite";
+import { createHtmlPlugin } from "vite-plugin-html";
+import pkg from "../../../package.json";
+import { GLOB_CONFIG_FILE_NAME } from "../../constant";
 
 export function configHtmlPlugin(env: ViteEnv, isBuild: boolean) {
   const { VITE_GLOB_APP_TITLE, VITE_PUBLIC_PATH } = env;
 
-  const path = VITE_PUBLIC_PATH.endsWith('/') ? VITE_PUBLIC_PATH : `${VITE_PUBLIC_PATH}/`;
+  const path = VITE_PUBLIC_PATH.endsWith("/") ? VITE_PUBLIC_PATH : `${VITE_PUBLIC_PATH}/`;
 
   const getAppConfigSrc = () => {
-    return `${path || '/'}${GLOB_CONFIG_FILE_NAME}?v=${pkg.version}-${new Date().getTime()}`;
+    return `${path || "/"}${GLOB_CONFIG_FILE_NAME}?v=${pkg.version}-${new Date().getTime()}`;
   };
 
-  const htmlPlugin: Plugin[] = html({
+  const htmlPlugin: PluginOption[] = createHtmlPlugin({
     minify: isBuild,
     inject: {
       // Inject data into ejs template
@@ -27,7 +27,7 @@ export function configHtmlPlugin(env: ViteEnv, isBuild: boolean) {
       tags: isBuild
         ? [
             {
-              tag: 'script',
+              tag: "script",
               attrs: {
                 src: getAppConfigSrc(),
               },
diff --git a/build/vite/plugin/index.ts b/build/vite/plugin/index.ts
index 9c0924a0dcc9c57588c144192945ac965f4d0317..25e9fd5c16e58416b4d672374c3f2f7297a59b1d 100644
--- a/build/vite/plugin/index.ts
+++ b/build/vite/plugin/index.ts
@@ -1,20 +1,20 @@
-import type { Plugin } from 'vite';
-import vue from '@vitejs/plugin-vue';
-import vueJsx from '@vitejs/plugin-vue-jsx';
-import legacy from '@vitejs/plugin-legacy';
-import purgeIcons from 'vite-plugin-purge-icons';
-import windiCSS from 'vite-plugin-windicss';
-import vueSetupExtend from 'vite-plugin-vue-setup-extend';
-import { configHtmlPlugin } from './html';
-import { configPwaConfig } from './pwa';
-import { configMockPlugin } from './mock';
-import { configCompressPlugin } from './compress';
-import { configStyleImportPlugin } from './styleImport';
-import { configVisualizerConfig } from './visualizer';
-import { configThemePlugin } from './theme';
-import { configImageminPlugin } from './imagemin';
-import { configSvgIconsPlugin } from './svgSprite';
-import { configHmrPlugin } from './hmr';
+import { PluginOption } from "vite";
+import vue from "@vitejs/plugin-vue";
+import vueJsx from "@vitejs/plugin-vue-jsx";
+import legacy from "@vitejs/plugin-legacy";
+import purgeIcons from "vite-plugin-purge-icons";
+import windiCSS from "vite-plugin-windicss";
+import VitePluginCertificate from "vite-plugin-mkcert";
+import vueSetupExtend from "vite-plugin-vue-setup-extend";
+import { configHtmlPlugin } from "./html";
+import { configPwaConfig } from "./pwa";
+import { configMockPlugin } from "./mock";
+import { configCompressPlugin } from "./compress";
+import { configStyleImportPlugin } from "./styleImport";
+import { configVisualizerConfig } from "./visualizer";
+import { configThemePlugin } from "./theme";
+import { configImageminPlugin } from "./imagemin";
+import { configSvgIconsPlugin } from "./svgSprite";
 
 export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean) {
   const {
@@ -25,21 +25,21 @@ export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean) {
     VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE,
   } = viteEnv;
 
-  const vitePlugins: (Plugin | Plugin[])[] = [
+  const vitePlugins: (PluginOption | PluginOption[])[] = [
     // have to
     vue(),
     // have to
     vueJsx(),
     // support name
     vueSetupExtend(),
+    VitePluginCertificate({
+      source: "coding",
+    }),
   ];
 
   // vite-plugin-windicss
   vitePlugins.push(windiCSS());
 
-  // TODO
-  !isBuild && vitePlugins.push(configHmrPlugin());
-
   // @vitejs/plugin-legacy
   VITE_LEGACY && isBuild && vitePlugins.push(legacy());
 
@@ -61,12 +61,12 @@ export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean) {
   // rollup-plugin-visualizer
   vitePlugins.push(configVisualizerConfig());
 
-  //vite-plugin-theme
+  // vite-plugin-theme
   vitePlugins.push(configThemePlugin(isBuild));
 
   // The following plugins only work in the production environment
   if (isBuild) {
-    //vite-plugin-imagemin
+    // vite-plugin-imagemin
     VITE_USE_IMAGEMIN && vitePlugins.push(configImageminPlugin());
 
     // rollup-plugin-gzip
diff --git a/build/vite/plugin/styleImport.ts b/build/vite/plugin/styleImport.ts
index 111a3faaf260e554cf88f0284fb23f5fd9d367a1..11c1d1c15f80d9d1381cfcf97f2dccbd0d184a9d 100644
--- a/build/vite/plugin/styleImport.ts
+++ b/build/vite/plugin/styleImport.ts
@@ -2,71 +2,74 @@
  *  Introduces component library styles on demand.
  * https://github.com/anncwb/vite-plugin-style-import
  */
-import styleImport from 'vite-plugin-style-import';
+import { createStyleImportPlugin } from "vite-plugin-style-import";
 
-export function configStyleImportPlugin(isBuild: boolean) {
-  if (!isBuild) {
-    return [];
-  }
-  const styleImportPlugin = styleImport({
+export function configStyleImportPlugin(_isBuild: boolean) {
+  // if (!isBuild) {
+  //   return [];
+  // }
+  const styleImportPlugin = createStyleImportPlugin({
     libs: [
       {
-        libraryName: 'ant-design-vue',
+        libraryName: "ant-design-vue",
         esModule: true,
         resolveStyle: (name) => {
           // 这里是无需额外引入样式文件的“子组件”列表
           const ignoreList = [
-            'anchor-link',
-            'sub-menu',
-            'menu-item',
-            'menu-item-group',
-            'breadcrumb-item',
-            'breadcrumb-separator',
-            'form-item',
-            'step',
-            'select-option',
-            'select-opt-group',
-            'card-grid',
-            'card-meta',
-            'collapse-panel',
-            'descriptions-item',
-            'list-item',
-            'list-item-meta',
-            'table-column',
-            'table-column-group',
-            'tab-pane',
-            'tab-content',
-            'timeline-item',
-            'tree-node',
-            'skeleton-input',
-            'skeleton-avatar',
-            'skeleton-title',
-            'skeleton-paragraph',
-            'skeleton-image',
-            'skeleton-button',
+            "anchor-link",
+            "sub-menu",
+            "menu-item",
+            "menu-divider",
+            "menu-item-group",
+            "breadcrumb-item",
+            "breadcrumb-separator",
+            "form-item",
+            "step",
+            "select-option",
+            "select-opt-group",
+            "card-grid",
+            "card-meta",
+            "collapse-panel",
+            "descriptions-item",
+            "list-item",
+            "list-item-meta",
+            "table-column",
+            "table-column-group",
+            "tab-pane",
+            "tab-content",
+            "timeline-item",
+            "tree-node",
+            "skeleton-input",
+            "skeleton-avatar",
+            "skeleton-title",
+            "skeleton-paragraph",
+            "skeleton-image",
+            "skeleton-button",
           ];
           // 这里是需要额外引入样式的子组件列表
           // 单独引入子组件时需引入组件样式,否则会在打包后导致子组件样式丢失
           const replaceList = {
-            'typography-text': 'typography',
-            'typography-title': 'typography',
-            'typography-paragraph': 'typography',
-            'typography-link': 'typography',
-            'dropdown-button': 'dropdown',
-            'input-password': 'input',
-            'input-search': 'input',
-            'input-group': 'input',
-            'radio-group': 'radio',
-            'checkbox-group': 'checkbox',
-            'layout-sider': 'layout',
-            'layout-content': 'layout',
-            'layout-footer': 'layout',
-            'layout-header': 'layout',
-            'month-picker': 'date-picker',
+            "typography-text": "typography",
+            "typography-title": "typography",
+            "typography-paragraph": "typography",
+            "typography-link": "typography",
+            "dropdown-button": "dropdown",
+            "input-password": "input",
+            "input-search": "input",
+            "input-group": "input",
+            "radio-group": "radio",
+            "checkbox-group": "checkbox",
+            "layout-sider": "layout",
+            "layout-content": "layout",
+            "layout-footer": "layout",
+            "layout-header": "layout",
+            "month-picker": "date-picker",
+            "range-picker": "date-picker",
+            "image-preview-group": "image",
           };
 
           return ignoreList.includes(name)
-            ? ''
+            ? ""
             : replaceList.hasOwnProperty(name)
             ? `ant-design-vue/es/${replaceList[name]}/style/index`
             : `ant-design-vue/es/${name}/style/index`;
diff --git a/build/vite/plugin/svgSprite.ts b/build/vite/plugin/svgSprite.ts
index 3817acbfc5f23994c11dcf0de8fe8c96e6b0cd16..82077b4d7b35dff6a94971cee0eaa72c44bd47e7 100644
--- a/build/vite/plugin/svgSprite.ts
+++ b/build/vite/plugin/svgSprite.ts
@@ -3,15 +3,15 @@
  * https://github.com/anncwb/vite-plugin-svg-icons
  */
 
-import SvgIconsPlugin from 'vite-plugin-svg-icons';
-import path from 'path';
+import { createSvgIconsPlugin } from "vite-plugin-svg-icons";
+import path from "path";
 
 export function configSvgIconsPlugin(isBuild: boolean) {
-  const svgIconsPlugin = SvgIconsPlugin({
-    iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],
+  const svgIconsPlugin = createSvgIconsPlugin({
+    iconDirs: [path.resolve(process.cwd(), "src/assets/icons")],
     svgoOptions: isBuild,
     // default
-    symbolId: 'icon-[dir]-[name]',
+    symbolId: "icon-[dir]-[name]",
   });
   return svgIconsPlugin;
 }
diff --git a/build/vite/plugin/theme.ts b/build/vite/plugin/theme.ts
index c54f1a834de0da4fa8f4df256c997e075ed55aea..7e5232aafa68e27c528ffd25aa77cd90e6a95a15 100644
--- a/build/vite/plugin/theme.ts
+++ b/build/vite/plugin/theme.ts
@@ -2,19 +2,19 @@
  * Vite plugin for website theme color switching
  * https://github.com/anncwb/vite-plugin-theme
  */
-import type { Plugin } from 'vite';
-import path from 'path';
+import type { PluginOption } from "vite";
+import path from "path";
 import {
   viteThemePlugin,
   antdDarkThemePlugin,
   mixLighten,
   mixDarken,
   tinycolor,
-} from 'vite-plugin-theme';
-import { getThemeColors, generateColors } from '../../config/themeConfig';
-import { generateModifyVars } from '../../generate/generateModifyVars';
+} from "vite-plugin-theme";
+import { getThemeColors, generateColors } from "../../config/themeConfig";
+import { generateModifyVars } from "../../generate/generateModifyVars";
 
-export function configThemePlugin(isBuild: boolean): Plugin[] {
+export function configThemePlugin(isBuild: boolean): PluginOption[] {
   const colors = generateColors({
     mixDarken,
     mixLighten,
@@ -25,65 +25,65 @@ export function configThemePlugin(isBuild: boolean): Plugin[] {
       resolveSelector: (s) => {
         s = s.trim();
         switch (s) {
-          case '.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon':
-            return '.ant-steps-item-icon > .ant-steps-icon';
-          case '.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled)':
-          case '.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover':
-          case '.ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active':
+          case ".ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon":
+            return ".ant-steps-item-icon > .ant-steps-icon";
+          case ".ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled)":
+          case ".ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):hover":
+          case ".ant-radio-button-wrapper-checked:not(.ant-radio-button-wrapper-disabled):active":
             return s;
-          case '.ant-steps-item-icon > .ant-steps-icon':
+          case ".ant-steps-item-icon > .ant-steps-icon":
             return s;
-          case '.ant-select-item-option-selected:not(.ant-select-item-option-disabled)':
+          case ".ant-select-item-option-selected:not(.ant-select-item-option-disabled)":
             return s;
           default:
-            if (s.indexOf('.ant-btn') >= -1) {
+            if (s.indexOf(".ant-btn") >= -1) {
               // 按钮被重新定制过,需要过滤掉class防止覆盖
               return s;
             }
         }
-        return s.startsWith('[data-theme') ? s : `[data-theme] ${s}`;
+        return s.startsWith("[data-theme") ? s : `[data-theme] ${s}`;
       },
       colorVariables: [...getThemeColors(), ...colors],
     }),
     antdDarkThemePlugin({
       preloadFiles: [
-        path.resolve(process.cwd(), 'node_modules/ant-design-vue/dist/antd.less'),
+        path.resolve(process.cwd(), "node_modules/ant-design-vue/dist/antd.less"),
         //path.resolve(process.cwd(), 'node_modules/ant-design-vue/dist/antd.dark.less'),
-        path.resolve(process.cwd(), 'src/design/index.less'),
+        path.resolve(process.cwd(), "src/design/index.less"),
       ],
-      filter: (id) => (isBuild ? !id.endsWith('antd.less') : true),
+      filter: (id) => (isBuild ? !id.endsWith("antd.less") : true),
       // extractCss: false,
       darkModifyVars: {
         ...generateModifyVars(true),
-        'text-color': '#c9d1d9',
-        'primary-1': 'rgb(255 255 255 / 8%)',
-        'text-color-base': '#c9d1d9',
-        'component-background': '#151515',
-        'heading-color': 'rgb(255 255 255 / 65%)',
+        "text-color": "#c9d1d9",
+        "primary-1": "rgb(255 255 255 / 8%)",
+        "text-color-base": "#c9d1d9",
+        "component-background": "#151515",
+        "heading-color": "rgb(255 255 255 / 65%)",
         // black: '#0e1117',
         // #8b949e
-        'text-color-secondary': '#8b949e',
-        'border-color-base': '#303030',
+        "text-color-secondary": "#8b949e",
+        "border-color-base": "#303030",
         // 'border-color-split': '#30363d',
-        'item-active-bg': '#111b26',
-        'app-content-background': '#1e1e1e',
-        'tree-node-selected-bg': '#11263c',
+        "item-active-bg": "#111b26",
+        "app-content-background": "#1e1e1e",
+        "tree-node-selected-bg": "#11263c",
 
-        'alert-success-border-color': '#274916',
-        'alert-success-bg-color': '#162312',
-        'alert-success-icon-color': '#49aa19',
-        'alert-info-border-color': '#153450',
-        'alert-info-bg-color': '#111b26',
-        'alert-info-icon-color': '#177ddc',
-        'alert-warning-border-color': '#594214',
-        'alert-warning-bg-color': '#2b2111',
-        'alert-warning-icon-color': '#d89614',
-        'alert-error-border-color': '#58181c',
-        'alert-error-bg-color': '#2a1215',
-        'alert-error-icon-color': '#a61d24',
+        "alert-success-border-color": "#274916",
+        "alert-success-bg-color": "#162312",
+        "alert-success-icon-color": "#49aa19",
+        "alert-info-border-color": "#153450",
+        "alert-info-bg-color": "#111b26",
+        "alert-info-icon-color": "#177ddc",
+        "alert-warning-border-color": "#594214",
+        "alert-warning-bg-color": "#2b2111",
+        "alert-warning-icon-color": "#d89614",
+        "alert-error-border-color": "#58181c",
+        "alert-error-bg-color": "#2a1215",
+        "alert-error-icon-color": "#a61d24",
       },
     }),
   ];
 
-  return plugin as unknown as Plugin[];
+  return plugin as unknown as PluginOption[];
 }
diff --git a/commitlint.config.js b/commitlint.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..6a14a433d71393461ad2384a357165ae85a31bea
--- /dev/null
+++ b/commitlint.config.js
@@ -0,0 +1,107 @@
+const fs = require("fs");
+const path = require("path");
+const { execSync } = require("child_process");
+
+const scopes = fs
+  .readdirSync(path.resolve(__dirname, "src"), { withFileTypes: true })
+  .filter((dirent) => dirent.isDirectory())
+  .map((dirent) => dirent.name.replace(/s$/, ""));
+
+// precomputed scope
+const scopeComplete = execSync("git status --porcelain || true")
+  .toString()
+  .trim()
+  .split("\n")
+  .find((r) => ~r.indexOf("M  src"))
+  ?.replace(/(\/)/g, "%%")
+  ?.match(/src%%((\w|-)*)/)?.[1]
+  ?.replace(/s$/, "");
+
+/** @type {import('cz-git').UserConfig} */
+module.exports = {
+  ignores: [(commit) => commit.includes("init")],
+  extends: ["@commitlint/config-conventional"],
+  rules: {
+    "body-leading-blank": [2, "always"],
+    "footer-leading-blank": [1, "always"],
+    "header-max-length": [2, "always", 108],
+    "subject-empty": [2, "never"],
+    "type-empty": [2, "never"],
+    "subject-case": [0],
+    "type-enum": [
+      2,
+      "always",
+      [
+        "feat",
+        "fix",
+        "perf",
+        "style",
+        "docs",
+        "test",
+        "refactor",
+        "build",
+        "ci",
+        "chore",
+        "revert",
+        "wip",
+        "workflow",
+        "types",
+        "release",
+      ],
+    ],
+  },
+  prompt: {
+    /** @use `yarn commit :f` */
+    alias: {
+      f: "docs: fix typos",
+      r: "docs: update README",
+      s: "style: update code format",
+      b: "build: bump dependencies",
+      c: "chore: update config",
+    },
+    customScopesAlign: !scopeComplete ? "top" : "bottom",
+    defaultScope: scopeComplete,
+    scopes: [...scopes, "mock"],
+    allowEmptyIssuePrefixs: false,
+    allowCustomIssuePrefixs: false,
+
+    // English
+    typesAppend: [
+      { value: "wip", name: "wip:      work in process" },
+      { value: "workflow", name: "workflow: workflow improvements" },
+      { value: "types", name: "types:    type definition file changes" },
+    ],
+
+    // 中英文对照版
+    // messages: {
+    //   type: '选择你要提交的类型 :',
+    //   scope: '选择一个提交范围 (可选):',
+    //   customScope: '请输入自定义的提交范围 :',
+    //   subject: '填写简短精炼的变更描述 :\n',
+    //   body: '填写更加详细的变更描述 (可选)。使用 "|" 换行 :\n',
+    //   breaking: '列举非兼容性重大的变更 (可选)。使用 "|" 换行 :\n',
+    //   footerPrefixsSelect: '选择关联issue前缀 (可选):',
+    //   customFooterPrefixs: '输入自定义issue前缀 :',
+    //   footer: '列举关联issue (可选) 例如: #31, #I3244 :\n',
+    //   confirmCommit: '是否提交或修改commit ?',
+    // },
+    // types: [
+    //   { value: 'feat', name: 'feat:     新增功能' },
+    //   { value: 'fix', name: 'fix:      修复缺陷' },
+    //   { value: 'docs', name: 'docs:     文档变更' },
+    //   { value: 'style', name: 'style:    代码格式' },
+    //   { value: 'refactor', name: 'refactor: 代码重构' },
+    //   { value: 'perf', name: 'perf:     性能优化' },
+    //   { value: 'test', name: 'test:     添加疏漏测试或已有测试改动' },
+    //   { value: 'build', name: 'build:    构建流程、外部依赖变更 (如升级 npm 包、修改打包配置等)' },
+    //   { value: 'ci', name: 'ci:       修改 CI 配置、脚本' },
+    //   { value: 'revert', name: 'revert:   回滚 commit' },
+    //   { value: 'chore', name: 'chore:    对构建过程或辅助工具和库的更改 (不影响源文件、测试用例)' },
+    //   { value: 'wip', name: 'wip:      正在开发中' },
+    //   { value: 'workflow', name: 'workflow: 工作流程改进' },
+    //   { value: 'types', name: 'types:    类型定义文件修改' },
+    // ],
+    // emptyScopesAlias: 'empty:      不填写',
+    // customScopesAlias: 'custom:     自定义',
+  },
+};
diff --git a/docs/.nojekyll b/docs/.nojekyll
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/docs/README.md b/docs/README.md
deleted file mode 100644
index 2008f81ddc247d0cd677ab18adff29d1f9115b1f..0000000000000000000000000000000000000000
--- a/docs/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# 简介
-
-```java
-class A {
-    // 测试 Java 代码高亮
-}
-```
diff --git a/docs/_coverpage.md b/docs/_coverpage.md
deleted file mode 100644
index b2b6e2da6e365acc0fd252ee93f53dd2b8e8341f..0000000000000000000000000000000000000000
--- a/docs/_coverpage.md
+++ /dev/null
@@ -1,7 +0,0 @@
-> **师范生学业指导系统使用手册**
-
-- 辅助师生高效完成工作
-- 记录导师制生活的点滴
-
-[码云](https://gitee.com/Suomm/tutor)
-[开始](#简介)
diff --git a/docs/_images/logo.svg b/docs/_images/logo.svg
deleted file mode 100644
index 130019d5d2f08e216eee2775060e71fbff5b952c..0000000000000000000000000000000000000000
--- a/docs/_images/logo.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-<svg version="1.2" baseProfile="tiny-ps" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 741 286" width="741" height="286">
-	<title>template</title>
-	<defs>
-		<image  width="52" height="50" id="img1" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQAAAAyCAYAAAATIfj2AAAAAXNSR0IB2cksfwAAHZlJREFUeJyFegd4VOW29qsoLSG9t0klgAUBPaAgHayoF88RPSpe1AMqRVEBj4ro71HaoaTOZGYy6QmEBAihGgISIJTQWyCU0BJKeibTy/ev9e1wbnnuvSYM82TP3rO/1d71vuvb0ERFQpMQi6yEaOjCArHa3wPZMWHIHRAHfWwk1BHB0ESGIDM2HIa4CGgjg5EW4oeMMH/50oT6QR3iSy8/pAf7Ii3IR76SAnyQHEh/hwRAEx4MvSqcviNSvvQx9D39Q1EYFg6NKh6bPvtIvtRRccgPCYUmPhhZqgjo4iOQEhcCfVwYclSRSA4LRe4L43EhZcULBxbNhSE+Bvm0Hv0A+h5amy4yCtD0j0BuVBhSA71Q+Mxw7Fu2ekzriZOi7fJtYbp0UZwsKS7XD41HWrgXDCEq5D+biOIJo7Fp4mgUjh6JTePGyveNUyaibNpr2DJtKra+/Q4qPpyJ0n9/FdtffwPrhgxDWlhfZMaEIjMyDJrEUFqMiu7piZ3vvwebEMJJr/2LFyA9zA/50VHSIE1sCHLjQ5ATE4X0/glICvLC9eLiTUI46GyX2PT+v0Eb1Af6xCjkRcSSo+IAfXQQcnxDUDVnNux3b4suOtUibMLhstJdjEK4hTi7evngouAonC8rrzU1t9AJTmEytQizqV04Oo3CabUIq90krHQdXSmsbjtd6xJ2h1mY7F2iraNV7J79JdS+PigaoIImIowWEYmsvl44snrFY063S67xTGHmohX9PJAVT5kRHYb8eMqKkGBk0N85lCGZvT1xrfKAg+4mXA632Dr9fWh690bOoFikqoKQG6uiCAX4oWz2pxB0kolssHfydzulITZ60Z9i77zZqJg5A076xGKjZTvleuWP1e0WJoeDTxdum0u4jeRvk5sMtAhhJtutdun9un27HWkBFGVK3+zYBBhCAyhiA3GlsqKtg66mU0XrmdOi+NUpMlU5zbTxYbIcDDHhFE1v7F36DczkTHKVsJID2q+cF4XT3oTWPxQbIoKg7h8E5Cc8hfbG24LDbre6hMtmFpe3ba6pXrtqzNnifN3J1SuGGcjoo/Pnwi2jZpWLd8n/yCCXTXTZzdIBDodDGmmjD6TBdMxMBjtdFvH7onnQ+HthfWIi1PSeN+p53Ks9Lnh5LqtTGOlaFweq857YOetjZPr7IiM2DFmx0dD7+ON4bsbPbmEUXUarPN9u5zuR661tomrZPxKzg4KQGucPVMz4COydNptDJlvVrz/0SPPth8ygCKSH9JV5nkeFnDEoDqdKslderKkSjbsrxfXKHXfOFeXr7p07SbF1CitHwmETxwsKsnb8+HecXLHmheqFC3D4hyW9yqe/A31QoASD9MgAFAyIxd3LZ9hsuUCn2SoNdxmd0iFmc7PYOHYc1Vkw1N7e2LroS/DqHGa7sDiUc/jNZrOQiW5yoF389ulMMtwXOLzoK/AJzZSTDTVHRYpHIHmwJ9KCQ6RHk4K8kezZD1o/P+R59EWSKgDZIYQo4X5Y3qsPKj+ZDXKZcMv72EXBC5OQ3htI9fGAOqA3/unzCLQEOIaYBKyPT8Rav56o1q4ZY+VIdlllZnCwLQ47LZKiaXfJY7f3VFrWBvZAyeRx6HIY2deio6lFtJ6to1JQsqTpzAnRdqeBapU+qzsncqLigX3fzIdFpokQ906eElunTsf26X/Fb/M/waGff/Q4SN4+/MtiHFnxi6p04ljkhPgoMNo/GLrgQOx4d7qsLTeF2WjtEmUvT8H6gH7ISeyPwoSBKIyNQlp/glUyKC0wAPkjh6PL1im6aEV2Ktjmq3WyLtkgE6Wb2dgsbJTPnIIbhz2J06tWjOQVc4Sqk1NfP/73XylaNnIgodwbb+PIqlUj2ZdmOraDEBPHFi4Cx89utVECmMlypQ7YBS46zvXAR6z06+hsEmUTXpPRSQ8PwAovTxz8Yi46KfASCOjcLW+9i9RQyv8BVNSR4dAmUIrFBFAt+FCf8sKhn5b3kt6jerlQumFT2QccYf5+t7iQnf1z9epVw/nDDjpl3ydzUL+htJwSTdZayQtTcGjpYn9BqGiiz7e88xdsnfIGrd8tgezY0h9VqJ4zD1zgdvoVFpMwOileRlqcrYM8ThBstwmLuUNYjXScUmL/J7Ow+pGHsX3mp7h6eL/oMN2h2zHuMDI6xc733oc6MJAiOBC6mGhqnEHQqYJlE1zp1Rt163Wfd4Oo2PPhLGyc9DJcLgIEt00c/moeNk9+Gdw6+JzqJYtxYWPJXlqvuHtqv9AG+qDul3+Gu9nJ5OVdMz5AxsABaGu6K7+wrlC3EruoQ0t0ISx2Ot0yIkqGks10kVNWI8E39ZYrVdvqcyIHoHLNjx6MXOwZJyMf+cJtMlN7Mol1r0xGhuejMIT7I3NADDKp02fGBKMgkhppmDe2z50uC7z16lmhIQQrHPYUmtpuyMLe+Oc/IzfhMdw9f0g0nqkRuUOHYP2/vYF7NftE+Yy3sAwPY+cHM0AJKu4cPya0AxKh69ULR/LSF1HzkA5CxbyZkAhMdzF1dYrTa5JeP7pwIbZ9Ngt1Gu1XVvK6w+UU9w+dEGsDArCN8pYN5J5ltthkKtq6cdxIy6r47kvkPTUQmQzPwYSQVG9ZqihKvXCKWAAygkNROWsmNr80FupYokzBAbi3s+IWp9nFsvVFWUGR1H8ossQMsmICkesfiNRgfxgGD8DG8cRKBg9BTYG2s2rePGQNfgL5A2MpAyKxYczzUIeHk0GffAgOCKNUm6VZ6IcOxZq+DxGyeaBkzHi4bVxXdnG5fOvljD7AyQ26RTLnTVxfHaLl/BFiDSbhMjsURuLoJOc0i+a6i2LT1ClYQyCSFR6K/DiiM9T98yIjkOzRC0n9+pBxgchIHIzWa/UMYqLz3k2RO2gYsn39oY70gcHHE2rihdVpv4Zb2+5TBliF3dYlTNSKHYR8LiOVxe0b4sTSlYPT+wXCQH0LzIfYIDvVCxffpnHjkafyl97MGzcabmObsLu6REP1AaFNiEDX1VpJbTgoVUsWISsuAZ3XrpJpLq5VYgtkrEUpEntTq8h5cSyRRiKpMbHQRquQ4++N4qlv4HJO5qKbu7bV3r1wQXRwUyGUdNit4v6xo+La/p23Lm0rUP/+9TfIiY9F5/GD0lfsXGYg3OA76V4mp0Qr+dnuhV8jlZyH9a9MAHd4OxWLjWA079mRWPNoD6R7emLf7HkwO8gjdEnd4WpRPHI8hElBmM4Os8h9ehhyosPRdO0irccuaY5CEVyEL3yEeKA+4/NUr37IT0yQxLR4ymRYWppFl9MpnWKmd6fdIVGsnSLAkM1fYexmG+Vvv4m6iu2XlejbJZtwS9Bgp1I1GTvlgdoN6/JSPDyALRMnwWYkYulm0LaKw7q0D44t/8m7Yd9+0dlupMVLCBRn1hdk7Rw6El0UZq6blut3xDoqSiaZpvqb0gib2yIOa1LfPadLfpPTlGH8zpmToih8ANLi/bA6qDd+//prMEpxijls1Ezpt5MAxmEhtkBmsdPtTptkH2xE+ZQXoR09DHvmfoZtX8zG8cXL/A//4ztUzp6L83m5K1uZSrNB+6uEPiwWKCUZYLdZZOuR/MzNqeMgQ1yi08kMVfls05yPsX3I0zBZO6RH2u82isIn4qEdFAXjpdtK96LULJ78ImkqLzRcrpN1abx7U5Q++Qz0Ed4wRPshm4r6tD73q6aqanF+/bq80xrDR0xh3Ew2KcJ3yytOnig0fHemMGNW+VvTkU6QnxPqgZQwX+z+9G/YNf0jLCewSe35MNY9OxZWqim+efPxw4LBB5snjofFzGEjXznIGO7KDMNWZhtuiXxHlq8Ypibas2HcJAiKJouErnsNojAhEYZEFdquX5Xcij3/21/fRZJ/LzQcrpK9xNlhEptJLyVFeyEjToXcUH+kR/giLyAIyx4C1MQoLM33pZNM9xtF1oiRSEFPrOnxCNSh/ZBH0iHdvw+qlv36GKclIZAoefev0Pv3w4ZJ4+C0mmQQmk+cEiwzSKg9BydRESVFhHx3m7tE46VT4mxp9sodU9/CKvJ4dnhflIx+HmZjK63TLlpv3xQFiYOQPTAGxhv1MrpMNre//RaS/Xqh8Wi1sLuV/lQwagQJRB+iQ7FEdCOgDwuD4ZnnUDnnU1zZVLyhnSLLVIgVVfu1c+IWgcL2v32INELE9ZHRBMf+qD9QIXskA8KOj6cjuU8PFE+eCJu1S6b73WM1QkdCEPmjnkWb0Sz1CPeb2syMzzOfeExC6tqHmWR6Sl2STl7PGzMO7W0t0ptd9++KdU8MhpZU6L3a892V6hLbpv0FKV6P4vruPZQJxCBsJpFHWcDyPpsilErO2fDKq2hpodbDaCkBQUjqJV9Oh8I6HCZxcOHfkdLXFzlDB6L11lV5C6uxRZRMGo1Ugv3tb78Np1NB3PqqPQ4NiUGsH/scXDYF+1hnNFT9Lg4tXZpYo0374EppUdHN3yoszQerxdWKTYea604It9stz3VSKm54+k/E2/xwg7q2YpBDlP+VIuTZA3XryvYqUtEutr/3HjHuINmHCuLicPdUtUSwTqfCGy3UoPlyqVzpXxexFvY7Q7g6LAr64U/A0dQsyN+i42a9yKXazfDzwr7P50O5q1tc2lK6I53lQxHlt5lSzOVSaDsvgVOP4dHGUtqmrNUm8Yh4HRUh+9DW3iFKnnsO6rAANBw/Lk9iGlT23jRKh4fQUL67ye1SmMTemZ8gg5qlNjwQ2157CUYmunR+x/3b4mBO3tKOllamt8LR0iKqUzPfNN+/Lw0zURYUPfE4MockwkzSnyPZcvmSyBoUgzQvDyKqS1UKSSOim6Wdne7lB2yc+CKM1OUZ/1k8OcxGYTebJOo4Sb3bnB2ig5DNarbJm7Bm4dqwUOqVjBopF9l4TDHI4bKLbR9OR2qfR1BXtq2eCS8Dxb7Zc5AdEIi0AG9Uk4zmhVnIY2ZKI0Y50arUkJ0MOabNnN3W3CCjZW9vE6XE9dYNGQijzSTvcZOyISeR0NXHC2eLC3Wi26CaH79Dhhcp1oIRQ2Brb2L5J/mceCCdHUqPlElhUWYDjafOyChIdt7ZLorJoIwQfzQeqZHX8eIr5swigdcTV4kqSfVPC2M1qQvyRTqlyXE9yQNOBYtdDlWY+PPAwyLlIUt8asgE45LBd5nF5uefQ97j8WjvbJPtxN54R+iIJ+YE+aPhxGG5Vu6hlYR8Gh+O0ITnCba75D24id4+tE8c+OF77Pl2Lq5sKCoS3U3w+v69ovjJZ2FqrpMpyN57YBAjjOSDdO6eL+ZQj3gUt0o2HSLOJNP38HcLsDbIA+k+/XAidXkiR4iJLNeEW8lnKVs4lXkNToeS+pZOqygZMQJ6qpmuhrsy7Z2WDlH80gQY/H1wr/6CbDFmAobN48chwz8AKCYVSuJHzgQ4Gr8Ri83AI0jr1QNbXntVUnU2qq543YZNf3oMtk6bNN7W1io2Pj8Gyb4euPv7Hkld+N+ebxdhNYjE5uXrZJ+m64/P/56KOIigOwgHflko5YOwOYSx+abovHpRSTe+vKVd3D5wUJjam2Vf7GjrFPnjRkIf6IsblZXdkyaXuFBgWMmDxZY7d2RpdNZeE+lx0ciICgI2jB8Nnp2xFjKTmDu29P/564jk8TygZPqfwd/C1OJ8/roNJWOfhsXC3YKSo5VqaOTzWOvdB7cqdrU9MGjf4m+RRA3zbFLKNGUCZBUHvl/Si4ljin9fHPpkppQfbNSZ/PyU3OcmwUEs/x6d13H1migd9w5a79fLz7su1orsgQky4uXffAmmHl08WyBGf5Ic1958XRq48/vvoPf1QkH/aGD72LEwu8yyB/BPJbHWlR69kT/gKVzaUbqXreE6uKDJ+Fw/NAEWymUuNk65jaMVg67v3H7L3W3Q/iXfYw0ZVP3Dkl4OSR+JH/78iyo1oBeRUx8Ujx4NThFOtabmRtF08ZwUhjwO4+kPq2YzpRXnxdXtGyvSqH8VkfJNDwzGhV1ltfwBsxKHxSz2J6/6ofylKUiK8YdeFYo0lYqYwvBn0WVqJ1fKQZdoOFUjzm8rLu+8fl1610K9iSeVFXM/lZ2+reG2pBocITZoDcnqG7t23HErqCAO/Lyk19qHH8LJb36AxH46fjop+c1U317ISgyVIqxu99azskos3U1VSmOKOpFUCznLaVKYeM1PPyDdywe5dF+WM/oB1GBJbjD3Y8ZfX1ZWm+7ZF0VxAdDFxSMtlgRe6XNjYDcbpZBhGc5FxuE28lo6LdLrd+rOiZSoeOx8ZqSMJnckjtDmsVRDXn1wm1LOrYxWyKCfvFdSDdWsWT2BOz4X8snM7JXMEHQDVcgkdCqaTPcklOQ+ylNYvqdTDj6cCspSslz9feetnPgBUEeHUEMORXpCILSkpdZNnEhtpkFYupT4V6/8JXElT1rj46iGvAjlxk0G9x6jZFLdsO1URsBMTcwN14ThzTfkjG4zUZ8WEnxyTEx9aOOoUdKgmxQhpk28wMPLfo1bwQatWj1BVizPxnML89Z49IF2YByyYqOgo0WWTnsbZzfkLG27ckHet4NHE3TuufKNFVveexe6xwYiNyKUoqNCenSA1F25CSok+XiAxRwzFl6xuemeWDd4BDRRvDtCESoZPx42U6dEqVYSW/cvXxT1tYcJpitF9c+LkUWSIcvfD5lhPVH2+mvgyQ8jEo+P80muJ/Xrjes7ttW7u0dfZ1OSXl/b8xGcWL5yuHDZ5bHLZVvO6gPJu9GxyAwIh97TH8nevSTb3jnhJTicSgqx1NCHRmEtHU/x8obezwfJ4cHIio+AhmSELoaILRmXSSzfdP5CN3dxiKMffw6thzILJC43CkYSbczjeNBeMv416AMCoAmil78nhTEU+kEqrPV/CFumMuopBKm94ZbIGTwYab6e/zKIS+F8Wsq0VT0eQs3qlcNdQqnLazu2nFVH9IU6IhAb33kLu6kvVc39gnrdfJzWaT6SfY3Va2uTuLylpPyIJvXNgwvnk6D7d2wYzvQqSA432aDMWJIf3h44sOxHf6l4yWNnN2+sMZDDdDEE28WjR8FKMpt3EZzEl/KGDYY+JACGhEgYYqPBc4TsBEoTby8Uv/MXCdtcysx+c54ejFTy4u2d2+ofsIqLBv13PLer/uXnYAk0dNerv+1sWtMTpDo/BdcLEyK3ktnyGim55Q6GXUoQtk5uydDx5htXReGY55BJ2kiXwGkVJTfaiqZMBM8vHA6baLnRIAyPP4accGIKpZPGw+5S9L+loUHkDXkSmRHBco9GHx2F9Bhl947TjhckuglsV8N1itDjUl407mLYFpL2n0qjlHukByoWfQ1T96IvkZRI8eyDq2WFOq5NucXiEN2yXxmTSY5IqSfZn1ORMoqksYrS16fAQPAtdwD7U9pGBCF9YDzarlyX7MTaZRKsjTJDvIGtU18HX8T+aaklJvt4otzD0ceESYMy4sOlQZzPh7756l90va3uvMiipqemhlZXWlyulJBLMejRh3GACpcZPPO++wePCd4Z2DrjfZgabxGxvS3a6y+K+xeOC8vta8JGIpD7EovHxtpT4vaZE6KlvV50XbkieHSsDouWTmbFm04GZZBB2iA/3Nq9l90hncZ8kfefsHvGdDjdUguKhppjIiM2SsKkVhWi7M0kRskwq4mH7V8wXxlK0rmsSLWEPBl+3jhOopAJpjQoZe0rbNCuhfOgaFjqFzVHBe/AZRDbNjw1GKWj/oSsoU8giXpS/htvSDbC0eg8d0YkDRxEjoxF8fCnqG8NRJp3EHJilT1ZriFe3/oEgmhC1zNa3RKrlChCHF22fDiTXxyYPxcKVhM1r9ov0olv5RJP4ghlcoRiw2SoNbTw3xd8gQf95m71AcGbySy0zuVnr5TklFKoZvXywSwfNr78ogQQhteWRkrP/lSHcX7QRVBXJ6KqSwyBmpoy6yPKQSXqx2uEhkAoJ4qQLNQTybFUywOikMZNNToI2THhSGZHUzlk+PRG9Y8/eDi7NxNq8wqKeFyGakIcxSCXqK+osKQEkfZPiFTSTBUpGxvvhmsCfLCP+NQDeG78vVJoI0OlQdfKSioeSPCja5YPTvHsiU0vToDN1qEQWRJu6598iliCL7LYsP6RirMCfVDy+liw/uLCuVdzROgTYigzIlDAu+CUAflRkdDxTh7vuxJKcsbwvDzVtw92zPwQ7ES+dcOevUIfRBK8avFCWRfcFa9s3XqZRVh2vBIhHgvxl2VSyjGaHfrx238ZdLm87KQm1B9qv364vKmkgsktp9xpDdWQxyPIG/8sHO2tRHrJhx1GkTthnHwcoCAmEtlRUciNSZBoWvDyCPDeEPuU96cMMSroouieCfHUUCNgoIaZSkiboQqDga+No+jEUfqRUt7y56lgdOE1NdeeE7mxMcDe75WuywZd2rS5hmfJ3HHZIEO3d6RBAb44s+rXuO5AiLotdC4tkLc4ajf+ByhcydN/x01z/bjRcBiVGZ61s1MUEwlOj/BGPjXGlATe4CVnURFvfnkkTDZldNx4mgyilNLFBVJqBsm6yeLFU5ZwpFgycN0y28ggPVRMGshttcr7dty9JQofHwgcWpY0RlGWJOJKSio4Qhn9Y6AlROHunBcRLaejWr+eOFmUuUTSHsra65W72lIjA6EOJpQrK93L+zts6VkSdhrS+0XUo2x3GmSx8yc735lGoPCoLHR+CCM7Ng6rQ7yw/mXqJw6zxPe2S1cE71o8eEiD92T/++vBwxuGCC/kkvhjZzHw8OA+d9QI4FpRaYWQFILQaH1RkZ6KnzentFERkjvxppWa6klNGH/5t7KTsmGRpLial5vCAxJ1gCduFJfu5Vzmjasr+aWbGM34wYl7x050T/vsouqTz0gP9ZajLDXR/RzeDAv1wQYyqMvUJg1qvXlTGGJjJUT/kUFaMqh42HCYWppkxvBop/S1l8mg3RUW4Vaa2LmsjM+TvfrKpzzYSwzdWvJkXv94JAX54lblziZrdx86t2JpopqaajIt6mKxknLcFC+ScVrq2JpgX1yprOoe3tvF8Z9+Uf3TpycyCbUK+dEYYh98XslLE2GjCHEN8uJyhj4mnzj5n4z5LwYREhYmDEJbfb10MGdN5dyPgfqjh7oHHITlK3+N41rhCBVSD9IQf9JHqSQ4pAX6Yd/8L+UDGk57qyib+iryQoOwNswH1dSHHoyTGvbuEckhRFMonW7u3a90ffr23Qu+QlpQP1kDhgjqdQmx0AT2w8bJk9BF1Isd2nX/nsgbOZQ6vv//atADo/SMvkRkeefe7lZ6Y/Xir4GGC1JryRHW/m8WQOcfKPM7i1huJqFdJqGOnmA8mxShLjIGe7+ej61/m0HdmlAwKlQ21pqkta84usHiPtEcTYQf1CpfKfL4MZs7d+pFyTPPIos4WHoipXBihNQvmdTtt02cDN4SsZOX227dEoYB/eX3/l8GKa8wqslAXNtXoTwaQEYd+vZLwNTcIB964Enlb7M/RoY30XbqBWoigpJucJdOiJBIw+Nc3ppP9VP0Sd6AOOh8vXFek/aBW8k5UU+8jutNGx2I9LAQ7PjLWyj40yg5v+P+kxMaioJIb2qWMSSrveU2o7GrVaZIU+NNkR0VLfnjHxpE9c3s5WrllstupazFCaJbYC7FJJJn0CWvTISemEI6z7LJi1mR4UpTJY9lUk9IiVFYRC4ZzE+E5CUmIJlI557FiyDVHf3c3k8RCvWj5hwuZ+KrCSC4Z2SRMWmMXhR1NTEG7kMMyRnEB+9fr6U1mIkpnBDZ4dR7VH8cId6QZvpzUpv87gMMOLZwAXAyJ2cNI9TFwk07DJRGhlhm12EyAtyHJBrRe15UjEw9Hs5royOlYRlUW3nBREVeehFWY7s0qGr16gn8qFou1R97W0dRzIkjcRbF/SVWgo2OuBpfm0Fox5vCO+cvwv3a02L7m7OwNphQNuGP0i1CkmYD6bXNs2ZItsAR2j1/Dkg4haN0xBDZhZXHukLko1x/GHJVnKQgehJchqAwlH/0MY6u/Ed40uB4WqwPnUM1p1LJKOl5az8uWn63LoFqMzwUeWTYmoGRyKfOXxBMWRERjrXUeOXnETH/Y83855c6IYxAKRiaiAhs/fAtHFrwGXL798f/B2UHgh0RpsMRAAAAAElFTkSuQmCC"/>
-	</defs>
-	<style>
-		tspan { white-space:pre }
-		.shp0 { fill: #2996f2 } 
-	</style>
-	<path id="形状 1" class="shp0" d="M584.04 122.38C570.07 111.58 552.36 104.63 530.9 101.53C537.72 95.02 541.13 87.89 541.13 80.15C541.13 69.2 534.9 59.84 522.42 52.1C509.95 44.35 494.89 40.47 477.27 40.47C461.3 40.47 447.49 43.68 435.85 50.08C426.04 35.41 410.45 23.53 389.08 14.44C367.7 5.35 343.88 0.8 317.6 0.8C282.34 0.8 252.24 8.55 227.29 24.05C202.34 39.54 189.87 58.24 189.87 80.15C189.87 81.7 190.03 83.92 190.37 86.81C171.07 92.39 155.52 100.83 143.71 112.15C131.9 123.46 126 135.94 126 149.57C126 168.69 136.93 185.04 158.81 198.62C180.67 212.21 206.99 219 237.77 219L509.2 219C535.64 219 558.22 213.19 576.93 201.57C595.64 189.94 605 175.92 605 159.49C605 145.54 598.01 133.17 584.04 122.38Z" />
-	<path id="Tutor " fill="#ffffff" aria-label="Tutor"  d="M309.99 106.29L309.99 106.29Q309.99 110.7 306.68 113.07Q303.37 115.43 299.28 116.38Q298.02 116.69 296.76 116.85Q295.5 117.01 294.4 117.16Q292.98 117.32 291.56 117.48Q290.14 117.48 288.57 117.48Q286.05 117.48 283.21 117.32Q280.53 117.01 277.7 116.38Q276.91 116.22 275.96 116.06Q275.02 115.75 274.07 115.43Q273.6 116.22 273.29 117.16Q272.97 117.95 272.5 118.74Q272.18 119.68 271.87 120.63Q271.55 121.42 271.24 122.2Q270.61 123.94 269.98 125.83Q269.5 127.56 268.87 129.45Q268.4 131.03 267.77 132.76Q267.3 134.33 266.83 135.91Q262.42 148.83 256.27 160.96Q250.28 173.09 238.15 180.49Q229.81 185.38 219.41 187.58Q209.17 189.79 196.57 189.79Q193.57 189.79 190.11 189.47Q186.64 189.16 183.02 188.68Q174.67 186.95 167.74 182.54Q160.96 178.13 160.96 169.47Q160.96 162.53 165.37 157.49Q169.94 152.29 175.77 152.29Q177.98 152.29 180.18 153.24Q182.54 154.18 184.75 156.07Q185.06 156.39 185.22 156.71Q185.54 156.86 185.85 157.18Q186.01 157.49 186.17 157.81Q186.48 157.97 186.8 158.28Q184.91 160.33 183.17 162.85Q181.44 165.21 180.97 167.58Q180.81 168.21 180.81 168.68Q180.81 169.15 180.81 169.62Q180.81 171.2 181.6 172.93Q182.39 174.51 183.96 176.08Q185.85 177.81 188.06 178.76Q190.26 179.55 192.47 179.55Q193.1 179.55 193.57 179.55Q194.2 179.39 194.67 179.39Q198.14 178.76 201.29 176.87Q204.44 174.82 206.8 172.14Q210.27 168.05 213.58 161.59Q216.89 155.13 220.2 145.68Q220.35 145.36 220.35 145.05Q220.51 144.57 220.67 144.1Q221.46 141.74 222.24 139.22Q223.03 136.7 223.98 134.18Q226.5 126.46 230.28 119.21Q234.22 111.96 240.83 107.55Q239.26 106.92 237.52 106.61Q235.95 106.14 234.37 105.82Q232.8 105.51 231.07 105.35Q229.49 105.19 227.91 105.19Q222.72 105.35 217.83 106.77Q212.95 108.18 208.38 111.02Q203.18 114.49 199.4 119.84Q195.78 125.2 195.78 131.66Q195.78 132.29 195.78 133.07Q195.93 133.86 196.09 134.65Q196.57 137.33 197.67 138.9Q198.93 140.48 200.5 141.9Q201.29 142.53 201.92 143.16Q202.71 143.63 203.5 144.26Q203.18 144.42 202.87 144.57Q202.55 144.57 202.39 144.57Q201.61 144.89 200.82 145.2Q200.03 145.36 199.24 145.68Q197.2 146.31 194.99 146.78Q192.94 147.25 190.74 147.25Q189.63 147.25 188.22 147.1Q186.96 146.94 185.54 146.47Q179.08 144.57 175.46 138.75Q171.83 132.92 171.52 126.46Q171.52 126.14 171.52 125.83Q171.52 125.51 171.52 125.2Q171.52 123.46 171.67 121.89Q171.99 120.31 172.46 118.74Q174.35 112.75 179.39 108.03Q184.59 103.3 191.68 99.99Q198.14 97.31 205.23 96.05Q212.48 94.64 220.04 94.64Q228.39 94.64 236.58 96.21Q244.77 97.79 252.02 100.62Q255.64 98.26 260.05 97Q264.62 95.58 269.35 94.95Q272.66 94.48 275.81 94.32Q279.11 94.01 282.11 94.01Q284.31 94.01 287.62 94.16Q291.09 94.32 294.71 94.95Q300.38 95.9 305.11 98.42Q309.99 100.94 309.99 106.29ZM301.33 105.82L301.33 105.82Q301.64 105.35 301.8 105.03Q301.96 104.56 301.96 104.25Q301.96 103.14 300.54 102.67Q299.28 102.2 297.7 101.88Q296.76 101.72 295.81 101.72Q294.87 101.72 294.24 101.72Q293.92 101.72 293.61 101.72Q293.29 101.72 292.98 101.72Q289.35 102.2 285.89 104.25Q282.58 106.14 280.06 108.34Q282.11 108.97 284.94 109.44Q287.78 109.92 290.77 109.92Q293.92 109.92 296.76 108.97Q299.75 108.03 301.33 105.82ZM362.92 160.96L362.92 160.96Q362.77 161.27 362.45 161.75Q362.29 162.06 362.14 162.53Q359.46 167.89 356.15 173.09Q353 178.29 348.43 182.23Q344.02 185.85 338.51 187.9Q333.15 189.79 326.06 189.79Q319.29 189.79 314.24 186.64Q309.2 183.49 308.1 176.4Q302.74 182.07 295.5 186.01Q288.41 189.95 280.22 189.95Q271.71 189.95 267.61 184.9Q263.68 179.71 263.68 172.93Q263.68 170.57 264.15 168.21Q264.62 165.84 265.41 163.64Q266.83 159.7 268.09 155.92Q269.5 151.98 270.76 148.2Q272.02 144.26 273.29 140.48Q274.7 136.54 276.12 132.76L306.05 132.76Q304.48 137.17 302.9 141.58Q301.48 145.99 300.07 150.4Q298.49 154.81 296.92 159.23Q295.5 163.64 293.92 168.05Q293.76 168.68 293.45 169.47Q293.29 170.1 293.29 170.73Q293.29 171.67 293.76 172.3Q294.4 172.93 295.81 172.93Q297.39 172.93 299.59 171.83Q301.96 170.57 304.63 167.26Q308.1 163.32 310.46 158.12Q312.98 152.77 315.03 147.25Q315.82 144.73 316.61 142.21Q317.55 139.53 318.5 137.01Q318.66 136.38 318.81 135.91Q319.13 135.28 319.29 134.65Q319.29 134.33 319.29 134.18Q319.44 133.86 319.6 133.7Q319.6 133.55 319.6 133.55Q319.76 133.39 319.76 133.39Q319.76 133.23 319.76 133.07Q319.92 132.92 319.92 132.76Q322.44 132.76 324.8 132.76Q327.32 132.76 329.84 132.76Q334.72 132.76 339.61 132.76Q344.65 132.76 349.69 132.76Q348.12 137.01 346.54 141.42Q345.12 145.68 343.7 149.93Q342.29 154.34 340.71 158.75Q339.29 163.01 337.72 167.26Q337.25 168.52 337.09 169.62Q336.93 170.57 336.93 171.36Q336.93 172.62 337.4 173.25Q338.03 173.72 338.98 173.72Q339.92 173.72 341.03 173.25Q342.13 172.77 343.39 172.14Q344.18 171.51 344.96 170.88Q345.75 170.25 346.54 169.62Q349.53 166.94 351.42 163.95Q353.31 160.8 354.89 157.18L362.92 160.96ZM405.93 161.59L405.93 161.59Q405.62 162.38 405.14 163.16Q404.83 163.79 404.51 164.58Q401.99 169.62 399 174.35Q396.01 179.08 391.75 182.86Q387.81 186.32 382.3 188.37Q376.94 190.42 369.86 190.42Q369.54 190.42 369.22 190.42Q369.07 190.42 368.91 190.42Q364.5 190.26 360.4 188.68Q356.46 187.11 353.94 183.33Q352.37 180.97 351.58 178.29Q350.95 175.61 350.95 172.77Q350.95 171.99 350.95 171.36Q351.11 170.57 351.27 169.78Q351.58 167.58 352.05 165.37Q352.68 163.16 353.31 161.12Q354.26 158.6 355.05 156.07Q355.99 153.55 356.78 150.88Q357.57 148.36 358.35 145.84Q359.3 143.31 360.25 140.79L353.47 140.79L356.15 133.23L362.92 133.23Q363.71 130.87 364.5 128.66Q365.29 126.3 366.23 123.94Q367.02 121.73 367.81 119.53Q368.59 117.16 369.38 114.8Q374.58 114.01 379.78 113.38Q384.98 112.59 390.18 111.81Q392.7 111.49 395.38 111.18Q398.05 110.7 400.57 110.39Q399.63 113.23 398.53 116.06Q397.58 118.9 396.64 121.73Q395.69 124.57 394.59 127.56Q393.64 130.4 392.7 133.23L401.2 133.23L398.37 140.79L390.02 140.79Q388.92 144.1 387.66 147.57Q386.55 150.88 385.45 154.34Q384.19 157.81 383.09 161.27Q381.99 164.58 380.73 167.89Q380.41 168.99 380.09 170.1Q379.94 171.04 379.94 171.83Q379.94 173.25 380.57 173.88Q381.2 174.35 382.3 174.35Q383.25 174.35 384.35 173.88Q385.61 173.4 386.87 172.62Q387.5 172.14 388.13 171.67Q388.92 171.2 389.55 170.57Q392.54 167.89 394.43 164.58Q396.32 161.27 397.9 157.81L405.93 161.59ZM497.93 161.75L497.93 161.75Q496.99 163.64 495.73 166.31Q494.47 168.84 492.89 171.51Q489.9 176.71 485.49 181.12Q481.23 185.38 475.4 185.38Q473.04 185.38 470.84 184.75Q468.79 183.96 466.9 182.86Q460.75 187.9 452.4 190.73Q444.21 193.57 435.55 194.04Q434.92 194.04 434.13 194.04Q433.5 194.04 432.71 194.04Q424.52 194.04 416.96 191.68Q409.4 189.16 403.73 184.27Q399.16 180.18 397.11 175.61Q395.06 170.88 395.06 166.16Q395.06 158.75 399.47 151.98Q403.88 145.2 411.13 140.48Q417.43 136.38 425.31 134.02Q433.18 131.66 441.53 131.66Q442.79 131.66 443.9 131.81Q445.16 131.81 446.42 131.81Q453.19 132.44 459.65 134.81Q466.11 137.01 470.99 141.58Q475.25 145.36 477.45 150.25Q479.66 154.97 479.66 160.17Q479.66 162.06 479.34 163.95Q479.03 165.84 478.4 167.73Q480.6 167.42 482.18 166.63Q483.91 165.68 485.49 163.79Q486.43 162.85 487.38 161.43Q488.32 159.86 489.43 157.97L497.93 161.75ZM453.03 148.67L453.03 148.67Q452.88 143.79 451.14 141.74Q449.57 139.53 447.05 139.53Q445.47 139.53 443.58 140.48Q441.69 141.27 439.8 142.84Q439.01 143.47 438.23 144.26Q437.6 145.05 436.81 145.84Q433.18 150.09 430.98 155.6Q428.77 160.96 427.83 166.63Q427.67 168.52 427.51 170.41Q427.36 172.14 427.36 173.88Q427.36 174.82 427.36 176.24Q427.51 177.66 427.83 179.08Q428.3 181.75 429.4 183.96Q430.66 186.01 433.18 186.01Q437.12 186.01 440.12 183.33Q443.27 180.49 445.16 177.03Q445.63 176.24 446.1 175.61Q446.58 174.82 446.89 174.03Q444.37 172.3 442.95 169.78Q441.69 167.1 441.69 164.11Q441.69 163.79 441.69 163.48Q441.69 163.16 441.69 163.01Q442.16 158.28 445.16 154.18Q448.31 149.93 453.03 148.67ZM580.32 140.95L580.32 140.95Q580.64 141.9 580.64 142.84Q580.64 143.79 580.64 144.57Q580.64 150.4 577.02 153.87Q573.55 157.18 569.3 157.18Q569.14 157.18 568.98 157.18Q568.98 157.18 568.82 157.18Q565.52 157.18 562.52 154.97Q559.53 152.77 558.27 147.88Q557.8 146.47 557.01 145.84Q556.38 145.05 555.43 145.2Q553.86 145.2 551.81 147.1Q549.92 148.83 547.71 151.98Q543.93 156.86 541.25 162.85Q538.58 168.84 536.53 174.98Q535.58 177.66 534.8 180.18Q534.01 182.7 533.06 185.22Q532.75 186.16 532.43 187.11Q532.12 188.05 531.8 189L502.66 189L515.73 152.45Q516.05 151.82 516.05 151.35Q516.05 150.88 516.05 150.56Q516.05 148.83 514.63 148.36Q513.37 147.73 511.64 147.88Q507.54 148.36 504.39 151.66Q501.24 154.97 499.19 158.75Q498.72 159.54 498.25 160.49Q497.77 161.43 497.46 162.22L489.58 159.07Q493.68 148.36 501.56 139.85Q509.59 131.18 521.56 130.55Q522.67 130.4 523.77 130.4Q525.03 130.4 526.29 130.55Q531.49 130.87 536.21 133.23Q541.1 135.44 543.93 140.01Q547.4 137.49 551.18 135.28Q555.12 133.07 559.21 131.81Q561.1 131.18 562.84 131.03Q564.73 130.71 566.46 130.71Q568.82 130.71 571.03 131.34Q573.39 131.97 575.44 133.23Q577.49 134.65 578.59 136.7Q579.85 138.75 580.32 140.95Z" />
-	<path id="Title" fill="#2996f2" aria-label="天津师范大学师范生学业指导系统"  d="M35.19 283.54Q33.33 282.86 31.62 281.59Q29.96 280.32 27.72 277.92Q25.47 275.48 22.98 272.11Q20.49 268.74 17.95 265.23Q16.39 268.55 14.63 271.87Q12.87 275.19 11.12 277.29Q9.36 279.34 7.11 281.39Q5.74 282.76 3.74 282.76L2.77 282.27Q2.18 281.59 2.28 280.51L2.77 279.54Q4.72 278.56 6.92 276.17Q9.16 273.72 10.33 271.67Q11.51 269.62 12.38 267.87Q13.26 266.11 13.95 264.64Q14.63 263.18 15.02 261.62L5.11 261.71L4.13 261.22Q3.55 260.44 3.64 259.37L4.13 258.39L5.11 257.9L15.9 257.81Q16.1 255.66 16.29 253.51Q16.49 251.36 16.49 249.07L2.28 248.97Q1.5 248.87 0.91 248.38Q0.32 247.7 0.42 246.63L0.91 245.65L1.89 245.16L33.04 245.16Q34.41 245.16 35.58 245.84Q36.16 246.63 36.07 247.7L35.58 248.68Q34.8 249.36 33.63 249.16L20.29 249.07Q20.29 251.36 20.1 253.51Q19.9 255.66 19.71 257.81L30.26 257.81L31.28 258.29Q31.87 258.98 31.77 260.05L31.28 261.03Q30.6 261.52 29.77 261.62L20.69 261.62Q23.22 266.4 26.45 270.5Q29.67 274.6 37.04 280.32Q37.63 281 37.53 282.07L37.04 283.05Q36.26 283.64 35.19 283.54ZM75.67 284.81L74.69 284.32Q73.81 282.66 74.1 280.41L74.49 273.72Q71.08 274.02 68.78 274.07Q66.49 274.12 64.24 274.41L63.26 273.92Q62.58 273.14 62.68 272.06L63.17 271.09Q65.8 270.21 68.73 270.21Q71.66 270.21 74.49 269.92L74.4 267.38L70.69 267.47Q69.9 267.38 69.32 266.89Q68.73 266.21 68.83 265.13L69.32 264.15Q70.39 263.57 71.71 263.57Q73.03 263.57 74.3 263.57L74.3 261.42L68.24 261.42Q67.46 261.32 66.88 260.83Q66.29 260.15 66.39 259.08L66.88 258.1L67.85 257.61L74.2 257.61L74.1 254.58Q64.97 255.07 61.8 254.88Q60.92 253.8 61.02 252.73L61.51 251.75Q62.78 251.07 64.34 251.02Q65.9 250.97 73.91 250.78L74.01 248.68Q68.34 248.97 66.78 249.16L65.71 248.58Q65.12 247.8 65.22 246.72L65.71 245.75Q67.66 244.96 69.9 244.87L74.01 244.87Q73.71 243.11 74.59 241.74Q75.28 241.16 76.35 241.25L77.33 241.74Q78.11 243.11 77.81 244.87Q79.67 244.87 81.57 244.92Q83.53 244.96 84.7 245.11Q85.92 245.21 85.58 248.38L85.48 250.78L88.12 250.58L89.09 251.07Q89.68 251.85 89.58 252.92L89.09 253.9Q87.43 254.78 85.29 254.58L85.29 259.27Q85.24 260.74 84.26 260.83Q83.33 260.93 81.62 261.08Q79.96 261.22 78.21 261.32L78.11 263.57L83.53 263.47L84.5 263.96Q85.09 264.64 84.99 265.72L84.5 266.69Q83.14 267.38 81.48 267.38Q79.87 267.38 78.21 267.38L78.3 269.82L89.09 269.82L90.07 270.31Q90.66 270.99 90.56 272.06L90.07 273.04Q89.39 273.53 88.61 273.63L78.3 273.63Q78.11 276.31 78.06 279.05Q78.01 281.78 77.42 284.32Q76.74 284.91 75.67 284.81ZM50.62 284.13L49.45 284.22L48.47 283.73Q47.88 282.95 47.98 281.88L48.66 280.71Q50.32 279.24 52.08 277.83Q53.84 276.41 55.94 275.82L56.92 276.31Q57.5 277 57.4 278.07L56.72 279.14Q55.11 280.22 53.55 281.49Q51.98 282.76 50.62 284.13ZM56.53 259.27Q54.52 258.59 52.33 258.39Q50.13 258.2 48.18 257.61Q47.59 256.93 47.69 255.85L48.18 254.88Q49.45 254.1 51.2 254.39Q52.96 254.58 54.72 254.93Q56.53 255.27 58.09 255.95Q58.67 256.63 58.58 257.71L58.09 258.69Q57.4 259.17 56.53 259.27ZM78.01 257.51L81.48 257.32L81.48 254.58L77.91 254.58L78.01 257.51ZM77.72 250.78L81.57 250.78L81.67 248.68L77.81 248.68L77.72 250.78ZM57.4 249.46Q55.11 248.87 52.96 248.09Q50.81 247.31 48.66 246.43Q48.08 245.75 48.18 244.67L48.66 243.7Q49.45 243.01 50.62 243.21Q52.67 243.89 54.72 244.62Q56.82 245.36 58.87 246.14Q59.46 246.82 59.36 247.89L58.87 248.87Q58.19 249.36 57.4 249.46ZM102.28 283.83L101.3 283.34Q100.71 282.66 100.81 281.59Q101.3 280.41 102.18 279.63Q103.06 278.85 104.38 276.36Q105.74 273.82 106.33 270.36Q106.92 266.89 107.06 261.76Q107.26 256.59 106.82 243.99L107.31 243.01Q108.09 242.33 109.16 242.43L110.14 242.91Q110.72 244.09 110.68 245.45Q110.63 246.82 110.82 252.19Q111.02 257.51 110.87 262.84Q110.72 268.16 109.8 272.7Q108.87 277.19 104.96 282.46Q103.99 283.93 102.28 283.83ZM126.25 283.73L125.28 283.25Q124.79 282.66 124.69 281.88L124.4 257.9L117.85 258.1Q118.54 269.92 118.54 273.04L117.95 274.12Q117.27 274.7 116.19 274.6L115.22 274.12Q114.73 273.53 114.63 272.75L114.04 256.24Q114.24 255.17 115.12 254.58Q116 254 124.4 254.1L124.49 248.09L115.22 248.29L114.24 247.8Q113.65 247.02 113.75 245.94L114.24 244.96L115.22 244.48L136.75 243.99L137.73 244.48Q138.31 245.16 138.21 246.23L137.73 247.21Q135.58 247.99 133.14 247.94Q130.7 247.89 128.3 247.99L128.21 254L137.73 253.71Q138.9 254.14 139.19 255.17Q139.29 270.21 139.09 271.92Q138.9 273.63 138.17 274.6Q137.43 275.58 136.31 275.48Q135.19 275.38 133.92 274.65Q132.65 273.92 131.48 273.04Q130.89 272.36 130.99 271.28L131.48 270.31Q132.16 269.72 133.23 269.82L135.38 270.99Q135.58 269.53 135.68 267.96Q135.77 266.4 135.38 257.61L128.21 257.81L128.55 282.27L128.01 283.25Q127.33 283.83 126.25 283.73ZM98.37 262.4L97.39 261.91Q96.52 259.56 96.37 256.98Q96.22 254.39 96.13 245.94L96.61 244.96Q97.3 244.38 98.37 244.48L99.35 244.96L99.93 246.04Q99.93 254.1 100.18 256.39Q100.42 258.69 100.62 260.93L100.13 261.91Q99.45 262.49 98.37 262.4ZM150.23 284.22L149.25 283.73Q148.66 282.95 148.76 281.88L149.25 280.9Q152.67 277.68 153.69 276.95Q154.72 276.21 155.4 275.09Q156.13 274.51 157.21 274.6L158.19 275.09Q158.87 275.92 158.67 277.09L157.99 278.36L152.18 283.64Q151.4 284.32 150.23 284.22ZM172.93 283.93Q171.37 283.93 169.86 283.64Q168.34 283.34 167.51 282.66Q166.68 281.93 166.05 280.32Q165.41 278.66 165.31 274.41Q165.22 270.11 164.92 259.37L164.83 258L165.31 257.03Q167.17 256.44 169.27 256.34Q171.37 256.24 184.7 255.95L185.68 256.44Q186.36 257.42 186.16 258.78Q185.58 261.81 185.33 264.98Q185.09 268.16 183.72 270.99Q182.94 271.48 182.06 271.58Q179.96 270.89 178.3 269.33Q177.72 268.65 177.81 267.57L178.3 266.6Q178.99 266.01 180.06 266.11L181.28 266.69Q181.57 265.03 181.72 263.28Q181.87 261.52 182.06 259.76L168.73 260.15Q168.93 269.23 169.12 272.8Q169.32 276.31 169.56 277.73Q169.86 279.14 170.69 279.63Q171.56 280.12 174.01 280.22Q176.45 280.27 185.58 279.73L185.38 276.41L185.87 275.38Q186.55 274.8 187.63 274.9L188.61 275.38Q189.19 276.9 189.34 278.51Q189.48 280.12 189.48 281.88L189 282.86Q187.34 283.54 183.48 283.93Q179.62 284.27 172.93 283.93ZM153.45 269.23Q152.08 268.55 150.67 267.96Q149.25 267.38 147.88 266.79Q147.3 266.11 147.39 265.03L147.88 264.06Q148.76 263.37 149.93 263.57Q151.2 263.96 152.47 264.5Q153.74 265.03 154.82 265.81Q155.55 266.6 155.4 267.67L154.91 268.65Q154.23 269.13 153.45 269.23ZM155.4 261.13Q153.84 260.35 152.23 259.76Q150.62 259.17 148.96 258.59Q148.37 257.81 148.47 256.73L148.96 255.76Q149.84 255.07 151.01 255.27Q152.57 255.76 154.13 256.34Q155.74 256.93 157.21 257.81Q157.79 258.59 157.7 259.66L157.21 260.64Q156.53 261.22 155.4 261.13ZM160.92 253.8L159.94 253.31Q159.06 251.65 158.97 249.65L148.27 249.55Q147.49 249.46 146.91 248.97Q146.32 248.29 146.42 247.21L146.91 246.23L147.88 245.75L158.28 245.75Q157.79 243.99 157.79 242.62L158.28 241.64Q159.06 241.06 160.14 241.16L161.12 241.64Q161.9 243.5 162.09 245.65L173.81 245.84Q173.52 243.4 174.4 241.55Q175.08 240.96 176.15 241.06L177.13 241.55Q177.91 243.5 177.62 245.84L188.51 245.94L189.48 246.43Q190.07 247.11 189.97 248.19L189.48 249.16Q188.8 249.65 188.02 249.75L177.33 249.65Q177.33 251.46 176.64 252.83Q175.96 253.41 174.88 253.31L173.91 252.83Q173.22 251.95 173.32 250.78L173.42 249.65L162.78 249.46L163.26 252.24L162.68 253.31Q161.99 253.9 160.92 253.8ZM201.59 282.56L200.62 282.07Q200.03 281.39 200.13 280.32L200.71 279.24Q204.13 276.26 206.82 272.75Q209.55 269.23 211.07 266.25Q212.58 263.28 213.51 261.18Q214.44 259.08 214.88 256.98L200.13 257.32L199.15 256.83Q198.47 256.05 198.57 254.88L199.05 253.9Q200.42 253.02 202.18 253.22L215.31 252.83L215.51 245.55Q215.61 244.77 216.1 244.18Q216.88 243.6 217.95 243.7L218.93 244.18L219.42 245.16L219.12 252.83L234.5 252.83L235.58 253.41Q236.16 254.1 236.07 255.17L235.58 256.15L234.6 256.63L220 256.63Q223.81 261.91 227.47 266.94Q231.18 271.97 238.12 278.85Q238.7 279.54 238.61 280.61L238.12 281.59Q237.34 282.17 236.26 282.07Q228.5 274.7 225.08 269.92Q221.66 265.13 217.76 260.74Q215.71 266.5 212.43 271.53Q209.16 276.56 203.74 281.59Q202.86 282.66 201.59 282.56ZM267.95 285.39Q265.85 284.81 264.24 283Q263.56 282.27 263.65 281.2L264.14 280.27Q264.78 279.68 265.85 279.78Q266.83 280.32 267.76 281Q268.05 279.29 268.34 277.68Q268.63 276.02 268.63 274.16L253.16 274.65L252.23 274.16Q251.64 273.53 251.74 272.46L252.23 271.48Q253.11 270.84 254.13 270.84L267.85 270.55Q267.46 269.04 266 267.57Q264.58 266.11 265.75 265.33Q266.97 264.54 268.15 263.57Q269.37 262.59 271.22 260.59L261.55 260.39L260.38 259.86Q259.85 259.17 259.94 258.1L260.38 257.17L261.36 256.68L275.42 256.88Q277.57 256.93 276.84 259.17L274.74 262.35Q273.76 263.57 272.64 264.64Q271.56 265.67 270.34 266.64Q271.42 268.55 271.76 270.36Q275.23 270.55 278.74 270.75Q282.26 270.94 285.58 271.58Q286.16 272.26 286.07 273.33L285.58 274.26Q284.75 274.95 283.48 274.85L272.35 274.07Q272.15 277 271.81 279.78Q271.47 282.51 270.59 284.22Q269.76 285.88 267.95 285.39ZM285.29 261.57Q284.55 261.47 283.97 260.98Q283.38 260.3 283.48 259.27Q283.97 258.1 284.55 254.49L251.45 254Q251.64 255.76 251.84 257.17Q252.03 258.59 252.33 259.96L251.74 260.98Q251.06 261.57 250.03 261.47L249.05 260.98Q248.13 258.88 247.98 256.44Q247.83 254 247.44 251.7Q247.35 250.29 249.64 250.24L255.65 250.24L254.33 243.45Q254.43 242.67 254.91 242.13Q255.55 241.55 256.67 241.64L257.65 242.13Q258.38 244.04 258.72 246.19Q259.06 248.33 259.55 250.43L263.95 250.43Q263.56 248.14 263.21 246.38Q262.87 244.62 262.29 242.87L262.78 241.94Q263.56 241.25 264.58 241.35L265.56 241.84Q266.54 243.65 266.83 245.7Q267.17 247.75 267.37 250.43L274.05 250.43Q273.71 248.87 274.25 248.09Q274.84 247.26 275.52 245.55Q276.25 243.84 276.94 242.13Q277.62 241.55 278.64 241.64L279.62 242.13Q280.35 242.87 280.11 244.04Q279.72 245.75 278.94 247.36Q278.21 248.92 277.33 250.43Q285.38 250.87 286.85 250.92Q288.31 250.92 288.46 251.75Q288.65 252.58 288.07 256Q287.53 259.37 286.85 260.98Q286.16 261.47 285.29 261.57ZM302.28 283.83L301.3 283.34Q300.71 282.66 300.81 281.59Q301.3 280.41 302.18 279.63Q303.06 278.85 304.38 276.36Q305.74 273.82 306.33 270.36Q306.92 266.89 307.06 261.76Q307.26 256.59 306.82 243.99L307.31 243.01Q308.09 242.33 309.16 242.43L310.14 242.91Q310.72 244.09 310.68 245.45Q310.63 246.82 310.82 252.19Q311.02 257.51 310.87 262.84Q310.72 268.16 309.8 272.7Q308.87 277.19 304.96 282.46Q303.99 283.93 302.28 283.83ZM326.25 283.73L325.28 283.25Q324.79 282.66 324.69 281.88L324.4 257.9L317.85 258.1Q318.54 269.92 318.54 273.04L317.95 274.12Q317.27 274.7 316.19 274.6L315.22 274.12Q314.73 273.53 314.63 272.75L314.04 256.24Q314.24 255.17 315.12 254.58Q316 254 324.4 254.1L324.49 248.09L315.22 248.29L314.24 247.8Q313.65 247.02 313.75 245.94L314.24 244.96L315.22 244.48L336.75 243.99L337.73 244.48Q338.31 245.16 338.21 246.23L337.73 247.21Q335.58 247.99 333.14 247.94Q330.7 247.89 328.3 247.99L328.21 254L337.73 253.71Q338.9 254.14 339.19 255.17Q339.29 270.21 339.09 271.92Q338.9 273.63 338.17 274.6Q337.43 275.58 336.31 275.48Q335.19 275.38 333.92 274.65Q332.65 273.92 331.48 273.04Q330.89 272.36 330.99 271.28L331.48 270.31Q332.16 269.72 333.23 269.82L335.38 270.99Q335.58 269.53 335.68 267.96Q335.77 266.4 335.38 257.61L328.21 257.81L328.55 282.27L328.01 283.25Q327.33 283.83 326.25 283.73ZM298.37 262.4L297.39 261.91Q296.52 259.56 296.37 256.98Q296.22 254.39 296.13 245.94L296.61 244.96Q297.3 244.38 298.37 244.48L299.35 244.96L299.93 246.04Q299.93 254.1 300.18 256.39Q300.42 258.69 300.62 260.93L300.13 261.91Q299.45 262.49 298.37 262.4ZM350.23 284.22L349.25 283.73Q348.66 282.95 348.76 281.88L349.25 280.9Q352.67 277.68 353.69 276.95Q354.72 276.21 355.4 275.09Q356.13 274.51 357.21 274.6L358.19 275.09Q358.87 275.92 358.67 277.09L357.99 278.36L352.18 283.64Q351.4 284.32 350.23 284.22ZM372.93 283.93Q371.37 283.93 369.86 283.64Q368.34 283.34 367.51 282.66Q366.68 281.93 366.05 280.32Q365.41 278.66 365.31 274.41Q365.22 270.11 364.92 259.37L364.83 258L365.31 257.03Q367.17 256.44 369.27 256.34Q371.37 256.24 384.7 255.95L385.68 256.44Q386.36 257.42 386.16 258.78Q385.58 261.81 385.33 264.98Q385.09 268.16 383.72 270.99Q382.94 271.48 382.06 271.58Q379.96 270.89 378.3 269.33Q377.72 268.65 377.81 267.57L378.3 266.6Q378.99 266.01 380.06 266.11L381.28 266.69Q381.57 265.03 381.72 263.28Q381.87 261.52 382.06 259.76L368.73 260.15Q368.93 269.23 369.12 272.8Q369.32 276.31 369.56 277.73Q369.86 279.14 370.69 279.63Q371.56 280.12 374.01 280.22Q376.45 280.27 385.58 279.73L385.38 276.41L385.87 275.38Q386.55 274.8 387.63 274.9L388.61 275.38Q389.19 276.9 389.34 278.51Q389.48 280.12 389.48 281.88L389 282.86Q387.34 283.54 383.48 283.93Q379.62 284.27 372.93 283.93ZM353.45 269.23Q352.08 268.55 350.67 267.96Q349.25 267.38 347.88 266.79Q347.3 266.11 347.39 265.03L347.88 264.06Q348.76 263.37 349.93 263.57Q351.2 263.96 352.47 264.5Q353.74 265.03 354.82 265.81Q355.55 266.6 355.4 267.67L354.91 268.65Q354.23 269.13 353.45 269.23ZM355.4 261.13Q353.84 260.35 352.23 259.76Q350.62 259.17 348.96 258.59Q348.37 257.81 348.47 256.73L348.96 255.76Q349.84 255.07 351.01 255.27Q352.57 255.76 354.13 256.34Q355.74 256.93 357.21 257.81Q357.79 258.59 357.7 259.66L357.21 260.64Q356.53 261.22 355.4 261.13ZM360.92 253.8L359.94 253.31Q359.06 251.65 358.97 249.65L348.27 249.55Q347.49 249.46 346.91 248.97Q346.32 248.29 346.42 247.21L346.91 246.23L347.88 245.75L358.28 245.75Q357.79 243.99 357.79 242.62L358.28 241.64Q359.06 241.06 360.14 241.16L361.12 241.64Q361.9 243.5 362.09 245.65L373.81 245.84Q373.52 243.4 374.4 241.55Q375.08 240.96 376.15 241.06L377.13 241.55Q377.91 243.5 377.62 245.84L388.51 245.94L389.48 246.43Q390.07 247.11 389.97 248.19L389.48 249.16Q388.8 249.65 388.02 249.75L377.33 249.65Q377.33 251.46 376.64 252.83Q375.96 253.41 374.88 253.31L373.91 252.83Q373.22 251.95 373.32 250.78L373.42 249.65L362.78 249.46L363.26 252.24L362.68 253.31Q361.99 253.9 360.92 253.8ZM401.89 284.03Q401.11 283.93 400.52 283.44Q399.93 282.66 400.03 281.59L400.52 280.61Q401.2 280.02 402.18 280.02L417.27 279.73L417.17 268.45L410.43 269.04Q409.65 268.94 409.06 268.45Q408.48 267.77 408.58 266.69L409.06 265.72Q410.92 265.03 413.02 264.89Q415.12 264.74 417.17 264.64L416.97 255.76L406.62 256.05Q405.94 258.2 405.3 260.44Q404.67 262.69 403.55 264.64Q402.57 265.62 401.2 265.42L400.23 264.94Q399.64 264.25 399.74 263.18Q400.81 261.71 401.69 259.27Q402.57 256.83 403.5 252.53Q404.47 248.19 405.26 243.99Q405.94 243.4 407.01 243.5L407.99 243.99Q408.77 245.16 408.48 246.72Q408.09 247.99 407.89 249.46Q407.7 250.87 407.5 252.24L416.78 252.04Q416.39 244.96 416.49 244.18L416.97 243.21Q417.76 242.52 418.93 242.72L419.9 243.21Q420.49 243.89 420.59 244.77L420.59 251.85L428.11 251.85Q429.52 251.95 430.99 251.95Q432.45 251.95 433.63 252.53Q434.21 253.22 434.11 254.29L433.63 255.27Q432.45 256.05 430.99 255.85L420.78 255.66L420.98 264.45L429.52 264.25L430.5 264.74Q431.09 265.42 430.99 266.5L430.5 267.47Q429.33 268.06 427.86 268.11Q426.45 268.16 420.98 268.26L421.08 279.44Q425.47 279.24 428.89 279Q432.36 278.75 435.77 278.66L436.95 279.24Q437.53 279.93 437.43 281L436.95 281.98Q430.89 282.76 424.69 283.05Q418.54 283.34 401.89 284.03ZM467.95 285.39Q465.85 284.81 464.24 283Q463.56 282.27 463.65 281.2L464.14 280.27Q464.78 279.68 465.85 279.78Q466.83 280.32 467.76 281Q468.05 279.29 468.34 277.68Q468.63 276.02 468.63 274.16L453.16 274.65L452.23 274.16Q451.64 273.53 451.74 272.46L452.23 271.48Q453.11 270.84 454.13 270.84L467.85 270.55Q467.46 269.04 466 267.57Q464.58 266.11 465.75 265.33Q466.97 264.54 468.15 263.57Q469.37 262.59 471.22 260.59L461.55 260.39L460.38 259.86Q459.85 259.17 459.94 258.1L460.38 257.17L461.36 256.68L475.42 256.88Q477.57 256.93 476.84 259.17L474.74 262.35Q473.76 263.57 472.64 264.64Q471.56 265.67 470.34 266.64Q471.42 268.55 471.76 270.36Q475.23 270.55 478.74 270.75Q482.26 270.94 485.58 271.58Q486.16 272.26 486.07 273.33L485.58 274.26Q484.75 274.95 483.48 274.85L472.35 274.07Q472.15 277 471.81 279.78Q471.47 282.51 470.59 284.22Q469.76 285.88 467.95 285.39ZM485.29 261.57Q484.55 261.47 483.97 260.98Q483.38 260.3 483.48 259.27Q483.97 258.1 484.55 254.49L451.45 254Q451.64 255.76 451.84 257.17Q452.03 258.59 452.33 259.96L451.74 260.98Q451.06 261.57 450.03 261.47L449.05 260.98Q448.13 258.88 447.98 256.44Q447.83 254 447.44 251.7Q447.35 250.29 449.64 250.24L455.65 250.24L454.33 243.45Q454.43 242.67 454.91 242.13Q455.55 241.55 456.67 241.64L457.65 242.13Q458.38 244.04 458.72 246.19Q459.06 248.33 459.55 250.43L463.95 250.43Q463.56 248.14 463.21 246.38Q462.87 244.62 462.29 242.87L462.78 241.94Q463.56 241.25 464.58 241.35L465.56 241.84Q466.54 243.65 466.83 245.7Q467.17 247.75 467.37 250.43L474.05 250.43Q473.71 248.87 474.25 248.09Q474.84 247.26 475.52 245.55Q476.25 243.84 476.94 242.13Q477.62 241.55 478.64 241.64L479.62 242.13Q480.35 242.87 480.11 244.04Q479.72 245.75 478.94 247.36Q478.21 248.92 477.33 250.43Q485.38 250.87 486.85 250.92Q488.31 250.92 488.46 251.75Q488.65 252.58 488.07 256Q487.53 259.37 486.85 260.98Q486.16 261.47 485.29 261.57ZM522.69 241.79Q523.91 240.52 525.28 241.69Q526.15 243.6 525.96 245.89L526.69 279.68Q534.7 279.83 536.75 279.63Q538.85 279.39 540.22 280.9Q540.9 282.17 540.07 283.1Q539.29 283.98 538.41 283.73Q524.05 283.2 497.15 283.15Q495.44 281.29 496.56 280.07Q498.32 279.19 500.32 279.39Q503.94 279.34 511.7 279.54Q510.58 244.13 510.68 243.16Q510.82 242.18 511.9 241.64Q513.02 241.11 514.24 243.06Q514.44 244.82 515.41 279.49L522.93 279.49Q522.15 244.28 522.25 243.21Q522.35 242.08 522.69 241.79ZM535.82 251.36Q537.14 249.95 538.51 251.21Q539.78 252.73 538.36 254.29Q537.78 255.07 533.38 264.84Q532.89 266.55 531.77 267.87Q530.5 268.7 529.43 267.67Q528.35 266.3 529.28 264.69Q530.06 262.74 530.94 260.49Q531.82 258.2 533.14 255.56Q534.5 252.88 535.82 251.36ZM497.83 253.17Q498.32 252.68 499.05 252.63Q500.42 252.73 501.06 254Q501.54 254.68 504.04 259.91Q506.57 265.13 506.92 267.13Q506.62 268.65 505.06 268.84Q503.3 268.5 502.91 266.74L498.66 257.17Q496.52 255.27 497.83 253.17ZM556.43 284.81Q555.21 284.52 554.18 283.78Q553.16 283.05 552.18 282.27Q551.59 281.59 551.69 280.51L552.18 279.54Q552.86 278.95 553.94 279.05L554.82 279.34L555.01 269.62Q552.86 270.01 551.2 270.6Q549.54 271.19 547.79 271.38L546.81 270.89Q546.22 270.21 546.32 269.13L546.81 268.16Q548.66 267.18 550.76 266.69Q552.86 266.21 554.91 265.62L555.21 252.44L548.18 252.34Q547.39 252.24 546.81 251.75Q546.22 250.97 546.32 249.85L546.81 248.87Q547.59 248.29 548.66 248.38L555.3 248.58L555.3 242.43L555.94 241.25Q556.62 240.67 557.7 240.77L558.67 241.25L559.16 242.23L559.16 248.58L563.65 248.58L564.63 249.07Q565.22 249.85 565.12 250.97L564.63 251.95Q563.56 252.63 562.19 252.58Q560.82 252.53 559.06 252.44L558.87 264.64L562.68 264.06L563.65 264.54Q564.24 265.33 564.14 266.4L563.65 267.38Q561.41 268.16 558.97 268.65Q558.67 277.68 558.72 279.97Q558.77 282.27 558.23 283.69Q557.75 285.1 556.43 284.81ZM586.16 285.49L571.27 285.49Q570.49 285.39 569.9 284.86Q569.32 284.32 569.22 283.54L568.59 266.74Q568.39 264.64 570.29 264.54L586.55 264.54Q587.34 264.64 588.02 265.38Q588.7 266.11 588.61 267.47Q588.21 282.66 588.02 284.08Q587.82 285.49 586.16 285.49ZM573.03 281.68L584.41 281.59L584.5 277L572.64 276.9L573.03 281.68ZM572.54 273.04L584.8 273.14L584.8 268.35L572.64 268.35L572.54 273.04ZM585.77 262.69Q581.96 262.49 578.11 262.15Q574.3 261.81 571.76 259.56Q569.22 257.32 568.59 254.49Q567.95 251.65 567.95 243.01Q568.05 242.23 568.54 241.64Q569.32 241.06 570.39 241.16L571.37 241.64Q571.96 242.33 571.86 243.4L571.76 246.72Q575.76 246.33 579.23 246.09Q582.75 245.84 586.16 245.65L587.43 246.23Q588.12 247.02 588.02 248.09L587.53 249.07Q583.72 249.75 579.67 249.9Q575.67 250.04 571.76 250.68Q572.25 252.63 572.49 254.14Q572.74 255.66 574.74 257.07Q576.74 258.49 580.35 258.54Q584.02 258.59 587.34 259.37Q587.92 260.05 587.82 261.13L587.34 262.1Q586.65 262.59 585.77 262.69ZM626.94 285.59Q625.67 285.49 624.59 284.71Q623.52 283.93 622.44 283.25Q621.86 282.56 621.96 281.49L622.44 280.51Q623.22 279.93 624.3 280.02L625.47 280.61L625.08 272.26L598.96 272.16Q598.18 272.06 597.59 271.58Q597 270.89 597.1 269.82L597.59 268.84L598.57 268.35L624.79 268.45L624.49 264.54Q620.88 264.74 617.66 264.59Q614.44 264.45 610.97 263.81Q607.5 263.18 605.21 260Q602.96 256.83 602.47 251.26Q602.03 245.7 602.08 244.09Q602.18 242.43 603.06 242.08Q603.99 241.74 609.65 241.84Q615.31 241.94 629.87 241.45Q631.57 241.64 631.92 242.77Q632.26 243.89 632.11 246.09Q631.96 248.29 631.57 249.99Q631.23 251.65 630.84 253.12Q630.45 254.54 628.3 254.58L606.82 254.97Q607.01 257.03 608.67 258.54Q610.33 260.05 612.97 260.35Q615.61 260.64 618.2 260.69Q620.78 260.74 631.87 260.44Q631.77 258 632.65 255.95Q633.33 255.37 634.41 255.46L635.38 255.95Q636.07 256.83 635.87 258Q635.68 259.37 635.58 261.62Q635.53 263.81 634.55 264.11Q633.63 264.35 631.82 264.3Q630.06 264.25 628.3 264.35L628.69 268.45L633.72 268.55Q636.26 268.45 638.51 269.23Q639.09 269.92 639 270.99L638.51 271.97Q637.14 272.75 635.38 272.55L628.99 272.36L629.28 283.64Q629.18 284.42 628.55 285Q627.91 285.59 626.94 285.59ZM614.14 281.59Q612.78 280.9 611.55 279.97Q610.33 279.05 609.06 278.17Q608.38 277.39 608.48 276.31L608.97 275.34Q609.75 274.7 610.82 274.8Q613.17 276.61 614.29 277.24Q615.41 277.88 616.29 278.95L616.39 280.12L615.9 281.1Q615.22 281.68 614.14 281.59ZM627.33 250.78L628.11 245.26Q616.1 245.55 612.73 245.7Q609.36 245.84 605.89 245.84L606.18 251.17L627.33 250.78ZM667.17 285.49L666.24 285Q665.56 282.66 665.56 280.02Q665.56 277.34 665.36 270.4Q659.02 270.4 656.87 270.6Q654.77 270.79 653.3 270.79Q651.89 270.79 651.3 270.26Q650.76 269.67 651.01 268.65Q651.25 267.57 652.42 266.64Q653.64 265.67 661.75 259.17Q658.14 257.03 657.21 256.29Q656.33 255.56 656.92 254.05Q657.55 252.53 659.02 250.68Q660.53 248.77 661.85 246.87Q659.85 247.16 658.48 247.55Q657.11 247.94 655.7 248.29Q654.96 248.19 654.38 247.75Q653.79 246.97 653.89 245.94L654.38 244.96Q659.55 243.35 664.92 242.62Q670.34 241.84 675.76 241.55L676.74 242.04Q677.28 242.67 677.18 243.74L676.74 244.67Q674.64 245.36 672.3 245.45Q669.95 245.55 667.07 246.14L661.02 254.34Q662.14 255.02 665.66 256.63L669.76 253.02Q671.17 250.87 673.47 250.87L674.45 251.36Q674.98 252.14 674.88 253.22L674.45 254.14Q662.34 263.57 659.11 266.79L677.57 265.96L675.76 263.96Q675.18 263.28 675.28 262.25L675.76 261.27Q676.54 260.74 677.57 260.83L678.55 261.27Q680.06 262.69 681.13 264.5Q682.21 266.25 684.31 268.6Q685.43 269.67 685.33 271.19L684.85 272.11Q684.21 272.7 683.14 272.6L682.21 272.11L679.96 269.48L669.07 270.21L669.37 284.08L668.93 285Q668.24 285.59 667.17 285.49ZM654.38 282.66L653.45 282.17Q652.86 281.39 652.96 280.37Q654.18 278.75 655.21 277.14Q656.23 275.48 657.31 273.72Q658.14 272.99 659.31 273.19L660.24 273.68Q660.82 274.31 660.72 275.38Q659.41 277.39 658.72 278.56Q658.04 279.68 656.13 282.17Q655.45 282.76 654.38 282.66ZM682.4 281.78L681.33 281.2Q679.96 280.17 674.88 276.56Q674.35 275.87 674.45 274.8L674.88 273.82Q675.67 273.19 676.79 273.38Q678.69 274.21 680.35 275.68Q682.01 277.14 684.11 278.56Q684.65 279.29 684.55 280.37L684.11 281.29Q683.43 281.88 682.4 281.78ZM734.99 284.61Q733.43 284.32 731.82 283.93Q730.26 283.54 728.64 281.98Q727.08 280.41 726.69 276.31Q726.3 272.21 726.54 266.4Q726.64 265.62 727.13 265.03Q727.81 264.45 728.89 264.54L729.87 265.03L730.35 266.01Q730.06 272.21 730.26 275.09Q730.45 277.97 731.77 279.14Q733.14 280.32 734.31 280.61Q735.48 280.9 736.85 280.8Q736.55 278.66 737.34 276.9Q738.02 276.31 739.09 276.41L740.07 276.9Q740.56 277.58 740.66 278.36L740.66 283.05Q740.95 284.66 739.48 284.61Q738.02 284.56 734.99 284.61ZM713.36 283.93L712.38 283.44Q711.8 282.76 711.9 281.68L712.38 280.71Q714.04 279.54 715.56 278.02Q717.07 276.51 718.05 274.51Q719.03 272.46 719.37 270.01Q719.71 267.57 720.29 265.23Q720.98 264.64 722.05 264.74L723.03 265.23Q723.81 266.99 723.52 269.13Q722.93 271.38 722.39 273.68Q721.86 275.97 720.25 278.41Q718.63 280.8 715.41 283.25Q714.63 284.03 713.36 283.93ZM697.3 280.22Q696.52 280.12 695.93 279.63Q695.34 278.95 695.44 277.88L695.93 276.9Q699.64 275.97 711.12 273.72L712.09 274.21Q712.68 274.9 712.58 275.97L712.09 277Q708.48 277.88 697.3 280.22ZM697.88 271.19Q695.1 271.43 696.03 268.84L702.08 258.29L698.08 254.19Q696.27 252.48 697.05 251.41Q697.88 250.29 702.38 243.89Q703.55 242.43 705.4 242.43L706.43 242.91Q707.01 243.6 706.92 244.67L706.43 245.65L701.3 251.95L704.72 255.37L706.13 253.12Q706.82 252.53 707.89 252.63L708.87 253.12Q709.55 253.9 709.36 255.07L701.5 266.79Q708.09 265.72 710.14 265.52L711.12 266.01Q711.7 266.69 711.6 267.77L711.12 268.74Q707.99 269.72 697.88 271.19ZM735.29 263.57L734.21 262.98L733.23 261.32L716.78 262.79Q714.14 262.69 714.92 260.35L721.27 250.73L713.85 251.17L712.68 250.53Q712.09 249.85 712.19 248.77L712.68 247.8Q715.31 247.02 718.2 247.02Q721.08 247.02 723.91 246.92Q723.91 245.65 723.86 244.28Q723.81 242.91 724.49 241.84Q725.18 241.25 726.25 241.35L727.23 241.84L727.72 242.82L727.72 247.02L735.77 247.02Q737.63 247.02 739.09 247.8Q739.68 248.48 739.58 249.55L739.09 250.53Q738.31 251.17 737.34 251.17L726.06 250.82L720.59 258.69L731.09 257.71Q729.87 256.44 729.87 254.78L730.35 253.8Q731.09 253.22 732.16 253.31L733.14 253.8Q736.85 260.05 737.53 262.1L737.04 263.08Q736.36 263.67 735.29 263.57Z" />
-	<use id="Logo" href="#img1" x="458" y="65" />
-</svg>
\ No newline at end of file
diff --git a/docs/_images/tutor.jpg b/docs/_images/tutor.jpg
deleted file mode 100644
index 8cc0f68e64e6e30bf3bc9cfe60836099af75159b..0000000000000000000000000000000000000000
Binary files a/docs/_images/tutor.jpg and /dev/null differ
diff --git a/docs/_media/favicon.ico b/docs/_media/favicon.ico
deleted file mode 100644
index f2d4490af1046ea50678211929e79b8b6e6697b2..0000000000000000000000000000000000000000
Binary files a/docs/_media/favicon.ico and /dev/null differ
diff --git a/docs/_sidebar.md b/docs/_sidebar.md
deleted file mode 100644
index 239726347b4b059217c1c7048d300c3ce758cde7..0000000000000000000000000000000000000000
--- a/docs/_sidebar.md
+++ /dev/null
@@ -1,13 +0,0 @@
-- 登陆系统
-  
-  - [快速了解](introduce.md)
-
-- 信息修改
-
-- 学生使用
-
-- 导师使用
-
-- 管理员使用
-
-- 其他问题
diff --git a/docs/index.html b/docs/index.html
deleted file mode 100644
index c9d3c1f4efa0d215ef0af44bf7ef1b931377a635..0000000000000000000000000000000000000000
--- a/docs/index.html
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE html>
-<html lang="zh">
-<head>
-  <meta charset="UTF-8">
-  <title>师范生学业指导系统</title>
-  <link rel="icon" href="_media/favicon.ico" />
-  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
-  <meta name="description" content="天津师范大学师范生学业指导系统相关文档">
-  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0">
-  <link rel="stylesheet" href="//cdn.jsdelivr.net/npm/docsify@4/lib/themes/vue.css">
-</head>
-<body>
-  <div id="app">正在努力加载中!</div>
-  <script src="//cdn.jsdelivr.net/npm/docsify-edit-on-github"></script>
-  <script>
-    window.$docsify = {
-	  auto2top: true,
-	  loadSidebar: true,
-	  coverpage: true,
-      name: 'Tutor',
-      repo: 'https://gitee.com/Suomm/tutor',
-	  search: {
-		placeholder: '搜索',
-		noData: '找不到结果'
-	  },
-	  copyCode: {
-		buttonText : '点击复制',
-		errorText  : '错误',
-		successText: '复制'
-	  },
-	  plugins: [
-		EditOnGithubPlugin.create("https://gitee.com/Suomm/tutor/blob/master/docs/", null, "Edit on gitee"),
-		function (hook) {
-          hook.afterEach(function (html) {
-            return html + '<hr/>' + '<a href="https://docsify.js.org" target="_blank" style="color: inherit; font-weight: normal; text-decoration: none;">Powered by docsify.</a>'
-          })
-        }
-	  ]
-    }
-  </script>
-  <!-- Docsify v4 -->
-  <script src="//cdn.jsdelivr.net/npm/docsify@4"></script>
-  <script src="//cdn.jsdelivr.net/npm/docsify/lib/plugins/search.min.js"></script>
-  <script src="//cdn.jsdelivr.net/npm/docsify-copy-code/dist/docsify-copy-code.min.js"></script>
-  <script src="//cdn.jsdelivr.net/npm/prismjs@1/components/prism-java.min.js"></script>
-</body>
-</html>
diff --git a/docs/introduce.md b/docs/introduce.md
deleted file mode 100644
index bfd470dddb35309686d7e09fe3b93dd3f4f7c7f1..0000000000000000000000000000000000000000
--- a/docs/introduce.md
+++ /dev/null
@@ -1 +0,0 @@
-# 介绍
diff --git a/index.html b/index.html
index 5b99faf679245060d6fb43ebe4bc4442cd5341ff..17f109a017f94e79ae56c21a54159ac809ff71db 100644
--- a/index.html
+++ b/index.html
@@ -8,29 +8,28 @@
       name="viewport"
       content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=0"
     />
-
     <title><%= title %></title>
     <link rel="icon" href="/favicon.ico" />
   </head>
   <body>
     <script>
       (() => {
-        var htmlRoot = document.getElementById('htmlRoot');
-        var theme = window.localStorage.getItem('__APP__DARK__MODE__');
+        var htmlRoot = document.getElementById("htmlRoot");
+        var theme = window.localStorage.getItem("__APP__DARK__MODE__");
         if (htmlRoot && theme) {
-          htmlRoot.setAttribute('data-theme', theme);
+          htmlRoot.setAttribute("data-theme", theme);
           theme = htmlRoot = null;
         }
       })();
     </script>
     <div id="app">
       <style>
-        html[data-theme='dark'] .app-loading {
+        html[data-theme="dark"] .app-loading {
           background-color: #2c344a;
         }
 
-        html[data-theme='dark'] .app-loading .app-loading-title {
-          color: rgba(255, 255, 255, 0.85);
+        html[data-theme="dark"] .app-loading .app-loading-title {
+          color: rgb(255 255 255 / 85%);
         }
 
         .app-loading {
@@ -48,7 +47,6 @@
           top: 50%;
           left: 50%;
           display: flex;
-          -webkit-transform: translate3d(-50%, -50%, 0);
           transform: translate3d(-50%, -50%, 0);
           justify-content: center;
           align-items: center;
@@ -66,7 +64,7 @@
           display: flex;
           margin-top: 30px;
           font-size: 30px;
-          color: rgba(0, 0, 0, 0.85);
+          color: rgb(0 0 0 / 85%);
           justify-content: center;
           align-items: center;
         }
@@ -97,7 +95,7 @@
           height: 20px;
           background-color: #0065cc;
           border-radius: 100%;
-          opacity: 0.3;
+          opacity: 30%;
           transform: scale(0.75);
           animation: antSpinMove 1s infinite linear alternate;
           transform-origin: 50% 50%;
@@ -111,43 +109,38 @@
         .dot i:nth-child(2) {
           top: 0;
           right: 0;
-          -webkit-animation-delay: 0.4s;
           animation-delay: 0.4s;
         }
 
         .dot i:nth-child(3) {
           right: 0;
           bottom: 0;
-          -webkit-animation-delay: 0.8s;
           animation-delay: 0.8s;
         }
 
         .dot i:nth-child(4) {
           bottom: 0;
           left: 0;
-          -webkit-animation-delay: 1.2s;
           animation-delay: 1.2s;
         }
         @keyframes antRotate {
           to {
-            -webkit-transform: rotate(405deg);
             transform: rotate(405deg);
           }
         }
-        @-webkit-keyframes antRotate {
+        @keyframes antRotate {
           to {
-            -webkit-transform: rotate(405deg);
             transform: rotate(405deg);
           }
         }
         @keyframes antSpinMove {
           to {
-            opacity: 1;
+            opacity: 100%;
           }
         }
-        @-webkit-keyframes antSpinMove {
+        @keyframes antSpinMove {
           to {
-            opacity: 1;
+            opacity: 100%;
           }
         }
       </style>
diff --git a/mock/_createProductionServer.ts b/mock/_createProductionServer.ts
index a44310b91d4ce06a80d1cdd1ea9a69cc8acbc359..86baae4429082568ee7cc3b71bb3bf69dd3bf61a 100644
--- a/mock/_createProductionServer.ts
+++ b/mock/_createProductionServer.ts
@@ -1,10 +1,10 @@
-import { createProdMockServer } from 'vite-plugin-mock/es/createProdMockServer';
+import { createProdMockServer } from "vite-plugin-mock/es/createProdMockServer";
 
-const modules = import.meta.globEager('./**/*.ts');
+const modules = import.meta.globEager("./**/*.ts");
 
 const mockModules: any[] = [];
 Object.keys(modules).forEach((key) => {
-  if (key.includes('/_')) {
+  if (key.includes("/_")) {
     return;
   }
   mockModules.push(...modules[key].default);
diff --git a/mock/_util.ts b/mock/_util.ts
index 97c87564fe3e0a6e7759b98f368dc15df6c7de78..63c940c817a2ba78c651886c17179dbd745ce6d8 100644
--- a/mock/_util.ts
+++ b/mock/_util.ts
@@ -1,11 +1,12 @@
 // Interface data format used to return a unified format
+import { ResultEnum } from "/@/enums/httpEnum";
 
-export function resultSuccess<T = Recordable>(result: T, { message = 'ok' } = {}) {
+export function resultSuccess<T = Recordable>(data: T, { message = "ok" } = {}) {
   return {
-    code: 0,
-    result,
+    code: ResultEnum.SUCCESS,
+    data,
     message,
-    type: 'success',
+    type: "success",
   };
 }
 
@@ -13,7 +14,7 @@ export function resultPageSuccess<T = any>(
   page: number,
   pageSize: number,
   list: T[],
-  { message = 'ok' } = {},
+  { message = "ok" } = {},
 ) {
   const pageData = pagination(page, pageSize, list);
 
@@ -26,22 +27,23 @@ export function resultPageSuccess<T = any>(
   };
 }
 
-export function resultError(message = 'Request failed', { code = -1, result = null } = {}) {
+export function resultError(
+  message = "Request failed",
+  { code = ResultEnum.ERROR, result: data = null } = {},
+) {
   return {
     code,
-    result,
+    data,
     message,
-    type: 'error',
+    type: "error",
   };
 }
 
 export function pagination<T = any>(pageNo: number, pageSize: number, array: T[]): T[] {
   const offset = (pageNo - 1) * Number(pageSize);
-  const ret =
-    offset + Number(pageSize) >= array.length
-      ? array.slice(offset, array.length)
-      : array.slice(offset, offset + Number(pageSize));
-  return ret;
+  return offset + Number(pageSize) >= array.length
+    ? array.slice(offset, array.length)
+    : array.slice(offset, offset + Number(pageSize));
 }
 
 export interface requestParams {
diff --git a/mock/demo/account.ts b/mock/demo/account.ts
index a39249315733cdd18360a9ea2ff32761d787fe80..8547305c1d13b56a45b3dd8e5b19e571b922d1f4 100644
--- a/mock/demo/account.ts
+++ b/mock/demo/account.ts
@@ -1,71 +1,71 @@
-import { MockMethod } from 'vite-plugin-mock';
-import { resultSuccess, resultError } from '../_util';
-import { ResultEnum } from '../../src/enums/httpEnum';
+import { MockMethod } from "vite-plugin-mock";
+import { resultSuccess, resultError } from "../_util";
+import { ResultEnum } from "../../src/enums/httpEnum";
 
 const userInfo = {
-  name: 'Vben',
-  userid: '00000001',
-  email: 'test@gmail.com',
-  signature: '海纳百川,有容乃大',
-  introduction: '微笑着,努力着,欣赏着',
-  title: '交互专家',
-  group: '某某某事业群-某某平台部-某某技术部-UED',
+  name: "Vben",
+  userid: "00000001",
+  email: "test@gmail.com",
+  signature: "海纳百川,有容乃大",
+  introduction: "微笑着,努力着,欣赏着",
+  title: "交互专家",
+  group: "某某某事业群-某某平台部-某某技术部-UED",
   tags: [
     {
-      key: '0',
-      label: '很有想法的',
+      key: "0",
+      label: "很有想法的",
     },
     {
-      key: '1',
-      label: '专注设计',
+      key: "1",
+      label: "专注设计",
     },
     {
-      key: '2',
-      label: '辣~',
+      key: "2",
+      label: "辣~",
     },
     {
-      key: '3',
-      label: '大长腿',
+      key: "3",
+      label: "大长腿",
     },
     {
-      key: '4',
-      label: '川妹子',
+      key: "4",
+      label: "川妹子",
     },
     {
-      key: '5',
-      label: '海纳百川',
+      key: "5",
+      label: "海纳百川",
     },
   ],
   notifyCount: 12,
   unreadCount: 11,
-  country: 'China',
-  address: 'Xiamen City 77',
-  phone: '0592-268888888',
+  country: "China",
+  address: "Xiamen City 77",
+  phone: "0592-268888888",
 };
 
 export default [
   {
-    url: '/basic-api/account/getAccountInfo',
+    url: "/dev-api/account/getAccountInfo",
     timeout: 1000,
-    method: 'get',
+    method: "get",
     response: () => {
       return resultSuccess(userInfo);
     },
   },
   {
-    url: '/basic-api/user/sessionTimeout',
-    method: 'post',
+    url: "/dev-api/user/sessionTimeout",
+    method: "post",
     statusCode: 401,
     response: () => {
       return resultError();
     },
   },
   {
-    url: '/basic-api/user/tokenExpired',
-    method: 'post',
+    url: "/dev-api/user/tokenExpired",
+    method: "post",
     statusCode: 200,
     response: () => {
-      return resultError('Token Expired!', { code: ResultEnum.TIMEOUT as number });
+      return resultError("Token Expired!", { code: ResultEnum.TIMEOUT as number });
     },
   },
 ] as MockMethod[];
diff --git a/mock/demo/api-cascader.ts b/mock/demo/api-cascader.ts
new file mode 100644
index 0000000000000000000000000000000000000000..337c66d14b912a36f1f3b041953f9a33f02673f9
--- /dev/null
+++ b/mock/demo/api-cascader.ts
@@ -0,0 +1,325 @@
+import { MockMethod } from "vite-plugin-mock";
+import { resultSuccess } from "../_util";
+
+const areaList: any[] = [
+  {
+    id: "530825900854620160",
+    code: "430000",
+    parentCode: "100000",
+    levelType: 1,
+    name: "湖南省",
+    province: "湖南省",
+    city: null,
+    district: null,
+    town: null,
+    village: null,
+    parentPath: "430000",
+    createTime: "2020-11-30 15:47:31",
+    updateTime: "2020-11-30 16:33:42",
+    customized: false,
+    usable: true,
+  },
+  {
+    id: "530825900883980288",
+    code: "430100",
+    parentCode: "430000",
+    levelType: 2,
+    name: "长沙市",
+    province: "湖南省",
+    city: "长沙市",
+    district: null,
+    town: null,
+    village: null,
+    parentPath: "430000,430100",
+    createTime: "2020-11-30 15:47:31",
+    updateTime: "2020-11-30 16:33:42",
+    customized: false,
+    usable: true,
+  },
+  {
+    id: "530825900951089152",
+    code: "430102",
+    parentCode: "430100",
+    levelType: 3,
+    name: "芙蓉区",
+    province: "湖南省",
+    city: "长沙市",
+    district: "芙蓉区",
+    town: null,
+    village: null,
+    parentPath: "430000,430100,430102",
+    createTime: "2020-11-30 15:47:31",
+    updateTime: "2020-11-30 16:33:42",
+    customized: false,
+    usable: true,
+  },
+  {
+    id: "530825901014003712",
+    code: "430104",
+    parentCode: "430100",
+    levelType: 3,
+    name: "岳麓区",
+    province: "湖南省",
+    city: "长沙市",
+    district: "岳麓区",
+    town: null,
+    village: null,
+    parentPath: "430000,430100,430104",
+    createTime: "2020-11-30 15:47:31",
+    updateTime: "2020-11-30 16:33:42",
+    customized: false,
+    usable: true,
+  },
+  {
+    id: "530825900988837888",
+    code: "430103",
+    parentCode: "430100",
+    levelType: 3,
+    name: "天心区",
+    province: "湖南省",
+    city: "长沙市",
+    district: "天心区",
+    town: null,
+    village: null,
+    parentPath: "430000,430100,430103",
+    createTime: "2020-11-30 15:47:31",
+    updateTime: "2020-11-30 16:33:42",
+    customized: false,
+    usable: true,
+  },
+  {
+    id: "530826672489115648",
+    code: "430103002",
+    parentCode: "430103",
+    levelType: 4,
+    name: "坡子街街道",
+    province: "湖南省",
+    city: "长沙市",
+    district: "天心区",
+    town: "坡子街街道",
+    village: null,
+    parentPath: "430000,430100,430103,430103002",
+    createTime: "2020-11-30 15:47:31",
+    updateTime: "2020-12-14 15:26:43",
+    customized: false,
+    usable: true,
+  },
+  {
+    id: "530840241171607552",
+    code: "430103002001",
+    parentCode: "430103002",
+    levelType: 5,
+    name: "八角亭社区",
+    province: "湖南省",
+    city: "长沙市",
+    district: "天心区",
+    town: "坡子街街道",
+    village: "八角亭社区",
+    parentPath: "430000,430100,430103,430103002,430103002001",
+    createTime: "2020-11-30 15:47:31",
+    updateTime: "2021-01-20 14:07:23",
+    customized: false,
+    usable: true,
+  },
+  {
+    id: "530840241200967680",
+    code: "430103002002",
+    parentCode: "430103002",
+    levelType: 5,
+    name: "西牌楼社区",
+    province: "湖南省",
+    city: "长沙市",
+    district: "天心区",
+    town: "坡子街街道",
+    village: "西牌楼社区",
+    parentPath: "430000,430100,430103,430103002,430103002002",
+    createTime: "2020-11-30 15:47:31",
+    updateTime: "2020-11-30 17:30:41",
+    customized: false,
+    usable: true,
+  },
+  {
+    id: "530840241230327808",
+    code: "430103002003",
+    parentCode: "430103002",
+    levelType: 5,
+    name: "太平街社区",
+    province: "湖南省",
+    city: "长沙市",
+    district: "天心区",
+    town: "坡子街街道",
+    village: "太平街社区",
+    parentPath: "430000,430100,430103,430103002,430103002003",
+    createTime: "2020-11-30 15:47:31",
+    updateTime: "2020-11-30 17:30:41",
+    customized: false,
+    usable: true,
+  },
+  {
+    id: "530840241259687936",
+    code: "430103002005",
+    parentCode: "430103002",
+    levelType: 5,
+    name: "坡子街社区",
+    province: "湖南省",
+    city: "长沙市",
+    district: "天心区",
+    town: "坡子街街道",
+    village: "坡子街社区",
+    parentPath: "430000,430100,430103,430103002,430103002005",
+    createTime: "2020-11-30 15:47:31",
+    updateTime: "2020-11-30 17:30:41",
+    customized: false,
+    usable: true,
+  },
+  {
+    id: "530840241284853760",
+    code: "430103002006",
+    parentCode: "430103002",
+    levelType: 5,
+    name: "青山祠社区",
+    province: "湖南省",
+    city: "长沙市",
+    district: "天心区",
+    town: "坡子街街道",
+    village: "青山祠社区",
+    parentPath: "430000,430100,430103,430103002,430103002006",
+    createTime: "2020-11-30 15:47:31",
+    updateTime: "2020-11-30 17:30:41",
+    customized: false,
+    usable: true,
+  },
+  {
+    id: "530840241310019584",
+    code: "430103002007",
+    parentCode: "430103002",
+    levelType: 5,
+    name: "沙河社区",
+    province: "湖南省",
+    city: "长沙市",
+    district: "天心区",
+    town: "坡子街街道",
+    village: "沙河社区",
+    parentPath: "430000,430100,430103,430103002,430103002007",
+    createTime: "2020-11-30 15:47:31",
+    updateTime: "2020-11-30 17:30:41",
+    customized: false,
+    usable: true,
+  },
+  {
+    id: "530840241381322752",
+    code: "430103002008",
+    parentCode: "430103002",
+    levelType: 5,
+    name: "碧湘社区",
+    province: "湖南省",
+    city: "长沙市",
+    district: "天心区",
+    town: "坡子街街道",
+    village: "碧湘社区",
+    parentPath: "430000,430100,430103,430103002,430103002008",
+    createTime: "2020-11-30 15:47:31",
+    updateTime: "2020-11-30 17:30:41",
+    customized: false,
+    usable: true,
+  },
+  {
+    id: "530840241410682880",
+    code: "430103002009",
+    parentCode: "430103002",
+    levelType: 5,
+    name: "创远社区",
+    province: "湖南省",
+    city: "长沙市",
+    district: "天心区",
+    town: "坡子街街道",
+    village: "创远社区",
+    parentPath: "430000,430100,430103,430103002,430103002009",
+    createTime: "2020-11-30 15:47:31",
+    updateTime: "2020-11-30 17:30:41",
+    customized: false,
+    usable: true,
+  },
+  {
+    id: "530840241431654400",
+    code: "430103002010",
+    parentCode: "430103002",
+    levelType: 5,
+    name: "楚湘社区",
+    province: "湖南省",
+    city: "长沙市",
+    district: "天心区",
+    town: "坡子街街道",
+    village: "楚湘社区",
+    parentPath: "430000,430100,430103,430103002,430103002010",
+    createTime: "2020-11-30 15:47:31",
+    updateTime: "2020-11-30 17:30:41",
+    customized: false,
+    usable: true,
+  },
+  {
+    id: "530840241465208832",
+    code: "430103002011",
+    parentCode: "430103002",
+    levelType: 5,
+    name: "西湖社区",
+    province: "湖南省",
+    city: "长沙市",
+    district: "天心区",
+    town: "坡子街街道",
+    village: "西湖社区",
+    parentPath: "430000,430100,430103,430103002,430103002011",
+    createTime: "2020-11-30 15:47:31",
+    updateTime: "2020-11-30 17:30:41",
+    customized: false,
+    usable: true,
+  },
+  {
+    id: "530840241502957568",
+    code: "430103002012",
+    parentCode: "430103002",
+    levelType: 5,
+    name: "登仁桥社区",
+    province: "湖南省",
+    city: "长沙市",
+    district: "天心区",
+    town: "坡子街街道",
+    village: "登仁桥社区",
+    parentPath: "430000,430100,430103,430103002,430103002012",
+    createTime: "2020-11-30 15:47:31",
+    updateTime: "2020-11-30 17:30:41",
+    customized: false,
+    usable: true,
+  },
+  {
+    id: "530840241553289216",
+    code: "430103002013",
+    parentCode: "430103002",
+    levelType: 5,
+    name: "文庙坪社区",
+    province: "湖南省",
+    city: "长沙市",
+    district: "天心区",
+    town: "坡子街街道",
+    village: "文庙坪社区",
+    parentPath: "430000,430100,430103,430103002,430103002013",
+    createTime: "2020-11-30 15:47:31",
+    updateTime: "2020-11-30 17:30:41",
+    customized: false,
+    usable: true,
+  },
+];
+export default [
+  {
+    url: "/dev-api/cascader/getAreaRecord",
+    timeout: 1000,
+    method: "post",
+    response: ({ body }) => {
+      const { parentCode } = body || {};
+      if (!parentCode) {
+        return resultSuccess(areaList.filter((it) => it.code === "430000"));
+      }
+      return resultSuccess(areaList.filter((it) => it.parentCode === parentCode));
+    },
+  },
+] as MockMethod[];
diff --git a/mock/demo/select-demo.ts b/mock/demo/select-demo.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b851a073de9bf79175c8555cf86e6f4dc1ce3420
--- /dev/null
+++ b/mock/demo/select-demo.ts
@@ -0,0 +1,28 @@
+import { MockMethod } from "vite-plugin-mock";
+import { resultSuccess } from "../_util";
+
+const demoList = (keyword, count = 20) => {
+  const result = {
+    list: [] as any[],
+  };
+  for (let index = 0; index < count; index++) {
+    result.list.push({
+      name: `${keyword ?? ""}选项${index}`,
+      id: `${index}`,
+    });
+  }
+  return result;
+};
+
+export default [
+  {
+    url: "/dev-api/select/getDemoOptions",
+    timeout: 1000,
+    method: "get",
+    response: ({ query }) => {
+      const { keyword, count } = query;
+      console.log(keyword);
+      return resultSuccess(demoList(keyword, count));
+    },
+  },
+] as MockMethod[];
diff --git a/mock/demo/system.ts b/mock/demo/system.ts
new file mode 100644
index 0000000000000000000000000000000000000000..439719ad0f61c44aa4db4337a4f2f191e7490bf6
--- /dev/null
+++ b/mock/demo/system.ts
@@ -0,0 +1,202 @@
+import { MockMethod } from "vite-plugin-mock";
+import { resultError, resultPageSuccess, resultSuccess } from "../_util";
+
+const accountList = (() => {
+  const result: any[] = [];
+  for (let index = 0; index < 20; index++) {
+    result.push({
+      id: `${index}`,
+      account: "@first",
+      email: "@email",
+      nickname: "@cname()",
+      role: "@first",
+      createTime: "@datetime",
+      remark: "@cword(10,20)",
+      "status|1": ["0", "1"],
+    });
+  }
+  return result;
+})();
+
+const roleList = (() => {
+  const result: any[] = [];
+  for (let index = 0; index < 4; index++) {
+    result.push({
+      id: index + 1,
+      orderNo: `${index + 1}`,
+      roleName: ["超级管理员", "管理员", "文章管理员", "普通用户"][index],
+      roleValue: "@first",
+      createTime: "@datetime",
+      remark: "@cword(10,20)",
+      menu: [["0", "1", "2"], ["0", "1"], ["0", "2"], ["2"]][index],
+      "status|1": ["0", "1"],
+    });
+  }
+  return result;
+})();
+
+const deptList = (() => {
+  const result: any[] = [];
+  for (let index = 0; index < 3; index++) {
+    result.push({
+      id: `${index}`,
+      deptName: ["华东分部", "华南分部", "西北分部"][index],
+      orderNo: index + 1,
+      createTime: "@datetime",
+      remark: "@cword(10,20)",
+      "status|1": ["0", "0", "1"],
+      children: (() => {
+        const children: any[] = [];
+        for (let j = 0; j < 4; j++) {
+          children.push({
+            id: `${index}-${j}`,
+            deptName: ["研发部", "市场部", "商务部", "财务部"][j],
+            orderNo: j + 1,
+            createTime: "@datetime",
+            remark: "@cword(10,20)",
+            "status|1": ["0", "1"],
+            parentDept: `${index}`,
+            children: undefined,
+          });
+        }
+        return children;
+      })(),
+    });
+  }
+  return result;
+})();
+
+const menuList = (() => {
+  const result: any[] = [];
+  for (let index = 0; index < 3; index++) {
+    result.push({
+      id: `${index}`,
+      icon: ["ion:layers-outline", "ion:git-compare-outline", "ion:tv-outline"][index],
+      component: "LAYOUT",
+      type: "0",
+      menuName: ["Dashboard", "权限管理", "功能"][index],
+      permission: "",
+      orderNo: index + 1,
+      createTime: "@datetime",
+      "status|1": ["0", "0", "1"],
+      children: (() => {
+        const children: any[] = [];
+        for (let j = 0; j < 4; j++) {
+          children.push({
+            id: `${index}-${j}`,
+            type: "1",
+            menuName: ["菜单1", "菜单2", "菜单3", "菜单4"][j],
+            icon: "ion:document",
+            permission: ["menu1:view", "menu2:add", "menu3:update", "menu4:del"][index],
+            component: [
+              "/dashboard/welcome/index",
+              "/dashboard/analysis/index",
+              "/dashboard/workbench/index",
+              "/dashboard/test/index",
+            ][j],
+            orderNo: j + 1,
+            createTime: "@datetime",
+            "status|1": ["0", "1"],
+            parentMenu: `${index}`,
+            children: (() => {
+              const children: any[] = [];
+              for (let k = 0; k < 4; k++) {
+                children.push({
+                  id: `${index}-${j}-${k}`,
+                  type: "2",
+                  menuName: "按钮" + (j + 1) + "-" + (k + 1),
+                  icon: "",
+                  permission:
+                    ["menu1:view", "menu2:add", "menu3:update", "menu4:del"][index] +
+                    ":btn" +
+                    (k + 1),
+                  component: [
+                    "/dashboard/welcome/index",
+                    "/dashboard/analysis/index",
+                    "/dashboard/workbench/index",
+                    "/dashboard/test/index",
+                  ][j],
+                  orderNo: j + 1,
+                  createTime: "@datetime",
+                  "status|1": ["0", "1"],
+                  parentMenu: `${index}-${j}`,
+                  children: undefined,
+                });
+              }
+              return children;
+            })(),
+          });
+        }
+        return children;
+      })(),
+    });
+  }
+  return result;
+})();
+
+export default [
+  {
+    url: "/dev-api/system/getAccountList",
+    timeout: 100,
+    method: "get",
+    response: ({ query }) => {
+      const { page = 1, pageSize = 20 } = query;
+      return resultPageSuccess(page, pageSize, accountList);
+    },
+  },
+  {
+    url: "/dev-api/system/getRoleListByPage",
+    timeout: 100,
+    method: "get",
+    response: ({ query }) => {
+      const { page = 1, pageSize = 20 } = query;
+      return resultPageSuccess(page, pageSize, roleList);
+    },
+  },
+  {
+    url: "/dev-api/system/setRoleStatus",
+    timeout: 500,
+    method: "post",
+    response: ({ query }) => {
+      const { id, status } = query;
+      return resultSuccess({ id, status });
+    },
+  },
+  {
+    url: "/dev-api/system/getAllRoleList",
+    timeout: 100,
+    method: "get",
+    response: () => {
+      return resultSuccess(roleList);
+    },
+  },
+  {
+    url: "/dev-api/system/getDeptList",
+    timeout: 100,
+    method: "get",
+    response: () => {
+      return resultSuccess(deptList);
+    },
+  },
+  {
+    url: "/dev-api/system/getMenuList",
+    timeout: 100,
+    method: "get",
+    response: () => {
+      return resultSuccess(menuList);
+    },
+  },
+  {
+    url: "/dev-api/system/accountExist",
+    timeout: 500,
+    method: "post",
+    response: ({ body }) => {
+      const { account } = body || {};
+      if (account && account.indexOf("admin") !== -1) {
+        return resultError("该字段不能包含admin");
+      } else {
+        return resultSuccess(`${account} can use`);
+      }
+    },
+  },
+] as MockMethod[];
diff --git a/mock/demo/table-demo.ts b/mock/demo/table-demo.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f6efe81189239e976f725753791b1c3dadafb3a8
--- /dev/null
+++ b/mock/demo/table-demo.ts
@@ -0,0 +1,52 @@
+import { MockMethod } from "vite-plugin-mock";
+import { Random } from "mockjs";
+import { resultPageSuccess } from "../_util";
+
+function getRandomPics(count = 10): string[] {
+  const arr: string[] = [];
+  for (let i = 0; i < count; i++) {
+    arr.push(Random.image("800x600", Random.color(), Random.color(), Random.title()));
+  }
+  return arr;
+}
+
+const demoList = (() => {
+  const result: any[] = [];
+  for (let index = 0; index < 200; index++) {
+    result.push({
+      id: `${index}`,
+      beginTime: "@datetime",
+      endTime: "@datetime",
+      address: "@city()",
+      name: "@cname()",
+      name1: "@cname()",
+      name2: "@cname()",
+      name3: "@cname()",
+      name4: "@cname()",
+      name5: "@cname()",
+      name6: "@cname()",
+      name7: "@cname()",
+      name8: "@cname()",
+      avatar: Random.image("400x400", Random.color(), Random.color(), Random.first()),
+      imgArr: getRandomPics(Math.ceil(Math.random() * 3) + 1),
+      imgs: getRandomPics(Math.ceil(Math.random() * 3) + 1),
+      date: `@date('yyyy-MM-dd')`,
+      time: `@time('HH:mm')`,
+      "no|100000-10000000": 100000,
+      "status|1": ["normal", "enable", "disable"],
+    });
+  }
+  return result;
+})();
+
+export default [
+  {
+    url: "/dev-api/table/getDemoList",
+    timeout: 100,
+    method: "get",
+    response: ({ query }) => {
+      const { page = 1, pageSize = 20 } = query;
+      return resultPageSuccess(page, pageSize, demoList);
+    },
+  },
+] as MockMethod[];
diff --git a/mock/demo/tree-demo.ts b/mock/demo/tree-demo.ts
new file mode 100644
index 0000000000000000000000000000000000000000..636bc661708a492e6bedde4894dd007504b20294
--- /dev/null
+++ b/mock/demo/tree-demo.ts
@@ -0,0 +1,38 @@
+import { MockMethod } from "vite-plugin-mock";
+import { resultSuccess } from "../_util";
+
+const demoTreeList = (keyword) => {
+  const result = {
+    list: [] as Recordable[],
+  };
+  for (let index = 0; index < 5; index++) {
+    const children: Recordable[] = [];
+    for (let j = 0; j < 3; j++) {
+      children.push({
+        title: `${keyword ?? ""}选项${index}-${j}`,
+        value: `${index}-${j}`,
+        key: `${index}-${j}`,
+      });
+    }
+    result.list.push({
+      title: `${keyword ?? ""}选项${index}`,
+      value: `${index}`,
+      key: `${index}`,
+      children,
+    });
+  }
+  return result;
+};
+
+export default [
+  {
+    url: "/dev-api/tree/getDemoOptions",
+    timeout: 1000,
+    method: "get",
+    response: ({ query }) => {
+      const { keyword } = query;
+      console.log(keyword);
+      return resultSuccess(demoTreeList(keyword));
+    },
+  },
+] as MockMethod[];
diff --git a/mock/student/practice.ts b/mock/student/practice.ts
new file mode 100644
index 0000000000000000000000000000000000000000..091702159f756b57b66abf4e798cc8dbb06f5242
--- /dev/null
+++ b/mock/student/practice.ts
@@ -0,0 +1,108 @@
+import {
+  LectureNoteItemModel,
+  LessonPlanItemModel,
+  TeachingStudyItemModel,
+} from "/@/api/student/model/practice-model";
+import { resultPageSuccess } from "mock/_util";
+import { MockMethod } from "vite-plugin-mock";
+
+function getLectureRecordList() {
+  const list: LectureNoteItemModel[] = [];
+  for (let i = 0; i < 30; i++) {
+    const item: LectureNoteItemModel = {
+      className: `${i}班`,
+      startDate: "2022/8/20",
+      docLink: "http://localhost:3300/static/upload/favicon.ico",
+      experience: `体会与建议——${i}`,
+      groupEvaluation: `小组评价——${i}`,
+      lectureType: "类型1",
+      personalSummary: `个人总结——${i}`,
+      teacherName: `宋浩--${i}`,
+      teachingProcess: `听课过程——${i}aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccddddddddd
+      eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
+      ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
+      gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg
+      hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
+      iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
+      巴拉巴拉巴拉巴拉`,
+      noteId: i,
+      lectureContent: `这是一条听课内容——${i}`,
+    };
+    list.push(item);
+  }
+  return list;
+}
+
+function getLessonPlanList() {
+  const list: LessonPlanItemModel[] = [];
+  for (let i = 0; i < 30; i++) {
+    const item: LessonPlanItemModel = {
+      designIdea: "设计思路-----" + i,
+      docLink: "http://localhost:3100/static/upload/favicon.ico",
+      groupEvaluation: "小组评价————" + i,
+      personalSummary: "个人总结————" + i,
+      planId: i,
+      startDate: "2022/8/26",
+      subjectName: "课题名称————" + i,
+      subjectType: "课题类型1",
+      teachingProcess: `教学过程aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbccccccc
+      ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
+      eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
+      巴拉巴拉${i}`,
+    };
+    list.push(item);
+  }
+  return list;
+}
+
+function getTeachingStudyList() {
+  const list: TeachingStudyItemModel[] = [];
+  for (let i = 0; i < 30; i++) {
+    const item: TeachingStudyItemModel = {
+      designIdea: "教研思路-----" + i,
+      docLink: "http://localhost:3100/static/upload/favicon.ico",
+      groupEvaluation: "小组评价————" + i,
+      personalSummary: "个人总结————" + i,
+      studyId: i,
+      startDate: "2022/8/26",
+      content: "教研内容————" + i,
+      type: "教研方式" + i,
+      teachingProcess: `教研过程aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbccccccc
+      ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
+      eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
+      巴拉巴拉${i}`,
+    };
+    list.push(item);
+  }
+  return list;
+}
+
+export default [
+  {
+    url: "/dev-api/lectureNote/page",
+    timeout: 100,
+    method: "get",
+    response: ({ query }) => {
+      const { page = 1, pageSize = 10 } = query;
+      return resultPageSuccess(page, pageSize, getLectureRecordList());
+    },
+  },
+  {
+    url: "/dev-api/lessonPlan/page",
+    timeout: 100,
+    method: "get",
+    response: ({ query }) => {
+      const { page = 1, pageSize = 10 } = query;
+      return resultPageSuccess(page, pageSize, getLessonPlanList());
+    },
+  },
+  {
+    url: "/dev-api/teachingStudy/page",
+    timeout: 100,
+    method: "get",
+    response: ({ query }) => {
+      const { page = 1, pageSize = 10 } = query;
+      return resultPageSuccess(page, pageSize, getTeachingStudyList());
+    },
+  },
+] as MockMethod[];
diff --git a/mock/sys/menu.ts b/mock/sys/menu.ts
index 1c47e667c90a3f1e175fd3034a4cbe290914063a..6c27acb9a06bab0315b618cf473c2aeb5c9b6b3e 100644
--- a/mock/sys/menu.ts
+++ b/mock/sys/menu.ts
@@ -1,235 +1,235 @@
-import { resultSuccess, resultError, getRequestToken, requestParams } from '../_util';
-import { MockMethod } from 'vite-plugin-mock';
-import { createFakeUserList } from './user';
+import { resultSuccess, resultError, getRequestToken, requestParams } from "../_util";
+import { MockMethod } from "vite-plugin-mock";
+import { createFakeUserList } from "./user";
 
 // single
 const dashboardRoute = {
-  path: '/dashboard',
-  name: 'Dashboard',
-  component: 'LAYOUT',
-  redirect: '/dashboard/analysis',
+  path: "/dashboard",
+  name: "Dashboard",
+  component: "LAYOUT",
+  redirect: "/dashboard/analysis",
   meta: {
-    title: 'routes.dashboard.dashboard',
+    title: "routes.dashboard.dashboard",
     hideChildrenInMenu: true,
-    icon: 'bx:bx-home',
+    icon: "bx:bx-home",
   },
   children: [
     {
-      path: 'analysis',
-      name: 'Analysis',
-      component: '/dashboard/analysis/index',
+      path: "analysis",
+      name: "Analysis",
+      component: "/dashboard/analysis/index",
       meta: {
         hideMenu: true,
         hideBreadcrumb: true,
-        title: 'routes.dashboard.analysis',
-        currentActiveMenu: '/dashboard',
-        icon: 'bx:bx-home',
+        title: "routes.dashboard.analysis",
+        currentActiveMenu: "/dashboard",
+        icon: "bx:bx-home",
       },
     },
     {
-      path: 'workbench',
-      name: 'Workbench',
-      component: '/dashboard/workbench/index',
+      path: "workbench",
+      name: "Workbench",
+      component: "/dashboard/workbench/index",
       meta: {
         hideMenu: true,
         hideBreadcrumb: true,
-        title: 'routes.dashboard.workbench',
-        currentActiveMenu: '/dashboard',
-        icon: 'bx:bx-home',
+        title: "routes.dashboard.workbench",
+        currentActiveMenu: "/dashboard",
+        icon: "bx:bx-home",
       },
     },
   ],
 };
 
 const backRoute = {
-  path: 'back',
-  name: 'PermissionBackDemo',
+  path: "back",
+  name: "PermissionBackDemo",
   meta: {
-    title: 'routes.demo.permission.back',
+    title: "routes.demo.permission.back",
   },
 
   children: [
     {
-      path: 'page',
-      name: 'BackAuthPage',
-      component: '/demo/permission/back/index',
+      path: "page",
+      name: "BackAuthPage",
+      component: "/demo/permission/back/index",
       meta: {
-        title: 'routes.demo.permission.backPage',
+        title: "routes.demo.permission.backPage",
       },
     },
     {
-      path: 'btn',
-      name: 'BackAuthBtn',
-      component: '/demo/permission/back/Btn',
+      path: "btn",
+      name: "BackAuthBtn",
+      component: "/demo/permission/back/Btn",
       meta: {
-        title: 'routes.demo.permission.backBtn',
+        title: "routes.demo.permission.backBtn",
       },
     },
   ],
 };
 
 const authRoute = {
-  path: '/permission',
-  name: 'Permission',
-  component: 'LAYOUT',
-  redirect: '/permission/front/page',
+  path: "/permission",
+  name: "Permission",
+  component: "LAYOUT",
+  redirect: "/permission/front/page",
   meta: {
-    icon: 'carbon:user-role',
-    title: 'routes.demo.permission.permission',
+    icon: "carbon:user-role",
+    title: "routes.demo.permission.permission",
   },
   children: [backRoute],
 };
 
 const levelRoute = {
-  path: '/level',
-  name: 'Level',
-  component: 'LAYOUT',
-  redirect: '/level/menu1/menu1-1',
+  path: "/level",
+  name: "Level",
+  component: "LAYOUT",
+  redirect: "/level/menu1/menu1-1",
   meta: {
-    icon: 'carbon:user-role',
-    title: 'routes.demo.level.level',
+    icon: "carbon:user-role",
+    title: "routes.demo.level.level",
   },
 
   children: [
     {
-      path: 'menu1',
-      name: 'Menu1Demo',
+      path: "menu1",
+      name: "Menu1Demo",
       meta: {
-        title: 'Menu1',
+        title: "Menu1",
       },
       children: [
         {
-          path: 'menu1-1',
-          name: 'Menu11Demo',
+          path: "menu1-1",
+          name: "Menu11Demo",
           meta: {
-            title: 'Menu1-1',
+            title: "Menu1-1",
           },
           children: [
             {
-              path: 'menu1-1-1',
-              name: 'Menu111Demo',
-              component: '/demo/level/Menu111',
+              path: "menu1-1-1",
+              name: "Menu111Demo",
+              component: "/demo/level/Menu111",
               meta: {
-                title: 'Menu111',
+                title: "Menu111",
               },
             },
           ],
         },
         {
-          path: 'menu1-2',
-          name: 'Menu12Demo',
-          component: '/demo/level/Menu12',
+          path: "menu1-2",
+          name: "Menu12Demo",
+          component: "/demo/level/Menu12",
           meta: {
-            title: 'Menu1-2',
+            title: "Menu1-2",
           },
         },
       ],
     },
     {
-      path: 'menu2',
-      name: 'Menu2Demo',
-      component: '/demo/level/Menu2',
+      path: "menu2",
+      name: "Menu2Demo",
+      component: "/demo/level/Menu2",
       meta: {
-        title: 'Menu2',
+        title: "Menu2",
       },
     },
   ],
 };
 
 const sysRoute = {
-  path: '/system',
-  name: 'System',
-  component: 'LAYOUT',
-  redirect: '/system/account',
+  path: "/system",
+  name: "System",
+  component: "LAYOUT",
+  redirect: "/system/account",
   meta: {
-    icon: 'ion:settings-outline',
-    title: 'routes.demo.system.moduleName',
+    icon: "ion:settings-outline",
+    title: "routes.demo.system.moduleName",
   },
   children: [
     {
-      path: 'account',
-      name: 'AccountManagement',
+      path: "account",
+      name: "AccountManagement",
       meta: {
-        title: 'routes.demo.system.account',
+        title: "routes.demo.system.account",
         ignoreKeepAlive: true,
       },
-      component: '/demo/system/account/index',
+      component: "/demo/system/account/index",
     },
     {
-      path: 'account_detail/:id',
-      name: 'AccountDetail',
+      path: "account_detail/:id",
+      name: "AccountDetail",
       meta: {
         hideMenu: true,
-        title: 'routes.demo.system.account_detail',
+        title: "routes.demo.system.account_detail",
         ignoreKeepAlive: true,
         showMenu: false,
-        currentActiveMenu: '/system/account',
+        currentActiveMenu: "/system/account",
       },
-      component: '/demo/system/account/AccountDetail',
+      component: "/demo/system/account/AccountDetail",
     },
     {
-      path: 'role',
-      name: 'RoleManagement',
+      path: "role",
+      name: "RoleManagement",
       meta: {
-        title: 'routes.demo.system.role',
+        title: "routes.demo.system.role",
         ignoreKeepAlive: true,
       },
-      component: '/demo/system/role/index',
+      component: "/demo/system/role/index",
     },
 
     {
-      path: 'menu',
-      name: 'MenuManagement',
+      path: "menu",
+      name: "MenuManagement",
       meta: {
-        title: 'routes.demo.system.menu',
+        title: "routes.demo.system.menu",
         ignoreKeepAlive: true,
       },
-      component: '/demo/system/menu/index',
+      component: "/demo/system/menu/index",
     },
     {
-      path: 'dept',
-      name: 'DeptManagement',
+      path: "dept",
+      name: "DeptManagement",
       meta: {
-        title: 'routes.demo.system.dept',
+        title: "routes.demo.system.dept",
         ignoreKeepAlive: true,
       },
-      component: '/demo/system/dept/index',
+      component: "/demo/system/dept/index",
     },
     {
-      path: 'changePassword',
-      name: 'ChangePassword',
+      path: "changePassword",
+      name: "ChangePassword",
       meta: {
-        title: 'routes.demo.system.password',
+        title: "routes.demo.system.password",
         ignoreKeepAlive: true,
       },
-      component: '/demo/system/password/index',
+      component: "/demo/system/password/index",
     },
   ],
 };
 
 const linkRoute = {
-  path: '/link',
-  name: 'Link',
-  component: 'LAYOUT',
+  path: "/link",
+  name: "Link",
+  component: "LAYOUT",
   meta: {
-    icon: 'ion:tv-outline',
-    title: 'routes.demo.iframe.frame',
+    icon: "ion:tv-outline",
+    title: "routes.demo.iframe.frame",
   },
   children: [
     {
-      path: 'doc',
-      name: 'Doc',
+      path: "doc",
+      name: "Doc",
       meta: {
-        title: 'routes.demo.iframe.doc',
-        frameSrc: 'https://vvbin.cn/doc-next/',
+        title: "routes.demo.iframe.doc",
+        frameSrc: "https://vvbin.cn/doc-next/",
       },
     },
     {
-      path: 'https://vvbin.cn/doc-next/',
-      name: 'DocExternal',
-      component: 'LAYOUT',
+      path: "https://vvbin.cn/doc-next/",
+      name: "DocExternal",
+      component: "LAYOUT",
       meta: {
-        title: 'routes.demo.iframe.docExternal',
+        title: "routes.demo.iframe.docExternal",
       },
     },
   ],
@@ -237,27 +237,27 @@ const linkRoute = {
 
 export default [
   {
-    url: '/basic-api/getMenuList',
+    url: "/dev-api/getMenuList",
     timeout: 1000,
-    method: 'get',
+    method: "get",
     response: (request: requestParams) => {
       const token = getRequestToken(request);
       if (!token) {
-        return resultError('Invalid token!');
+        return resultError("Invalid token!");
       }
       const checkUser = createFakeUserList().find((item) => item.token === token);
       if (!checkUser) {
-        return resultError('Invalid user token!');
+        return resultError("Invalid user token!");
       }
       const id = checkUser.userId;
       let menu: Object[];
       switch (id) {
-        case '1':
-          dashboardRoute.redirect = dashboardRoute.path + '/' + dashboardRoute.children[0].path;
+        case "1":
+          dashboardRoute.redirect = dashboardRoute.path + "/" + dashboardRoute.children[0].path;
           menu = [dashboardRoute, authRoute, levelRoute, sysRoute, linkRoute];
           break;
-        case '2':
-          dashboardRoute.redirect = dashboardRoute.path + '/' + dashboardRoute.children[1].path;
+        case "2":
+          dashboardRoute.redirect = dashboardRoute.path + "/" + dashboardRoute.children[1].path;
           menu = [dashboardRoute, authRoute, levelRoute, linkRoute];
           break;
         default:
diff --git a/mock/sys/user.ts b/mock/sys/user.ts
index 8b8989fa42b01a1112b175927f34143c4c06a28a..19f05767f5477ea4fa486c43a0a4e7d5f9d0fac7 100644
--- a/mock/sys/user.ts
+++ b/mock/sys/user.ts
@@ -1,37 +1,37 @@
-import { MockMethod } from 'vite-plugin-mock';
-import { resultError, resultSuccess, getRequestToken, requestParams } from '../_util';
+import { MockMethod } from "vite-plugin-mock";
+import { resultError, resultSuccess, getRequestToken, requestParams } from "../_util";
 
 export function createFakeUserList() {
   return [
     {
-      userId: '1',
-      username: 'vben',
-      realName: 'Vben Admin',
-      avatar: 'https://q1.qlogo.cn/g?b=qq&nk=190848757&s=640',
-      desc: 'manager',
-      password: '123456',
-      token: 'fakeToken1',
-      homePath: '/dashboard/analysis',
+      userId: "1",
+      username: "vben",
+      realName: "Vben Admin",
+      avatar: "https://q1.qlogo.cn/g?b=qq&nk=190848757&s=640",
+      desc: "manager",
+      password: "123456",
+      token: "fakeToken1",
+      homePath: "/dashboard/analysis",
       roles: [
         {
-          roleName: 'Super Admin',
-          value: 'super',
+          roleName: "Super Admin",
+          value: "super",
         },
       ],
     },
     {
-      userId: '2',
-      username: 'test',
-      password: '123456',
-      realName: 'test user',
-      avatar: 'https://q1.qlogo.cn/g?b=qq&nk=339449197&s=640',
-      desc: 'tester',
-      token: 'fakeToken2',
-      homePath: '/dashboard/workbench',
+      userId: "2",
+      username: "test",
+      password: "123456",
+      realName: "test user",
+      avatar: "https://q1.qlogo.cn/g?b=qq&nk=339449197&s=640",
+      desc: "tester",
+      token: "fakeToken2",
+      homePath: "/dashboard/workbench",
       roles: [
         {
-          roleName: 'Tester',
-          value: 'test',
+          roleName: "Tester",
+          value: "test",
         },
       ],
     },
@@ -39,23 +39,23 @@ export function createFakeUserList() {
 }
 
 const fakeCodeList: any = {
-  '1': ['1000', '3000', '5000'],
+  "1": ["1000", "3000", "5000"],
 
-  '2': ['2000', '4000', '6000'],
+  "2": ["2000", "4000", "6000"],
 };
 export default [
   // mock user login
   {
-    url: '/basic-api/login',
+    url: "/dev-api/login",
     timeout: 200,
-    method: 'post',
+    method: "post",
     response: ({ body }) => {
       const { username, password } = body;
       const checkUser = createFakeUserList().find(
         (item) => item.username === username && password === item.password,
       );
       if (!checkUser) {
-        return resultError('Incorrect account or password!');
+        return resultError("Incorrect account or password!");
       }
       const { userId, username: _username, token, realName, desc, roles } = checkUser;
       return resultSuccess({
@@ -69,28 +69,28 @@ export default [
     },
   },
   {
-    url: '/basic-api/getUserInfo',
-    method: 'get',
+    url: "/dev-api/getUserInfo",
+    method: "get",
     response: (request: requestParams) => {
       const token = getRequestToken(request);
-      if (!token) return resultError('Invalid token');
+      if (!token) return resultError("Invalid token");
       const checkUser = createFakeUserList().find((item) => item.token === token);
       if (!checkUser) {
-        return resultError('The corresponding user information was not obtained!');
+        return resultError("The corresponding user information was not obtained!");
       }
       return resultSuccess(checkUser);
     },
   },
   {
-    url: '/basic-api/getPermCode',
+    url: "/dev-api/getPermCode",
     timeout: 200,
-    method: 'get',
+    method: "get",
     response: (request: requestParams) => {
       const token = getRequestToken(request);
-      if (!token) return resultError('Invalid token');
+      if (!token) return resultError("Invalid token");
       const checkUser = createFakeUserList().find((item) => item.token === token);
       if (!checkUser) {
-        return resultError('Invalid token!');
+        return resultError("Invalid token!");
       }
       const codeList = fakeCodeList[checkUser.userId];
 
@@ -98,17 +98,25 @@ export default [
     },
   },
   {
-    url: '/basic-api/logout',
+    url: "/dev-api/logout",
     timeout: 200,
-    method: 'get',
+    method: "get",
     response: (request: requestParams) => {
       const token = getRequestToken(request);
-      if (!token) return resultError('Invalid token');
+      if (!token) return resultError("Invalid token");
       const checkUser = createFakeUserList().find((item) => item.token === token);
       if (!checkUser) {
-        return resultError('Invalid token!');
+        return resultError("Invalid token!");
       }
-      return resultSuccess(undefined, { message: 'Token has been destroyed' });
+      return resultSuccess(undefined, { message: "Token has been destroyed" });
+    },
+  },
+  {
+    url: "/dev-api/testRetry",
+    statusCode: 405,
+    method: "get",
+    response: () => {
+      return resultError("Error!");
     },
   },
 ] as MockMethod[];
diff --git a/package.json b/package.json
index 649e8bff94e474de0fe6fbbd9b92901b365abdeb..a5a60db04dddcdfc4b9e777790d25b5ccec981a0 100644
--- a/package.json
+++ b/package.json
@@ -7,82 +7,148 @@
     "url": "https://gitee.com/Suomm"
   },
   "scripts": {
-    "dev": "vite",
+    "commit": "czg",
     "bootstrap": "pnpm install",
+    "serve": "npm run dev",
+    "dev": "vite",
     "build": "cross-env NODE_ENV=production vite build && esno ./build/script/postBuild.ts",
-    "preview": "pnpm run build && vite preview"
+    "build:test": "cross-env vite build --mode test && esno ./build/script/postBuild.ts",
+    "build:no-cache": "pnpm clean:cache && npm run build",
+    "report": "cross-env REPORT=true npm run build",
+    "type:check": "vue-tsc --noEmit --skipLibCheck",
+    "preview": "npm run build && vite preview",
+    "preview:dist": "vite preview",
+    "log": "conventional-changelog -p angular -i CHANGELOG.md -s",
+    "clean:cache": "rimraf node_modules/.cache/ && rimraf node_modules/.vite",
+    "clean:lib": "rimraf node_modules",
+    "lint:eslint": "eslint --cache --max-warnings 0  \"{src,mock}/**/*.{vue,ts,tsx}\" --fix",
+    "lint:prettier": "prettier --write  \"src/**/*.{js,json,tsx,css,less,scss,vue,html,md}\"",
+    "lint:stylelint": "stylelint --cache --fix \"**/*.{vue,less,postcss,css,scss}\" --cache --cache-location node_modules/.cache/stylelint/",
+    "lint:lint-staged": "lint-staged",
+    "test:unit": "jest",
+    "test:gzip": "npx http-server dist --cors --gzip -c-1",
+    "test:br": "npx http-server dist --cors --brotli -c-1",
+    "reinstall": "rimraf pnpm-lock.yaml && rimraf package.lock.json && rimraf node_modules && npm run bootstrap",
+    "prepare": "husky install",
+    "gen:icon": "esno ./build/generate/icon/index.ts"
   },
   "dependencies": {
     "@ant-design/colors": "^6.0.0",
-    "@ant-design/icons-vue": "^6.0.1",
-    "@iconify/iconify": "^2.1.0",
-    "@vueuse/core": "^6.9.2",
-    "@vueuse/shared": "^6.9.2",
-    "@zxcvbn-ts/core": "^1.2.0",
-    "ant-design-vue": "2.2.8",
-    "axios": "^0.24.0",
+    "@ant-design/icons-vue": "^6.1.0",
+    "@iconify/iconify": "^2.2.1",
+    "@logicflow/core": "^1.1.13",
+    "@logicflow/extension": "^1.1.13",
+    "@vue/runtime-core": "^3.2.33",
+    "@vue/shared": "^3.2.33",
+    "@vueuse/core": "^8.3.0",
+    "@vueuse/shared": "^8.3.0",
+    "@zxcvbn-ts/core": "^2.0.1",
+    "ant-design-vue": "^3.2.0",
+    "axios": "^0.26.1",
+    "codemirror": "^5.65.3",
+    "cropperjs": "^1.5.12",
     "crypto-js": "^4.1.1",
-    "echarts": "^5.2.2",
+    "dayjs": "^1.11.1",
+    "echarts": "^5.3.2",
+    "intro.js": "^5.1.0",
     "lodash-es": "^4.17.21",
     "mockjs": "^1.1.0",
-    "moment": "^2.29.1",
     "nprogress": "^0.2.0",
     "path-to-regexp": "^6.2.0",
-    "pinia": "2.0.0",
+    "pinia": "2.0.12",
+    "print-js": "^1.6.0",
     "qrcode": "^1.5.0",
-    "qs": "^6.10.2",
+    "qs": "^6.10.3",
     "resize-observer-polyfill": "^1.5.1",
-    "sortablejs": "^1.14.0",
-    "vue": "^3.2.26",
+    "showdown": "^2.1.0",
+    "sortablejs": "^1.15.0",
+    "tinymce": "^5.10.3",
+    "vditor": "^3.8.13",
+    "vue": "^3.2.33",
     "vue-i18n": "^9.1.9",
-    "vue-router": "^4.0.12",
-    "vue-types": "^4.1.1"
+    "vue-json-pretty": "^2.0.6",
+    "vue-router": "^4.0.14",
+    "vue-types": "^4.1.1",
+    "xlsx": "^0.18.5"
   },
   "devDependencies": {
-    "@iconify/json": "^1.1.446",
-    "@purge-icons/generated": "^0.7.0",
+    "@commitlint/cli": "^16.2.3",
+    "@commitlint/config-conventional": "^16.2.1",
+    "@iconify/json": "^2.1.30",
+    "@purge-icons/generated": "^0.8.1",
     "@types/codemirror": "^5.60.5",
-    "@types/crypto-js": "^4.0.2",
+    "@types/crypto-js": "^4.1.1",
     "@types/fs-extra": "^9.0.13",
-    "@types/inquirer": "^8.1.3",
+    "@types/inquirer": "^8.2.1",
     "@types/intro.js": "^3.0.2",
-    "@types/lodash-es": "^4.17.5",
-    "@types/mockjs": "^1.0.4",
-    "@types/node": "^16.11.15",
+    "@types/lodash-es": "^4.17.6",
+    "@types/mockjs": "^1.0.6",
+    "@types/node": "^17.0.25",
     "@types/nprogress": "^0.2.0",
     "@types/qrcode": "^1.4.2",
     "@types/qs": "^6.9.7",
     "@types/showdown": "^1.9.4",
     "@types/sortablejs": "^1.10.7",
-    "@vitejs/plugin-legacy": "^1.6.4",
-    "@vitejs/plugin-vue": "^1.10.2",
-    "@vitejs/plugin-vue-jsx": "^1.3.3",
-    "@vue/compiler-sfc": "3.2.21",
+    "@typescript-eslint/eslint-plugin": "^5.20.0",
+    "@typescript-eslint/parser": "^5.20.0",
+    "@vitejs/plugin-legacy": "^1.8.1",
+    "@vitejs/plugin-vue": "^2.3.1",
+    "@vitejs/plugin-vue-jsx": "^1.3.10",
+    "@vue/compiler-sfc": "^3.2.33",
+    "@vue/test-utils": "^2.0.0-rc.21",
+    "autoprefixer": "^10.4.4",
+    "conventional-changelog-cli": "^2.2.2",
     "cross-env": "^7.0.3",
-    "dotenv": "^10.0.0",
-    "esno": "^0.10.1",
-    "fs-extra": "^10.0.0",
-    "inquirer": "^8.2.0",
+    "cz-git": "^1.3.9",
+    "czg": "^1.3.9",
+    "dotenv": "^16.0.0",
+    "eslint": "^8.13.0",
+    "eslint-config-prettier": "^8.5.0",
+    "eslint-plugin-prettier": "^4.0.0",
+    "eslint-plugin-vue": "^8.6.0",
+    "esno": "^0.14.1",
+    "fs-extra": "^10.1.0",
+    "husky": "^7.0.4",
+    "inquirer": "^8.2.2",
     "less": "^4.1.2",
-    "rollup-plugin-visualizer": "^5.5.2",
-    "typescript": "^4.5.4",
-    "vite": "^2.7.6",
-    "vite-plugin-compression": "^0.3.6",
-    "vite-plugin-html": "^2.1.1",
-    "vite-plugin-imagemin": "^0.4.6",
+    "lint-staged": "12.3.7",
+    "npm-run-all": "^4.1.5",
+    "picocolors": "^1.0.0",
+    "postcss": "^8.4.12",
+    "postcss-html": "^1.4.1",
+    "postcss-less": "^6.0.0",
+    "prettier": "^2.6.2",
+    "rimraf": "^3.0.2",
+    "rollup": "^2.70.2",
+    "rollup-plugin-visualizer": "^5.6.0",
+    "stylelint": "^14.7.1",
+    "stylelint-config-prettier": "^9.0.3",
+    "stylelint-config-recommended": "^7.0.0",
+    "stylelint-config-recommended-vue": "^1.4.0",
+    "stylelint-config-standard": "^25.0.0",
+    "stylelint-order": "^5.0.0",
+    "ts-node": "^10.7.0",
+    "typescript": "^4.6.3",
+    "vite": "^2.9.5",
+    "vite-plugin-compression": "^0.5.1",
+    "vite-plugin-html": "^3.2.0",
+    "vite-plugin-imagemin": "^0.6.1",
+    "vite-plugin-mkcert": "^1.6.0",
     "vite-plugin-mock": "^2.9.6",
-    "vite-plugin-purge-icons": "^0.7.0",
-    "vite-plugin-pwa": "^0.11.12",
-    "vite-plugin-style-import": "^1.4.0",
-    "vite-plugin-svg-icons": "^1.0.5",
-    "vite-plugin-theme": "^0.8.1",
-    "vite-plugin-vue-setup-extend": "^0.1.0",
-    "vite-plugin-windicss": "^1.6.1"
+    "vite-plugin-purge-icons": "^0.8.1",
+    "vite-plugin-pwa": "^0.11.13",
+    "vite-plugin-style-import": "^2.0.0",
+    "vite-plugin-svg-icons": "^2.0.1",
+    "vite-plugin-theme": "^0.8.6",
+    "vite-plugin-vue-setup-extend": "^0.4.0",
+    "vite-plugin-windicss": "^1.8.4",
+    "vue-eslint-parser": "^8.3.0",
+    "vue-tsc": "^0.33.9"
   },
   "resolutions": {
-    "//": "Used to install imagemin dependencies, because imagemin may not be installed in China. If it is abroad, you can delete it",
     "bin-wrapper": "npm:bin-wrapper-china",
-    "rollup": "^2.61.1"
+    "rollup": "^2.56.3",
+    "gifsicle": "5.2.0"
   },
   "repository": {
     "type": "git",
@@ -95,5 +161,34 @@
   "homepage": "https://gitee.com/Suomm/tutor-ui",
   "engines": {
     "node": "^12 || >=14"
+  },
+  "lint-staged": {
+    "*.{js,jsx,ts,tsx}": [
+      "eslint --fix",
+      "prettier --write"
+    ],
+    "{!(package)*.json,*.code-snippets,.!(browserslist)*rc}": [
+      "prettier --write--parser json"
+    ],
+    "package.json": [
+      "prettier --write"
+    ],
+    "*.vue": [
+      "eslint --fix",
+      "prettier --write",
+      "stylelint --fix"
+    ],
+    "*.{scss,less,styl,html}": [
+      "stylelint --fix",
+      "prettier --write"
+    ],
+    "*.md": [
+      "prettier --write"
+    ]
+  },
+  "config": {
+    "commitizen": {
+      "path": "node_modules/cz-git"
+    }
   }
 }
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
deleted file mode 100644
index 0588f332f2d9a72a402438760572213500105088..0000000000000000000000000000000000000000
--- a/pnpm-lock.yaml
+++ /dev/null
@@ -1,7419 +0,0 @@
-lockfileVersion: 5.3
-
-overrides:
-  //: Used to install imagemin dependencies, because imagemin may not be installed in China. If it is abroad, you can delete it
-  bin-wrapper: npm:bin-wrapper-china
-  rollup: ^2.61.1
-
-specifiers:
-  '@ant-design/colors': ^6.0.0
-  '@ant-design/icons-vue': ^6.0.1
-  '@iconify/iconify': ^2.1.0
-  '@iconify/json': ^1.1.446
-  '@purge-icons/generated': ^0.7.0
-  '@types/codemirror': ^5.60.5
-  '@types/crypto-js': ^4.0.2
-  '@types/fs-extra': ^9.0.13
-  '@types/inquirer': ^8.1.3
-  '@types/intro.js': ^3.0.2
-  '@types/lodash-es': ^4.17.5
-  '@types/mockjs': ^1.0.4
-  '@types/node': ^16.11.15
-  '@types/nprogress': ^0.2.0
-  '@types/qrcode': ^1.4.2
-  '@types/qs': ^6.9.7
-  '@types/showdown': ^1.9.4
-  '@types/sortablejs': ^1.10.7
-  '@vitejs/plugin-legacy': ^1.6.4
-  '@vitejs/plugin-vue': ^1.10.2
-  '@vitejs/plugin-vue-jsx': ^1.3.3
-  '@vue/compiler-sfc': 3.2.21
-  '@vueuse/core': ^6.9.2
-  '@vueuse/shared': ^6.9.2
-  '@zxcvbn-ts/core': ^1.2.0
-  ant-design-vue: 2.2.8
-  axios: ^0.24.0
-  cross-env: ^7.0.3
-  crypto-js: ^4.1.1
-  dotenv: ^10.0.0
-  echarts: ^5.2.2
-  esno: ^0.10.1
-  fs-extra: ^10.0.0
-  inquirer: ^8.2.0
-  less: ^4.1.2
-  lodash-es: ^4.17.21
-  mockjs: ^1.1.0
-  moment: ^2.29.1
-  nprogress: ^0.2.0
-  path-to-regexp: ^6.2.0
-  pinia: 2.0.0
-  qrcode: ^1.5.0
-  qs: ^6.10.2
-  resize-observer-polyfill: ^1.5.1
-  rollup-plugin-visualizer: ^5.5.2
-  sortablejs: ^1.14.0
-  typescript: ^4.5.4
-  vite: ^2.7.6
-  vite-plugin-compression: ^0.3.6
-  vite-plugin-html: ^2.1.1
-  vite-plugin-imagemin: ^0.4.6
-  vite-plugin-mock: ^2.9.6
-  vite-plugin-purge-icons: ^0.7.0
-  vite-plugin-pwa: ^0.11.12
-  vite-plugin-style-import: ^1.4.0
-  vite-plugin-svg-icons: ^1.0.5
-  vite-plugin-theme: ^0.8.1
-  vite-plugin-vue-setup-extend: ^0.1.0
-  vite-plugin-windicss: ^1.6.1
-  vue: ^3.2.26
-  vue-i18n: ^9.1.9
-  vue-router: ^4.0.12
-  vue-types: ^4.1.1
-
-dependencies:
-  '@ant-design/colors': 6.0.0
-  '@ant-design/icons-vue': 6.0.1_vue@3.2.26
-  '@iconify/iconify': 2.1.0
-  '@vueuse/core': 6.9.2_vue@3.2.26
-  '@vueuse/shared': 6.9.2_vue@3.2.26
-  '@zxcvbn-ts/core': 1.2.0
-  ant-design-vue: 2.2.8_095859896ec76c1f97b322e01cbf47cb
-  axios: 0.24.0
-  crypto-js: 4.1.1
-  echarts: 5.2.2
-  lodash-es: 4.17.21
-  mockjs: 1.1.0
-  moment: 2.29.1
-  nprogress: 0.2.0
-  path-to-regexp: 6.2.0
-  pinia: 2.0.0_typescript@4.5.4+vue@3.2.26
-  qrcode: 1.5.0
-  qs: 6.10.2
-  resize-observer-polyfill: 1.5.1
-  sortablejs: 1.14.0
-  vue: 3.2.26
-  vue-i18n: 9.1.9_vue@3.2.26
-  vue-router: 4.0.12_vue@3.2.26
-  vue-types: 4.1.1_vue@3.2.26
-
-devDependencies:
-  '@iconify/json': 1.1.446
-  '@purge-icons/generated': 0.7.0
-  '@types/codemirror': 5.60.5
-  '@types/crypto-js': 4.0.2
-  '@types/fs-extra': 9.0.13
-  '@types/inquirer': 8.1.3
-  '@types/intro.js': 3.0.2
-  '@types/lodash-es': 4.17.5
-  '@types/mockjs': 1.0.4
-  '@types/node': 16.11.15
-  '@types/nprogress': 0.2.0
-  '@types/qrcode': 1.4.2
-  '@types/qs': 6.9.7
-  '@types/showdown': 1.9.4
-  '@types/sortablejs': 1.10.7
-  '@vitejs/plugin-legacy': 1.6.4_vite@2.7.6
-  '@vitejs/plugin-vue': 1.10.2_vite@2.7.6
-  '@vitejs/plugin-vue-jsx': 1.3.3
-  '@vue/compiler-sfc': 3.2.21
-  cross-env: 7.0.3
-  dotenv: 10.0.0
-  esno: 0.10.1
-  fs-extra: 10.0.0
-  inquirer: 8.2.0
-  less: 4.1.2
-  rollup-plugin-visualizer: 5.5.2
-  typescript: 4.5.4
-  vite: 2.7.6_less@4.1.2
-  vite-plugin-compression: 0.3.6_vite@2.7.6
-  vite-plugin-html: 2.1.1_vite@2.7.6
-  vite-plugin-imagemin: 0.4.6_vite@2.7.6
-  vite-plugin-mock: 2.9.6_mockjs@1.1.0+vite@2.7.6
-  vite-plugin-purge-icons: 0.7.0_vite@2.7.6
-  vite-plugin-pwa: 0.11.12_vite@2.7.6
-  vite-plugin-style-import: 1.4.0_vite@2.7.6
-  vite-plugin-svg-icons: 1.0.5_vite@2.7.6
-  vite-plugin-theme: 0.8.1_vite@2.7.6
-  vite-plugin-vue-setup-extend: 0.1.0_vite@2.7.6
-  vite-plugin-windicss: 1.6.1_vite@2.7.6
-
-packages:
-
-  /@ant-design/colors/5.1.1:
-    resolution: {integrity: sha1-gAshhrHifmZDLmfQPtlq8+IdiUA=, tarball: '@ant-design/colors/download/@ant-design/colors-5.1.1.tgz'}
-    dependencies:
-      '@ctrl/tinycolor': 3.4.0
-    dev: false
-
-  /@ant-design/colors/6.0.0:
-    resolution: {integrity: sha1-m5NmJXz/zEfbQrnQIDu1ksE8Apg=, tarball: '@ant-design/colors/download/@ant-design/colors-6.0.0.tgz'}
-    dependencies:
-      '@ctrl/tinycolor': 3.4.0
-    dev: false
-
-  /@ant-design/icons-svg/4.2.1:
-    resolution: {integrity: sha1-hjDajrRHGkqr2u19H/apfcss8Fo=, tarball: '@ant-design/icons-svg/download/@ant-design/icons-svg-4.2.1.tgz'}
-    dev: false
-
-  /@ant-design/icons-vue/6.0.1_vue@3.2.26:
-    resolution: {integrity: sha1-nYBMPHTSz6+XyxjlgtO5QAk09f0=, tarball: '@ant-design/icons-vue/download/@ant-design/icons-vue-6.0.1.tgz'}
-    peerDependencies:
-      vue: '>=3.0.3'
-    dependencies:
-      '@ant-design/colors': 5.1.1
-      '@ant-design/icons-svg': 4.2.1
-      '@types/lodash': 4.14.178
-      lodash: 4.17.21
-      vue: 3.2.26
-    dev: false
-
-  /@antfu/utils/0.3.0:
-    resolution: {integrity: sha1-YwbEO1Kog72Olz4+2N1kJIQYvMQ=, tarball: '@antfu/utils/download/@antfu/utils-0.3.0.tgz'}
-    dependencies:
-      '@types/throttle-debounce': 2.1.0
-    dev: true
-
-  /@apideck/better-ajv-errors/0.3.1_ajv@8.8.2:
-    resolution: {integrity: sha512-6RMV31esAxqlDIvVCG/CJxY/s8dFNVOI5w8RWIfDMhjg/iwqnawko9tJXau/leqC4+T1Bu8et99QVWCwU5wk+g==, tarball: '@apideck/better-ajv-errors/download/@apideck/better-ajv-errors-0.3.1.tgz'}
-    engines: {node: '>=10'}
-    peerDependencies:
-      ajv: '>=8'
-    dependencies:
-      ajv: 8.8.2
-      json-schema: 0.4.0
-      jsonpointer: 5.0.0
-      leven: 3.1.0
-    dev: true
-
-  /@babel/code-frame/7.16.0:
-    resolution: {integrity: sha1-DfyAMJvuyEEeZecGRhxAiwu5tDE=, tarball: '@babel/code-frame/download/@babel/code-frame-7.16.0.tgz'}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/highlight': 7.16.0
-    dev: true
-
-  /@babel/compat-data/7.16.4:
-    resolution: {integrity: sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==, tarball: '@babel/compat-data/download/@babel/compat-data-7.16.4.tgz'}
-    engines: {node: '>=6.9.0'}
-    dev: true
-
-  /@babel/core/7.16.5:
-    resolution: {integrity: sha512-wUcenlLzuWMZ9Zt8S0KmFwGlH6QKRh3vsm/dhDA3CHkiTA45YuG1XkHRcNRl73EFPXDp/d5kVOU0/y7x2w6OaQ==, tarball: '@babel/core/download/@babel/core-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/code-frame': 7.16.0
-      '@babel/generator': 7.16.5
-      '@babel/helper-compilation-targets': 7.16.3_@babel+core@7.16.5
-      '@babel/helper-module-transforms': 7.16.5
-      '@babel/helpers': 7.16.5
-      '@babel/parser': 7.16.6
-      '@babel/template': 7.16.0
-      '@babel/traverse': 7.16.5
-      '@babel/types': 7.16.0
-      convert-source-map: 1.8.0
-      debug: 4.3.3
-      gensync: 1.0.0-beta.2
-      json5: 2.2.0
-      semver: 6.3.0
-      source-map: 0.5.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@babel/generator/7.16.5:
-    resolution: {integrity: sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA==, tarball: '@babel/generator/download/@babel/generator-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.16.0
-      jsesc: 2.5.2
-      source-map: 0.5.7
-    dev: true
-
-  /@babel/helper-annotate-as-pure/7.16.0:
-    resolution: {integrity: sha1-mh8OvNpT2aLQAQjEzqzmpdXx8I0=, tarball: '@babel/helper-annotate-as-pure/download/@babel/helper-annotate-as-pure-7.16.0.tgz'}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.16.0
-    dev: true
-
-  /@babel/helper-builder-binary-assignment-operator-visitor/7.16.5:
-    resolution: {integrity: sha512-3JEA9G5dmmnIWdzaT9d0NmFRgYnWUThLsDaL7982H0XqqWr56lRrsmwheXFMjR+TMl7QMBb6mzy9kvgr1lRLUA==, tarball: '@babel/helper-builder-binary-assignment-operator-visitor/download/@babel/helper-builder-binary-assignment-operator-visitor-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/helper-explode-assignable-expression': 7.16.0
-      '@babel/types': 7.16.0
-    dev: true
-
-  /@babel/helper-compilation-targets/7.16.3_@babel+core@7.16.5:
-    resolution: {integrity: sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==, tarball: '@babel/helper-compilation-targets/download/@babel/helper-compilation-targets-7.16.3.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/compat-data': 7.16.4
-      '@babel/core': 7.16.5
-      '@babel/helper-validator-option': 7.14.5
-      browserslist: 4.19.1
-      semver: 6.3.0
-    dev: true
-
-  /@babel/helper-create-class-features-plugin/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-NEohnYA7mkB8L5JhU7BLwcBdU3j83IziR9aseMueWGeAjblbul3zzb8UvJ3a1zuBiqCMObzCJHFqKIQE6hTVmg==, tarball: '@babel/helper-create-class-features-plugin/download/@babel/helper-create-class-features-plugin-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-annotate-as-pure': 7.16.0
-      '@babel/helper-environment-visitor': 7.16.5
-      '@babel/helper-function-name': 7.16.0
-      '@babel/helper-member-expression-to-functions': 7.16.5
-      '@babel/helper-optimise-call-expression': 7.16.0
-      '@babel/helper-replace-supers': 7.16.5
-      '@babel/helper-split-export-declaration': 7.16.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@babel/helper-create-regexp-features-plugin/7.16.0_@babel+core@7.16.5:
-    resolution: {integrity: sha1-BrI0jON/zMT14Y3NjXUFPyp8RP8=, tarball: '@babel/helper-create-regexp-features-plugin/download/@babel/helper-create-regexp-features-plugin-7.16.0.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-annotate-as-pure': 7.16.0
-      regexpu-core: 4.8.0
-    dev: true
-
-  /@babel/helper-define-polyfill-provider/0.3.0_@babel+core@7.16.5:
-    resolution: {integrity: sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==, tarball: '@babel/helper-define-polyfill-provider/download/@babel/helper-define-polyfill-provider-0.3.0.tgz'}
-    peerDependencies:
-      '@babel/core': ^7.4.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-compilation-targets': 7.16.3_@babel+core@7.16.5
-      '@babel/helper-module-imports': 7.16.0
-      '@babel/helper-plugin-utils': 7.16.5
-      '@babel/traverse': 7.16.5
-      debug: 4.3.3
-      lodash.debounce: 4.0.8
-      resolve: 1.20.0
-      semver: 6.3.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@babel/helper-environment-visitor/7.16.5:
-    resolution: {integrity: sha512-ODQyc5AnxmZWm/R2W7fzhamOk1ey8gSguo5SGvF0zcB3uUzRpTRmM/jmLSm9bDMyPlvbyJ+PwPEK0BWIoZ9wjg==, tarball: '@babel/helper-environment-visitor/download/@babel/helper-environment-visitor-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.16.0
-    dev: true
-
-  /@babel/helper-explode-assignable-expression/7.16.0:
-    resolution: {integrity: sha1-dTAXM3oV9G+cCfZ0z/EM7pudd3g=, tarball: '@babel/helper-explode-assignable-expression/download/@babel/helper-explode-assignable-expression-7.16.0.tgz'}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.16.0
-    dev: true
-
-  /@babel/helper-function-name/7.16.0:
-    resolution: {integrity: sha1-t90Hl9ALv+5PB+nE6lsOMMi7FIE=, tarball: '@babel/helper-function-name/download/@babel/helper-function-name-7.16.0.tgz'}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/helper-get-function-arity': 7.16.0
-      '@babel/template': 7.16.0
-      '@babel/types': 7.16.0
-    dev: true
-
-  /@babel/helper-get-function-arity/7.16.0:
-    resolution: {integrity: sha1-AIjHSGspqctdlIsaHeRttm4InPo=, tarball: '@babel/helper-get-function-arity/download/@babel/helper-get-function-arity-7.16.0.tgz'}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.16.0
-    dev: true
-
-  /@babel/helper-hoist-variables/7.16.0:
-    resolution: {integrity: sha1-TJAjwvHe9+KP9G/B2802o5vqqBo=, tarball: '@babel/helper-hoist-variables/download/@babel/helper-hoist-variables-7.16.0.tgz'}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.16.0
-    dev: true
-
-  /@babel/helper-member-expression-to-functions/7.16.5:
-    resolution: {integrity: sha512-7fecSXq7ZrLE+TWshbGT+HyCLkxloWNhTbU2QM1NTI/tDqyf0oZiMcEfYtDuUDCo528EOlt39G1rftea4bRZIw==, tarball: '@babel/helper-member-expression-to-functions/download/@babel/helper-member-expression-to-functions-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.16.0
-    dev: true
-
-  /@babel/helper-module-imports/7.16.0:
-    resolution: {integrity: sha1-kFOOYLZy7PG0SPX09UM9N+eaPsM=, tarball: '@babel/helper-module-imports/download/@babel/helper-module-imports-7.16.0.tgz'}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.16.0
-    dev: true
-
-  /@babel/helper-module-transforms/7.16.5:
-    resolution: {integrity: sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==, tarball: '@babel/helper-module-transforms/download/@babel/helper-module-transforms-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/helper-environment-visitor': 7.16.5
-      '@babel/helper-module-imports': 7.16.0
-      '@babel/helper-simple-access': 7.16.0
-      '@babel/helper-split-export-declaration': 7.16.0
-      '@babel/helper-validator-identifier': 7.15.7
-      '@babel/template': 7.16.0
-      '@babel/traverse': 7.16.5
-      '@babel/types': 7.16.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@babel/helper-optimise-call-expression/7.16.0:
-    resolution: {integrity: sha1-zs2xRdcMVAlrFWT46fEM19GTszg=, tarball: '@babel/helper-optimise-call-expression/download/@babel/helper-optimise-call-expression-7.16.0.tgz'}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.16.0
-    dev: true
-
-  /@babel/helper-plugin-utils/7.16.5:
-    resolution: {integrity: sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==, tarball: '@babel/helper-plugin-utils/download/@babel/helper-plugin-utils-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    dev: true
-
-  /@babel/helper-remap-async-to-generator/7.16.5:
-    resolution: {integrity: sha512-X+aAJldyxrOmN9v3FKp+Hu1NO69VWgYgDGq6YDykwRPzxs5f2N+X988CBXS7EQahDU+Vpet5QYMqLk+nsp+Qxw==, tarball: '@babel/helper-remap-async-to-generator/download/@babel/helper-remap-async-to-generator-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/helper-annotate-as-pure': 7.16.0
-      '@babel/helper-wrap-function': 7.16.5
-      '@babel/types': 7.16.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@babel/helper-replace-supers/7.16.5:
-    resolution: {integrity: sha512-ao3seGVa/FZCMCCNDuBcqnBFSbdr8N2EW35mzojx3TwfIbdPmNK+JV6+2d5bR0Z71W5ocLnQp9en/cTF7pBJiQ==, tarball: '@babel/helper-replace-supers/download/@babel/helper-replace-supers-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/helper-environment-visitor': 7.16.5
-      '@babel/helper-member-expression-to-functions': 7.16.5
-      '@babel/helper-optimise-call-expression': 7.16.0
-      '@babel/traverse': 7.16.5
-      '@babel/types': 7.16.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@babel/helper-simple-access/7.16.0:
-    resolution: {integrity: sha1-IdaidiDjg+N1NM9sELugGab5BRc=, tarball: '@babel/helper-simple-access/download/@babel/helper-simple-access-7.16.0.tgz'}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.16.0
-    dev: true
-
-  /@babel/helper-skip-transparent-expression-wrappers/7.16.0:
-    resolution: {integrity: sha1-DuM4gHAUfDrgUeSH7KPrsOLouwk=, tarball: '@babel/helper-skip-transparent-expression-wrappers/download/@babel/helper-skip-transparent-expression-wrappers-7.16.0.tgz'}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.16.0
-    dev: true
-
-  /@babel/helper-split-export-declaration/7.16.0:
-    resolution: {integrity: sha1-KWcvQ2Y+k23zcKrrIr7ds7rsdDg=, tarball: '@babel/helper-split-export-declaration/download/@babel/helper-split-export-declaration-7.16.0.tgz'}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.16.0
-    dev: true
-
-  /@babel/helper-validator-identifier/7.15.7:
-    resolution: {integrity: sha1-Ig35k7/pBKSmsCq08zhaXr9uI4k=, tarball: '@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.15.7.tgz'}
-    engines: {node: '>=6.9.0'}
-    dev: true
-
-  /@babel/helper-validator-option/7.14.5:
-    resolution: {integrity: sha1-bnKh//GNXfy4eOHmLxoCHEty1aM=, tarball: '@babel/helper-validator-option/download/@babel/helper-validator-option-7.14.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    dev: true
-
-  /@babel/helper-wrap-function/7.16.5:
-    resolution: {integrity: sha512-2J2pmLBqUqVdJw78U0KPNdeE2qeuIyKoG4mKV7wAq3mc4jJG282UgjZw4ZYDnqiWQuS3Y3IYdF/AQ6CpyBV3VA==, tarball: '@babel/helper-wrap-function/download/@babel/helper-wrap-function-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/helper-function-name': 7.16.0
-      '@babel/template': 7.16.0
-      '@babel/traverse': 7.16.5
-      '@babel/types': 7.16.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@babel/helpers/7.16.5:
-    resolution: {integrity: sha512-TLgi6Lh71vvMZGEkFuIxzaPsyeYCHQ5jJOOX1f0xXn0uciFuE8cEk0wyBquMcCxBXZ5BJhE2aUB7pnWTD150Tw==, tarball: '@babel/helpers/download/@babel/helpers-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/template': 7.16.0
-      '@babel/traverse': 7.16.5
-      '@babel/types': 7.16.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@babel/highlight/7.16.0:
-    resolution: {integrity: sha1-bOsysspLj182H7f9gh4/3fShclo=, tarball: '@babel/highlight/download/@babel/highlight-7.16.0.tgz'}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/helper-validator-identifier': 7.15.7
-      chalk: 2.4.2
-      js-tokens: 4.0.0
-    dev: true
-
-  /@babel/parser/7.16.6:
-    resolution: {integrity: sha512-Gr86ujcNuPDnNOY8mi383Hvi8IYrJVJYuf3XcuBM/Dgd+bINn/7tHqsj+tKkoreMbmGsFLsltI/JJd8fOFWGDQ==, tarball: '@babel/parser/download/@babel/parser-7.16.6.tgz'}
-    engines: {node: '>=6.0.0'}
-    hasBin: true
-
-  /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.2_@babel+core@7.16.5:
-    resolution: {integrity: sha1-KXf8qbIS2xU8GVZ05Xz6uAdzMYM=, tarball: '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/download/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.0_@babel+core@7.16.5:
-    resolution: {integrity: sha1-NYly6qsAb16wgmGDsMk8vK8T4eI=, tarball: '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/download/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.13.0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-      '@babel/helper-skip-transparent-expression-wrappers': 7.16.0
-      '@babel/plugin-proposal-optional-chaining': 7.16.5_@babel+core@7.16.5
-    dev: true
-
-  /@babel/plugin-proposal-async-generator-functions/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-C/FX+3HNLV6sz7AqbTQqEo1L9/kfrKjxcVtgyBCmvIgOjvuBVUWooDoi7trsLxOzCEo5FccjRvKHkfDsJFZlfA==, tarball: '@babel/plugin-proposal-async-generator-functions/download/@babel/plugin-proposal-async-generator-functions-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-      '@babel/helper-remap-async-to-generator': 7.16.5
-      '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.16.5
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@babel/plugin-proposal-class-properties/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-pJD3HjgRv83s5dv1sTnDbZOaTjghKEz8KUn1Kbh2eAIRhGuyQ1XSeI4xVXU3UlIEVA3DAyIdxqT1eRn7Wcn55A==, tarball: '@babel/plugin-proposal-class-properties/download/@babel/plugin-proposal-class-properties-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-create-class-features-plugin': 7.16.5_@babel+core@7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@babel/plugin-proposal-class-static-block/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-EEFzuLZcm/rNJ8Q5krK+FRKdVkd6FjfzT9tuSZql9sQn64K0hHA2KLJ0DqVot9/iV6+SsuadC5yI39zWnm+nmQ==, tarball: '@babel/plugin-proposal-class-static-block/download/@babel/plugin-proposal-class-static-block-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.12.0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-create-class-features-plugin': 7.16.5_@babel+core@7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-      '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.16.5
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@babel/plugin-proposal-dynamic-import/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-P05/SJZTTvHz79LNYTF8ff5xXge0kk5sIIWAypcWgX4BTRUgyHc8wRxJ/Hk+mU0KXldgOOslKaeqnhthcDJCJQ==, tarball: '@babel/plugin-proposal-dynamic-import/download/@babel/plugin-proposal-dynamic-import-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-      '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.16.5
-    dev: true
-
-  /@babel/plugin-proposal-export-namespace-from/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-i+sltzEShH1vsVydvNaTRsgvq2vZsfyrd7K7vPLUU/KgS0D5yZMe6uipM0+izminnkKrEfdUnz7CxMRb6oHZWw==, tarball: '@babel/plugin-proposal-export-namespace-from/download/@babel/plugin-proposal-export-namespace-from-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-      '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.16.5
-    dev: true
-
-  /@babel/plugin-proposal-json-strings/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-QQJueTFa0y9E4qHANqIvMsuxM/qcLQmKttBACtPCQzGUEizsXDACGonlPiSwynHfOa3vNw0FPMVvQzbuXwh4SQ==, tarball: '@babel/plugin-proposal-json-strings/download/@babel/plugin-proposal-json-strings-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-      '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.16.5
-    dev: true
-
-  /@babel/plugin-proposal-logical-assignment-operators/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-xqibl7ISO2vjuQM+MzR3rkd0zfNWltk7n9QhaD8ghMmMceVguYrNDt7MikRyj4J4v3QehpnrU8RYLnC7z/gZLA==, tarball: '@babel/plugin-proposal-logical-assignment-operators/download/@babel/plugin-proposal-logical-assignment-operators-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-      '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.16.5
-    dev: true
-
-  /@babel/plugin-proposal-nullish-coalescing-operator/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-YwMsTp/oOviSBhrjwi0vzCUycseCYwoXnLiXIL3YNjHSMBHicGTz7GjVU/IGgz4DtOEXBdCNG72pvCX22ehfqg==, tarball: '@babel/plugin-proposal-nullish-coalescing-operator/download/@babel/plugin-proposal-nullish-coalescing-operator-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-      '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.16.5
-    dev: true
-
-  /@babel/plugin-proposal-numeric-separator/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-DvB9l/TcsCRvsIV9v4jxR/jVP45cslTVC0PMVHvaJhhNuhn2Y1SOhCSFlPK777qLB5wb8rVDaNoqMTyOqtY5Iw==, tarball: '@babel/plugin-proposal-numeric-separator/download/@babel/plugin-proposal-numeric-separator-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-      '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.16.5
-    dev: true
-
-  /@babel/plugin-proposal-object-rest-spread/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-UEd6KpChoyPhCoE840KRHOlGhEZFutdPDMGj+0I56yuTTOaT51GzmnEl/0uT41fB/vD2nT+Pci2KjezyE3HmUw==, tarball: '@babel/plugin-proposal-object-rest-spread/download/@babel/plugin-proposal-object-rest-spread-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/compat-data': 7.16.4
-      '@babel/core': 7.16.5
-      '@babel/helper-compilation-targets': 7.16.3_@babel+core@7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-      '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.16.5
-      '@babel/plugin-transform-parameters': 7.16.5_@babel+core@7.16.5
-    dev: true
-
-  /@babel/plugin-proposal-optional-catch-binding/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-ihCMxY1Iljmx4bWy/PIMJGXN4NS4oUj1MKynwO07kiKms23pNvIn1DMB92DNB2R0EA882sw0VXIelYGdtF7xEQ==, tarball: '@babel/plugin-proposal-optional-catch-binding/download/@babel/plugin-proposal-optional-catch-binding-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-      '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.16.5
-    dev: true
-
-  /@babel/plugin-proposal-optional-chaining/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-kzdHgnaXRonttiTfKYnSVafbWngPPr2qKw9BWYBESl91W54e+9R5pP70LtWxV56g0f05f/SQrwHYkfvbwcdQ/A==, tarball: '@babel/plugin-proposal-optional-chaining/download/@babel/plugin-proposal-optional-chaining-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-      '@babel/helper-skip-transparent-expression-wrappers': 7.16.0
-      '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.16.5
-    dev: true
-
-  /@babel/plugin-proposal-private-methods/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-+yFMO4BGT3sgzXo+lrq7orX5mAZt57DwUK6seqII6AcJnJOIhBJ8pzKH47/ql/d426uQ7YhN8DpUFirQzqYSUA==, tarball: '@babel/plugin-proposal-private-methods/download/@babel/plugin-proposal-private-methods-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-create-class-features-plugin': 7.16.5_@babel+core@7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@babel/plugin-proposal-private-property-in-object/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-+YGh5Wbw0NH3y/E5YMu6ci5qTDmAEVNoZ3I54aB6nVEOZ5BQ7QJlwKq5pYVucQilMByGn/bvX0af+uNaPRCabA==, tarball: '@babel/plugin-proposal-private-property-in-object/download/@babel/plugin-proposal-private-property-in-object-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-annotate-as-pure': 7.16.0
-      '@babel/helper-create-class-features-plugin': 7.16.5_@babel+core@7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-      '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.16.5
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@babel/plugin-proposal-unicode-property-regex/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-s5sKtlKQyFSatt781HQwv1hoM5BQ9qRH30r+dK56OLDsHmV74mzwJNX7R1yMuE7VZKG5O6q/gmOGSAO6ikTudg==, tarball: '@babel/plugin-proposal-unicode-property-regex/download/@babel/plugin-proposal-unicode-property-regex-7.16.5.tgz'}
-    engines: {node: '>=4'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-create-regexp-features-plugin': 7.16.0_@babel+core@7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.16.5:
-    resolution: {integrity: sha1-qYP7Gusuw/btBCohD2QOkOeG/g0=, tarball: '@babel/plugin-syntax-async-generators/download/@babel/plugin-syntax-async-generators-7.8.4.tgz'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.16.5:
-    resolution: {integrity: sha1-tcmHJ0xKOoK4lxR5aTGmtTVErhA=, tarball: '@babel/plugin-syntax-class-properties/download/@babel/plugin-syntax-class-properties-7.12.13.tgz'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.16.5:
-    resolution: {integrity: sha1-GV34mxRrS3izv4l/16JXyEZZ1AY=, tarball: '@babel/plugin-syntax-class-static-block/download/@babel/plugin-syntax-class-static-block-7.14.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.16.5:
-    resolution: {integrity: sha1-Yr+Ysto80h1iYVT8lu5bPLaOrLM=, tarball: '@babel/plugin-syntax-dynamic-import/download/@babel/plugin-syntax-dynamic-import-7.8.3.tgz?cache=0&sync_timestamp=1632822771523&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fplugin-syntax-dynamic-import%2Fdownload%2F%40babel%2Fplugin-syntax-dynamic-import-7.8.3.tgz'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.16.5:
-    resolution: {integrity: sha1-AolkqbqA28CUyRXEh618TnpmRlo=, tarball: '@babel/plugin-syntax-export-namespace-from/download/@babel/plugin-syntax-export-namespace-from-7.8.3.tgz'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.16.5:
-    resolution: {integrity: sha1-7mATSMNw+jNNIge+FYd3SWUh/VE=, tarball: '@babel/plugin-syntax-import-meta/download/@babel/plugin-syntax-import-meta-7.10.4.tgz?cache=0&sync_timestamp=1632822771791&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40babel%2Fplugin-syntax-import-meta%2Fdownload%2F%40babel%2Fplugin-syntax-import-meta-7.10.4.tgz'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.16.5:
-    resolution: {integrity: sha1-AcohtmjNghjJ5kDLbdiMVBKyyWo=, tarball: '@babel/plugin-syntax-json-strings/download/@babel/plugin-syntax-json-strings-7.8.3.tgz'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-syntax-jsx/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-42OGssv9NPk4QHKVgIHlzeLgPOW5rGgfV5jzG90AhcXXIv6hu/eqj63w4VgvRxdvZY3AlYeDgPiSJ3BqAd1Y6Q==, tarball: '@babel/plugin-syntax-jsx/download/@babel/plugin-syntax-jsx-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.16.5:
-    resolution: {integrity: sha1-ypHvRjA1MESLkGZSusLp/plB9pk=, tarball: '@babel/plugin-syntax-logical-assignment-operators/download/@babel/plugin-syntax-logical-assignment-operators-7.10.4.tgz'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.16.5:
-    resolution: {integrity: sha1-Fn7XA2iIYIH3S1w2xlqIwDtm0ak=, tarball: '@babel/plugin-syntax-nullish-coalescing-operator/download/@babel/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.16.5:
-    resolution: {integrity: sha1-ubBws+M1cM2f0Hun+pHA3Te5r5c=, tarball: '@babel/plugin-syntax-numeric-separator/download/@babel/plugin-syntax-numeric-separator-7.10.4.tgz'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.16.5:
-    resolution: {integrity: sha1-YOIl7cvZimQDMqLnLdPmbxr1WHE=, tarball: '@babel/plugin-syntax-object-rest-spread/download/@babel/plugin-syntax-object-rest-spread-7.8.3.tgz'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.16.5:
-    resolution: {integrity: sha1-YRGiZbz7Ag6579D9/X0mQCue1sE=, tarball: '@babel/plugin-syntax-optional-catch-binding/download/@babel/plugin-syntax-optional-catch-binding-7.8.3.tgz'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.16.5:
-    resolution: {integrity: sha1-T2nCq5UWfgGAzVM2YT+MV4j31Io=, tarball: '@babel/plugin-syntax-optional-chaining/download/@babel/plugin-syntax-optional-chaining-7.8.3.tgz'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.16.5:
-    resolution: {integrity: sha1-DcZnHsDqIrbpShEU+FeXDNOd4a0=, tarball: '@babel/plugin-syntax-private-property-in-object/download/@babel/plugin-syntax-private-property-in-object-7.14.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.16.5:
-    resolution: {integrity: sha1-wc/a3DWmRiQAAfBhOCR7dBw02Uw=, tarball: '@babel/plugin-syntax-top-level-await/download/@babel/plugin-syntax-top-level-await-7.14.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-syntax-typescript/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-/d4//lZ1Vqb4mZ5xTep3dDK888j7BGM/iKqBmndBaoYAFPlPKrGU608VVBz5JeyAb6YQDjRu1UKqj86UhwWVgw==, tarball: '@babel/plugin-syntax-typescript/download/@babel/plugin-syntax-typescript-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-transform-arrow-functions/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-8bTHiiZyMOyfZFULjsCnYOWG059FVMes0iljEHSfARhNgFfpsqE92OrCffv3veSw9rwMkYcFe9bj0ZoXU2IGtQ==, tarball: '@babel/plugin-transform-arrow-functions/download/@babel/plugin-transform-arrow-functions-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-transform-async-to-generator/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-TMXgfioJnkXU+XRoj7P2ED7rUm5jbnDWwlCuFVTpQboMfbSya5WrmubNBAMlk7KXvywpo8rd8WuYZkis1o2H8w==, tarball: '@babel/plugin-transform-async-to-generator/download/@babel/plugin-transform-async-to-generator-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-module-imports': 7.16.0
-      '@babel/helper-plugin-utils': 7.16.5
-      '@babel/helper-remap-async-to-generator': 7.16.5
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@babel/plugin-transform-block-scoped-functions/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-BxmIyKLjUGksJ99+hJyL/HIxLIGnLKtw772zYDER7UuycDZ+Xvzs98ZQw6NGgM2ss4/hlFAaGiZmMNKvValEjw==, tarball: '@babel/plugin-transform-block-scoped-functions/download/@babel/plugin-transform-block-scoped-functions-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-transform-block-scoping/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-JxjSPNZSiOtmxjX7PBRBeRJTUKTyJ607YUYeT0QJCNdsedOe+/rXITjP08eG8xUpsLfPirgzdCFN+h0w6RI+pQ==, tarball: '@babel/plugin-transform-block-scoping/download/@babel/plugin-transform-block-scoping-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-transform-classes/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-DzJ1vYf/7TaCYy57J3SJ9rV+JEuvmlnvvyvYKFbk5u46oQbBvuB9/0w+YsVsxkOv8zVWKpDmUoj4T5ILHoXevA==, tarball: '@babel/plugin-transform-classes/download/@babel/plugin-transform-classes-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-annotate-as-pure': 7.16.0
-      '@babel/helper-environment-visitor': 7.16.5
-      '@babel/helper-function-name': 7.16.0
-      '@babel/helper-optimise-call-expression': 7.16.0
-      '@babel/helper-plugin-utils': 7.16.5
-      '@babel/helper-replace-supers': 7.16.5
-      '@babel/helper-split-export-declaration': 7.16.0
-      globals: 11.12.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@babel/plugin-transform-computed-properties/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-n1+O7xtU5lSLraRzX88CNcpl7vtGdPakKzww74bVwpAIRgz9JVLJJpOLb0uYqcOaXVM0TL6X0RVeIJGD2CnCkg==, tarball: '@babel/plugin-transform-computed-properties/download/@babel/plugin-transform-computed-properties-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-transform-destructuring/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-GuRVAsjq+c9YPK6NeTkRLWyQskDC099XkBSVO+6QzbnOnH2d/4mBVXYStaPrZD3dFRfg00I6BFJ9Atsjfs8mlg==, tarball: '@babel/plugin-transform-destructuring/download/@babel/plugin-transform-destructuring-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-transform-dotall-regex/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-iQiEMt8Q4/5aRGHpGVK2Zc7a6mx7qEAO7qehgSug3SDImnuMzgmm/wtJALXaz25zUj1PmnNHtShjFgk4PDx4nw==, tarball: '@babel/plugin-transform-dotall-regex/download/@babel/plugin-transform-dotall-regex-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-create-regexp-features-plugin': 7.16.0_@babel+core@7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-transform-duplicate-keys/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-81tijpDg2a6I1Yhj4aWY1l3O1J4Cg/Pd7LfvuaH2VVInAkXtzibz9+zSPdUM1WvuUi128ksstAP0hM5w48vQgg==, tarball: '@babel/plugin-transform-duplicate-keys/download/@babel/plugin-transform-duplicate-keys-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-transform-exponentiation-operator/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-12rba2HwemQPa7BLIKCzm1pT2/RuQHtSFHdNl41cFiC6oi4tcrp7gjB07pxQvFpcADojQywSjblQth6gJyE6CA==, tarball: '@babel/plugin-transform-exponentiation-operator/download/@babel/plugin-transform-exponentiation-operator-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-builder-binary-assignment-operator-visitor': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-transform-for-of/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-+DpCAJFPAvViR17PIMi9x2AE34dll5wNlXO43wagAX2YcRGgEVHCNFC4azG85b4YyyFarvkc/iD5NPrz4Oneqw==, tarball: '@babel/plugin-transform-for-of/download/@babel/plugin-transform-for-of-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-transform-function-name/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-Fuec/KPSpVLbGo6z1RPw4EE1X+z9gZk1uQmnYy7v4xr4TO9p41v1AoUuXEtyqAI7H+xNJYSICzRqZBhDEkd3kQ==, tarball: '@babel/plugin-transform-function-name/download/@babel/plugin-transform-function-name-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-function-name': 7.16.0
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-transform-literals/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-B1j9C/IfvshnPcklsc93AVLTrNVa69iSqztylZH6qnmiAsDDOmmjEYqOm3Ts2lGSgTSywnBNiqC949VdD0/gfw==, tarball: '@babel/plugin-transform-literals/download/@babel/plugin-transform-literals-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-transform-member-expression-literals/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-d57i3vPHWgIde/9Y8W/xSFUndhvhZN5Wu2TjRrN1MVz5KzdUihKnfDVlfP1U7mS5DNj/WHHhaE4/tTi4hIyHwQ==, tarball: '@babel/plugin-transform-member-expression-literals/download/@babel/plugin-transform-member-expression-literals-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-transform-modules-amd/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-oHI15S/hdJuSCfnwIz+4lm6wu/wBn7oJ8+QrkzPPwSFGXk8kgdI/AIKcbR/XnD1nQVMg/i6eNaXpszbGuwYDRQ==, tarball: '@babel/plugin-transform-modules-amd/download/@babel/plugin-transform-modules-amd-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-module-transforms': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-      babel-plugin-dynamic-import-node: 2.3.3
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@babel/plugin-transform-modules-commonjs/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-ABhUkxvoQyqhCWyb8xXtfwqNMJD7tx+irIRnUh6lmyFud7Jln1WzONXKlax1fg/ey178EXbs4bSGNd6PngO+SQ==, tarball: '@babel/plugin-transform-modules-commonjs/download/@babel/plugin-transform-modules-commonjs-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-module-transforms': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-      '@babel/helper-simple-access': 7.16.0
-      babel-plugin-dynamic-import-node: 2.3.3
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@babel/plugin-transform-modules-systemjs/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-53gmLdScNN28XpjEVIm7LbWnD/b/TpbwKbLk6KV4KqC9WyU6rq1jnNmVG6UgAdQZVVGZVoik3DqHNxk4/EvrjA==, tarball: '@babel/plugin-transform-modules-systemjs/download/@babel/plugin-transform-modules-systemjs-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-hoist-variables': 7.16.0
-      '@babel/helper-module-transforms': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-      '@babel/helper-validator-identifier': 7.15.7
-      babel-plugin-dynamic-import-node: 2.3.3
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@babel/plugin-transform-modules-umd/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-qTFnpxHMoenNHkS3VoWRdwrcJ3FhX567GvDA3hRZKF0Dj8Fmg0UzySZp3AP2mShl/bzcywb/UWAMQIjA1bhXvw==, tarball: '@babel/plugin-transform-modules-umd/download/@babel/plugin-transform-modules-umd-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-module-transforms': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@babel/plugin-transform-named-capturing-groups-regex/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-/wqGDgvFUeKELW6ex6QB7dLVRkd5ehjw34tpXu1nhKC0sFfmaLabIswnpf8JgDyV2NeDmZiwoOb0rAmxciNfjA==, tarball: '@babel/plugin-transform-named-capturing-groups-regex/download/@babel/plugin-transform-named-capturing-groups-regex-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-create-regexp-features-plugin': 7.16.0_@babel+core@7.16.5
-    dev: true
-
-  /@babel/plugin-transform-new-target/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-ZaIrnXF08ZC8jnKR4/5g7YakGVL6go6V9ql6Jl3ecO8PQaQqFE74CuM384kezju7Z9nGCCA20BqZaR1tJ/WvHg==, tarball: '@babel/plugin-transform-new-target/download/@babel/plugin-transform-new-target-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-transform-object-super/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-tded+yZEXuxt9Jdtkc1RraW1zMF/GalVxaVVxh41IYwirdRgyAxxxCKZ9XB7LxZqmsjfjALxupNE1MIz9KH+Zg==, tarball: '@babel/plugin-transform-object-super/download/@babel/plugin-transform-object-super-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-      '@babel/helper-replace-supers': 7.16.5
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@babel/plugin-transform-parameters/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-B3O6AL5oPop1jAVg8CV+haeUte9oFuY85zu0jwnRNZZi3tVAbJriu5tag/oaO2kGaQM/7q7aGPBlTI5/sr9enA==, tarball: '@babel/plugin-transform-parameters/download/@babel/plugin-transform-parameters-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-transform-property-literals/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-+IRcVW71VdF9pEH/2R/Apab4a19LVvdVsr/gEeotH00vSDVlKD+XgfSIw+cgGWsjDB/ziqGv/pGoQZBIiQVXHg==, tarball: '@babel/plugin-transform-property-literals/download/@babel/plugin-transform-property-literals-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-transform-regenerator/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-2z+it2eVWU8TtQQRauvGUqZwLy4+7rTfo6wO4npr+fvvN1SW30ZF3O/ZRCNmTuu4F5MIP8OJhXAhRV5QMJOuYg==, tarball: '@babel/plugin-transform-regenerator/download/@babel/plugin-transform-regenerator-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      regenerator-transform: 0.14.5
-    dev: true
-
-  /@babel/plugin-transform-reserved-words/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-aIB16u8lNcf7drkhXJRoggOxSTUAuihTSTfAcpynowGJOZiGf+Yvi7RuTwFzVYSYPmWyARsPqUGoZWWWxLiknw==, tarball: '@babel/plugin-transform-reserved-words/download/@babel/plugin-transform-reserved-words-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-transform-shorthand-properties/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-ZbuWVcY+MAXJuuW7qDoCwoxDUNClfZxoo7/4swVbOW1s/qYLOMHlm9YRWMsxMFuLs44eXsv4op1vAaBaBaDMVg==, tarball: '@babel/plugin-transform-shorthand-properties/download/@babel/plugin-transform-shorthand-properties-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-transform-spread/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-5d6l/cnG7Lw4tGHEoga4xSkYp1euP7LAtrah1h1PgJ3JY7yNsjybsxQAnVK4JbtReZ/8z6ASVmd3QhYYKLaKZw==, tarball: '@babel/plugin-transform-spread/download/@babel/plugin-transform-spread-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-      '@babel/helper-skip-transparent-expression-wrappers': 7.16.0
-    dev: true
-
-  /@babel/plugin-transform-sticky-regex/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-usYsuO1ID2LXxzuUxifgWtJemP7wL2uZtyrTVM4PKqsmJycdS4U4mGovL5xXkfUheds10Dd2PjoQLXw6zCsCbg==, tarball: '@babel/plugin-transform-sticky-regex/download/@babel/plugin-transform-sticky-regex-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-transform-template-literals/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-gnyKy9RyFhkovex4BjKWL3BVYzUDG6zC0gba7VMLbQoDuqMfJ1SDXs8k/XK41Mmt1Hyp4qNAvGFb9hKzdCqBRQ==, tarball: '@babel/plugin-transform-template-literals/download/@babel/plugin-transform-template-literals-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-transform-typeof-symbol/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-ldxCkW180qbrvyCVDzAUZqB0TAeF8W/vGJoRcaf75awm6By+PxfJKvuqVAnq8N9wz5Xa6mSpM19OfVKKVmGHSQ==, tarball: '@babel/plugin-transform-typeof-symbol/download/@babel/plugin-transform-typeof-symbol-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-transform-typescript/7.16.1_@babel+core@7.16.5:
-    resolution: {integrity: sha1-zAZwsoIrAzg1W8Gz0iRqQrgWZAk=, tarball: '@babel/plugin-transform-typescript/download/@babel/plugin-transform-typescript-7.16.1.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-create-class-features-plugin': 7.16.5_@babel+core@7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-      '@babel/plugin-syntax-typescript': 7.16.5_@babel+core@7.16.5
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@babel/plugin-transform-unicode-escapes/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-shiCBHTIIChGLdyojsKQjoAyB8MBwat25lKM7MJjbe1hE0bgIppD+LX9afr41lLHOhqceqeWl4FkLp+Bgn9o1Q==, tarball: '@babel/plugin-transform-unicode-escapes/download/@babel/plugin-transform-unicode-escapes-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/plugin-transform-unicode-regex/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-GTJ4IW012tiPEMMubd7sD07iU9O/LOo8Q/oU4xNhcaq0Xn8+6TcUQaHtC8YxySo1T+ErQ8RaWogIEeFhKGNPzw==, tarball: '@babel/plugin-transform-unicode-regex/download/@babel/plugin-transform-unicode-regex-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-create-regexp-features-plugin': 7.16.0_@babel+core@7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-    dev: true
-
-  /@babel/preset-env/7.16.5_@babel+core@7.16.5:
-    resolution: {integrity: sha512-MiJJW5pwsktG61NDxpZ4oJ1CKxM1ncam9bzRtx9g40/WkLRkxFP6mhpkYV0/DxcciqoiHicx291+eUQrXb/SfQ==, tarball: '@babel/preset-env/download/@babel/preset-env-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/compat-data': 7.16.4
-      '@babel/core': 7.16.5
-      '@babel/helper-compilation-targets': 7.16.3_@babel+core@7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-      '@babel/helper-validator-option': 7.14.5
-      '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.16.2_@babel+core@7.16.5
-      '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.16.0_@babel+core@7.16.5
-      '@babel/plugin-proposal-async-generator-functions': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-proposal-class-properties': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-proposal-class-static-block': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-proposal-dynamic-import': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-proposal-export-namespace-from': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-proposal-json-strings': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-proposal-logical-assignment-operators': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-proposal-numeric-separator': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-proposal-object-rest-spread': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-proposal-optional-catch-binding': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-proposal-optional-chaining': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-proposal-private-methods': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-proposal-private-property-in-object': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-proposal-unicode-property-regex': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.16.5
-      '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.16.5
-      '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.16.5
-      '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.16.5
-      '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.16.5
-      '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.16.5
-      '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.16.5
-      '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.16.5
-      '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.16.5
-      '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.16.5
-      '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.16.5
-      '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.16.5
-      '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.16.5
-      '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.16.5
-      '@babel/plugin-transform-arrow-functions': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-async-to-generator': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-block-scoped-functions': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-block-scoping': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-classes': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-computed-properties': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-destructuring': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-dotall-regex': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-duplicate-keys': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-exponentiation-operator': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-for-of': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-function-name': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-literals': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-member-expression-literals': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-modules-amd': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-modules-commonjs': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-modules-systemjs': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-modules-umd': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-named-capturing-groups-regex': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-new-target': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-object-super': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-parameters': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-property-literals': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-regenerator': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-reserved-words': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-shorthand-properties': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-spread': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-sticky-regex': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-template-literals': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-typeof-symbol': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-unicode-escapes': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-unicode-regex': 7.16.5_@babel+core@7.16.5
-      '@babel/preset-modules': 0.1.5_@babel+core@7.16.5
-      '@babel/types': 7.16.0
-      babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.16.5
-      babel-plugin-polyfill-corejs3: 0.4.0_@babel+core@7.16.5
-      babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.16.5
-      core-js-compat: 3.20.0
-      semver: 6.3.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@babel/preset-modules/0.1.5_@babel+core@7.16.5:
-    resolution: {integrity: sha1-75Odbn8miCfhhBY43G/5VRXhFdk=, tarball: '@babel/preset-modules/download/@babel/preset-modules-0.1.5.tgz'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-plugin-utils': 7.16.5
-      '@babel/plugin-proposal-unicode-property-regex': 7.16.5_@babel+core@7.16.5
-      '@babel/plugin-transform-dotall-regex': 7.16.5_@babel+core@7.16.5
-      '@babel/types': 7.16.0
-      esutils: 2.0.3
-    dev: true
-
-  /@babel/runtime/7.16.5:
-    resolution: {integrity: sha512-TXWihFIS3Pyv5hzR7j6ihmeLkZfrXGxAr5UfSl8CHf+6q/wpiYDkUau0czckpYG8QmnCIuPpdLtuA9VmuGGyMA==, tarball: '@babel/runtime/download/@babel/runtime-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      regenerator-runtime: 0.13.9
-
-  /@babel/standalone/7.16.6:
-    resolution: {integrity: sha512-wjildVe951w1IPEPN4G76j+y5JFZfJN9gdyP8o9zd61qbiVEecAgORKskK1D/7VrJZrZS+nxDbhj2akEFU2RJw==, tarball: '@babel/standalone/download/@babel/standalone-7.16.6.tgz'}
-    engines: {node: '>=6.9.0'}
-    dev: true
-
-  /@babel/template/7.16.0:
-    resolution: {integrity: sha1-0Wo16/TNdOICCDNW+rId2JNj3dY=, tarball: '@babel/template/download/@babel/template-7.16.0.tgz'}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/code-frame': 7.16.0
-      '@babel/parser': 7.16.6
-      '@babel/types': 7.16.0
-    dev: true
-
-  /@babel/traverse/7.16.5:
-    resolution: {integrity: sha512-FOCODAzqUMROikDYLYxl4nmwiLlu85rNqBML/A5hKRVXG2LV8d0iMqgPzdYTcIpjZEBB7D6UDU9vxRZiriASdQ==, tarball: '@babel/traverse/download/@babel/traverse-7.16.5.tgz'}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/code-frame': 7.16.0
-      '@babel/generator': 7.16.5
-      '@babel/helper-environment-visitor': 7.16.5
-      '@babel/helper-function-name': 7.16.0
-      '@babel/helper-hoist-variables': 7.16.0
-      '@babel/helper-split-export-declaration': 7.16.0
-      '@babel/parser': 7.16.6
-      '@babel/types': 7.16.0
-      debug: 4.3.3
-      globals: 11.12.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@babel/types/7.16.0:
-    resolution: {integrity: sha1-2zsxOAT5aq3Qt3bEgj4SetZyibo=, tarball: '@babel/types/download/@babel/types-7.16.0.tgz'}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/helper-validator-identifier': 7.15.7
-      to-fast-properties: 2.0.0
-    dev: true
-
-  /@ctrl/tinycolor/3.4.0:
-    resolution: {integrity: sha1-w8WuVDyJfKqcKmhjC+01W+X5mQ8=, tarball: '@ctrl/tinycolor/download/@ctrl/tinycolor-3.4.0.tgz'}
-    engines: {node: '>=10'}
-    dev: false
-
-  /@iconify/iconify/2.0.0-rc.6:
-    resolution: {integrity: sha1-4/U3a2O0QdyzaWMXeEuY4uZ4z0Y=, tarball: '@iconify/iconify/download/@iconify/iconify-2.0.0-rc.6.tgz'}
-    dependencies:
-      cross-fetch: 3.1.4
-    dev: true
-
-  /@iconify/iconify/2.1.0:
-    resolution: {integrity: sha512-YXKrDVXIGUeFIRqr6QC/l6MRj9kDOlES4sWx/ty8SXUk0pCZnBwsj0/to9Q3g79TAyh2wG3/yzrkf6fHKichwA==, tarball: '@iconify/iconify/download/@iconify/iconify-2.1.0.tgz'}
-    dependencies:
-      cross-fetch: 3.1.4
-
-  /@iconify/json/1.1.446:
-    resolution: {integrity: sha512-d/ki5FC3UTrYFWPceQ/EDu/qCKQZFSTuPR6nWHUmTx6ywEgOhnOaak8RQIxxc1lMr3Dzp1KC2X4D8/kcqiGmvA==, tarball: '@iconify/json/download/@iconify/json-1.1.446.tgz'}
-    dev: true
-
-  /@intlify/core-base/9.1.9:
-    resolution: {integrity: sha1-5OjJUQEHKOSvOg0T10zz+eet1/Y=, tarball: '@intlify/core-base/download/@intlify/core-base-9.1.9.tgz'}
-    engines: {node: '>= 10'}
-    dependencies:
-      '@intlify/devtools-if': 9.1.9
-      '@intlify/message-compiler': 9.1.9
-      '@intlify/message-resolver': 9.1.9
-      '@intlify/runtime': 9.1.9
-      '@intlify/shared': 9.1.9
-      '@intlify/vue-devtools': 9.1.9
-    dev: false
-
-  /@intlify/devtools-if/9.1.9:
-    resolution: {integrity: sha1-ow4d0SVv8sXJjY110HU4T7qJjl0=, tarball: '@intlify/devtools-if/download/@intlify/devtools-if-9.1.9.tgz'}
-    engines: {node: '>= 10'}
-    dependencies:
-      '@intlify/shared': 9.1.9
-    dev: false
-
-  /@intlify/message-compiler/9.1.9:
-    resolution: {integrity: sha1-EZPL0iSnHC+5gUVbhTSjx2bSlI0=, tarball: '@intlify/message-compiler/download/@intlify/message-compiler-9.1.9.tgz'}
-    engines: {node: '>= 10'}
-    dependencies:
-      '@intlify/message-resolver': 9.1.9
-      '@intlify/shared': 9.1.9
-      source-map: 0.6.1
-    dev: false
-
-  /@intlify/message-resolver/9.1.9:
-    resolution: {integrity: sha1-MVXM0vXm0NwWyti38djpf82gW/w=, tarball: '@intlify/message-resolver/download/@intlify/message-resolver-9.1.9.tgz'}
-    engines: {node: '>= 10'}
-    dev: false
-
-  /@intlify/runtime/9.1.9:
-    resolution: {integrity: sha1-LBLOKVGKB1Yp7+0KjtKT7nQMsoU=, tarball: '@intlify/runtime/download/@intlify/runtime-9.1.9.tgz'}
-    engines: {node: '>= 10'}
-    dependencies:
-      '@intlify/message-compiler': 9.1.9
-      '@intlify/message-resolver': 9.1.9
-      '@intlify/shared': 9.1.9
-    dev: false
-
-  /@intlify/shared/9.1.9:
-    resolution: {integrity: sha1-C6r5YSi4VWBma+x4T/sB9mI8wXo=, tarball: '@intlify/shared/download/@intlify/shared-9.1.9.tgz'}
-    engines: {node: '>= 10'}
-    dev: false
-
-  /@intlify/vue-devtools/9.1.9:
-    resolution: {integrity: sha1-K+j02+f37UEVZ26zI0gUHUEeQms=, tarball: '@intlify/vue-devtools/download/@intlify/vue-devtools-9.1.9.tgz'}
-    engines: {node: '>= 10'}
-    dependencies:
-      '@intlify/message-resolver': 9.1.9
-      '@intlify/runtime': 9.1.9
-      '@intlify/shared': 9.1.9
-    dev: false
-
-  /@nodelib/fs.scandir/2.1.5:
-    resolution: {integrity: sha1-dhnC6yGyVIP20WdUi0z9WnSIw9U=, tarball: '@nodelib/fs.scandir/download/@nodelib/fs.scandir-2.1.5.tgz'}
-    engines: {node: '>= 8'}
-    dependencies:
-      '@nodelib/fs.stat': 2.0.5
-      run-parallel: 1.2.0
-    dev: true
-
-  /@nodelib/fs.stat/2.0.5:
-    resolution: {integrity: sha1-W9Jir5Tp0lvR5xsF3u1Eh2oiLos=, tarball: '@nodelib/fs.stat/download/@nodelib/fs.stat-2.0.5.tgz'}
-    engines: {node: '>= 8'}
-    dev: true
-
-  /@nodelib/fs.walk/1.2.8:
-    resolution: {integrity: sha1-6Vc36LtnRt3t9pxVaVNJTxlv5po=, tarball: '@nodelib/fs.walk/download/@nodelib/fs.walk-1.2.8.tgz?cache=0&sync_timestamp=1632822730231&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2F%40nodelib%2Ffs.walk%2Fdownload%2F%40nodelib%2Ffs.walk-1.2.8.tgz'}
-    engines: {node: '>= 8'}
-    dependencies:
-      '@nodelib/fs.scandir': 2.1.5
-      fastq: 1.13.0
-    dev: true
-
-  /@purge-icons/core/0.7.0:
-    resolution: {integrity: sha1-CXuo1Ni36NZi32h70jkeuLg8q6A=, tarball: '@purge-icons/core/download/@purge-icons/core-0.7.0.tgz'}
-    dependencies:
-      '@iconify/iconify': 2.0.0-rc.6
-      axios: 0.21.4_debug@4.3.3
-      debug: 4.3.3
-      fast-glob: 3.2.7
-      fs-extra: 9.1.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@purge-icons/generated/0.7.0:
-    resolution: {integrity: sha1-2H27MUXouaZOLhL/ZgqjyxPL61Y=, tarball: '@purge-icons/generated/download/@purge-icons/generated-0.7.0.tgz'}
-    dependencies:
-      '@iconify/iconify': 2.1.0
-    dev: true
-
-  /@rollup/plugin-babel/5.3.0_@babel+core@7.16.5+rollup@2.61.1:
-    resolution: {integrity: sha1-nLHFFG3daklorZbyCcUMYvkvmHk=, tarball: '@rollup/plugin-babel/download/@rollup/plugin-babel-5.3.0.tgz'}
-    engines: {node: '>= 10.0.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-      '@types/babel__core': ^7.1.9
-      rollup: ^1.20.0||^2.0.0
-    peerDependenciesMeta:
-      '@types/babel__core':
-        optional: true
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-module-imports': 7.16.0
-      '@rollup/pluginutils': 3.1.0_rollup@2.61.1
-      rollup: 2.61.1
-    dev: true
-
-  /@rollup/plugin-node-resolve/11.2.1_rollup@2.61.1:
-    resolution: {integrity: sha1-gqpZOXopzU4TJIsQbmpKGIA2KmA=, tarball: '@rollup/plugin-node-resolve/download/@rollup/plugin-node-resolve-11.2.1.tgz'}
-    engines: {node: '>= 10.0.0'}
-    peerDependencies:
-      rollup: ^1.20.0||^2.0.0
-    dependencies:
-      '@rollup/pluginutils': 3.1.0_rollup@2.61.1
-      '@types/resolve': 1.17.1
-      builtin-modules: 3.2.0
-      deepmerge: 4.2.2
-      is-module: 1.0.0
-      resolve: 1.20.0
-      rollup: 2.61.1
-    dev: true
-
-  /@rollup/plugin-node-resolve/13.1.1:
-    resolution: {integrity: sha512-6QKtRevXLrmEig9UiMYt2fSvee9TyltGRfw+qSs6xjUnxwjOzTOqy+/Lpxsgjb8mJn1EQNbCDAvt89O4uzL5kw==, tarball: '@rollup/plugin-node-resolve/download/@rollup/plugin-node-resolve-13.1.1.tgz'}
-    engines: {node: '>= 10.0.0'}
-    peerDependencies:
-      rollup: ^2.42.0
-    dependencies:
-      '@rollup/pluginutils': 3.1.0
-      '@types/resolve': 1.17.1
-      builtin-modules: 3.2.0
-      deepmerge: 4.2.2
-      is-module: 1.0.0
-      resolve: 1.20.0
-    dev: true
-
-  /@rollup/plugin-replace/2.4.2_rollup@2.61.1:
-    resolution: {integrity: sha1-otU5MU+8d8JEhY+qUjASglBoUQo=, tarball: '@rollup/plugin-replace/download/@rollup/plugin-replace-2.4.2.tgz'}
-    peerDependencies:
-      rollup: ^1.20.0 || ^2.0.0
-    dependencies:
-      '@rollup/pluginutils': 3.1.0_rollup@2.61.1
-      magic-string: 0.25.7
-      rollup: 2.61.1
-    dev: true
-
-  /@rollup/pluginutils/3.1.0:
-    resolution: {integrity: sha1-cGtFJO5tyLEDs8mVUz5a1oDAK5s=, tarball: '@rollup/pluginutils/download/@rollup/pluginutils-3.1.0.tgz'}
-    engines: {node: '>= 8.0.0'}
-    peerDependencies:
-      rollup: ^1.20.0||^2.0.0
-    dependencies:
-      '@types/estree': 0.0.39
-      estree-walker: 1.0.1
-      picomatch: 2.3.0
-    dev: true
-
-  /@rollup/pluginutils/3.1.0_rollup@2.61.1:
-    resolution: {integrity: sha1-cGtFJO5tyLEDs8mVUz5a1oDAK5s=, tarball: '@rollup/pluginutils/download/@rollup/pluginutils-3.1.0.tgz'}
-    engines: {node: '>= 8.0.0'}
-    peerDependencies:
-      rollup: ^1.20.0||^2.0.0
-    dependencies:
-      '@types/estree': 0.0.39
-      estree-walker: 1.0.1
-      picomatch: 2.3.0
-      rollup: 2.61.1
-    dev: true
-
-  /@rollup/pluginutils/4.1.2:
-    resolution: {integrity: sha512-ROn4qvkxP9SyPeHaf7uQC/GPFY6L/OWy9+bd9AwcjOAWQwxRscoEyAUD8qCY5o5iL4jqQwoLk2kaTKJPb/HwzQ==, tarball: '@rollup/pluginutils/download/@rollup/pluginutils-4.1.2.tgz'}
-    engines: {node: '>= 8.0.0'}
-    dependencies:
-      estree-walker: 2.0.2
-      picomatch: 2.3.0
-    dev: true
-
-  /@simonwep/pickr/1.8.2:
-    resolution: {integrity: sha1-ltyGZ1lA18rWPWnCIIPdHLuXl8s=, tarball: '@simonwep/pickr/download/@simonwep/pickr-1.8.2.tgz'}
-    dependencies:
-      core-js: 3.20.0
-      nanopop: 2.1.0
-    dev: false
-
-  /@sindresorhus/is/0.7.0:
-    resolution: {integrity: sha1-mgb08TfuhNffBGDB/bETX/psUP0=, tarball: '@sindresorhus/is/download/@sindresorhus/is-0.7.0.tgz'}
-    engines: {node: '>=4'}
-    dev: true
-
-  /@surma/rollup-plugin-off-main-thread/2.2.3:
-    resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==, tarball: '@surma/rollup-plugin-off-main-thread/download/@surma/rollup-plugin-off-main-thread-2.2.3.tgz'}
-    dependencies:
-      ejs: 3.1.6
-      json5: 2.2.0
-      magic-string: 0.25.7
-      string.prototype.matchall: 4.0.6
-    dev: true
-
-  /@trysound/sax/0.2.0:
-    resolution: {integrity: sha1-zMqrdYr1Z2Hre/N69vA/Mm3XmK0=, tarball: '@trysound/sax/download/@trysound/sax-0.2.0.tgz'}
-    engines: {node: '>=10.13.0'}
-    dev: true
-
-  /@types/codemirror/5.60.5:
-    resolution: {integrity: sha1-W5iaO0u+ZXRYzzcskra/2mBhorc=, tarball: '@types/codemirror/download/@types/codemirror-5.60.5.tgz'}
-    dependencies:
-      '@types/tern': 0.23.4
-    dev: true
-
-  /@types/crypto-js/4.0.2:
-    resolution: {integrity: sha1-RSQyWhdb+Bn+xuQlYMOJzh+5LJc=, tarball: '@types/crypto-js/download/@types/crypto-js-4.0.2.tgz'}
-    dev: true
-
-  /@types/estree/0.0.39:
-    resolution: {integrity: sha1-4Xfmme4bjCLSMXTKqnQiZEOJUJ8=, tarball: '@types/estree/download/@types/estree-0.0.39.tgz'}
-    dev: true
-
-  /@types/estree/0.0.50:
-    resolution: {integrity: sha1-Hgyqk2TT/M0pMcPtlv2+ql1MyoM=, tarball: '@types/estree/download/@types/estree-0.0.50.tgz'}
-    dev: true
-
-  /@types/fs-extra/9.0.13:
-    resolution: {integrity: sha1-dZT7rgT+fxkYzos9IT90/0SsH0U=, tarball: '@types/fs-extra/download/@types/fs-extra-9.0.13.tgz'}
-    dependencies:
-      '@types/node': 16.11.15
-    dev: true
-
-  /@types/glob/7.2.0:
-    resolution: {integrity: sha1-vBtb86qS8lvV3TnzXFc2G9zlsus=, tarball: '@types/glob/download/@types/glob-7.2.0.tgz'}
-    dependencies:
-      '@types/minimatch': 3.0.5
-      '@types/node': 16.11.15
-    dev: true
-
-  /@types/imagemin-gifsicle/7.0.1:
-    resolution: {integrity: sha1-CESpajOEOLuY93spis8hcmDQ1Ak=, tarball: '@types/imagemin-gifsicle/download/@types/imagemin-gifsicle-7.0.1.tgz'}
-    dependencies:
-      '@types/imagemin': 7.0.1
-    dev: true
-
-  /@types/imagemin-jpegtran/5.0.1:
-    resolution: {integrity: sha1-eYsqZs1Jt+xlUPtzPAWluHVfIR8=, tarball: '@types/imagemin-jpegtran/download/@types/imagemin-jpegtran-5.0.1.tgz'}
-    dependencies:
-      '@types/imagemin': 7.0.1
-    dev: true
-
-  /@types/imagemin-mozjpeg/8.0.1:
-    resolution: {integrity: sha1-6vLweuo6MXoXEO8sdj7FPzvPzcU=, tarball: '@types/imagemin-mozjpeg/download/@types/imagemin-mozjpeg-8.0.1.tgz'}
-    dependencies:
-      '@types/imagemin': 7.0.1
-    dev: true
-
-  /@types/imagemin-optipng/5.2.1:
-    resolution: {integrity: sha1-bvAz87FdKBAJ3k4L0srfbL0udBo=, tarball: '@types/imagemin-optipng/download/@types/imagemin-optipng-5.2.1.tgz'}
-    dependencies:
-      '@types/imagemin': 7.0.1
-    dev: true
-
-  /@types/imagemin-svgo/9.0.1:
-    resolution: {integrity: sha1-Yp68jQGAJAWp8HZn5z5zlDuij/c=, tarball: '@types/imagemin-svgo/download/@types/imagemin-svgo-9.0.1.tgz'}
-    dependencies:
-      '@types/imagemin': 7.0.1
-      '@types/svgo': 1.3.6
-    dev: true
-
-  /@types/imagemin-webp/5.1.2:
-    resolution: {integrity: sha1-tCb5PHAZ83mVeMiOKM5pSdlbFpA=, tarball: '@types/imagemin-webp/download/@types/imagemin-webp-5.1.2.tgz'}
-    dependencies:
-      '@types/imagemin': 7.0.1
-    dev: true
-
-  /@types/imagemin/7.0.1:
-    resolution: {integrity: sha1-EcoeZcyzhxqEadmyMDO5XTg47aA=, tarball: '@types/imagemin/download/@types/imagemin-7.0.1.tgz'}
-    dependencies:
-      '@types/node': 16.11.15
-    dev: true
-
-  /@types/inquirer/8.1.3:
-    resolution: {integrity: sha1-39pMl82+ME5NzrN4qA95RI6lyP4=, tarball: '@types/inquirer/download/@types/inquirer-8.1.3.tgz'}
-    dependencies:
-      '@types/through': 0.0.30
-      rxjs: 7.4.0
-    dev: true
-
-  /@types/intro.js/3.0.2:
-    resolution: {integrity: sha1-y/m2nwVbd1gsws6+I26aQFsw770=, tarball: '@types/intro.js/download/@types/intro.js-3.0.2.tgz'}
-    dev: true
-
-  /@types/lodash-es/4.17.5:
-    resolution: {integrity: sha1-HD/dFoSdhK6kOJCxxg2jeftQE1M=, tarball: '@types/lodash-es/download/@types/lodash-es-4.17.5.tgz'}
-    dependencies:
-      '@types/lodash': 4.14.178
-    dev: true
-
-  /@types/lodash/4.14.178:
-    resolution: {integrity: sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw==, tarball: '@types/lodash/download/@types/lodash-4.14.178.tgz'}
-
-  /@types/minimatch/3.0.5:
-    resolution: {integrity: sha1-EAHMXmo3BLg8I2An538vWOoBD0A=, tarball: '@types/minimatch/download/@types/minimatch-3.0.5.tgz'}
-    dev: true
-
-  /@types/mockjs/1.0.4:
-    resolution: {integrity: sha1-5waVHV4ztPCku3Ox+LEk4m8IHeA=, tarball: '@types/mockjs/download/@types/mockjs-1.0.4.tgz'}
-    dev: true
-
-  /@types/node/14.18.2:
-    resolution: {integrity: sha512-fqtSN5xn/bBzDxMT77C1rJg6CsH/R49E7qsGuvdPJa20HtV5zSTuLJPNfnlyVH3wauKnkHdLggTVkOW/xP9oQg==, tarball: '@types/node/download/@types/node-14.18.2.tgz'}
-    dev: true
-
-  /@types/node/16.11.15:
-    resolution: {integrity: sha512-LMGR7iUjwZRxoYnfc9+YELxwqkaLmkJlo4/HUvOMyGvw9DaHO0gtAbH2FUdoFE6PXBTYZIT7x610r7kdo8o1fQ==, tarball: '@types/node/download/@types/node-16.11.15.tgz'}
-    dev: true
-
-  /@types/nprogress/0.2.0:
-    resolution: {integrity: sha1-hsWTaC1BmSEqBQnMPE1WK7vW5F8=, tarball: '@types/nprogress/download/@types/nprogress-0.2.0.tgz'}
-    dev: true
-
-  /@types/qrcode/1.4.2:
-    resolution: {integrity: sha512-7uNT9L4WQTNJejHTSTdaJhfBSCN73xtXaHFyBJ8TSwiLhe4PRuTue7Iph0s2nG9R/ifUaSnGhLUOZavlBEqDWQ==, tarball: '@types/qrcode/download/@types/qrcode-1.4.2.tgz'}
-    dependencies:
-      '@types/node': 16.11.15
-    dev: true
-
-  /@types/qs/6.9.7:
-    resolution: {integrity: sha1-Y7t9Bn2xB8weRXwwO8JdUR/r9ss=, tarball: '@types/qs/download/@types/qs-6.9.7.tgz'}
-    dev: true
-
-  /@types/resolve/1.17.1:
-    resolution: {integrity: sha1-Ov1q2JZ8d+Q3bFmKgt3Vj0bsRdY=, tarball: '@types/resolve/download/@types/resolve-1.17.1.tgz'}
-    dependencies:
-      '@types/node': 16.11.15
-    dev: true
-
-  /@types/showdown/1.9.4:
-    resolution: {integrity: sha1-U4Wt80FDq62TCVYWYfpseB0quWI=, tarball: '@types/showdown/download/@types/showdown-1.9.4.tgz'}
-    dev: true
-
-  /@types/sortablejs/1.10.7:
-    resolution: {integrity: sha1-q5A5yFQp8FFpVextvAuyATlBexU=, tarball: '@types/sortablejs/download/@types/sortablejs-1.10.7.tgz'}
-    dev: true
-
-  /@types/svgo/1.3.6:
-    resolution: {integrity: sha1-nbAKfd+bJq0v62uDS+8YGGd4ReE=, tarball: '@types/svgo/download/@types/svgo-1.3.6.tgz'}
-    dev: true
-
-  /@types/svgo/2.6.0:
-    resolution: {integrity: sha1-8MUO7ShkIvY7TjNG2KMJsOpn1Yo=, tarball: '@types/svgo/download/@types/svgo-2.6.0.tgz'}
-    dependencies:
-      '@types/node': 16.11.15
-    dev: true
-
-  /@types/tern/0.23.4:
-    resolution: {integrity: sha1-A5JusT2+rzrg05DK9wayZDoBJ/s=, tarball: '@types/tern/download/@types/tern-0.23.4.tgz'}
-    dependencies:
-      '@types/estree': 0.0.50
-    dev: true
-
-  /@types/throttle-debounce/2.1.0:
-    resolution: {integrity: sha1-HD32JL/Eti+ZLTASuExW1B6rN3Y=, tarball: '@types/throttle-debounce/download/@types/throttle-debounce-2.1.0.tgz'}
-    dev: true
-
-  /@types/through/0.0.30:
-    resolution: {integrity: sha1-4OQs536Je9aurW9upirrE1uKOJU=, tarball: '@types/through/download/@types/through-0.0.30.tgz'}
-    dependencies:
-      '@types/node': 16.11.15
-    dev: true
-
-  /@types/tinycolor2/1.4.3:
-    resolution: {integrity: sha1-7UoJAflUsSbmqRS0g5x3Ri1W5wY=, tarball: '@types/tinycolor2/download/@types/tinycolor2-1.4.3.tgz'}
-    dev: true
-
-  /@types/trusted-types/2.0.2:
-    resolution: {integrity: sha1-/CWtmUO8rBHM64Fo208nXg5y51Y=, tarball: '@types/trusted-types/download/@types/trusted-types-2.0.2.tgz'}
-    dev: true
-
-  /@vitejs/plugin-legacy/1.6.4_vite@2.7.6:
-    resolution: {integrity: sha512-geH2F3hTRN++E4n9NZ0JFumxIWUKqW4FA9PAgM7Q6RvUOUUYW4tlURhEmCBYfZSN24H/yX3mEolX+wFVErsAYQ==, tarball: '@vitejs/plugin-legacy/download/@vitejs/plugin-legacy-1.6.4.tgz'}
-    engines: {node: '>=12.0.0'}
-    peerDependencies:
-      vite: ^2.0.0
-    dependencies:
-      '@babel/standalone': 7.16.6
-      core-js: 3.20.0
-      magic-string: 0.25.7
-      regenerator-runtime: 0.13.9
-      systemjs: 6.11.0
-      vite: 2.7.6_less@4.1.2
-    dev: true
-
-  /@vitejs/plugin-vue-jsx/1.3.3:
-    resolution: {integrity: sha512-VSBXVqMcxbgX85rgJC1eMWuZ9hzOJhWPvGYlKxyymPokE/i3Gykh5ljkCoNdxnKgIyFqv4WutYoYY93fgjbTxA==, tarball: '@vitejs/plugin-vue-jsx/download/@vitejs/plugin-vue-jsx-1.3.3.tgz'}
-    engines: {node: '>=12.0.0'}
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.16.5
-      '@babel/plugin-transform-typescript': 7.16.1_@babel+core@7.16.5
-      '@rollup/pluginutils': 4.1.2
-      '@vue/babel-plugin-jsx': 1.1.1_@babel+core@7.16.5
-      hash-sum: 2.0.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@vitejs/plugin-vue/1.10.2_vite@2.7.6:
-    resolution: {integrity: sha512-/QJ0Z9qfhAFtKRY+r57ziY4BSbGUTGsPRMpB/Ron3QPwBZM4OZAZHdTa4a8PafCwU5DTatXG8TMDoP8z+oDqJw==, tarball: '@vitejs/plugin-vue/download/@vitejs/plugin-vue-1.10.2.tgz'}
-    engines: {node: '>=12.0.0'}
-    peerDependencies:
-      vite: ^2.5.10
-    dependencies:
-      vite: 2.7.6_less@4.1.2
-    dev: true
-
-  /@vue/babel-helper-vue-transform-on/1.0.2:
-    resolution: {integrity: sha1-m5xpHNBvyFUiGiR1w8yDHXdLx9w=, tarball: '@vue/babel-helper-vue-transform-on/download/@vue/babel-helper-vue-transform-on-1.0.2.tgz'}
-    dev: true
-
-  /@vue/babel-plugin-jsx/1.1.1_@babel+core@7.16.5:
-    resolution: {integrity: sha1-DFusJ4gNI/iYlM0Daje1XvYd38E=, tarball: '@vue/babel-plugin-jsx/download/@vue/babel-plugin-jsx-1.1.1.tgz'}
-    dependencies:
-      '@babel/helper-module-imports': 7.16.0
-      '@babel/plugin-syntax-jsx': 7.16.5_@babel+core@7.16.5
-      '@babel/template': 7.16.0
-      '@babel/traverse': 7.16.5
-      '@babel/types': 7.16.0
-      '@vue/babel-helper-vue-transform-on': 1.0.2
-      camelcase: 6.2.1
-      html-tags: 3.1.0
-      svg-tags: 1.0.0
-    transitivePeerDependencies:
-      - '@babel/core'
-      - supports-color
-    dev: true
-
-  /@vue/compiler-core/3.2.21:
-    resolution: {integrity: sha1-JlZsMrKtg4GZ1HHvXfYgqDhG8k4=, tarball: '@vue/compiler-core/download/@vue/compiler-core-3.2.21.tgz'}
-    dependencies:
-      '@babel/parser': 7.16.6
-      '@vue/shared': 3.2.21
-      estree-walker: 2.0.2
-      source-map: 0.6.1
-    dev: true
-
-  /@vue/compiler-core/3.2.26:
-    resolution: {integrity: sha512-N5XNBobZbaASdzY9Lga2D9Lul5vdCIOXvUMd6ThcN8zgqQhPKfCV+wfAJNNJKQkSHudnYRO2gEB+lp0iN3g2Tw==, tarball: '@vue/compiler-core/download/@vue/compiler-core-3.2.26.tgz'}
-    dependencies:
-      '@babel/parser': 7.16.6
-      '@vue/shared': 3.2.26
-      estree-walker: 2.0.2
-      source-map: 0.6.1
-    dev: false
-
-  /@vue/compiler-dom/3.2.21:
-    resolution: {integrity: sha1-1vbIU2TviIj5xOkSK/uhHnj7OYw=, tarball: '@vue/compiler-dom/download/@vue/compiler-dom-3.2.21.tgz'}
-    dependencies:
-      '@vue/compiler-core': 3.2.21
-      '@vue/shared': 3.2.21
-    dev: true
-
-  /@vue/compiler-dom/3.2.26:
-    resolution: {integrity: sha512-smBfaOW6mQDxcT3p9TKT6mE22vjxjJL50GFVJiI0chXYGU/xzC05QRGrW3HHVuJrmLTLx5zBhsZ2dIATERbarg==, tarball: '@vue/compiler-dom/download/@vue/compiler-dom-3.2.26.tgz'}
-    dependencies:
-      '@vue/compiler-core': 3.2.26
-      '@vue/shared': 3.2.26
-    dev: false
-
-  /@vue/compiler-sfc/3.2.21:
-    resolution: {integrity: sha1-QmOe5J5yWvt9jx0ZQOddwXpWACw=, tarball: '@vue/compiler-sfc/download/@vue/compiler-sfc-3.2.21.tgz'}
-    dependencies:
-      '@babel/parser': 7.16.6
-      '@vue/compiler-core': 3.2.21
-      '@vue/compiler-dom': 3.2.21
-      '@vue/compiler-ssr': 3.2.21
-      '@vue/ref-transform': 3.2.21
-      '@vue/shared': 3.2.21
-      estree-walker: 2.0.2
-      magic-string: 0.25.7
-      postcss: 8.4.5
-      source-map: 0.6.1
-    dev: true
-
-  /@vue/compiler-sfc/3.2.26:
-    resolution: {integrity: sha512-ePpnfktV90UcLdsDQUh2JdiTuhV0Skv2iYXxfNMOK/F3Q+2BO0AulcVcfoksOpTJGmhhfosWfMyEaEf0UaWpIw==, tarball: '@vue/compiler-sfc/download/@vue/compiler-sfc-3.2.26.tgz'}
-    dependencies:
-      '@babel/parser': 7.16.6
-      '@vue/compiler-core': 3.2.26
-      '@vue/compiler-dom': 3.2.26
-      '@vue/compiler-ssr': 3.2.26
-      '@vue/reactivity-transform': 3.2.26
-      '@vue/shared': 3.2.26
-      estree-walker: 2.0.2
-      magic-string: 0.25.7
-      postcss: 8.4.5
-      source-map: 0.6.1
-    dev: false
-
-  /@vue/compiler-ssr/3.2.21:
-    resolution: {integrity: sha1-N9Ek+J6K3vn9VrhXdd5LUxCgQ24=, tarball: '@vue/compiler-ssr/download/@vue/compiler-ssr-3.2.21.tgz'}
-    dependencies:
-      '@vue/compiler-dom': 3.2.21
-      '@vue/shared': 3.2.21
-    dev: true
-
-  /@vue/compiler-ssr/3.2.26:
-    resolution: {integrity: sha512-2mywLX0ODc4Zn8qBoA2PDCsLEZfpUGZcyoFRLSOjyGGK6wDy2/5kyDOWtf0S0UvtoyVq95OTSGIALjZ4k2q/ag==, tarball: '@vue/compiler-ssr/download/@vue/compiler-ssr-3.2.26.tgz'}
-    dependencies:
-      '@vue/compiler-dom': 3.2.26
-      '@vue/shared': 3.2.26
-    dev: false
-
-  /@vue/devtools-api/6.0.0-beta.21.1:
-    resolution: {integrity: sha512-FqC4s3pm35qGVeXRGOjTsRzlkJjrBLriDS9YXbflHLsfA9FrcKzIyWnLXoNm+/7930E8rRakXuAc2QkC50swAw==, tarball: '@vue/devtools-api/download/@vue/devtools-api-6.0.0-beta.21.1.tgz'}
-    dev: false
-
-  /@vue/reactivity-transform/3.2.26:
-    resolution: {integrity: sha512-XKMyuCmzNA7nvFlYhdKwD78rcnmPb7q46uoR00zkX6yZrUmcCQ5OikiwUEVbvNhL5hBJuvbSO95jB5zkUon+eQ==, tarball: '@vue/reactivity-transform/download/@vue/reactivity-transform-3.2.26.tgz'}
-    dependencies:
-      '@babel/parser': 7.16.6
-      '@vue/compiler-core': 3.2.26
-      '@vue/shared': 3.2.26
-      estree-walker: 2.0.2
-      magic-string: 0.25.7
-    dev: false
-
-  /@vue/reactivity/3.2.26:
-    resolution: {integrity: sha512-h38bxCZLW6oFJVDlCcAiUKFnXI8xP8d+eO0pcDxx+7dQfSPje2AO6M9S9QO6MrxQB7fGP0DH0dYQ8ksf6hrXKQ==, tarball: '@vue/reactivity/download/@vue/reactivity-3.2.26.tgz'}
-    dependencies:
-      '@vue/shared': 3.2.26
-    dev: false
-
-  /@vue/ref-transform/3.2.21:
-    resolution: {integrity: sha1-sMVUyfZAw/AF935nYGaqD6upCYQ=, tarball: '@vue/ref-transform/download/@vue/ref-transform-3.2.21.tgz'}
-    dependencies:
-      '@babel/parser': 7.16.6
-      '@vue/compiler-core': 3.2.21
-      '@vue/shared': 3.2.21
-      estree-walker: 2.0.2
-      magic-string: 0.25.7
-    dev: true
-
-  /@vue/runtime-core/3.2.26:
-    resolution: {integrity: sha512-BcYi7qZ9Nn+CJDJrHQ6Zsmxei2hDW0L6AB4vPvUQGBm2fZyC0GXd/4nVbyA2ubmuhctD5RbYY8L+5GUJszv9mQ==, tarball: '@vue/runtime-core/download/@vue/runtime-core-3.2.26.tgz'}
-    dependencies:
-      '@vue/reactivity': 3.2.26
-      '@vue/shared': 3.2.26
-    dev: false
-
-  /@vue/runtime-dom/3.2.26:
-    resolution: {integrity: sha512-dY56UIiZI+gjc4e8JQBwAifljyexfVCkIAu/WX8snh8vSOt/gMSEGwPRcl2UpYpBYeyExV8WCbgvwWRNt9cHhQ==, tarball: '@vue/runtime-dom/download/@vue/runtime-dom-3.2.26.tgz'}
-    dependencies:
-      '@vue/runtime-core': 3.2.26
-      '@vue/shared': 3.2.26
-      csstype: 2.6.19
-    dev: false
-
-  /@vue/server-renderer/3.2.26_vue@3.2.26:
-    resolution: {integrity: sha512-Jp5SggDUvvUYSBIvYEhy76t4nr1vapY/FIFloWmQzn7UxqaHrrBpbxrqPcTrSgGrcaglj0VBp22BKJNre4aA1w==, tarball: '@vue/server-renderer/download/@vue/server-renderer-3.2.26.tgz'}
-    peerDependencies:
-      vue: 3.2.26
-    dependencies:
-      '@vue/compiler-ssr': 3.2.26
-      '@vue/shared': 3.2.26
-      vue: 3.2.26
-    dev: false
-
-  /@vue/shared/3.2.21:
-    resolution: {integrity: sha1-TNgMDmLPZaetqyRJ6GtvDLM6Ews=, tarball: '@vue/shared/download/@vue/shared-3.2.21.tgz'}
-    dev: true
-
-  /@vue/shared/3.2.26:
-    resolution: {integrity: sha512-vPV6Cq+NIWbH5pZu+V+2QHE9y1qfuTq49uNWw4f7FDEeZaDU2H2cx5jcUZOAKW7qTrUS4k6qZPbMy1x4N96nbA==, tarball: '@vue/shared/download/@vue/shared-3.2.26.tgz'}
-    dev: false
-
-  /@vueuse/core/6.9.2_vue@3.2.26:
-    resolution: {integrity: sha512-FRwl4ccSFuHZBHLGgS9TMv/+Dd6XFaL4o9nph2qtgQIV+z29RBFokw08XjHfykiENRzB01MjYHJ7iRUnsIFQXg==, tarball: '@vueuse/core/download/@vueuse/core-6.9.2.tgz'}
-    peerDependencies:
-      '@vue/composition-api': ^1.1.0
-      vue: ^2.6.0 || ^3.2.0
-    peerDependenciesMeta:
-      '@vue/composition-api':
-        optional: true
-      vue:
-        optional: true
-    dependencies:
-      '@vueuse/shared': 6.9.2_vue@3.2.26
-      vue: 3.2.26
-      vue-demi: 0.12.1_vue@3.2.26
-    dev: false
-
-  /@vueuse/shared/6.9.2_vue@3.2.26:
-    resolution: {integrity: sha512-lAiMh6XROs0kSKVd0Yb/6GKoQMxC1fYrFDi6opvQWISPtcqRNluRrQxLUZ3WTI78ovtoKRLktjhkFAtydcfFDg==, tarball: '@vueuse/shared/download/@vueuse/shared-6.9.2.tgz'}
-    peerDependencies:
-      '@vue/composition-api': ^1.1.0
-      vue: ^2.6.0 || ^3.2.0
-    peerDependenciesMeta:
-      '@vue/composition-api':
-        optional: true
-      vue:
-        optional: true
-    dependencies:
-      vue: 3.2.26
-      vue-demi: 0.12.1_vue@3.2.26
-    dev: false
-
-  /@windicss/config/1.6.1:
-    resolution: {integrity: sha512-E4FKtWdYl5HwFknBQ+Z2JIF58TZiR4/ZiP8B30sfRxNlG6clh4agn5MJqTb4ER0MLkDb30Hugl2tGun0AQNbFw==, tarball: '@windicss/config/download/@windicss/config-1.6.1.tgz'}
-    dependencies:
-      debug: 4.3.3
-      jiti: 1.12.9
-      windicss: 3.4.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@windicss/plugin-utils/1.6.1:
-    resolution: {integrity: sha512-hFQY27bOr9SSpekIvSwBpIX25nR4cwrU5/1kJFqCwAzqyazvd7U9c/iI1E2sTEQOkPbpTTJkY2Act21Q70oSDQ==, tarball: '@windicss/plugin-utils/download/@windicss/plugin-utils-1.6.1.tgz'}
-    dependencies:
-      '@antfu/utils': 0.3.0
-      '@windicss/config': 1.6.1
-      debug: 4.3.3
-      fast-glob: 3.2.7
-      magic-string: 0.25.7
-      micromatch: 4.0.4
-      windicss: 3.4.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@zxcvbn-ts/core/1.2.0:
-    resolution: {integrity: sha512-zaGUGolat04MB1ImVMbP8o7uDytKRLahZO6VSWeW6tK+tko6vHMl/eNsdKWSSWG7OR45BeUy7nBvFg79HYSdGA==, tarball: '@zxcvbn-ts/core/download/@zxcvbn-ts/core-1.2.0.tgz'}
-    dev: false
-
-  /ajv/8.8.2:
-    resolution: {integrity: sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==, tarball: ajv/download/ajv-8.8.2.tgz}
-    dependencies:
-      fast-deep-equal: 3.1.3
-      json-schema-traverse: 1.0.0
-      require-from-string: 2.0.2
-      uri-js: 4.4.1
-    dev: true
-
-  /ansi-escapes/4.3.2:
-    resolution: {integrity: sha1-ayKR0dt9mLZSHV8e+kLQ86n+tl4=, tarball: ansi-escapes/download/ansi-escapes-4.3.2.tgz}
-    engines: {node: '>=8'}
-    dependencies:
-      type-fest: 0.21.3
-    dev: true
-
-  /ansi-regex/2.1.1:
-    resolution: {integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8=, tarball: ansi-regex/download/ansi-regex-2.1.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /ansi-regex/5.0.1:
-    resolution: {integrity: sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=, tarball: ansi-regex/download/ansi-regex-5.0.1.tgz}
-    engines: {node: '>=8'}
-
-  /ansi-styles/2.2.1:
-    resolution: {integrity: sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=, tarball: ansi-styles/download/ansi-styles-2.2.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /ansi-styles/3.2.1:
-    resolution: {integrity: sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=, tarball: ansi-styles/download/ansi-styles-3.2.1.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      color-convert: 1.9.3
-    dev: true
-
-  /ansi-styles/4.3.0:
-    resolution: {integrity: sha1-7dgDYornHATIWuegkG7a00tkiTc=, tarball: ansi-styles/download/ansi-styles-4.3.0.tgz}
-    engines: {node: '>=8'}
-    dependencies:
-      color-convert: 2.0.1
-
-  /ant-design-vue/2.2.8_095859896ec76c1f97b322e01cbf47cb:
-    resolution: {integrity: sha1-+ofPaELY7poNivOT/0CZ7MQHLys=, tarball: ant-design-vue/download/ant-design-vue-2.2.8.tgz}
-    peerDependencies:
-      '@vue/compiler-sfc': '>=3.1.0'
-      vue: '>=3.1.0'
-    dependencies:
-      '@ant-design/icons-vue': 6.0.1_vue@3.2.26
-      '@babel/runtime': 7.16.5
-      '@simonwep/pickr': 1.8.2
-      '@vue/compiler-sfc': 3.2.21
-      array-tree-filter: 2.1.0
-      async-validator: 3.5.2
-      dom-align: 1.12.2
-      dom-scroll-into-view: 2.0.1
-      lodash: 4.17.21
-      lodash-es: 4.17.21
-      moment: 2.29.1
-      omit.js: 2.0.2
-      resize-observer-polyfill: 1.5.1
-      scroll-into-view-if-needed: 2.2.28
-      shallow-equal: 1.2.1
-      vue: 3.2.26
-      vue-types: 3.0.2_vue@3.2.26
-      warning: 4.0.3
-    dev: false
-
-  /anymatch/3.1.2:
-    resolution: {integrity: sha1-wFV8CWrzLxBhmPT04qODU343hxY=, tarball: anymatch/download/anymatch-3.1.2.tgz}
-    engines: {node: '>= 8'}
-    dependencies:
-      normalize-path: 3.0.0
-      picomatch: 2.3.0
-    dev: true
-
-  /arch/2.2.0:
-    resolution: {integrity: sha1-G8R4GPMFdk8jqzMGsL/AhsWinRE=, tarball: arch/download/arch-2.2.0.tgz}
-    dev: true
-
-  /archive-type/4.0.0:
-    resolution: {integrity: sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=, tarball: archive-type/download/archive-type-4.0.0.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      file-type: 4.4.0
-    dev: true
-
-  /arr-diff/4.0.0:
-    resolution: {integrity: sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=, tarball: arr-diff/download/arr-diff-4.0.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /arr-flatten/1.1.0:
-    resolution: {integrity: sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=, tarball: arr-flatten/download/arr-flatten-1.1.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /arr-union/3.1.0:
-    resolution: {integrity: sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=, tarball: arr-union/download/arr-union-3.1.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /array-find-index/1.0.2:
-    resolution: {integrity: sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=, tarball: array-find-index/download/array-find-index-1.0.2.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /array-tree-filter/2.1.0:
-    resolution: {integrity: sha1-hzrAD+yDdJ8lWsjdCDgUtPYykZA=, tarball: array-tree-filter/download/array-tree-filter-2.1.0.tgz}
-    dev: false
-
-  /array-union/2.1.0:
-    resolution: {integrity: sha1-t5hCCtvrHego2ErNii4j0+/oXo0=, tarball: array-union/download/array-union-2.1.0.tgz}
-    engines: {node: '>=8'}
-    dev: true
-
-  /array-unique/0.3.2:
-    resolution: {integrity: sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=, tarball: array-unique/download/array-unique-0.3.2.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /assign-symbols/1.0.0:
-    resolution: {integrity: sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=, tarball: assign-symbols/download/assign-symbols-1.0.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /async-validator/3.5.2:
-    resolution: {integrity: sha1-aOhmqWgk6LJpT/eoMcGiXETV5QA=, tarball: async-validator/download/async-validator-3.5.2.tgz}
-    dev: false
-
-  /async/0.9.2:
-    resolution: {integrity: sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=, tarball: async/download/async-0.9.2.tgz}
-    dev: true
-
-  /at-least-node/1.0.0:
-    resolution: {integrity: sha1-YCzUtG6EStTv/JKoARo8RuAjjcI=, tarball: at-least-node/download/at-least-node-1.0.0.tgz}
-    engines: {node: '>= 4.0.0'}
-    dev: true
-
-  /atob/2.1.2:
-    resolution: {integrity: sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k=, tarball: atob/download/atob-2.1.2.tgz}
-    engines: {node: '>= 4.5.0'}
-    hasBin: true
-    dev: true
-
-  /axios/0.21.4_debug@4.3.3:
-    resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==, tarball: axios/download/axios-0.21.4.tgz}
-    dependencies:
-      follow-redirects: 1.14.6
-    transitivePeerDependencies:
-      - debug
-    dev: true
-
-  /axios/0.24.0:
-    resolution: {integrity: sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==, tarball: axios/download/axios-0.24.0.tgz}
-    dependencies:
-      follow-redirects: 1.14.6
-    transitivePeerDependencies:
-      - debug
-    dev: false
-
-  /babel-plugin-dynamic-import-node/2.3.3:
-    resolution: {integrity: sha1-hP2hnJduxcbe/vV/lCez3vZuF6M=, tarball: babel-plugin-dynamic-import-node/download/babel-plugin-dynamic-import-node-2.3.3.tgz?cache=0&sync_timestamp=1632822778823&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fbabel-plugin-dynamic-import-node%2Fdownload%2Fbabel-plugin-dynamic-import-node-2.3.3.tgz}
-    dependencies:
-      object.assign: 4.1.2
-    dev: true
-
-  /babel-plugin-polyfill-corejs2/0.3.0_@babel+core@7.16.5:
-    resolution: {integrity: sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==, tarball: babel-plugin-polyfill-corejs2/download/babel-plugin-polyfill-corejs2-0.3.0.tgz}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/compat-data': 7.16.4
-      '@babel/core': 7.16.5
-      '@babel/helper-define-polyfill-provider': 0.3.0_@babel+core@7.16.5
-      semver: 6.3.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /babel-plugin-polyfill-corejs3/0.4.0_@babel+core@7.16.5:
-    resolution: {integrity: sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==, tarball: babel-plugin-polyfill-corejs3/download/babel-plugin-polyfill-corejs3-0.4.0.tgz}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-define-polyfill-provider': 0.3.0_@babel+core@7.16.5
-      core-js-compat: 3.20.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /babel-plugin-polyfill-regenerator/0.3.0_@babel+core@7.16.5:
-    resolution: {integrity: sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg==, tarball: babel-plugin-polyfill-regenerator/download/babel-plugin-polyfill-regenerator-0.3.0.tgz}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.16.5
-      '@babel/helper-define-polyfill-provider': 0.3.0_@babel+core@7.16.5
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /balanced-match/1.0.2:
-    resolution: {integrity: sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4=, tarball: balanced-match/download/balanced-match-1.0.2.tgz}
-    dev: true
-
-  /base/0.11.2:
-    resolution: {integrity: sha1-e95c7RRbbVUakNuH+DxVi060io8=, tarball: base/download/base-0.11.2.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      cache-base: 1.0.1
-      class-utils: 0.3.6
-      component-emitter: 1.3.0
-      define-property: 1.0.0
-      isobject: 3.0.1
-      mixin-deep: 1.3.2
-      pascalcase: 0.1.1
-    dev: true
-
-  /base64-js/1.5.1:
-    resolution: {integrity: sha1-GxtEAWClv3rUC2UPCVljSBkDkwo=, tarball: base64-js/download/base64-js-1.5.1.tgz}
-    dev: true
-
-  /big.js/5.2.2:
-    resolution: {integrity: sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=, tarball: big.js/download/big.js-5.2.2.tgz}
-    dev: true
-
-  /bin-build/3.0.0:
-    resolution: {integrity: sha1-xXgKJaip+WbYJEIX5sH1CCoUOGE=, tarball: bin-build/download/bin-build-3.0.0.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      decompress: 4.2.1
-      download: 6.2.5
-      execa: 0.7.0
-      p-map-series: 1.0.0
-      tempfile: 2.0.0
-    dev: true
-
-  /bin-check/4.1.0:
-    resolution: {integrity: sha1-/ElZcL3Ii7HVo1/BfmXEoUn8Skk=, tarball: bin-check/download/bin-check-4.1.0.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      execa: 0.7.0
-      executable: 4.1.1
-    dev: true
-
-  /bin-version-check/4.0.0:
-    resolution: {integrity: sha1-fYGcYklpkfgNiT5uAqMDI2Fgj3E=, tarball: bin-version-check/download/bin-version-check-4.0.0.tgz}
-    engines: {node: '>=6'}
-    dependencies:
-      bin-version: 3.1.0
-      semver: 5.7.1
-      semver-truncate: 1.1.2
-    dev: true
-
-  /bin-version/3.1.0:
-    resolution: {integrity: sha1-WwnrKAdSsb0o8MnbP5by9DtsCDk=, tarball: bin-version/download/bin-version-3.1.0.tgz}
-    engines: {node: '>=6'}
-    dependencies:
-      execa: 1.0.0
-      find-versions: 3.2.0
-    dev: true
-
-  /bin-wrapper-china/0.1.0:
-    resolution: {integrity: sha1-wuyVtNDq727VrRCVT5In2OXvNyU=, tarball: bin-wrapper-china/download/bin-wrapper-china-0.1.0.tgz}
-    engines: {node: '>=8.3'}
-    hasBin: true
-    dependencies:
-      bin-check: 4.1.0
-      bin-version-check: 4.0.0
-      binary-mirror-config: 1.34.0
-      download: 7.1.0
-      import-lazy: 4.0.0
-      os-filter-obj: 2.0.0
-      pify: 4.0.1
-    dev: true
-
-  /binary-extensions/2.2.0:
-    resolution: {integrity: sha1-dfUC7q+f/eQvyYgpZFvk6na9ni0=, tarball: binary-extensions/download/binary-extensions-2.2.0.tgz}
-    engines: {node: '>=8'}
-    dev: true
-
-  /binary-mirror-config/1.34.0:
-    resolution: {integrity: sha512-EGn/L4iVcWohGu5GE7GDe6ZrcNWmCFhMqj+h7D7aVmN1+dKuHjSrD/QIal6/1l4tdBv5iVR5NFBIPqf+NZM25A==, tarball: binary-mirror-config/download/binary-mirror-config-1.34.0.tgz}
-    dev: true
-
-  /bl/1.2.3:
-    resolution: {integrity: sha1-Ho3YAULqyA1xWMnczAR/tiDgNec=, tarball: bl/download/bl-1.2.3.tgz}
-    dependencies:
-      readable-stream: 2.3.7
-      safe-buffer: 5.2.1
-    dev: true
-
-  /bl/4.1.0:
-    resolution: {integrity: sha1-RRU1JkGCvsL7vIOmKrmM8R2fezo=, tarball: bl/download/bl-4.1.0.tgz}
-    dependencies:
-      buffer: 5.7.1
-      inherits: 2.0.4
-      readable-stream: 3.6.0
-    dev: true
-
-  /bluebird/3.7.2:
-    resolution: {integrity: sha1-nyKcFb4nJFT/qXOs4NvueaGww28=, tarball: bluebird/download/bluebird-3.7.2.tgz?cache=0&sync_timestamp=1632822780713&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fbluebird%2Fdownload%2Fbluebird-3.7.2.tgz}
-    dev: true
-
-  /boolbase/1.0.0:
-    resolution: {integrity: sha1-aN/1++YMUes3cl6p4+0xDcwed24=, tarball: boolbase/download/boolbase-1.0.0.tgz}
-    dev: true
-
-  /brace-expansion/1.1.11:
-    resolution: {integrity: sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=, tarball: brace-expansion/download/brace-expansion-1.1.11.tgz}
-    dependencies:
-      balanced-match: 1.0.2
-      concat-map: 0.0.1
-    dev: true
-
-  /braces/2.3.2:
-    resolution: {integrity: sha1-WXn9PxTNUxVl5fot8av/8d+u5yk=, tarball: braces/download/braces-2.3.2.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      arr-flatten: 1.1.0
-      array-unique: 0.3.2
-      extend-shallow: 2.0.1
-      fill-range: 4.0.0
-      isobject: 3.0.1
-      repeat-element: 1.1.4
-      snapdragon: 0.8.2
-      snapdragon-node: 2.1.1
-      split-string: 3.1.0
-      to-regex: 3.0.2
-    dev: true
-
-  /braces/3.0.2:
-    resolution: {integrity: sha1-NFThpGLujVmeI23zNs2epPiv4Qc=, tarball: braces/download/braces-3.0.2.tgz}
-    engines: {node: '>=8'}
-    dependencies:
-      fill-range: 7.0.1
-    dev: true
-
-  /browserslist/4.19.1:
-    resolution: {integrity: sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==, tarball: browserslist/download/browserslist-4.19.1.tgz}
-    engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
-    hasBin: true
-    dependencies:
-      caniuse-lite: 1.0.30001292
-      electron-to-chromium: 1.4.26
-      escalade: 3.1.1
-      node-releases: 2.0.1
-      picocolors: 1.0.0
-    dev: true
-
-  /buffer-alloc-unsafe/1.1.0:
-    resolution: {integrity: sha1-vX3CauKXLQ7aJTvgYdupkjScGfA=, tarball: buffer-alloc-unsafe/download/buffer-alloc-unsafe-1.1.0.tgz}
-    dev: true
-
-  /buffer-alloc/1.2.0:
-    resolution: {integrity: sha1-iQ3ZDZI6hz4I4Q5f1RpX5bfM4Ow=, tarball: buffer-alloc/download/buffer-alloc-1.2.0.tgz}
-    dependencies:
-      buffer-alloc-unsafe: 1.1.0
-      buffer-fill: 1.0.0
-    dev: true
-
-  /buffer-crc32/0.2.13:
-    resolution: {integrity: sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=, tarball: buffer-crc32/download/buffer-crc32-0.2.13.tgz}
-    dev: true
-
-  /buffer-fill/1.0.0:
-    resolution: {integrity: sha1-+PeLdniYiO858gXNY39o5wISKyw=, tarball: buffer-fill/download/buffer-fill-1.0.0.tgz}
-    dev: true
-
-  /buffer-from/1.1.2:
-    resolution: {integrity: sha1-KxRqb9cugLT1XSVfNe1Zo6mkG9U=, tarball: buffer-from/download/buffer-from-1.1.2.tgz}
-    dev: true
-
-  /buffer/5.7.1:
-    resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==, tarball: buffer/download/buffer-5.7.1.tgz}
-    dependencies:
-      base64-js: 1.5.1
-      ieee754: 1.2.1
-    dev: true
-
-  /builtin-modules/3.2.0:
-    resolution: {integrity: sha1-RdXbmefuXmvE82LgCL+RerUEmIc=, tarball: builtin-modules/download/builtin-modules-3.2.0.tgz}
-    engines: {node: '>=6'}
-    dev: true
-
-  /cache-base/1.0.1:
-    resolution: {integrity: sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=, tarball: cache-base/download/cache-base-1.0.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      collection-visit: 1.0.0
-      component-emitter: 1.3.0
-      get-value: 2.0.6
-      has-value: 1.0.0
-      isobject: 3.0.1
-      set-value: 2.0.1
-      to-object-path: 0.3.0
-      union-value: 1.0.1
-      unset-value: 1.0.0
-    dev: true
-
-  /cacheable-request/2.1.4:
-    resolution: {integrity: sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=, tarball: cacheable-request/download/cacheable-request-2.1.4.tgz}
-    dependencies:
-      clone-response: 1.0.2
-      get-stream: 3.0.0
-      http-cache-semantics: 3.8.1
-      keyv: 3.0.0
-      lowercase-keys: 1.0.0
-      normalize-url: 2.0.1
-      responselike: 1.0.2
-    dev: true
-
-  /call-bind/1.0.2:
-    resolution: {integrity: sha1-sdTonmiBGcPJqQOtMKuy9qkZvjw=, tarball: call-bind/download/call-bind-1.0.2.tgz}
-    dependencies:
-      function-bind: 1.1.1
-      get-intrinsic: 1.1.1
-
-  /camel-case/4.1.2:
-    resolution: {integrity: sha1-lygHKpVPgFIoIlpt7qazhGHhvVo=, tarball: camel-case/download/camel-case-4.1.2.tgz}
-    dependencies:
-      pascal-case: 3.1.2
-      tslib: 2.3.1
-    dev: true
-
-  /camelcase-keys/2.1.0:
-    resolution: {integrity: sha1-MIvur/3ygRkFHvodkyITyRuPkuc=, tarball: camelcase-keys/download/camelcase-keys-2.1.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      camelcase: 2.1.1
-      map-obj: 1.0.1
-    dev: true
-
-  /camelcase/2.1.1:
-    resolution: {integrity: sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=, tarball: camelcase/download/camelcase-2.1.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /camelcase/5.3.1:
-    resolution: {integrity: sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=, tarball: camelcase/download/camelcase-5.3.1.tgz}
-    engines: {node: '>=6'}
-    dev: false
-
-  /camelcase/6.2.1:
-    resolution: {integrity: sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==, tarball: camelcase/download/camelcase-6.2.1.tgz}
-    engines: {node: '>=10'}
-    dev: true
-
-  /caniuse-lite/1.0.30001292:
-    resolution: {integrity: sha512-jnT4Tq0Q4ma+6nncYQVe7d73kmDmE9C3OGTx3MvW7lBM/eY1S1DZTMBON7dqV481RhNiS5OxD7k9JQvmDOTirw==, tarball: caniuse-lite/download/caniuse-lite-1.0.30001292.tgz}
-    dev: true
-
-  /capital-case/1.0.4:
-    resolution: {integrity: sha1-nRMCkjU8kkn2sA+lhSvuOKcX5mk=, tarball: capital-case/download/capital-case-1.0.4.tgz}
-    dependencies:
-      no-case: 3.0.4
-      tslib: 2.3.1
-      upper-case-first: 2.0.2
-    dev: true
-
-  /caw/2.0.1:
-    resolution: {integrity: sha1-bDygcfwZRyCIPC3F2psHS/x+npU=, tarball: caw/download/caw-2.0.1.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      get-proxy: 2.1.0
-      isurl: 1.0.0
-      tunnel-agent: 0.6.0
-      url-to-options: 1.0.1
-    dev: true
-
-  /chalk/1.1.3:
-    resolution: {integrity: sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=, tarball: chalk/download/chalk-1.1.3.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      ansi-styles: 2.2.1
-      escape-string-regexp: 1.0.5
-      has-ansi: 2.0.0
-      strip-ansi: 3.0.1
-      supports-color: 2.0.0
-    dev: true
-
-  /chalk/2.4.2:
-    resolution: {integrity: sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=, tarball: chalk/download/chalk-2.4.2.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      ansi-styles: 3.2.1
-      escape-string-regexp: 1.0.5
-      supports-color: 5.5.0
-    dev: true
-
-  /chalk/4.1.2:
-    resolution: {integrity: sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=, tarball: chalk/download/chalk-4.1.2.tgz}
-    engines: {node: '>=10'}
-    dependencies:
-      ansi-styles: 4.3.0
-      supports-color: 7.2.0
-    dev: true
-
-  /change-case/4.1.2:
-    resolution: {integrity: sha1-/t/F8TYEXiOYwEEO5EH5VwRkHhI=, tarball: change-case/download/change-case-4.1.2.tgz}
-    dependencies:
-      camel-case: 4.1.2
-      capital-case: 1.0.4
-      constant-case: 3.0.4
-      dot-case: 3.0.4
-      header-case: 2.0.4
-      no-case: 3.0.4
-      param-case: 3.0.4
-      pascal-case: 3.1.2
-      path-case: 3.0.4
-      sentence-case: 3.0.4
-      snake-case: 3.0.4
-      tslib: 2.3.1
-    dev: true
-
-  /chardet/0.7.0:
-    resolution: {integrity: sha1-kAlISfCTfy7twkJdDSip5fDLrZ4=, tarball: chardet/download/chardet-0.7.0.tgz}
-    dev: true
-
-  /chokidar/3.5.2:
-    resolution: {integrity: sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==, tarball: chokidar/download/chokidar-3.5.2.tgz}
-    engines: {node: '>= 8.10.0'}
-    dependencies:
-      anymatch: 3.1.2
-      braces: 3.0.2
-      glob-parent: 5.1.2
-      is-binary-path: 2.1.0
-      is-glob: 4.0.3
-      normalize-path: 3.0.0
-      readdirp: 3.6.0
-    optionalDependencies:
-      fsevents: 2.3.2
-    dev: true
-
-  /class-utils/0.3.6:
-    resolution: {integrity: sha1-+TNprouafOAv1B+q0MqDAzGQxGM=, tarball: class-utils/download/class-utils-0.3.6.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      arr-union: 3.1.0
-      define-property: 0.2.5
-      isobject: 3.0.1
-      static-extend: 0.1.2
-    dev: true
-
-  /clean-css/4.2.4:
-    resolution: {integrity: sha1-czv0brpOYHxokepXwkqYk1aDEXg=, tarball: clean-css/download/clean-css-4.2.4.tgz}
-    engines: {node: '>= 4.0'}
-    dependencies:
-      source-map: 0.6.1
-    dev: true
-
-  /clean-css/5.2.2:
-    resolution: {integrity: sha1-06fG7iURAR4FFxmDi9z4MU3EVI0=, tarball: clean-css/download/clean-css-5.2.2.tgz}
-    engines: {node: '>= 10.0'}
-    dependencies:
-      source-map: 0.6.1
-    dev: true
-
-  /cli-cursor/3.1.0:
-    resolution: {integrity: sha1-JkMFp65JDR0Dvwybp8kl0XU68wc=, tarball: cli-cursor/download/cli-cursor-3.1.0.tgz}
-    engines: {node: '>=8'}
-    dependencies:
-      restore-cursor: 3.1.0
-    dev: true
-
-  /cli-spinners/2.6.1:
-    resolution: {integrity: sha1-rclU6+KBw3pjGb+kAebdJIj/tw0=, tarball: cli-spinners/download/cli-spinners-2.6.1.tgz}
-    engines: {node: '>=6'}
-    dev: true
-
-  /cli-width/3.0.0:
-    resolution: {integrity: sha1-ovSEN6LKqaIkNueUvwceyeYc7fY=, tarball: cli-width/download/cli-width-3.0.0.tgz}
-    engines: {node: '>= 10'}
-    dev: true
-
-  /cliui/6.0.0:
-    resolution: {integrity: sha1-UR1wLAxOQcoVbX0OlgIfI+EyJbE=, tarball: cliui/download/cliui-6.0.0.tgz}
-    dependencies:
-      string-width: 4.2.3
-      strip-ansi: 6.0.1
-      wrap-ansi: 6.2.0
-    dev: false
-
-  /cliui/7.0.4:
-    resolution: {integrity: sha1-oCZe5lVHb8gHrqnfPfjfd4OAi08=, tarball: cliui/download/cliui-7.0.4.tgz}
-    dependencies:
-      string-width: 4.2.3
-      strip-ansi: 6.0.1
-      wrap-ansi: 7.0.0
-    dev: true
-
-  /clone-response/1.0.2:
-    resolution: {integrity: sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=, tarball: clone-response/download/clone-response-1.0.2.tgz}
-    dependencies:
-      mimic-response: 1.0.1
-    dev: true
-
-  /clone/1.0.4:
-    resolution: {integrity: sha1-2jCcwmPfFZlMaIypAheco8fNfH4=, tarball: clone/download/clone-1.0.4.tgz}
-    engines: {node: '>=0.8'}
-    dev: true
-
-  /clone/2.1.2:
-    resolution: {integrity: sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=, tarball: clone/download/clone-2.1.2.tgz}
-    engines: {node: '>=0.8'}
-    dev: true
-
-  /collection-visit/1.0.0:
-    resolution: {integrity: sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=, tarball: collection-visit/download/collection-visit-1.0.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      map-visit: 1.0.0
-      object-visit: 1.0.1
-    dev: true
-
-  /color-convert/1.9.3:
-    resolution: {integrity: sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=, tarball: color-convert/download/color-convert-1.9.3.tgz}
-    dependencies:
-      color-name: 1.1.3
-    dev: true
-
-  /color-convert/2.0.1:
-    resolution: {integrity: sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=, tarball: color-convert/download/color-convert-2.0.1.tgz}
-    engines: {node: '>=7.0.0'}
-    dependencies:
-      color-name: 1.1.4
-
-  /color-name/1.1.3:
-    resolution: {integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=, tarball: color-name/download/color-name-1.1.3.tgz}
-    dev: true
-
-  /color-name/1.1.4:
-    resolution: {integrity: sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=, tarball: color-name/download/color-name-1.1.4.tgz}
-
-  /commander/2.20.3:
-    resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==, tarball: commander/download/commander-2.20.3.tgz}
-    dev: true
-
-  /commander/4.1.1:
-    resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==, tarball: commander/download/commander-4.1.1.tgz}
-    engines: {node: '>= 6'}
-    dev: true
-
-  /commander/7.2.0:
-    resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==, tarball: commander/download/commander-7.2.0.tgz}
-    engines: {node: '>= 10'}
-    dev: true
-
-  /commander/8.3.0:
-    resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==, tarball: commander/download/commander-8.3.0.tgz}
-    engines: {node: '>= 12'}
-    dev: false
-
-  /common-tags/1.8.2:
-    resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==, tarball: common-tags/download/common-tags-1.8.2.tgz}
-    engines: {node: '>=4.0.0'}
-    dev: true
-
-  /component-emitter/1.3.0:
-    resolution: {integrity: sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A=, tarball: component-emitter/download/component-emitter-1.3.0.tgz}
-    dev: true
-
-  /compute-scroll-into-view/1.0.17:
-    resolution: {integrity: sha1-aojxis2dQunPS6pr7H4FImB6t6s=, tarball: compute-scroll-into-view/download/compute-scroll-into-view-1.0.17.tgz}
-    dev: false
-
-  /concat-map/0.0.1:
-    resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=, tarball: concat-map/download/concat-map-0.0.1.tgz}
-    dev: true
-
-  /config-chain/1.1.13:
-    resolution: {integrity: sha1-+tB5Wqamza/57Rto6d/5Q3LCMvQ=, tarball: config-chain/download/config-chain-1.1.13.tgz}
-    dependencies:
-      ini: 1.3.8
-      proto-list: 1.2.4
-    dev: true
-
-  /connect/3.7.0:
-    resolution: {integrity: sha1-XUk0iRDKpeB6AYALAw0MNfIEhPg=, tarball: connect/download/connect-3.7.0.tgz}
-    engines: {node: '>= 0.10.0'}
-    dependencies:
-      debug: 2.6.9
-      finalhandler: 1.1.2
-      parseurl: 1.3.3
-      utils-merge: 1.0.1
-    dev: true
-
-  /console-stream/0.1.1:
-    resolution: {integrity: sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ=, tarball: console-stream/download/console-stream-0.1.1.tgz}
-    dev: true
-
-  /constant-case/3.0.4:
-    resolution: {integrity: sha1-O4Sprq9M8x7EXmv13pG9+wWJ+vE=, tarball: constant-case/download/constant-case-3.0.4.tgz}
-    dependencies:
-      no-case: 3.0.4
-      tslib: 2.3.1
-      upper-case: 2.0.2
-    dev: true
-
-  /content-disposition/0.5.4:
-    resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==, tarball: content-disposition/download/content-disposition-0.5.4.tgz}
-    engines: {node: '>= 0.6'}
-    dependencies:
-      safe-buffer: 5.2.1
-    dev: true
-
-  /convert-source-map/1.8.0:
-    resolution: {integrity: sha1-8zc8MtIbTXgN2ABFFGhPt5HKQ2k=, tarball: convert-source-map/download/convert-source-map-1.8.0.tgz}
-    dependencies:
-      safe-buffer: 5.1.2
-    dev: true
-
-  /copy-anything/2.0.3:
-    resolution: {integrity: sha1-hCQHugJGaw34RIGbvjuuu+XUXYc=, tarball: copy-anything/download/copy-anything-2.0.3.tgz}
-    dependencies:
-      is-what: 3.14.1
-    dev: true
-
-  /copy-descriptor/0.1.1:
-    resolution: {integrity: sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=, tarball: copy-descriptor/download/copy-descriptor-0.1.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /core-js-compat/3.20.0:
-    resolution: {integrity: sha512-relrah5h+sslXssTTOkvqcC/6RURifB0W5yhYBdBkaPYa5/2KBMiog3XiD+s3TwEHWxInWVv4Jx2/Lw0vng+IQ==, tarball: core-js-compat/download/core-js-compat-3.20.0.tgz}
-    dependencies:
-      browserslist: 4.19.1
-      semver: 7.0.0
-    dev: true
-
-  /core-js/3.20.0:
-    resolution: {integrity: sha512-KjbKU7UEfg4YPpskMtMXPhUKn7m/1OdTHTVjy09ScR2LVaoUXe8Jh0UdvN2EKUR6iKTJph52SJP95mAB0MnVLQ==, tarball: core-js/download/core-js-3.20.0.tgz}
-    requiresBuild: true
-
-  /core-util-is/1.0.3:
-    resolution: {integrity: sha1-pgQtNjTCsn6TKPg3uWX6yDgI24U=, tarball: core-util-is/download/core-util-is-1.0.3.tgz}
-    dev: true
-
-  /cors/2.8.5:
-    resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==, tarball: cors/download/cors-2.8.5.tgz}
-    engines: {node: '>= 0.10'}
-    dependencies:
-      object-assign: 4.1.1
-      vary: 1.1.2
-    dev: true
-
-  /cross-env/7.0.3:
-    resolution: {integrity: sha1-hlJkspZ33AFbqEGJGJZd0jL8VM8=, tarball: cross-env/download/cross-env-7.0.3.tgz}
-    engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'}
-    hasBin: true
-    dependencies:
-      cross-spawn: 7.0.3
-    dev: true
-
-  /cross-fetch/3.1.4:
-    resolution: {integrity: sha1-lyPzo6JHv4uJA586OAqSROj6Lzk=, tarball: cross-fetch/download/cross-fetch-3.1.4.tgz}
-    dependencies:
-      node-fetch: 2.6.1
-
-  /cross-spawn/5.1.0:
-    resolution: {integrity: sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=, tarball: cross-spawn/download/cross-spawn-5.1.0.tgz}
-    dependencies:
-      lru-cache: 4.1.5
-      shebang-command: 1.2.0
-      which: 1.3.1
-    dev: true
-
-  /cross-spawn/6.0.5:
-    resolution: {integrity: sha1-Sl7Hxk364iw6FBJNus3uhG2Ay8Q=, tarball: cross-spawn/download/cross-spawn-6.0.5.tgz}
-    engines: {node: '>=4.8'}
-    dependencies:
-      nice-try: 1.0.5
-      path-key: 2.0.1
-      semver: 5.7.1
-      shebang-command: 1.2.0
-      which: 1.3.1
-    dev: true
-
-  /cross-spawn/7.0.3:
-    resolution: {integrity: sha1-9zqFudXUHQRVUcF34ogtSshXKKY=, tarball: cross-spawn/download/cross-spawn-7.0.3.tgz}
-    engines: {node: '>= 8'}
-    dependencies:
-      path-key: 3.1.1
-      shebang-command: 2.0.0
-      which: 2.0.2
-    dev: true
-
-  /crypto-js/4.1.1:
-    resolution: {integrity: sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==, tarball: crypto-js/download/crypto-js-4.1.1.tgz}
-    dev: false
-
-  /crypto-random-string/2.0.0:
-    resolution: {integrity: sha1-7yp6lm7BEIM4g2m6oC6+rSKbMNU=, tarball: crypto-random-string/download/crypto-random-string-2.0.0.tgz}
-    engines: {node: '>=8'}
-    dev: true
-
-  /css-select/4.2.0:
-    resolution: {integrity: sha512-6YVG6hsH9yIb/si3Th/is8Pex7qnVHO6t7q7U6TIUnkQASGbS8tnUDBftnPynLNnuUl/r2+PTd0ekiiq7R0zJw==, tarball: css-select/download/css-select-4.2.0.tgz}
-    dependencies:
-      boolbase: 1.0.0
-      css-what: 5.1.0
-      domhandler: 4.3.0
-      domutils: 2.8.0
-      nth-check: 2.0.1
-    dev: true
-
-  /css-tree/1.1.3:
-    resolution: {integrity: sha1-60hw+2/XcHMn7JXC/yqwm16NuR0=, tarball: css-tree/download/css-tree-1.1.3.tgz}
-    engines: {node: '>=8.0.0'}
-    dependencies:
-      mdn-data: 2.0.14
-      source-map: 0.6.1
-    dev: true
-
-  /css-what/5.1.0:
-    resolution: {integrity: sha1-P3tweq32M7r2LCzrhXm1RbtA9/4=, tarball: css-what/download/css-what-5.1.0.tgz}
-    engines: {node: '>= 6'}
-    dev: true
-
-  /csso/4.2.0:
-    resolution: {integrity: sha1-6jpWE0bo3J9UbW/r7dUBh884lSk=, tarball: csso/download/csso-4.2.0.tgz}
-    engines: {node: '>=8.0.0'}
-    dependencies:
-      css-tree: 1.1.3
-    dev: true
-
-  /csstype/2.6.19:
-    resolution: {integrity: sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==, tarball: csstype/download/csstype-2.6.19.tgz}
-    dev: false
-
-  /currently-unhandled/0.4.1:
-    resolution: {integrity: sha1-mI3zP+qxke95mmE2nddsF635V+o=, tarball: currently-unhandled/download/currently-unhandled-0.4.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      array-find-index: 1.0.2
-    dev: true
-
-  /cwebp-bin/5.1.0:
-    resolution: {integrity: sha1-1b6ofBJzWFWOe/epCm1EDULcsHQ=, tarball: cwebp-bin/download/cwebp-bin-5.1.0.tgz}
-    engines: {node: '>=6'}
-    hasBin: true
-    requiresBuild: true
-    dependencies:
-      bin-build: 3.0.0
-      bin-wrapper: /bin-wrapper-china/0.1.0
-      logalot: 2.1.0
-    dev: true
-
-  /debug/2.6.9:
-    resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==, tarball: debug/download/debug-2.6.9.tgz}
-    dependencies:
-      ms: 2.0.0
-    dev: true
-
-  /debug/3.2.7:
-    resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==, tarball: debug/download/debug-3.2.7.tgz}
-    dependencies:
-      ms: 2.1.3
-    dev: true
-    optional: true
-
-  /debug/4.3.3:
-    resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==, tarball: debug/download/debug-4.3.3.tgz}
-    engines: {node: '>=6.0'}
-    peerDependencies:
-      supports-color: '*'
-    peerDependenciesMeta:
-      supports-color:
-        optional: true
-    dependencies:
-      ms: 2.1.2
-    dev: true
-
-  /decamelize/1.2.0:
-    resolution: {integrity: sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=, tarball: decamelize/download/decamelize-1.2.0.tgz}
-    engines: {node: '>=0.10.0'}
-
-  /decode-uri-component/0.2.0:
-    resolution: {integrity: sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=, tarball: decode-uri-component/download/decode-uri-component-0.2.0.tgz}
-    engines: {node: '>=0.10'}
-    dev: true
-
-  /decompress-response/3.3.0:
-    resolution: {integrity: sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=, tarball: decompress-response/download/decompress-response-3.3.0.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      mimic-response: 1.0.1
-    dev: true
-
-  /decompress-tar/4.1.1:
-    resolution: {integrity: sha1-cYy9P8sWIJcW5womuE57pFkuWvE=, tarball: decompress-tar/download/decompress-tar-4.1.1.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      file-type: 5.2.0
-      is-stream: 1.1.0
-      tar-stream: 1.6.2
-    dev: true
-
-  /decompress-tarbz2/4.1.1:
-    resolution: {integrity: sha1-MIKluIDqQEOBY0nzeLVsUWvho5s=, tarball: decompress-tarbz2/download/decompress-tarbz2-4.1.1.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      decompress-tar: 4.1.1
-      file-type: 6.2.0
-      is-stream: 1.1.0
-      seek-bzip: 1.0.6
-      unbzip2-stream: 1.4.3
-    dev: true
-
-  /decompress-targz/4.1.1:
-    resolution: {integrity: sha1-wJvDXE0R894J8tLaU+neI+fOHu4=, tarball: decompress-targz/download/decompress-targz-4.1.1.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      decompress-tar: 4.1.1
-      file-type: 5.2.0
-      is-stream: 1.1.0
-    dev: true
-
-  /decompress-unzip/4.0.1:
-    resolution: {integrity: sha1-3qrM39FK6vhVePczroIQ+bSEj2k=, tarball: decompress-unzip/download/decompress-unzip-4.0.1.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      file-type: 3.9.0
-      get-stream: 2.3.1
-      pify: 2.3.0
-      yauzl: 2.10.0
-    dev: true
-
-  /decompress/4.2.1:
-    resolution: {integrity: sha1-AH9VzGpiwFWvo3wH62pO4bdz8Rg=, tarball: decompress/download/decompress-4.2.1.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      decompress-tar: 4.1.1
-      decompress-tarbz2: 4.1.1
-      decompress-targz: 4.1.1
-      decompress-unzip: 4.0.1
-      graceful-fs: 4.2.8
-      make-dir: 1.3.0
-      pify: 2.3.0
-      strip-dirs: 2.1.0
-    dev: true
-
-  /deepmerge/4.2.2:
-    resolution: {integrity: sha1-RNLqNnm49NT/ujPwPYZfwee/SVU=, tarball: deepmerge/download/deepmerge-4.2.2.tgz?cache=0&sync_timestamp=1632822781299&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fdeepmerge%2Fdownload%2Fdeepmerge-4.2.2.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /defaults/1.0.3:
-    resolution: {integrity: sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=, tarball: defaults/download/defaults-1.0.3.tgz}
-    dependencies:
-      clone: 1.0.4
-    dev: true
-
-  /define-properties/1.1.3:
-    resolution: {integrity: sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=, tarball: define-properties/download/define-properties-1.1.3.tgz}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      object-keys: 1.1.1
-    dev: true
-
-  /define-property/0.2.5:
-    resolution: {integrity: sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=, tarball: define-property/download/define-property-0.2.5.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      is-descriptor: 0.1.6
-    dev: true
-
-  /define-property/1.0.0:
-    resolution: {integrity: sha1-dp66rz9KY6rTr56NMEybvnm/sOY=, tarball: define-property/download/define-property-1.0.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      is-descriptor: 1.0.2
-    dev: true
-
-  /define-property/2.0.2:
-    resolution: {integrity: sha1-1Flono1lS6d+AqgX+HENcCyxbp0=, tarball: define-property/download/define-property-2.0.2.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      is-descriptor: 1.0.2
-      isobject: 3.0.1
-    dev: true
-
-  /dijkstrajs/1.0.2:
-    resolution: {integrity: sha1-LkjA07glRir+datK1egpyOzjYlc=, tarball: dijkstrajs/download/dijkstrajs-1.0.2.tgz}
-    dev: false
-
-  /dir-glob/3.0.1:
-    resolution: {integrity: sha1-Vtv3PZkqSpO6FYT0U0Bj/S5BcX8=, tarball: dir-glob/download/dir-glob-3.0.1.tgz}
-    engines: {node: '>=8'}
-    dependencies:
-      path-type: 4.0.0
-    dev: true
-
-  /dom-align/1.12.2:
-    resolution: {integrity: sha1-D4Fk69DJwhsMeQMQSTzYVYkqzUs=, tarball: dom-align/download/dom-align-1.12.2.tgz}
-    dev: false
-
-  /dom-scroll-into-view/2.0.1:
-    resolution: {integrity: sha1-DezIUigB/Y0/HGujVadNOCxfmJs=, tarball: dom-scroll-into-view/download/dom-scroll-into-view-2.0.1.tgz}
-    dev: false
-
-  /dom-serializer/0.2.2:
-    resolution: {integrity: sha1-GvuB9TNxcXXUeGVd68XjMtn5u1E=, tarball: dom-serializer/download/dom-serializer-0.2.2.tgz}
-    dependencies:
-      domelementtype: 2.2.0
-      entities: 2.2.0
-    dev: true
-
-  /dom-serializer/1.3.2:
-    resolution: {integrity: sha1-YgZDfTLO767HFhgDIwx6ILwbTZE=, tarball: dom-serializer/download/dom-serializer-1.3.2.tgz}
-    dependencies:
-      domelementtype: 2.2.0
-      domhandler: 4.3.0
-      entities: 2.2.0
-    dev: true
-
-  /domelementtype/1.3.1:
-    resolution: {integrity: sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8=, tarball: domelementtype/download/domelementtype-1.3.1.tgz}
-    dev: true
-
-  /domelementtype/2.2.0:
-    resolution: {integrity: sha1-mgtsJ4LtahxzI9QiZxg9+b2LHVc=, tarball: domelementtype/download/domelementtype-2.2.0.tgz}
-    dev: true
-
-  /domhandler/2.4.2:
-    resolution: {integrity: sha1-iAUJfpM9ZehVRvcm1g9euItE+AM=, tarball: domhandler/download/domhandler-2.4.2.tgz}
-    dependencies:
-      domelementtype: 1.3.1
-    dev: true
-
-  /domhandler/4.3.0:
-    resolution: {integrity: sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==, tarball: domhandler/download/domhandler-4.3.0.tgz}
-    engines: {node: '>= 4'}
-    dependencies:
-      domelementtype: 2.2.0
-    dev: true
-
-  /domutils/1.7.0:
-    resolution: {integrity: sha1-Vuo0HoNOBuZ0ivehyyXaZ+qfjCo=, tarball: domutils/download/domutils-1.7.0.tgz}
-    dependencies:
-      dom-serializer: 0.2.2
-      domelementtype: 1.3.1
-    dev: true
-
-  /domutils/2.8.0:
-    resolution: {integrity: sha1-RDfe9dtuLR9dbuhZvZXKfQIEgTU=, tarball: domutils/download/domutils-2.8.0.tgz}
-    dependencies:
-      dom-serializer: 1.3.2
-      domelementtype: 2.2.0
-      domhandler: 4.3.0
-    dev: true
-
-  /dot-case/3.0.4:
-    resolution: {integrity: sha1-mytnDQCkMWZ6inW6Kc0bmICc51E=, tarball: dot-case/download/dot-case-3.0.4.tgz}
-    dependencies:
-      no-case: 3.0.4
-      tslib: 2.3.1
-    dev: true
-
-  /dotenv-expand/5.1.0:
-    resolution: {integrity: sha1-P7rwIL/XlIhAcuomsel5HUWmKfA=, tarball: dotenv-expand/download/dotenv-expand-5.1.0.tgz}
-    dev: true
-
-  /dotenv/10.0.0:
-    resolution: {integrity: sha1-PUInuPuV+BCWzdK2ZlP7LHCFuoE=, tarball: dotenv/download/dotenv-10.0.0.tgz?cache=0&sync_timestamp=1632822785154&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fdotenv%2Fdownload%2Fdotenv-10.0.0.tgz}
-    engines: {node: '>=10'}
-    dev: true
-
-  /download/6.2.5:
-    resolution: {integrity: sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==, tarball: download/download/download-6.2.5.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      caw: 2.0.1
-      content-disposition: 0.5.4
-      decompress: 4.2.1
-      ext-name: 5.0.0
-      file-type: 5.2.0
-      filenamify: 2.1.0
-      get-stream: 3.0.0
-      got: 7.1.0
-      make-dir: 1.3.0
-      p-event: 1.3.0
-      pify: 3.0.0
-    dev: true
-
-  /download/7.1.0:
-    resolution: {integrity: sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==, tarball: download/download/download-7.1.0.tgz}
-    engines: {node: '>=6'}
-    dependencies:
-      archive-type: 4.0.0
-      caw: 2.0.1
-      content-disposition: 0.5.4
-      decompress: 4.2.1
-      ext-name: 5.0.0
-      file-type: 8.1.0
-      filenamify: 2.1.0
-      get-stream: 3.0.0
-      got: 8.3.2
-      make-dir: 1.3.0
-      p-event: 2.3.1
-      pify: 3.0.0
-    dev: true
-
-  /duplexer3/0.1.4:
-    resolution: {integrity: sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=, tarball: duplexer3/download/duplexer3-0.1.4.tgz}
-    dev: true
-
-  /echarts/5.2.2:
-    resolution: {integrity: sha512-yxuBfeIH5c+0FsoRP60w4De6omXhA06c7eUYBsC1ykB6Ys2yK5fSteIYWvkJ4xJVLQgCvAdO8C4mN6MLeJpBaw==, tarball: echarts/download/echarts-5.2.2.tgz}
-    dependencies:
-      tslib: 2.3.0
-      zrender: 5.2.1
-    dev: false
-
-  /ee-first/1.1.1:
-    resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=, tarball: ee-first/download/ee-first-1.1.1.tgz}
-    dev: true
-
-  /ejs/3.1.6:
-    resolution: {integrity: sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==, tarball: ejs/download/ejs-3.1.6.tgz}
-    engines: {node: '>=0.10.0'}
-    hasBin: true
-    dependencies:
-      jake: 10.8.2
-    dev: true
-
-  /electron-to-chromium/1.4.26:
-    resolution: {integrity: sha512-cA1YwlRzO6TGp7yd3+KAqh9Tt6Z4CuuKqsAJP6uF/H5MQryjAGDhMhnY5cEXo8MaRCczpzSBhMPdqRIodkbZYw==, tarball: electron-to-chromium/download/electron-to-chromium-1.4.26.tgz}
-    dev: true
-
-  /emoji-regex/8.0.0:
-    resolution: {integrity: sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=, tarball: emoji-regex/download/emoji-regex-8.0.0.tgz}
-
-  /emojis-list/3.0.0:
-    resolution: {integrity: sha1-VXBmIEatKeLpFucariYKvf9Pang=, tarball: emojis-list/download/emojis-list-3.0.0.tgz}
-    engines: {node: '>= 4'}
-    dev: true
-
-  /encode-utf8/1.0.3:
-    resolution: {integrity: sha1-8w/dMdoH+1lvKBvrL2sCeFGZTNo=, tarball: encode-utf8/download/encode-utf8-1.0.3.tgz}
-    dev: false
-
-  /encodeurl/1.0.2:
-    resolution: {integrity: sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=, tarball: encodeurl/download/encodeurl-1.0.2.tgz}
-    engines: {node: '>= 0.8'}
-    dev: true
-
-  /end-of-stream/1.4.4:
-    resolution: {integrity: sha1-WuZKX0UFe682JuwU2gyl5LJDHrA=, tarball: end-of-stream/download/end-of-stream-1.4.4.tgz}
-    dependencies:
-      once: 1.4.0
-    dev: true
-
-  /entities/1.1.2:
-    resolution: {integrity: sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=, tarball: entities/download/entities-1.1.2.tgz}
-    dev: true
-
-  /entities/2.2.0:
-    resolution: {integrity: sha1-CY3JDruD2N/6CJ1VJWs1HTTE2lU=, tarball: entities/download/entities-2.2.0.tgz}
-    dev: true
-
-  /errno/0.1.8:
-    resolution: {integrity: sha1-i7Ppx9Rjvkl2/4iPdrSAnrwugR8=, tarball: errno/download/errno-0.1.8.tgz}
-    hasBin: true
-    requiresBuild: true
-    dependencies:
-      prr: 1.0.1
-    dev: true
-    optional: true
-
-  /error-ex/1.3.2:
-    resolution: {integrity: sha1-tKxAZIEH/c3PriQvQovqihTU8b8=, tarball: error-ex/download/error-ex-1.3.2.tgz}
-    dependencies:
-      is-arrayish: 0.2.1
-    dev: true
-
-  /es-abstract/1.19.1:
-    resolution: {integrity: sha1-1IhXlodpFpWd547aoN9FZicRXsM=, tarball: es-abstract/download/es-abstract-1.19.1.tgz}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      call-bind: 1.0.2
-      es-to-primitive: 1.2.1
-      function-bind: 1.1.1
-      get-intrinsic: 1.1.1
-      get-symbol-description: 1.0.0
-      has: 1.0.3
-      has-symbols: 1.0.2
-      internal-slot: 1.0.3
-      is-callable: 1.2.4
-      is-negative-zero: 2.0.2
-      is-regex: 1.1.4
-      is-shared-array-buffer: 1.0.1
-      is-string: 1.0.7
-      is-weakref: 1.0.2
-      object-inspect: 1.12.0
-      object-keys: 1.1.1
-      object.assign: 4.1.2
-      string.prototype.trimend: 1.0.4
-      string.prototype.trimstart: 1.0.4
-      unbox-primitive: 1.0.1
-    dev: true
-
-  /es-module-lexer/0.9.3:
-    resolution: {integrity: sha1-bxPbAMw4QXE32vdDZvU1yOtDjxk=, tarball: es-module-lexer/download/es-module-lexer-0.9.3.tgz}
-    dev: true
-
-  /es-to-primitive/1.2.1:
-    resolution: {integrity: sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo=, tarball: es-to-primitive/download/es-to-primitive-1.2.1.tgz}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      is-callable: 1.2.4
-      is-date-object: 1.0.5
-      is-symbol: 1.0.4
-    dev: true
-
-  /esbuild-android-arm64/0.13.15:
-    resolution: {integrity: sha512-m602nft/XXeO8YQPUDVoHfjyRVPdPgjyyXOxZ44MK/agewFFkPa8tUo6lAzSWh5Ui5PB4KR9UIFTSBKh/RrCmg==, tarball: esbuild-android-arm64/download/esbuild-android-arm64-0.13.15.tgz}
-    cpu: [arm64]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-darwin-64/0.13.15:
-    resolution: {integrity: sha512-ihOQRGs2yyp7t5bArCwnvn2Atr6X4axqPpEdCFPVp7iUj4cVSdisgvEKdNR7yH3JDjW6aQDw40iQFoTqejqxvQ==, tarball: esbuild-darwin-64/download/esbuild-darwin-64-0.13.15.tgz}
-    cpu: [x64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-darwin-arm64/0.13.15:
-    resolution: {integrity: sha512-i1FZssTVxUqNlJ6cBTj5YQj4imWy3m49RZRnHhLpefFIh0To05ow9DTrXROTE1urGTQCloFUXTX8QfGJy1P8dQ==, tarball: esbuild-darwin-arm64/download/esbuild-darwin-arm64-0.13.15.tgz}
-    cpu: [arm64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-freebsd-64/0.13.15:
-    resolution: {integrity: sha512-G3dLBXUI6lC6Z09/x+WtXBXbOYQZ0E8TDBqvn7aMaOCzryJs8LyVXKY4CPnHFXZAbSwkCbqiPuSQ1+HhrNk7EA==, tarball: esbuild-freebsd-64/download/esbuild-freebsd-64-0.13.15.tgz}
-    cpu: [x64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-freebsd-arm64/0.13.15:
-    resolution: {integrity: sha512-KJx0fzEDf1uhNOZQStV4ujg30WlnwqUASaGSFPhznLM/bbheu9HhqZ6mJJZM32lkyfGJikw0jg7v3S0oAvtvQQ==, tarball: esbuild-freebsd-arm64/download/esbuild-freebsd-arm64-0.13.15.tgz}
-    cpu: [arm64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-32/0.13.15:
-    resolution: {integrity: sha512-ZvTBPk0YWCLMCXiFmD5EUtB30zIPvC5Itxz0mdTu/xZBbbHJftQgLWY49wEPSn2T/TxahYCRDWun5smRa0Tu+g==, tarball: esbuild-linux-32/download/esbuild-linux-32-0.13.15.tgz}
-    cpu: [ia32]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-64/0.13.15:
-    resolution: {integrity: sha512-eCKzkNSLywNeQTRBxJRQ0jxRCl2YWdMB3+PkWFo2BBQYC5mISLIVIjThNtn6HUNqua1pnvgP5xX0nHbZbPj5oA==, tarball: esbuild-linux-64/download/esbuild-linux-64-0.13.15.tgz}
-    cpu: [x64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-arm/0.13.15:
-    resolution: {integrity: sha512-wUHttDi/ol0tD8ZgUMDH8Ef7IbDX+/UsWJOXaAyTdkT7Yy9ZBqPg8bgB/Dn3CZ9SBpNieozrPRHm0BGww7W/jA==, tarball: esbuild-linux-arm/download/esbuild-linux-arm-0.13.15.tgz}
-    cpu: [arm]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-arm64/0.13.15:
-    resolution: {integrity: sha512-bYpuUlN6qYU9slzr/ltyLTR9YTBS7qUDymO8SV7kjeNext61OdmqFAzuVZom+OLW1HPHseBfJ/JfdSlx8oTUoA==, tarball: esbuild-linux-arm64/download/esbuild-linux-arm64-0.13.15.tgz}
-    cpu: [arm64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-mips64le/0.13.15:
-    resolution: {integrity: sha512-KlVjIG828uFPyJkO/8gKwy9RbXhCEUeFsCGOJBepUlpa7G8/SeZgncUEz/tOOUJTcWMTmFMtdd3GElGyAtbSWg==, tarball: esbuild-linux-mips64le/download/esbuild-linux-mips64le-0.13.15.tgz}
-    cpu: [mips64el]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-ppc64le/0.13.15:
-    resolution: {integrity: sha512-h6gYF+OsaqEuBjeesTBtUPw0bmiDu7eAeuc2OEH9S6mV9/jPhPdhOWzdeshb0BskRZxPhxPOjqZ+/OqLcxQwEQ==, tarball: esbuild-linux-ppc64le/download/esbuild-linux-ppc64le-0.13.15.tgz}
-    cpu: [ppc64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-netbsd-64/0.13.15:
-    resolution: {integrity: sha512-3+yE9emwoevLMyvu+iR3rsa+Xwhie7ZEHMGDQ6dkqP/ndFzRHkobHUKTe+NCApSqG5ce2z4rFu+NX/UHnxlh3w==, tarball: esbuild-netbsd-64/download/esbuild-netbsd-64-0.13.15.tgz}
-    cpu: [x64]
-    os: [netbsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-node-loader/0.4.3:
-    resolution: {integrity: sha1-QaG0VZsE3Av1VOSpYw2vl1nWF9M=, tarball: esbuild-node-loader/download/esbuild-node-loader-0.4.3.tgz}
-    dependencies:
-      esbuild: 0.13.15
-    dev: true
-
-  /esbuild-openbsd-64/0.13.15:
-    resolution: {integrity: sha512-wTfvtwYJYAFL1fSs8yHIdf5GEE4NkbtbXtjLWjM3Cw8mmQKqsg8kTiqJ9NJQe5NX/5Qlo7Xd9r1yKMMkHllp5g==, tarball: esbuild-openbsd-64/download/esbuild-openbsd-64-0.13.15.tgz}
-    cpu: [x64]
-    os: [openbsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-plugin-alias/0.1.2:
-    resolution: {integrity: sha1-EjL73oB8DIrUTETshZgZ60kuEqg=, tarball: esbuild-plugin-alias/download/esbuild-plugin-alias-0.1.2.tgz}
-    dev: true
-
-  /esbuild-register/3.2.1_esbuild@0.13.15:
-    resolution: {integrity: sha512-LFgzsqCHsFUpTZdYJFTl1o5p60+C4nZ65BzFYPS1jKGwiKk6JLH8tuLwuydvpgreNUAeDUhTPJgJNjmpZKSOpQ==, tarball: esbuild-register/download/esbuild-register-3.2.1.tgz}
-    peerDependencies:
-      esbuild: '>=0.12 <1'
-    dependencies:
-      esbuild: 0.13.15
-      jsonc-parser: 3.0.0
-    dev: true
-
-  /esbuild-sunos-64/0.13.15:
-    resolution: {integrity: sha512-lbivT9Bx3t1iWWrSnGyBP9ODriEvWDRiweAs69vI+miJoeKwHWOComSRukttbuzjZ8r1q0mQJ8Z7yUsDJ3hKdw==, tarball: esbuild-sunos-64/download/esbuild-sunos-64-0.13.15.tgz}
-    cpu: [x64]
-    os: [sunos]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-windows-32/0.13.15:
-    resolution: {integrity: sha512-fDMEf2g3SsJ599MBr50cY5ve5lP1wyVwTe6aLJsM01KtxyKkB4UT+fc5MXQFn3RLrAIAZOG+tHC+yXObpSn7Nw==, tarball: esbuild-windows-32/download/esbuild-windows-32-0.13.15.tgz}
-    cpu: [ia32]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-windows-64/0.13.15:
-    resolution: {integrity: sha512-9aMsPRGDWCd3bGjUIKG/ZOJPKsiztlxl/Q3C1XDswO6eNX/Jtwu4M+jb6YDH9hRSUflQWX0XKAfWzgy5Wk54JQ==, tarball: esbuild-windows-64/download/esbuild-windows-64-0.13.15.tgz}
-    cpu: [x64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-windows-arm64/0.13.15:
-    resolution: {integrity: sha512-zzvyCVVpbwQQATaf3IG8mu1IwGEiDxKkYUdA4FpoCHi1KtPa13jeScYDjlW0Qh+ebWzpKfR2ZwvqAQkSWNcKjA==, tarball: esbuild-windows-arm64/download/esbuild-windows-arm64-0.13.15.tgz}
-    cpu: [arm64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild/0.11.23:
-    resolution: {integrity: sha512-iaiZZ9vUF5wJV8ob1tl+5aJTrwDczlvGP0JoMmnpC2B0ppiMCu8n8gmy5ZTGl5bcG081XBVn+U+jP+mPFm5T5Q==, tarball: esbuild/download/esbuild-0.11.23.tgz}
-    hasBin: true
-    requiresBuild: true
-    dev: true
-
-  /esbuild/0.11.3:
-    resolution: {integrity: sha512-BzVRHcCtFepjS9WcqRjqoIxLqgpK21a8J4Zi4msSGxDxiXVO1IbcqT1KjhdDDnJxKfe7bvzZrvMEX+bVO0Elcw==, tarball: esbuild/download/esbuild-0.11.3.tgz}
-    hasBin: true
-    requiresBuild: true
-    dev: true
-
-  /esbuild/0.13.15:
-    resolution: {integrity: sha512-raCxt02HBKv8RJxE8vkTSCXGIyKHdEdGfUmiYb8wnabnaEmHzyW7DCHb5tEN0xU8ryqg5xw54mcwnYkC4x3AIw==, tarball: esbuild/download/esbuild-0.13.15.tgz}
-    hasBin: true
-    requiresBuild: true
-    optionalDependencies:
-      esbuild-android-arm64: 0.13.15
-      esbuild-darwin-64: 0.13.15
-      esbuild-darwin-arm64: 0.13.15
-      esbuild-freebsd-64: 0.13.15
-      esbuild-freebsd-arm64: 0.13.15
-      esbuild-linux-32: 0.13.15
-      esbuild-linux-64: 0.13.15
-      esbuild-linux-arm: 0.13.15
-      esbuild-linux-arm64: 0.13.15
-      esbuild-linux-mips64le: 0.13.15
-      esbuild-linux-ppc64le: 0.13.15
-      esbuild-netbsd-64: 0.13.15
-      esbuild-openbsd-64: 0.13.15
-      esbuild-sunos-64: 0.13.15
-      esbuild-windows-32: 0.13.15
-      esbuild-windows-64: 0.13.15
-      esbuild-windows-arm64: 0.13.15
-    dev: true
-
-  /escalade/3.1.1:
-    resolution: {integrity: sha1-2M/ccACWXFoBdLSoLqpcBVJ0LkA=, tarball: escalade/download/escalade-3.1.1.tgz}
-    engines: {node: '>=6'}
-    dev: true
-
-  /escape-html/1.0.3:
-    resolution: {integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=, tarball: escape-html/download/escape-html-1.0.3.tgz}
-    dev: true
-
-  /escape-string-regexp/1.0.5:
-    resolution: {integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=, tarball: escape-string-regexp/download/escape-string-regexp-1.0.5.tgz}
-    engines: {node: '>=0.8.0'}
-    dev: true
-
-  /esno/0.10.1:
-    resolution: {integrity: sha1-KPmtsw/cxZYEddA0pPIjEdM01s0=, tarball: esno/download/esno-0.10.1.tgz}
-    hasBin: true
-    dependencies:
-      cross-spawn: 7.0.3
-      esbuild: 0.13.15
-      esbuild-node-loader: 0.4.3
-      esbuild-register: 3.2.1_esbuild@0.13.15
-    dev: true
-
-  /estree-walker/1.0.1:
-    resolution: {integrity: sha1-MbxdYSyWtwQQa0d+bdXYqhOMtwA=, tarball: estree-walker/download/estree-walker-1.0.1.tgz}
-    dev: true
-
-  /estree-walker/2.0.2:
-    resolution: {integrity: sha1-UvAQF4wqTBF6d1fP6UKtt9LaTKw=, tarball: estree-walker/download/estree-walker-2.0.2.tgz}
-
-  /esutils/2.0.3:
-    resolution: {integrity: sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q=, tarball: esutils/download/esutils-2.0.3.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /etag/1.8.1:
-    resolution: {integrity: sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=, tarball: etag/download/etag-1.8.1.tgz}
-    engines: {node: '>= 0.6'}
-    dev: true
-
-  /exec-buffer/3.2.0:
-    resolution: {integrity: sha1-sWhtvZBMfPmC5lLB9aebHlVzCCs=, tarball: exec-buffer/download/exec-buffer-3.2.0.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      execa: 0.7.0
-      p-finally: 1.0.0
-      pify: 3.0.0
-      rimraf: 2.7.1
-      tempfile: 2.0.0
-    dev: true
-
-  /execa/0.7.0:
-    resolution: {integrity: sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=, tarball: execa/download/execa-0.7.0.tgz?cache=0&sync_timestamp=1637200719230&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fexeca%2Fdownload%2Fexeca-0.7.0.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      cross-spawn: 5.1.0
-      get-stream: 3.0.0
-      is-stream: 1.1.0
-      npm-run-path: 2.0.2
-      p-finally: 1.0.0
-      signal-exit: 3.0.6
-      strip-eof: 1.0.0
-    dev: true
-
-  /execa/1.0.0:
-    resolution: {integrity: sha1-xiNqW7TfbW8V6I5/AXeYIWdJ3dg=, tarball: execa/download/execa-1.0.0.tgz?cache=0&sync_timestamp=1637200719230&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fexeca%2Fdownload%2Fexeca-1.0.0.tgz}
-    engines: {node: '>=6'}
-    dependencies:
-      cross-spawn: 6.0.5
-      get-stream: 4.1.0
-      is-stream: 1.1.0
-      npm-run-path: 2.0.2
-      p-finally: 1.0.0
-      signal-exit: 3.0.6
-      strip-eof: 1.0.0
-    dev: true
-
-  /execa/4.1.0:
-    resolution: {integrity: sha1-TlSRrRVy8vF6d9OIxshXE1sihHo=, tarball: execa/download/execa-4.1.0.tgz?cache=0&sync_timestamp=1637200719230&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fexeca%2Fdownload%2Fexeca-4.1.0.tgz}
-    engines: {node: '>=10'}
-    dependencies:
-      cross-spawn: 7.0.3
-      get-stream: 5.2.0
-      human-signals: 1.1.1
-      is-stream: 2.0.1
-      merge-stream: 2.0.0
-      npm-run-path: 4.0.1
-      onetime: 5.1.2
-      signal-exit: 3.0.6
-      strip-final-newline: 2.0.0
-    dev: true
-
-  /execa/5.1.1:
-    resolution: {integrity: sha1-+ArZy/Qpj3vR1MlVXCHpN0HEEd0=, tarball: execa/download/execa-5.1.1.tgz?cache=0&sync_timestamp=1637200719230&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fexeca%2Fdownload%2Fexeca-5.1.1.tgz}
-    engines: {node: '>=10'}
-    dependencies:
-      cross-spawn: 7.0.3
-      get-stream: 6.0.1
-      human-signals: 2.1.0
-      is-stream: 2.0.1
-      merge-stream: 2.0.0
-      npm-run-path: 4.0.1
-      onetime: 5.1.2
-      signal-exit: 3.0.6
-      strip-final-newline: 2.0.0
-    dev: true
-
-  /executable/4.1.1:
-    resolution: {integrity: sha1-QVMr/zYdPlevTXY7cFgtsY9dEzw=, tarball: executable/download/executable-4.1.1.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      pify: 2.3.0
-    dev: true
-
-  /expand-brackets/2.1.4:
-    resolution: {integrity: sha1-t3c14xXOMPa27/D4OwQVGiJEliI=, tarball: expand-brackets/download/expand-brackets-2.1.4.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      debug: 2.6.9
-      define-property: 0.2.5
-      extend-shallow: 2.0.1
-      posix-character-classes: 0.1.1
-      regex-not: 1.0.2
-      snapdragon: 0.8.2
-      to-regex: 3.0.2
-    dev: true
-
-  /ext-list/2.2.2:
-    resolution: {integrity: sha1-C5jmTtgvWs8PKTG6v2khLvUt3Tc=, tarball: ext-list/download/ext-list-2.2.2.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      mime-db: 1.51.0
-    dev: true
-
-  /ext-name/5.0.0:
-    resolution: {integrity: sha1-cHgZgdGD7hXROZPIgiBFxQbI8KY=, tarball: ext-name/download/ext-name-5.0.0.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      ext-list: 2.2.2
-      sort-keys-length: 1.0.1
-    dev: true
-
-  /extend-shallow/2.0.1:
-    resolution: {integrity: sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=, tarball: extend-shallow/download/extend-shallow-2.0.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      is-extendable: 0.1.1
-    dev: true
-
-  /extend-shallow/3.0.2:
-    resolution: {integrity: sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=, tarball: extend-shallow/download/extend-shallow-3.0.2.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      assign-symbols: 1.0.0
-      is-extendable: 1.0.1
-    dev: true
-
-  /external-editor/3.1.0:
-    resolution: {integrity: sha1-ywP3QL764D6k0oPK7SdBqD8zVJU=, tarball: external-editor/download/external-editor-3.1.0.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      chardet: 0.7.0
-      iconv-lite: 0.4.24
-      tmp: 0.0.33
-    dev: true
-
-  /extglob/2.0.4:
-    resolution: {integrity: sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=, tarball: extglob/download/extglob-2.0.4.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      array-unique: 0.3.2
-      define-property: 1.0.0
-      expand-brackets: 2.1.4
-      extend-shallow: 2.0.1
-      fragment-cache: 0.2.1
-      regex-not: 1.0.2
-      snapdragon: 0.8.2
-      to-regex: 3.0.2
-    dev: true
-
-  /fast-deep-equal/3.1.3:
-    resolution: {integrity: sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=, tarball: fast-deep-equal/download/fast-deep-equal-3.1.3.tgz}
-    dev: true
-
-  /fast-glob/3.2.7:
-    resolution: {integrity: sha1-/Wy3otfpqnp4RhEehaGW1rL3ZqE=, tarball: fast-glob/download/fast-glob-3.2.7.tgz}
-    engines: {node: '>=8'}
-    dependencies:
-      '@nodelib/fs.stat': 2.0.5
-      '@nodelib/fs.walk': 1.2.8
-      glob-parent: 5.1.2
-      merge2: 1.4.1
-      micromatch: 4.0.4
-    dev: true
-
-  /fast-json-stable-stringify/2.1.0:
-    resolution: {integrity: sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=, tarball: fast-json-stable-stringify/download/fast-json-stable-stringify-2.1.0.tgz}
-    dev: true
-
-  /fast-xml-parser/3.21.1:
-    resolution: {integrity: sha1-FSodUdRFOA9wRrMEZy3VXRXJ5zY=, tarball: fast-xml-parser/download/fast-xml-parser-3.21.1.tgz}
-    hasBin: true
-    dependencies:
-      strnum: 1.0.5
-    dev: true
-
-  /fastq/1.13.0:
-    resolution: {integrity: sha1-YWdg+Ip1Jr38WWt8q4wYk4w2uYw=, tarball: fastq/download/fastq-1.13.0.tgz?cache=0&sync_timestamp=1632822735358&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ffastq%2Fdownload%2Ffastq-1.13.0.tgz}
-    dependencies:
-      reusify: 1.0.4
-    dev: true
-
-  /fd-slicer/1.1.0:
-    resolution: {integrity: sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=, tarball: fd-slicer/download/fd-slicer-1.1.0.tgz}
-    dependencies:
-      pend: 1.2.0
-    dev: true
-
-  /figures/1.7.0:
-    resolution: {integrity: sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=, tarball: figures/download/figures-1.7.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      escape-string-regexp: 1.0.5
-      object-assign: 4.1.1
-    dev: true
-
-  /figures/3.2.0:
-    resolution: {integrity: sha1-YlwYvSk8YE3EqN2y/r8MiDQXRq8=, tarball: figures/download/figures-3.2.0.tgz}
-    engines: {node: '>=8'}
-    dependencies:
-      escape-string-regexp: 1.0.5
-    dev: true
-
-  /file-type/10.11.0:
-    resolution: {integrity: sha1-KWHQnkZ1ufuaPua2npzSP0P9GJA=, tarball: file-type/download/file-type-10.11.0.tgz}
-    engines: {node: '>=6'}
-    dev: true
-
-  /file-type/12.4.2:
-    resolution: {integrity: sha1-o0TqVmSh0BRH7n+xtjX3L+thadk=, tarball: file-type/download/file-type-12.4.2.tgz}
-    engines: {node: '>=8'}
-    dev: true
-
-  /file-type/3.9.0:
-    resolution: {integrity: sha1-JXoHg4TR24CHvESdEH1SpSZyuek=, tarball: file-type/download/file-type-3.9.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /file-type/4.4.0:
-    resolution: {integrity: sha1-G2AOX8ofvcboDApwxxyNul95BsU=, tarball: file-type/download/file-type-4.4.0.tgz}
-    engines: {node: '>=4'}
-    dev: true
-
-  /file-type/5.2.0:
-    resolution: {integrity: sha1-LdvqfHP/42No365J3DOMBYwritY=, tarball: file-type/download/file-type-5.2.0.tgz}
-    engines: {node: '>=4'}
-    dev: true
-
-  /file-type/6.2.0:
-    resolution: {integrity: sha1-5QzXXTVv/tTjBtxPW89Sp5kDqRk=, tarball: file-type/download/file-type-6.2.0.tgz}
-    engines: {node: '>=4'}
-    dev: true
-
-  /file-type/8.1.0:
-    resolution: {integrity: sha1-JE87fvZBu+DMoZbHJ25LMyOZ9ow=, tarball: file-type/download/file-type-8.1.0.tgz}
-    engines: {node: '>=6'}
-    dev: true
-
-  /filelist/1.0.2:
-    resolution: {integrity: sha1-gCAvIUYtTRwuIUEZsYB8G8A4Dls=, tarball: filelist/download/filelist-1.0.2.tgz}
-    dependencies:
-      minimatch: 3.0.4
-    dev: true
-
-  /filename-reserved-regex/2.0.0:
-    resolution: {integrity: sha1-q/c9+rc10EVECr/qLZHzieu/oik=, tarball: filename-reserved-regex/download/filename-reserved-regex-2.0.0.tgz}
-    engines: {node: '>=4'}
-    dev: true
-
-  /filenamify/2.1.0:
-    resolution: {integrity: sha1-iPr0lfsbR6v9YSMAACoWIoxnfuk=, tarball: filenamify/download/filenamify-2.1.0.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      filename-reserved-regex: 2.0.0
-      strip-outer: 1.0.1
-      trim-repeated: 1.0.0
-    dev: true
-
-  /fill-range/4.0.0:
-    resolution: {integrity: sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=, tarball: fill-range/download/fill-range-4.0.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      extend-shallow: 2.0.1
-      is-number: 3.0.0
-      repeat-string: 1.6.1
-      to-regex-range: 2.1.1
-    dev: true
-
-  /fill-range/7.0.1:
-    resolution: {integrity: sha1-GRmmp8df44ssfHflGYU12prN2kA=, tarball: fill-range/download/fill-range-7.0.1.tgz}
-    engines: {node: '>=8'}
-    dependencies:
-      to-regex-range: 5.0.1
-    dev: true
-
-  /finalhandler/1.1.2:
-    resolution: {integrity: sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0=, tarball: finalhandler/download/finalhandler-1.1.2.tgz}
-    engines: {node: '>= 0.8'}
-    dependencies:
-      debug: 2.6.9
-      encodeurl: 1.0.2
-      escape-html: 1.0.3
-      on-finished: 2.3.0
-      parseurl: 1.3.3
-      statuses: 1.5.0
-      unpipe: 1.0.0
-    dev: true
-
-  /find-up/1.1.2:
-    resolution: {integrity: sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=, tarball: find-up/download/find-up-1.1.2.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      path-exists: 2.1.0
-      pinkie-promise: 2.0.1
-    dev: true
-
-  /find-up/4.1.0:
-    resolution: {integrity: sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=, tarball: find-up/download/find-up-4.1.0.tgz}
-    engines: {node: '>=8'}
-    dependencies:
-      locate-path: 5.0.0
-      path-exists: 4.0.0
-    dev: false
-
-  /find-versions/3.2.0:
-    resolution: {integrity: sha1-ECl/mAMKeGgpaBaQVF72We0dJU4=, tarball: find-versions/download/find-versions-3.2.0.tgz}
-    engines: {node: '>=6'}
-    dependencies:
-      semver-regex: 2.0.0
-    dev: true
-
-  /follow-redirects/1.14.6:
-    resolution: {integrity: sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==, tarball: follow-redirects/download/follow-redirects-1.14.6.tgz}
-    engines: {node: '>=4.0'}
-    peerDependencies:
-      debug: '*'
-    peerDependenciesMeta:
-      debug:
-        optional: true
-
-  /for-in/1.0.2:
-    resolution: {integrity: sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=, tarball: for-in/download/for-in-1.0.2.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /fragment-cache/0.2.1:
-    resolution: {integrity: sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=, tarball: fragment-cache/download/fragment-cache-0.2.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      map-cache: 0.2.2
-    dev: true
-
-  /from2/2.3.0:
-    resolution: {integrity: sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=, tarball: from2/download/from2-2.3.0.tgz}
-    dependencies:
-      inherits: 2.0.4
-      readable-stream: 2.3.7
-    dev: true
-
-  /fs-constants/1.0.0:
-    resolution: {integrity: sha1-a+Dem+mYzhavivwkSXue6bfM2a0=, tarball: fs-constants/download/fs-constants-1.0.0.tgz}
-    dev: true
-
-  /fs-extra/10.0.0:
-    resolution: {integrity: sha1-n/YbZV3eU/s0qC34S7IUzoAuF8E=, tarball: fs-extra/download/fs-extra-10.0.0.tgz?cache=0&sync_timestamp=1632822706452&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ffs-extra%2Fdownload%2Ffs-extra-10.0.0.tgz}
-    engines: {node: '>=12'}
-    dependencies:
-      graceful-fs: 4.2.8
-      jsonfile: 6.1.0
-      universalify: 2.0.0
-    dev: true
-
-  /fs-extra/9.1.0:
-    resolution: {integrity: sha1-WVRGDHZKjaIJS6NVS/g55rmnyG0=, tarball: fs-extra/download/fs-extra-9.1.0.tgz?cache=0&sync_timestamp=1632822706452&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Ffs-extra%2Fdownload%2Ffs-extra-9.1.0.tgz}
-    engines: {node: '>=10'}
-    dependencies:
-      at-least-node: 1.0.0
-      graceful-fs: 4.2.8
-      jsonfile: 6.1.0
-      universalify: 2.0.0
-    dev: true
-
-  /fs.realpath/1.0.0:
-    resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=, tarball: fs.realpath/download/fs.realpath-1.0.0.tgz}
-    dev: true
-
-  /fsevents/2.3.2:
-    resolution: {integrity: sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro=, tarball: fsevents/download/fsevents-2.3.2.tgz}
-    engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /function-bind/1.1.1:
-    resolution: {integrity: sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=, tarball: function-bind/download/function-bind-1.1.1.tgz}
-
-  /gensync/1.0.0-beta.2:
-    resolution: {integrity: sha1-MqbudsPX9S1GsrGuXZP+qFgKJeA=, tarball: gensync/download/gensync-1.0.0-beta.2.tgz}
-    engines: {node: '>=6.9.0'}
-    dev: true
-
-  /get-caller-file/2.0.5:
-    resolution: {integrity: sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=, tarball: get-caller-file/download/get-caller-file-2.0.5.tgz}
-    engines: {node: 6.* || 8.* || >= 10.*}
-
-  /get-intrinsic/1.1.1:
-    resolution: {integrity: sha1-FfWfN2+FXERpY5SPDSTNNje0q8Y=, tarball: get-intrinsic/download/get-intrinsic-1.1.1.tgz}
-    dependencies:
-      function-bind: 1.1.1
-      has: 1.0.3
-      has-symbols: 1.0.2
-
-  /get-own-enumerable-property-symbols/3.0.2:
-    resolution: {integrity: sha1-tf3nfyLL4185C04ImSLFC85u9mQ=, tarball: get-own-enumerable-property-symbols/download/get-own-enumerable-property-symbols-3.0.2.tgz}
-    dev: true
-
-  /get-proxy/2.1.0:
-    resolution: {integrity: sha1-NJ8rTZHUTE1NTpy6KtkBQ/rF75M=, tarball: get-proxy/download/get-proxy-2.1.0.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      npm-conf: 1.1.3
-    dev: true
-
-  /get-stdin/4.0.1:
-    resolution: {integrity: sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=, tarball: get-stdin/download/get-stdin-4.0.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /get-stream/2.3.1:
-    resolution: {integrity: sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=, tarball: get-stream/download/get-stream-2.3.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      object-assign: 4.1.1
-      pinkie-promise: 2.0.1
-    dev: true
-
-  /get-stream/3.0.0:
-    resolution: {integrity: sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=, tarball: get-stream/download/get-stream-3.0.0.tgz}
-    engines: {node: '>=4'}
-    dev: true
-
-  /get-stream/4.1.0:
-    resolution: {integrity: sha1-wbJVV189wh1Zv8ec09K0axw6VLU=, tarball: get-stream/download/get-stream-4.1.0.tgz}
-    engines: {node: '>=6'}
-    dependencies:
-      pump: 3.0.0
-    dev: true
-
-  /get-stream/5.2.0:
-    resolution: {integrity: sha1-SWaheV7lrOZecGxLe+txJX1uItM=, tarball: get-stream/download/get-stream-5.2.0.tgz}
-    engines: {node: '>=8'}
-    dependencies:
-      pump: 3.0.0
-    dev: true
-
-  /get-stream/6.0.1:
-    resolution: {integrity: sha1-omLY7vZ6ztV8KFKtYWdSakPL97c=, tarball: get-stream/download/get-stream-6.0.1.tgz}
-    engines: {node: '>=10'}
-    dev: true
-
-  /get-symbol-description/1.0.0:
-    resolution: {integrity: sha1-f9uByQAQH71WTdXxowr1qtweWNY=, tarball: get-symbol-description/download/get-symbol-description-1.0.0.tgz}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      call-bind: 1.0.2
-      get-intrinsic: 1.1.1
-    dev: true
-
-  /get-value/2.0.6:
-    resolution: {integrity: sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=, tarball: get-value/download/get-value-2.0.6.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /gifsicle/5.2.1:
-    resolution: {integrity: sha1-762rJmpJPvC0F440WXSTNJk3Np4=, tarball: gifsicle/download/gifsicle-5.2.1.tgz}
-    engines: {node: '>=10'}
-    hasBin: true
-    requiresBuild: true
-    dependencies:
-      bin-build: 3.0.0
-      bin-wrapper: /bin-wrapper-china/0.1.0
-      execa: 5.1.1
-    dev: true
-
-  /glob-parent/5.1.2:
-    resolution: {integrity: sha1-hpgyxYA0/mikCTwX3BXoNA2EAcQ=, tarball: glob-parent/download/glob-parent-5.1.2.tgz}
-    engines: {node: '>= 6'}
-    dependencies:
-      is-glob: 4.0.3
-    dev: true
-
-  /glob/7.2.0:
-    resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==, tarball: glob/download/glob-7.2.0.tgz}
-    dependencies:
-      fs.realpath: 1.0.0
-      inflight: 1.0.6
-      inherits: 2.0.4
-      minimatch: 3.0.4
-      once: 1.4.0
-      path-is-absolute: 1.0.1
-    dev: true
-
-  /globals/11.12.0:
-    resolution: {integrity: sha1-q4eVM4hooLq9hSV1gBjCp+uVxC4=, tarball: globals/download/globals-11.12.0.tgz}
-    engines: {node: '>=4'}
-    dev: true
-
-  /globby/10.0.2:
-    resolution: {integrity: sha1-J3WT50WsqkZGw6tBEonsR6A5JUM=, tarball: globby/download/globby-10.0.2.tgz}
-    engines: {node: '>=8'}
-    dependencies:
-      '@types/glob': 7.2.0
-      array-union: 2.1.0
-      dir-glob: 3.0.1
-      fast-glob: 3.2.7
-      glob: 7.2.0
-      ignore: 5.2.0
-      merge2: 1.4.1
-      slash: 3.0.0
-    dev: true
-
-  /got/7.1.0:
-    resolution: {integrity: sha1-BUUP2ECU5rvqVvRRpDqcKJFmOFo=, tarball: got/download/got-7.1.0.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      decompress-response: 3.3.0
-      duplexer3: 0.1.4
-      get-stream: 3.0.0
-      is-plain-obj: 1.1.0
-      is-retry-allowed: 1.2.0
-      is-stream: 1.1.0
-      isurl: 1.0.0
-      lowercase-keys: 1.0.1
-      p-cancelable: 0.3.0
-      p-timeout: 1.2.1
-      safe-buffer: 5.2.1
-      timed-out: 4.0.1
-      url-parse-lax: 1.0.0
-      url-to-options: 1.0.1
-    dev: true
-
-  /got/8.3.2:
-    resolution: {integrity: sha1-HSP2Q5Dpf3dsrFLluTbl9RTS6Tc=, tarball: got/download/got-8.3.2.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      '@sindresorhus/is': 0.7.0
-      cacheable-request: 2.1.4
-      decompress-response: 3.3.0
-      duplexer3: 0.1.4
-      get-stream: 3.0.0
-      into-stream: 3.1.0
-      is-retry-allowed: 1.2.0
-      isurl: 1.0.0
-      lowercase-keys: 1.0.1
-      mimic-response: 1.0.1
-      p-cancelable: 0.4.1
-      p-timeout: 2.0.1
-      pify: 3.0.0
-      safe-buffer: 5.2.1
-      timed-out: 4.0.1
-      url-parse-lax: 3.0.0
-      url-to-options: 1.0.1
-    dev: true
-
-  /graceful-fs/4.2.8:
-    resolution: {integrity: sha1-5BK40z9eAGWTy9PO5t+fLOu+gCo=, tarball: graceful-fs/download/graceful-fs-4.2.8.tgz}
-    dev: true
-
-  /has-ansi/2.0.0:
-    resolution: {integrity: sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=, tarball: has-ansi/download/has-ansi-2.0.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      ansi-regex: 2.1.1
-    dev: true
-
-  /has-bigints/1.0.1:
-    resolution: {integrity: sha1-ZP5qywIGc+O3jbA1pa9pqp0HsRM=, tarball: has-bigints/download/has-bigints-1.0.1.tgz}
-    dev: true
-
-  /has-flag/1.0.0:
-    resolution: {integrity: sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=, tarball: has-flag/download/has-flag-1.0.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /has-flag/3.0.0:
-    resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=, tarball: has-flag/download/has-flag-3.0.0.tgz}
-    engines: {node: '>=4'}
-    dev: true
-
-  /has-flag/4.0.0:
-    resolution: {integrity: sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=, tarball: has-flag/download/has-flag-4.0.0.tgz}
-    engines: {node: '>=8'}
-    dev: true
-
-  /has-symbol-support-x/1.4.2:
-    resolution: {integrity: sha1-FAn5i8ACR9pF2mfO4KNvKC/yZFU=, tarball: has-symbol-support-x/download/has-symbol-support-x-1.4.2.tgz}
-    dev: true
-
-  /has-symbols/1.0.2:
-    resolution: {integrity: sha1-Fl0wcMADCXUqEjakeTMeOsVvFCM=, tarball: has-symbols/download/has-symbols-1.0.2.tgz}
-    engines: {node: '>= 0.4'}
-
-  /has-to-string-tag-x/1.4.1:
-    resolution: {integrity: sha1-oEWrOD17SyASoAFIqwql8pAETU0=, tarball: has-to-string-tag-x/download/has-to-string-tag-x-1.4.1.tgz}
-    dependencies:
-      has-symbol-support-x: 1.4.2
-    dev: true
-
-  /has-tostringtag/1.0.0:
-    resolution: {integrity: sha1-fhM4GKfTlHNPlB5zw9P5KR5liyU=, tarball: has-tostringtag/download/has-tostringtag-1.0.0.tgz}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      has-symbols: 1.0.2
-    dev: true
-
-  /has-value/0.3.1:
-    resolution: {integrity: sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=, tarball: has-value/download/has-value-0.3.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      get-value: 2.0.6
-      has-values: 0.1.4
-      isobject: 2.1.0
-    dev: true
-
-  /has-value/1.0.0:
-    resolution: {integrity: sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=, tarball: has-value/download/has-value-1.0.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      get-value: 2.0.6
-      has-values: 1.0.0
-      isobject: 3.0.1
-    dev: true
-
-  /has-values/0.1.4:
-    resolution: {integrity: sha1-bWHeldkd/Km5oCCJrThL/49it3E=, tarball: has-values/download/has-values-0.1.4.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /has-values/1.0.0:
-    resolution: {integrity: sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=, tarball: has-values/download/has-values-1.0.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      is-number: 3.0.0
-      kind-of: 4.0.0
-    dev: true
-
-  /has/1.0.3:
-    resolution: {integrity: sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=, tarball: has/download/has-1.0.3.tgz}
-    engines: {node: '>= 0.4.0'}
-    dependencies:
-      function-bind: 1.1.1
-
-  /hash-sum/2.0.0:
-    resolution: {integrity: sha1-gdAbtd6OpKIUrV1urRtSNGCwtFo=, tarball: hash-sum/download/hash-sum-2.0.0.tgz}
-    dev: true
-
-  /he/1.2.0:
-    resolution: {integrity: sha1-hK5l+n6vsWX922FWauFLrwVmTw8=, tarball: he/download/he-1.2.0.tgz?cache=0&sync_timestamp=1632822734781&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fhe%2Fdownload%2Fhe-1.2.0.tgz}
-    hasBin: true
-    dev: true
-
-  /header-case/2.0.4:
-    resolution: {integrity: sha1-WkLmO1UXc0nPQFvrjXdayruSwGM=, tarball: header-case/download/header-case-2.0.4.tgz}
-    dependencies:
-      capital-case: 1.0.4
-      tslib: 2.3.1
-    dev: true
-
-  /hosted-git-info/2.8.9:
-    resolution: {integrity: sha1-3/wL+aIcAiCQkPKqaUKeFBTa8/k=, tarball: hosted-git-info/download/hosted-git-info-2.8.9.tgz}
-    dev: true
-
-  /html-minifier-terser/5.1.1:
-    resolution: {integrity: sha1-ki6W8fO7YIMsJjS3mIQJY4mx8FQ=, tarball: html-minifier-terser/download/html-minifier-terser-5.1.1.tgz}
-    engines: {node: '>=6'}
-    hasBin: true
-    dependencies:
-      camel-case: 4.1.2
-      clean-css: 4.2.4
-      commander: 4.1.1
-      he: 1.2.0
-      param-case: 3.0.4
-      relateurl: 0.2.7
-      terser: 4.8.0
-    dev: true
-
-  /html-tags/3.1.0:
-    resolution: {integrity: sha1-e15vfmZen7QfMAB+2eDUHpf7IUA=, tarball: html-tags/download/html-tags-3.1.0.tgz}
-    engines: {node: '>=8'}
-    dev: true
-
-  /htmlparser2/3.10.1:
-    resolution: {integrity: sha1-vWedw/WYl7ajS7EHSchVu1OpOS8=, tarball: htmlparser2/download/htmlparser2-3.10.1.tgz?cache=0&sync_timestamp=1636640925909&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fhtmlparser2%2Fdownload%2Fhtmlparser2-3.10.1.tgz}
-    dependencies:
-      domelementtype: 1.3.1
-      domhandler: 2.4.2
-      domutils: 1.7.0
-      entities: 1.1.2
-      inherits: 2.0.4
-      readable-stream: 3.6.0
-    dev: true
-
-  /http-cache-semantics/3.8.1:
-    resolution: {integrity: sha1-ObDhat2bYFvwqe89nar0hDtMrNI=, tarball: http-cache-semantics/download/http-cache-semantics-3.8.1.tgz}
-    dev: true
-
-  /human-signals/1.1.1:
-    resolution: {integrity: sha1-xbHNFPUK6uCatsWf5jujOV/k36M=, tarball: human-signals/download/human-signals-1.1.1.tgz}
-    engines: {node: '>=8.12.0'}
-    dev: true
-
-  /human-signals/2.1.0:
-    resolution: {integrity: sha1-3JH8ukLk0G5Kuu0zs+ejwC9RTqA=, tarball: human-signals/download/human-signals-2.1.0.tgz}
-    engines: {node: '>=10.17.0'}
-    dev: true
-
-  /iconv-lite/0.4.24:
-    resolution: {integrity: sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=, tarball: iconv-lite/download/iconv-lite-0.4.24.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      safer-buffer: 2.1.2
-    dev: true
-
-  /idb/6.1.5:
-    resolution: {integrity: sha1-28U+et8ax8Wfmyv1bgC06k/OjHs=, tarball: idb/download/idb-6.1.5.tgz}
-    dev: true
-
-  /ieee754/1.2.1:
-    resolution: {integrity: sha1-jrehCmP/8l0VpXsAFYbRd9Gw01I=, tarball: ieee754/download/ieee754-1.2.1.tgz}
-    dev: true
-
-  /ignore/5.2.0:
-    resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==, tarball: ignore/download/ignore-5.2.0.tgz}
-    engines: {node: '>= 4'}
-    dev: true
-
-  /image-size/0.5.5:
-    resolution: {integrity: sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=, tarball: image-size/download/image-size-0.5.5.tgz}
-    engines: {node: '>=0.10.0'}
-    hasBin: true
-    dev: true
-
-  /imagemin-gifsicle/7.0.0:
-    resolution: {integrity: sha1-GnqxNqFExGeGV7o7bEEvgIBdJrA=, tarball: imagemin-gifsicle/download/imagemin-gifsicle-7.0.0.tgz}
-    engines: {node: '>=10'}
-    dependencies:
-      execa: 1.0.0
-      gifsicle: 5.2.1
-      is-gif: 3.0.0
-    dev: true
-
-  /imagemin-jpegtran/7.0.0:
-    resolution: {integrity: sha1-dyj4SHY2LUibmhZW4MyOIAlAbm8=, tarball: imagemin-jpegtran/download/imagemin-jpegtran-7.0.0.tgz}
-    engines: {node: '>=10'}
-    dependencies:
-      exec-buffer: 3.2.0
-      is-jpg: 2.0.0
-      jpegtran-bin: 5.0.2
-    dev: true
-
-  /imagemin-mozjpeg/9.0.0:
-    resolution: {integrity: sha1-0a8m0LQ9daQcIRBRwZENpZ2dIyQ=, tarball: imagemin-mozjpeg/download/imagemin-mozjpeg-9.0.0.tgz}
-    engines: {node: '>=10'}
-    dependencies:
-      execa: 4.1.0
-      is-jpg: 2.0.0
-      mozjpeg: 7.1.1
-    dev: true
-
-  /imagemin-optipng/8.0.0:
-    resolution: {integrity: sha1-uI5c9tolzIR54HzfOMOuBHnffvI=, tarball: imagemin-optipng/download/imagemin-optipng-8.0.0.tgz}
-    engines: {node: '>=10'}
-    dependencies:
-      exec-buffer: 3.2.0
-      is-png: 2.0.0
-      optipng-bin: 7.0.1
-    dev: true
-
-  /imagemin-pngquant/9.0.2:
-    resolution: {integrity: sha1-OBVXArDMT2D2cbp8Kwhuo4BdlWc=, tarball: imagemin-pngquant/download/imagemin-pngquant-9.0.2.tgz}
-    engines: {node: '>=10'}
-    dependencies:
-      execa: 4.1.0
-      is-png: 2.0.0
-      is-stream: 2.0.1
-      ow: 0.17.0
-      pngquant-bin: 6.0.1
-    dev: true
-
-  /imagemin-svgo/9.0.0:
-    resolution: {integrity: sha1-dJNwgEYIkXpn1P9ZDweod1auwAY=, tarball: imagemin-svgo/download/imagemin-svgo-9.0.0.tgz}
-    engines: {node: '>=10'}
-    dependencies:
-      is-svg: 4.3.2
-      svgo: 2.8.0
-    dev: true
-
-  /imagemin-webp/6.0.0:
-    resolution: {integrity: sha1-uy13urgY/WEz35Z1MmSXuHfnvk0=, tarball: imagemin-webp/download/imagemin-webp-6.0.0.tgz}
-    engines: {node: '>=10'}
-    dependencies:
-      cwebp-bin: 5.1.0
-      exec-buffer: 3.2.0
-      is-cwebp-readable: 3.0.0
-    dev: true
-
-  /imagemin/7.0.1:
-    resolution: {integrity: sha1-9kQcpkcZdjLiPbfZcf/71TDIfb8=, tarball: imagemin/download/imagemin-7.0.1.tgz}
-    engines: {node: '>=8'}
-    dependencies:
-      file-type: 12.4.2
-      globby: 10.0.2
-      graceful-fs: 4.2.8
-      junk: 3.1.0
-      make-dir: 3.1.0
-      p-pipe: 3.1.0
-      replace-ext: 1.0.1
-    dev: true
-
-  /import-lazy/4.0.0:
-    resolution: {integrity: sha1-6OtidIOgpD2jwD8+NVSL5csMwVM=, tarball: import-lazy/download/import-lazy-4.0.0.tgz}
-    engines: {node: '>=8'}
-    dev: true
-
-  /indent-string/2.1.0:
-    resolution: {integrity: sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=, tarball: indent-string/download/indent-string-2.1.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      repeating: 2.0.1
-    dev: true
-
-  /inflight/1.0.6:
-    resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=, tarball: inflight/download/inflight-1.0.6.tgz}
-    dependencies:
-      once: 1.4.0
-      wrappy: 1.0.2
-    dev: true
-
-  /inherits/2.0.4:
-    resolution: {integrity: sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=, tarball: inherits/download/inherits-2.0.4.tgz}
-    dev: true
-
-  /ini/1.3.8:
-    resolution: {integrity: sha1-op2kJbSIBvNHZ6Tvzjlyaa8oQyw=, tarball: ini/download/ini-1.3.8.tgz}
-    dev: true
-
-  /inquirer/8.2.0:
-    resolution: {integrity: sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==, tarball: inquirer/download/inquirer-8.2.0.tgz}
-    engines: {node: '>=8.0.0'}
-    dependencies:
-      ansi-escapes: 4.3.2
-      chalk: 4.1.2
-      cli-cursor: 3.1.0
-      cli-width: 3.0.0
-      external-editor: 3.1.0
-      figures: 3.2.0
-      lodash: 4.17.21
-      mute-stream: 0.0.8
-      ora: 5.4.1
-      run-async: 2.4.1
-      rxjs: 7.4.0
-      string-width: 4.2.3
-      strip-ansi: 6.0.1
-      through: 2.3.8
-    dev: true
-
-  /internal-slot/1.0.3:
-    resolution: {integrity: sha1-c0fjB97uovqsKsYgXUvH00ln9Zw=, tarball: internal-slot/download/internal-slot-1.0.3.tgz}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      get-intrinsic: 1.1.1
-      has: 1.0.3
-      side-channel: 1.0.4
-    dev: true
-
-  /into-stream/3.1.0:
-    resolution: {integrity: sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=, tarball: into-stream/download/into-stream-3.1.0.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      from2: 2.3.0
-      p-is-promise: 1.1.0
-    dev: true
-
-  /is-accessor-descriptor/0.1.6:
-    resolution: {integrity: sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=, tarball: is-accessor-descriptor/download/is-accessor-descriptor-0.1.6.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      kind-of: 3.2.2
-    dev: true
-
-  /is-accessor-descriptor/1.0.0:
-    resolution: {integrity: sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=, tarball: is-accessor-descriptor/download/is-accessor-descriptor-1.0.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      kind-of: 6.0.3
-    dev: true
-
-  /is-arrayish/0.2.1:
-    resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=, tarball: is-arrayish/download/is-arrayish-0.2.1.tgz}
-    dev: true
-
-  /is-bigint/1.0.4:
-    resolution: {integrity: sha1-CBR6GHW8KzIAXUHM2Ckd/8ZpHfM=, tarball: is-bigint/download/is-bigint-1.0.4.tgz}
-    dependencies:
-      has-bigints: 1.0.1
-    dev: true
-
-  /is-binary-path/2.1.0:
-    resolution: {integrity: sha1-6h9/O4DwZCNug0cPhsCcJU+0Wwk=, tarball: is-binary-path/download/is-binary-path-2.1.0.tgz}
-    engines: {node: '>=8'}
-    dependencies:
-      binary-extensions: 2.2.0
-    dev: true
-
-  /is-boolean-object/1.1.2:
-    resolution: {integrity: sha1-XG3CACRt2TIa5LiFoRS7H3X2Nxk=, tarball: is-boolean-object/download/is-boolean-object-1.1.2.tgz}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      call-bind: 1.0.2
-      has-tostringtag: 1.0.0
-    dev: true
-
-  /is-buffer/1.1.6:
-    resolution: {integrity: sha1-76ouqdqg16suoTqXsritUf776L4=, tarball: is-buffer/download/is-buffer-1.1.6.tgz}
-    dev: true
-
-  /is-callable/1.2.4:
-    resolution: {integrity: sha1-RzAdWN0CWUB4ZVR4U99tYf5HGUU=, tarball: is-callable/download/is-callable-1.2.4.tgz}
-    engines: {node: '>= 0.4'}
-    dev: true
-
-  /is-core-module/2.8.0:
-    resolution: {integrity: sha1-AyEzbD0JJeSX/Zf12VyxFKXM1Ug=, tarball: is-core-module/download/is-core-module-2.8.0.tgz}
-    dependencies:
-      has: 1.0.3
-    dev: true
-
-  /is-cwebp-readable/3.0.0:
-    resolution: {integrity: sha1-BVSqpACXei/E3jZtjAJE8TzeWMs=, tarball: is-cwebp-readable/download/is-cwebp-readable-3.0.0.tgz}
-    dependencies:
-      file-type: 10.11.0
-    dev: true
-
-  /is-data-descriptor/0.1.4:
-    resolution: {integrity: sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=, tarball: is-data-descriptor/download/is-data-descriptor-0.1.4.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      kind-of: 3.2.2
-    dev: true
-
-  /is-data-descriptor/1.0.0:
-    resolution: {integrity: sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=, tarball: is-data-descriptor/download/is-data-descriptor-1.0.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      kind-of: 6.0.3
-    dev: true
-
-  /is-date-object/1.0.5:
-    resolution: {integrity: sha1-CEHVU25yTCVZe/bqYuG9OCmN8x8=, tarball: is-date-object/download/is-date-object-1.0.5.tgz}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      has-tostringtag: 1.0.0
-    dev: true
-
-  /is-descriptor/0.1.6:
-    resolution: {integrity: sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=, tarball: is-descriptor/download/is-descriptor-0.1.6.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      is-accessor-descriptor: 0.1.6
-      is-data-descriptor: 0.1.4
-      kind-of: 5.1.0
-    dev: true
-
-  /is-descriptor/1.0.2:
-    resolution: {integrity: sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=, tarball: is-descriptor/download/is-descriptor-1.0.2.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      is-accessor-descriptor: 1.0.0
-      is-data-descriptor: 1.0.0
-      kind-of: 6.0.3
-    dev: true
-
-  /is-docker/2.2.1:
-    resolution: {integrity: sha1-M+6r4jz+hvFL3kQIoCwM+4U6zao=, tarball: is-docker/download/is-docker-2.2.1.tgz}
-    engines: {node: '>=8'}
-    hasBin: true
-    dev: true
-
-  /is-extendable/0.1.1:
-    resolution: {integrity: sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=, tarball: is-extendable/download/is-extendable-0.1.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /is-extendable/1.0.1:
-    resolution: {integrity: sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=, tarball: is-extendable/download/is-extendable-1.0.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      is-plain-object: 2.0.4
-    dev: true
-
-  /is-extglob/2.1.1:
-    resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=, tarball: is-extglob/download/is-extglob-2.1.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /is-finite/1.1.0:
-    resolution: {integrity: sha1-kEE1x3+0LAZB1qobzbxNqo2ggvM=, tarball: is-finite/download/is-finite-1.1.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /is-fullwidth-code-point/3.0.0:
-    resolution: {integrity: sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=, tarball: is-fullwidth-code-point/download/is-fullwidth-code-point-3.0.0.tgz}
-    engines: {node: '>=8'}
-
-  /is-gif/3.0.0:
-    resolution: {integrity: sha1-xL5gsmowHWlbuDOyDZtdZsbPg7E=, tarball: is-gif/download/is-gif-3.0.0.tgz}
-    engines: {node: '>=6'}
-    dependencies:
-      file-type: 10.11.0
-    dev: true
-
-  /is-glob/4.0.3:
-    resolution: {integrity: sha1-ZPYeQsu7LuwgcanawLKLoeZdUIQ=, tarball: is-glob/download/is-glob-4.0.3.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      is-extglob: 2.1.1
-    dev: true
-
-  /is-interactive/1.0.0:
-    resolution: {integrity: sha1-zqbmrlyHCnsKAAQHC3tYfgJSkS4=, tarball: is-interactive/download/is-interactive-1.0.0.tgz}
-    engines: {node: '>=8'}
-    dev: true
-
-  /is-jpg/2.0.0:
-    resolution: {integrity: sha1-LhmX+m6RZuqsAkLarkQ0A+TvHZc=, tarball: is-jpg/download/is-jpg-2.0.0.tgz}
-    engines: {node: '>=6'}
-    dev: true
-
-  /is-module/1.0.0:
-    resolution: {integrity: sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=, tarball: is-module/download/is-module-1.0.0.tgz}
-    dev: true
-
-  /is-natural-number/4.0.1:
-    resolution: {integrity: sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=, tarball: is-natural-number/download/is-natural-number-4.0.1.tgz}
-    dev: true
-
-  /is-negative-zero/2.0.2:
-    resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==, tarball: is-negative-zero/download/is-negative-zero-2.0.2.tgz}
-    engines: {node: '>= 0.4'}
-    dev: true
-
-  /is-number-object/1.0.6:
-    resolution: {integrity: sha1-anqvg4x/BoalC0VT9+VKlklOifA=, tarball: is-number-object/download/is-number-object-1.0.6.tgz}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      has-tostringtag: 1.0.0
-    dev: true
-
-  /is-number/3.0.0:
-    resolution: {integrity: sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=, tarball: is-number/download/is-number-3.0.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      kind-of: 3.2.2
-    dev: true
-
-  /is-number/7.0.0:
-    resolution: {integrity: sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=, tarball: is-number/download/is-number-7.0.0.tgz}
-    engines: {node: '>=0.12.0'}
-    dev: true
-
-  /is-obj/1.0.1:
-    resolution: {integrity: sha1-PkcprB9f3gJc19g6iW2rn09n2w8=, tarball: is-obj/download/is-obj-1.0.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /is-object/1.0.2:
-    resolution: {integrity: sha1-pWVS4cZlyelQtKAlRh2ofnL4b88=, tarball: is-object/download/is-object-1.0.2.tgz}
-    dev: true
-
-  /is-plain-obj/1.1.0:
-    resolution: {integrity: sha1-caUMhCnfync8kqOQpKA7OfzVHT4=, tarball: is-plain-obj/download/is-plain-obj-1.1.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /is-plain-object/2.0.4:
-    resolution: {integrity: sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=, tarball: is-plain-object/download/is-plain-object-2.0.4.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      isobject: 3.0.1
-    dev: true
-
-  /is-plain-object/3.0.1:
-    resolution: {integrity: sha1-Zi2S0kwKpDAkB7DUXSHyJRyF+Fs=, tarball: is-plain-object/download/is-plain-object-3.0.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: false
-
-  /is-plain-object/5.0.0:
-    resolution: {integrity: sha1-RCf1CrNCnpAl6n1S6QQ6nvQVk0Q=, tarball: is-plain-object/download/is-plain-object-5.0.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: false
-
-  /is-png/2.0.0:
-    resolution: {integrity: sha1-7oy8npsFBCXO3utKb7dKZJsKSo0=, tarball: is-png/download/is-png-2.0.0.tgz}
-    engines: {node: '>=8'}
-    dev: true
-
-  /is-regex/1.1.4:
-    resolution: {integrity: sha1-7vVmPNWfpMCuM5UFMj32hUuxWVg=, tarball: is-regex/download/is-regex-1.1.4.tgz}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      call-bind: 1.0.2
-      has-tostringtag: 1.0.0
-    dev: true
-
-  /is-regexp/1.0.0:
-    resolution: {integrity: sha1-/S2INUXEa6xaYz57mgnof6LLUGk=, tarball: is-regexp/download/is-regexp-1.0.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /is-retry-allowed/1.2.0:
-    resolution: {integrity: sha1-13hIi9CkZmo76KFIK58rqv7eqLQ=, tarball: is-retry-allowed/download/is-retry-allowed-1.2.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /is-shared-array-buffer/1.0.1:
-    resolution: {integrity: sha1-l7DIX72stZycRG/mU7gs8rW3z+Y=, tarball: is-shared-array-buffer/download/is-shared-array-buffer-1.0.1.tgz}
-    dev: true
-
-  /is-stream/1.1.0:
-    resolution: {integrity: sha1-EtSj3U5o4Lec6428hBc66A2RykQ=, tarball: is-stream/download/is-stream-1.1.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /is-stream/2.0.1:
-    resolution: {integrity: sha1-+sHj1TuXrVqdCunO8jifWBClwHc=, tarball: is-stream/download/is-stream-2.0.1.tgz}
-    engines: {node: '>=8'}
-    dev: true
-
-  /is-string/1.0.7:
-    resolution: {integrity: sha1-DdEr8gBvJVu1j2lREO/3SR7rwP0=, tarball: is-string/download/is-string-1.0.7.tgz}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      has-tostringtag: 1.0.0
-    dev: true
-
-  /is-svg/4.3.2:
-    resolution: {integrity: sha512-mM90duy00JGMyjqIVHu9gNTjywdZV+8qNasX8cm/EEYZ53PHDgajvbBwNVvty5dwSAxLUD3p3bdo+7sR/UMrpw==, tarball: is-svg/download/is-svg-4.3.2.tgz}
-    engines: {node: '>=6'}
-    dependencies:
-      fast-xml-parser: 3.21.1
-    dev: true
-
-  /is-symbol/1.0.4:
-    resolution: {integrity: sha1-ptrJO2NbBjymhyI23oiRClevE5w=, tarball: is-symbol/download/is-symbol-1.0.4.tgz}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      has-symbols: 1.0.2
-    dev: true
-
-  /is-unicode-supported/0.1.0:
-    resolution: {integrity: sha1-PybHaoCVk7Ur+i7LVxDtJ3m1Iqc=, tarball: is-unicode-supported/download/is-unicode-supported-0.1.0.tgz}
-    engines: {node: '>=10'}
-    dev: true
-
-  /is-utf8/0.2.1:
-    resolution: {integrity: sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=, tarball: is-utf8/download/is-utf8-0.2.1.tgz}
-    dev: true
-
-  /is-weakref/1.0.2:
-    resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==, tarball: is-weakref/download/is-weakref-1.0.2.tgz}
-    dependencies:
-      call-bind: 1.0.2
-    dev: true
-
-  /is-what/3.14.1:
-    resolution: {integrity: sha1-4SIvRt3ahd6tD9HJ3xMXYOd3VcE=, tarball: is-what/download/is-what-3.14.1.tgz}
-    dev: true
-
-  /is-windows/1.0.2:
-    resolution: {integrity: sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=, tarball: is-windows/download/is-windows-1.0.2.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /is-wsl/2.2.0:
-    resolution: {integrity: sha1-dKTHbnfKn9P5MvKQwX6jJs0VcnE=, tarball: is-wsl/download/is-wsl-2.2.0.tgz}
-    engines: {node: '>=8'}
-    dependencies:
-      is-docker: 2.2.1
-    dev: true
-
-  /isarray/1.0.0:
-    resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=, tarball: isarray/download/isarray-1.0.0.tgz}
-    dev: true
-
-  /isexe/2.0.0:
-    resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=, tarball: isexe/download/isexe-2.0.0.tgz}
-    dev: true
-
-  /isobject/2.1.0:
-    resolution: {integrity: sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=, tarball: isobject/download/isobject-2.1.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      isarray: 1.0.0
-    dev: true
-
-  /isobject/3.0.1:
-    resolution: {integrity: sha1-TkMekrEalzFjaqH5yNHMvP2reN8=, tarball: isobject/download/isobject-3.0.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /isurl/1.0.0:
-    resolution: {integrity: sha1-sn9PSfPNqj6kSgpbfzRi5u3DnWc=, tarball: isurl/download/isurl-1.0.0.tgz}
-    engines: {node: '>= 4'}
-    dependencies:
-      has-to-string-tag-x: 1.4.1
-      is-object: 1.0.2
-    dev: true
-
-  /jake/10.8.2:
-    resolution: {integrity: sha1-68nehVgWCmbYLQ6txqLlj7xQCns=, tarball: jake/download/jake-10.8.2.tgz}
-    hasBin: true
-    dependencies:
-      async: 0.9.2
-      chalk: 2.4.2
-      filelist: 1.0.2
-      minimatch: 3.0.4
-    dev: true
-
-  /jest-worker/26.6.2:
-    resolution: {integrity: sha1-f3LLxNZDw2Xie5/XdfnQ6qnHqO0=, tarball: jest-worker/download/jest-worker-26.6.2.tgz}
-    engines: {node: '>= 10.13.0'}
-    dependencies:
-      '@types/node': 16.11.15
-      merge-stream: 2.0.0
-      supports-color: 7.2.0
-    dev: true
-
-  /jiti/1.12.9:
-    resolution: {integrity: sha1-LORbJlz8jckevXClIEgHz5FSkbw=, tarball: jiti/download/jiti-1.12.9.tgz?cache=0&sync_timestamp=1636940166702&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fjiti%2Fdownload%2Fjiti-1.12.9.tgz}
-    hasBin: true
-    dev: true
-
-  /jpegtran-bin/5.0.2:
-    resolution: {integrity: sha1-WHD9fmgxe9IDoclFcr0GrncyysM=, tarball: jpegtran-bin/download/jpegtran-bin-5.0.2.tgz}
-    engines: {node: '>=10'}
-    hasBin: true
-    requiresBuild: true
-    dependencies:
-      bin-build: 3.0.0
-      bin-wrapper: /bin-wrapper-china/0.1.0
-      logalot: 2.1.0
-    dev: true
-
-  /js-base64/2.6.4:
-    resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==, tarball: js-base64/download/js-base64-2.6.4.tgz}
-    dev: true
-
-  /js-tokens/4.0.0:
-    resolution: {integrity: sha1-GSA/tZmR35jjoocFDUZHzerzJJk=, tarball: js-tokens/download/js-tokens-4.0.0.tgz}
-
-  /jsesc/0.5.0:
-    resolution: {integrity: sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=, tarball: jsesc/download/jsesc-0.5.0.tgz}
-    hasBin: true
-    dev: true
-
-  /jsesc/2.5.2:
-    resolution: {integrity: sha1-gFZNLkg9rPbo7yCWUKZ98/DCg6Q=, tarball: jsesc/download/jsesc-2.5.2.tgz}
-    engines: {node: '>=4'}
-    hasBin: true
-    dev: true
-
-  /json-buffer/3.0.0:
-    resolution: {integrity: sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=, tarball: json-buffer/download/json-buffer-3.0.0.tgz}
-    dev: true
-
-  /json-schema-traverse/1.0.0:
-    resolution: {integrity: sha1-rnvLNlard6c7pcSb9lTzjmtoYOI=, tarball: json-schema-traverse/download/json-schema-traverse-1.0.0.tgz}
-    dev: true
-
-  /json-schema/0.4.0:
-    resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==, tarball: json-schema/download/json-schema-0.4.0.tgz?cache=0&sync_timestamp=1636559101924&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fjson-schema%2Fdownload%2Fjson-schema-0.4.0.tgz}
-    dev: true
-
-  /json5/1.0.1:
-    resolution: {integrity: sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=, tarball: json5/download/json5-1.0.1.tgz}
-    hasBin: true
-    dependencies:
-      minimist: 1.2.5
-    dev: true
-
-  /json5/2.2.0:
-    resolution: {integrity: sha1-Lf7+cgxrpSXZ69kJlQ8FFTFsiaM=, tarball: json5/download/json5-2.2.0.tgz}
-    engines: {node: '>=6'}
-    hasBin: true
-    dependencies:
-      minimist: 1.2.5
-    dev: true
-
-  /jsonc-parser/3.0.0:
-    resolution: {integrity: sha1-q914VwHH5+rKip7IzwcMpRp0WiI=, tarball: jsonc-parser/download/jsonc-parser-3.0.0.tgz}
-    dev: true
-
-  /jsonfile/6.1.0:
-    resolution: {integrity: sha1-vFWyY0eTxnnsZAMJTrE2mKbsCq4=, tarball: jsonfile/download/jsonfile-6.1.0.tgz}
-    dependencies:
-      universalify: 2.0.0
-    optionalDependencies:
-      graceful-fs: 4.2.8
-    dev: true
-
-  /jsonpointer/5.0.0:
-    resolution: {integrity: sha512-PNYZIdMjVIvVgDSYKTT63Y+KZ6IZvGRNNWcxwD+GNnUz1MKPfv30J8ueCjdwcN0nDx2SlshgyB7Oy0epAzVRRg==, tarball: jsonpointer/download/jsonpointer-5.0.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /junk/3.1.0:
-    resolution: {integrity: sha1-MUmQmNkCt+mMXZucgPQ0V6iKv6E=, tarball: junk/download/junk-3.1.0.tgz}
-    engines: {node: '>=8'}
-    dev: true
-
-  /keyv/3.0.0:
-    resolution: {integrity: sha1-RJI7o55osSp87H32wyaMAx8u83M=, tarball: keyv/download/keyv-3.0.0.tgz}
-    dependencies:
-      json-buffer: 3.0.0
-    dev: true
-
-  /kind-of/3.2.2:
-    resolution: {integrity: sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=, tarball: kind-of/download/kind-of-3.2.2.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      is-buffer: 1.1.6
-    dev: true
-
-  /kind-of/4.0.0:
-    resolution: {integrity: sha1-IIE989cSkosgc3hpGkUGb65y3Vc=, tarball: kind-of/download/kind-of-4.0.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      is-buffer: 1.1.6
-    dev: true
-
-  /kind-of/5.1.0:
-    resolution: {integrity: sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=, tarball: kind-of/download/kind-of-5.1.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /kind-of/6.0.3:
-    resolution: {integrity: sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=, tarball: kind-of/download/kind-of-6.0.3.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /kolorist/1.5.1:
-    resolution: {integrity: sha512-lxpCM3HTvquGxKGzHeknB/sUjuVoUElLlfYnXZT73K8geR9jQbroGlSCFBax9/0mpGoD3kzcMLnOlGQPJJNyqQ==, tarball: kolorist/download/kolorist-1.5.1.tgz}
-    dev: true
-
-  /less/4.1.2:
-    resolution: {integrity: sha512-EoQp/Et7OSOVu0aJknJOtlXZsnr8XE8KwuzTHOLeVSEx8pVWUICc8Q0VYRHgzyjX78nMEyC/oztWFbgyhtNfDA==, tarball: less/download/less-4.1.2.tgz}
-    engines: {node: '>=6'}
-    hasBin: true
-    dependencies:
-      copy-anything: 2.0.3
-      parse-node-version: 1.0.1
-      tslib: 2.3.1
-    optionalDependencies:
-      errno: 0.1.8
-      graceful-fs: 4.2.8
-      image-size: 0.5.5
-      make-dir: 2.1.0
-      mime: 1.6.0
-      needle: 2.9.1
-      source-map: 0.6.1
-    dev: true
-
-  /leven/3.1.0:
-    resolution: {integrity: sha1-d4kd6DQGTMy6gq54QrtrFKE+1/I=, tarball: leven/download/leven-3.1.0.tgz}
-    engines: {node: '>=6'}
-    dev: true
-
-  /load-json-file/1.1.0:
-    resolution: {integrity: sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=, tarball: load-json-file/download/load-json-file-1.1.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      graceful-fs: 4.2.8
-      parse-json: 2.2.0
-      pify: 2.3.0
-      pinkie-promise: 2.0.1
-      strip-bom: 2.0.0
-    dev: true
-
-  /loader-utils/1.4.0:
-    resolution: {integrity: sha1-xXm140yzSxp07cbB+za/o3HVphM=, tarball: loader-utils/download/loader-utils-1.4.0.tgz}
-    engines: {node: '>=4.0.0'}
-    dependencies:
-      big.js: 5.2.2
-      emojis-list: 3.0.0
-      json5: 1.0.1
-    dev: true
-
-  /locate-path/5.0.0:
-    resolution: {integrity: sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=, tarball: locate-path/download/locate-path-5.0.0.tgz}
-    engines: {node: '>=8'}
-    dependencies:
-      p-locate: 4.1.0
-    dev: false
-
-  /lodash-es/4.17.21:
-    resolution: {integrity: sha1-Q+YmxG5lkbd1C+srUBFzkMYJ4+4=, tarball: lodash-es/download/lodash-es-4.17.21.tgz?cache=0&sync_timestamp=1632822762695&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Flodash-es%2Fdownload%2Flodash-es-4.17.21.tgz}
-    dev: false
-
-  /lodash.debounce/4.0.8:
-    resolution: {integrity: sha1-gteb/zCmfEAF/9XiUVMArZyk168=, tarball: lodash.debounce/download/lodash.debounce-4.0.8.tgz}
-    dev: true
-
-  /lodash.sortby/4.7.0:
-    resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==, tarball: lodash.sortby/download/lodash.sortby-4.7.0.tgz}
-    dev: true
-
-  /lodash/4.17.21:
-    resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, tarball: lodash/download/lodash-4.17.21.tgz}
-
-  /log-symbols/4.1.0:
-    resolution: {integrity: sha1-P727lbRoOsn8eFER55LlWNSr1QM=, tarball: log-symbols/download/log-symbols-4.1.0.tgz}
-    engines: {node: '>=10'}
-    dependencies:
-      chalk: 4.1.2
-      is-unicode-supported: 0.1.0
-    dev: true
-
-  /logalot/2.1.0:
-    resolution: {integrity: sha1-X46MkNME7fElMJUaVVSruMXj9VI=, tarball: logalot/download/logalot-2.1.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      figures: 1.7.0
-      squeak: 1.3.0
-    dev: true
-
-  /longest/1.0.1:
-    resolution: {integrity: sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=, tarball: longest/download/longest-1.0.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /loose-envify/1.4.0:
-    resolution: {integrity: sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8=, tarball: loose-envify/download/loose-envify-1.4.0.tgz?cache=0&sync_timestamp=1632822742309&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Floose-envify%2Fdownload%2Floose-envify-1.4.0.tgz}
-    hasBin: true
-    dependencies:
-      js-tokens: 4.0.0
-    dev: false
-
-  /loud-rejection/1.6.0:
-    resolution: {integrity: sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=, tarball: loud-rejection/download/loud-rejection-1.6.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      currently-unhandled: 0.4.1
-      signal-exit: 3.0.6
-    dev: true
-
-  /lower-case/2.0.2:
-    resolution: {integrity: sha1-b6I3xj29xKgsoP2ILkci3F5jTig=, tarball: lower-case/download/lower-case-2.0.2.tgz}
-    dependencies:
-      tslib: 2.3.1
-    dev: true
-
-  /lowercase-keys/1.0.0:
-    resolution: {integrity: sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=, tarball: lowercase-keys/download/lowercase-keys-1.0.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /lowercase-keys/1.0.1:
-    resolution: {integrity: sha1-b54wtHCE2XGnyCD/FabFFnt0wm8=, tarball: lowercase-keys/download/lowercase-keys-1.0.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /lpad-align/1.1.2:
-    resolution: {integrity: sha1-IfYArBwwlcPG5JfuZyce4ISB/p4=, tarball: lpad-align/download/lpad-align-1.1.2.tgz}
-    engines: {node: '>=0.10.0'}
-    hasBin: true
-    dependencies:
-      get-stdin: 4.0.1
-      indent-string: 2.1.0
-      longest: 1.0.1
-      meow: 3.7.0
-    dev: true
-
-  /lru-cache/4.1.5:
-    resolution: {integrity: sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80=, tarball: lru-cache/download/lru-cache-4.1.5.tgz}
-    dependencies:
-      pseudomap: 1.0.2
-      yallist: 2.1.2
-    dev: true
-
-  /magic-string/0.25.7:
-    resolution: {integrity: sha1-P0l9b9NMZpxnmNy4IfLvMfVEUFE=, tarball: magic-string/download/magic-string-0.25.7.tgz}
-    dependencies:
-      sourcemap-codec: 1.4.8
-
-  /make-dir/1.3.0:
-    resolution: {integrity: sha1-ecEDO4BRW9bSTsmTPoYMp17ifww=, tarball: make-dir/download/make-dir-1.3.0.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      pify: 3.0.0
-    dev: true
-
-  /make-dir/2.1.0:
-    resolution: {integrity: sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU=, tarball: make-dir/download/make-dir-2.1.0.tgz}
-    engines: {node: '>=6'}
-    requiresBuild: true
-    dependencies:
-      pify: 4.0.1
-      semver: 5.7.1
-    dev: true
-    optional: true
-
-  /make-dir/3.1.0:
-    resolution: {integrity: sha1-QV6WcEazp/HRhSd9hKpYIDcmoT8=, tarball: make-dir/download/make-dir-3.1.0.tgz}
-    engines: {node: '>=8'}
-    dependencies:
-      semver: 6.3.0
-    dev: true
-
-  /map-cache/0.2.2:
-    resolution: {integrity: sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=, tarball: map-cache/download/map-cache-0.2.2.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /map-obj/1.0.1:
-    resolution: {integrity: sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=, tarball: map-obj/download/map-obj-1.0.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /map-visit/1.0.0:
-    resolution: {integrity: sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=, tarball: map-visit/download/map-visit-1.0.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      object-visit: 1.0.1
-    dev: true
-
-  /mdn-data/2.0.14:
-    resolution: {integrity: sha1-cRP8QoGRfWPOKbQ0RvcB5owlulA=, tarball: mdn-data/download/mdn-data-2.0.14.tgz}
-    dev: true
-
-  /meow/3.7.0:
-    resolution: {integrity: sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=, tarball: meow/download/meow-3.7.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      camelcase-keys: 2.1.0
-      decamelize: 1.2.0
-      loud-rejection: 1.6.0
-      map-obj: 1.0.1
-      minimist: 1.2.5
-      normalize-package-data: 2.5.0
-      object-assign: 4.1.1
-      read-pkg-up: 1.0.1
-      redent: 1.0.0
-      trim-newlines: 1.0.0
-    dev: true
-
-  /merge-options/1.0.1:
-    resolution: {integrity: sha1-KmSyRFe+zU5NxggoMkfpTOWJqjI=, tarball: merge-options/download/merge-options-1.0.1.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      is-plain-obj: 1.1.0
-    dev: true
-
-  /merge-stream/2.0.0:
-    resolution: {integrity: sha1-UoI2KaFN0AyXcPtq1H3GMQ8sH2A=, tarball: merge-stream/download/merge-stream-2.0.0.tgz}
-    dev: true
-
-  /merge2/1.4.1:
-    resolution: {integrity: sha1-Q2iJL4hekHRVpv19xVwMnUBJkK4=, tarball: merge2/download/merge2-1.4.1.tgz}
-    engines: {node: '>= 8'}
-    dev: true
-
-  /micromatch/3.1.0:
-    resolution: {integrity: sha1-UQLU6vILaZfWAI46z+HESj+oFeI=, tarball: micromatch/download/micromatch-3.1.0.tgz?cache=0&sync_timestamp=1632822666893&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmicromatch%2Fdownload%2Fmicromatch-3.1.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      arr-diff: 4.0.0
-      array-unique: 0.3.2
-      braces: 2.3.2
-      define-property: 1.0.0
-      extend-shallow: 2.0.1
-      extglob: 2.0.4
-      fragment-cache: 0.2.1
-      kind-of: 5.1.0
-      nanomatch: 1.2.13
-      object.pick: 1.3.0
-      regex-not: 1.0.2
-      snapdragon: 0.8.2
-      to-regex: 3.0.2
-    dev: true
-
-  /micromatch/4.0.4:
-    resolution: {integrity: sha1-iW1Rnf6dsl/OlM63pQCRm/iB6/k=, tarball: micromatch/download/micromatch-4.0.4.tgz?cache=0&sync_timestamp=1632822666893&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fmicromatch%2Fdownload%2Fmicromatch-4.0.4.tgz}
-    engines: {node: '>=8.6'}
-    dependencies:
-      braces: 3.0.2
-      picomatch: 2.3.0
-    dev: true
-
-  /mime-db/1.51.0:
-    resolution: {integrity: sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==, tarball: mime-db/download/mime-db-1.51.0.tgz}
-    engines: {node: '>= 0.6'}
-    dev: true
-
-  /mime/1.6.0:
-    resolution: {integrity: sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=, tarball: mime/download/mime-1.6.0.tgz}
-    engines: {node: '>=4'}
-    hasBin: true
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /mimic-fn/2.1.0:
-    resolution: {integrity: sha1-ftLCzMyvhNP/y3pptXcR/CCDQBs=, tarball: mimic-fn/download/mimic-fn-2.1.0.tgz}
-    engines: {node: '>=6'}
-    dev: true
-
-  /mimic-response/1.0.1:
-    resolution: {integrity: sha1-SSNTiHju9CBjy4o+OweYeBSHqxs=, tarball: mimic-response/download/mimic-response-1.0.1.tgz}
-    engines: {node: '>=4'}
-    dev: true
-
-  /minimatch/3.0.4:
-    resolution: {integrity: sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=, tarball: minimatch/download/minimatch-3.0.4.tgz}
-    dependencies:
-      brace-expansion: 1.1.11
-    dev: true
-
-  /minimist/1.2.5:
-    resolution: {integrity: sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=, tarball: minimist/download/minimist-1.2.5.tgz}
-    dev: true
-
-  /mixin-deep/1.3.2:
-    resolution: {integrity: sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY=, tarball: mixin-deep/download/mixin-deep-1.3.2.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      for-in: 1.0.2
-      is-extendable: 1.0.1
-    dev: true
-
-  /mockjs/1.1.0:
-    resolution: {integrity: sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==, tarball: mockjs/download/mockjs-1.1.0.tgz}
-    hasBin: true
-    dependencies:
-      commander: 8.3.0
-    dev: false
-
-  /moment/2.29.1:
-    resolution: {integrity: sha1-sr52n6MZQL6e7qZGnAdeNQBvo9M=, tarball: moment/download/moment-2.29.1.tgz}
-    dev: false
-
-  /mozjpeg/7.1.1:
-    resolution: {integrity: sha1-37YZU1NuZvyr1K55XnoxLUKlHxg=, tarball: mozjpeg/download/mozjpeg-7.1.1.tgz}
-    engines: {node: '>=10'}
-    hasBin: true
-    requiresBuild: true
-    dependencies:
-      bin-build: 3.0.0
-      bin-wrapper: /bin-wrapper-china/0.1.0
-    dev: true
-
-  /ms/2.0.0:
-    resolution: {integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=, tarball: ms/download/ms-2.0.0.tgz?cache=0&sync_timestamp=1632822734970&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fms%2Fdownload%2Fms-2.0.0.tgz}
-    dev: true
-
-  /ms/2.1.2:
-    resolution: {integrity: sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=, tarball: ms/download/ms-2.1.2.tgz?cache=0&sync_timestamp=1632822734970&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fms%2Fdownload%2Fms-2.1.2.tgz}
-    dev: true
-
-  /ms/2.1.3:
-    resolution: {integrity: sha1-V0yBOM4dK1hh8LRFedut1gxmFbI=, tarball: ms/download/ms-2.1.3.tgz?cache=0&sync_timestamp=1632822734970&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fms%2Fdownload%2Fms-2.1.3.tgz}
-    dev: true
-    optional: true
-
-  /mute-stream/0.0.8:
-    resolution: {integrity: sha1-FjDEKyJR/4HiooPelqVJfqkuXg0=, tarball: mute-stream/download/mute-stream-0.0.8.tgz}
-    dev: true
-
-  /nanoid/3.1.30:
-    resolution: {integrity: sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==, tarball: nanoid/download/nanoid-3.1.30.tgz}
-    engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
-    hasBin: true
-
-  /nanomatch/1.2.13:
-    resolution: {integrity: sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk=, tarball: nanomatch/download/nanomatch-1.2.13.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      arr-diff: 4.0.0
-      array-unique: 0.3.2
-      define-property: 2.0.2
-      extend-shallow: 3.0.2
-      fragment-cache: 0.2.1
-      is-windows: 1.0.2
-      kind-of: 6.0.3
-      object.pick: 1.3.0
-      regex-not: 1.0.2
-      snapdragon: 0.8.2
-      to-regex: 3.0.2
-    dev: true
-
-  /nanopop/2.1.0:
-    resolution: {integrity: sha1-I0dlE87iQFiIr9LopLVAZrcLnmA=, tarball: nanopop/download/nanopop-2.1.0.tgz}
-    dev: false
-
-  /needle/2.9.1:
-    resolution: {integrity: sha1-ItHf++NJDCuD4wH3cJtnNs2PJoQ=, tarball: needle/download/needle-2.9.1.tgz}
-    engines: {node: '>= 4.4.x'}
-    hasBin: true
-    requiresBuild: true
-    dependencies:
-      debug: 3.2.7
-      iconv-lite: 0.4.24
-      sax: 1.2.4
-    dev: true
-    optional: true
-
-  /nice-try/1.0.5:
-    resolution: {integrity: sha1-ozeKdpbOfSI+iPybdkvX7xCJ42Y=, tarball: nice-try/download/nice-try-1.0.5.tgz}
-    dev: true
-
-  /no-case/3.0.4:
-    resolution: {integrity: sha1-02H9XJgA9VhVGoNp/A3NRmK2Ek0=, tarball: no-case/download/no-case-3.0.4.tgz}
-    dependencies:
-      lower-case: 2.0.2
-      tslib: 2.3.1
-    dev: true
-
-  /node-fetch/2.6.1:
-    resolution: {integrity: sha1-BFvTI2Mfdu0uK1VXM5RBa2OaAFI=, tarball: node-fetch/download/node-fetch-2.6.1.tgz}
-    engines: {node: 4.x || >=6.0.0}
-
-  /node-releases/2.0.1:
-    resolution: {integrity: sha1-PR05XyBPHy8ppUNYuftnh2WtL8U=, tarball: node-releases/download/node-releases-2.0.1.tgz?cache=0&sync_timestamp=1634808436743&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fnode-releases%2Fdownload%2Fnode-releases-2.0.1.tgz}
-    dev: true
-
-  /normalize-package-data/2.5.0:
-    resolution: {integrity: sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg=, tarball: normalize-package-data/download/normalize-package-data-2.5.0.tgz}
-    dependencies:
-      hosted-git-info: 2.8.9
-      resolve: 1.20.0
-      semver: 5.7.1
-      validate-npm-package-license: 3.0.4
-    dev: true
-
-  /normalize-path/3.0.0:
-    resolution: {integrity: sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU=, tarball: normalize-path/download/normalize-path-3.0.0.tgz?cache=0&sync_timestamp=1632822667884&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fnormalize-path%2Fdownload%2Fnormalize-path-3.0.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /normalize-url/2.0.1:
-    resolution: {integrity: sha1-g1qdoVUfom9w6SMpBpojqmV01+Y=, tarball: normalize-url/download/normalize-url-2.0.1.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      prepend-http: 2.0.0
-      query-string: 5.1.1
-      sort-keys: 2.0.0
-    dev: true
-
-  /npm-conf/1.1.3:
-    resolution: {integrity: sha1-JWzEe9DiGMJZxOlVC/QTvCGSr/k=, tarball: npm-conf/download/npm-conf-1.1.3.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      config-chain: 1.1.13
-      pify: 3.0.0
-    dev: true
-
-  /npm-run-path/2.0.2:
-    resolution: {integrity: sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=, tarball: npm-run-path/download/npm-run-path-2.0.2.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      path-key: 2.0.1
-    dev: true
-
-  /npm-run-path/4.0.1:
-    resolution: {integrity: sha1-t+zR5e1T2o43pV4cImnguX7XSOo=, tarball: npm-run-path/download/npm-run-path-4.0.1.tgz}
-    engines: {node: '>=8'}
-    dependencies:
-      path-key: 3.1.1
-    dev: true
-
-  /nprogress/0.2.0:
-    resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==, tarball: nprogress/download/nprogress-0.2.0.tgz}
-    dev: false
-
-  /nth-check/2.0.1:
-    resolution: {integrity: sha1-Lv4WL1w9oGoolZ+9PbddvuqfD8I=, tarball: nth-check/download/nth-check-2.0.1.tgz}
-    dependencies:
-      boolbase: 1.0.0
-    dev: true
-
-  /object-assign/4.1.1:
-    resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=, tarball: object-assign/download/object-assign-4.1.1.tgz?cache=0&sync_timestamp=1632822742534&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fobject-assign%2Fdownload%2Fobject-assign-4.1.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /object-copy/0.1.0:
-    resolution: {integrity: sha1-fn2Fi3gb18mRpBupde04EnVOmYw=, tarball: object-copy/download/object-copy-0.1.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      copy-descriptor: 0.1.1
-      define-property: 0.2.5
-      kind-of: 3.2.2
-    dev: true
-
-  /object-inspect/1.12.0:
-    resolution: {integrity: sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==, tarball: object-inspect/download/object-inspect-1.12.0.tgz}
-
-  /object-keys/1.1.1:
-    resolution: {integrity: sha1-HEfyct8nfzsdrwYWd9nILiMixg4=, tarball: object-keys/download/object-keys-1.1.1.tgz}
-    engines: {node: '>= 0.4'}
-    dev: true
-
-  /object-visit/1.0.1:
-    resolution: {integrity: sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=, tarball: object-visit/download/object-visit-1.0.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      isobject: 3.0.1
-    dev: true
-
-  /object.assign/4.1.2:
-    resolution: {integrity: sha1-DtVKNC7Os3s4/3brgxoOeIy2OUA=, tarball: object.assign/download/object.assign-4.1.2.tgz}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      call-bind: 1.0.2
-      define-properties: 1.1.3
-      has-symbols: 1.0.2
-      object-keys: 1.1.1
-    dev: true
-
-  /object.pick/1.3.0:
-    resolution: {integrity: sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=, tarball: object.pick/download/object.pick-1.3.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      isobject: 3.0.1
-    dev: true
-
-  /omit.js/2.0.2:
-    resolution: {integrity: sha1-3ZuENvq5R6Xz/yFMslOGMeMT7C8=, tarball: omit.js/download/omit.js-2.0.2.tgz}
-    dev: false
-
-  /on-finished/2.3.0:
-    resolution: {integrity: sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=, tarball: on-finished/download/on-finished-2.3.0.tgz}
-    engines: {node: '>= 0.8'}
-    dependencies:
-      ee-first: 1.1.1
-    dev: true
-
-  /once/1.4.0:
-    resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=, tarball: once/download/once-1.4.0.tgz}
-    dependencies:
-      wrappy: 1.0.2
-    dev: true
-
-  /onetime/5.1.2:
-    resolution: {integrity: sha1-0Oluu1awdHbfHdnEgG5SN5hcpF4=, tarball: onetime/download/onetime-5.1.2.tgz}
-    engines: {node: '>=6'}
-    dependencies:
-      mimic-fn: 2.1.0
-    dev: true
-
-  /open/7.4.2:
-    resolution: {integrity: sha1-uBR+Jtzz5CYxbHMAif1x7dKcIyE=, tarball: open/download/open-7.4.2.tgz}
-    engines: {node: '>=8'}
-    dependencies:
-      is-docker: 2.2.1
-      is-wsl: 2.2.0
-    dev: true
-
-  /optipng-bin/7.0.1:
-    resolution: {integrity: sha1-vrjlWlL4om+IXuV6tE/PYjl9aXI=, tarball: optipng-bin/download/optipng-bin-7.0.1.tgz}
-    engines: {node: '>=10'}
-    hasBin: true
-    requiresBuild: true
-    dependencies:
-      bin-build: 3.0.0
-      bin-wrapper: /bin-wrapper-china/0.1.0
-    dev: true
-
-  /ora/5.4.1:
-    resolution: {integrity: sha1-GyZ4Qmr0rEpQkAjl5KyemVnbnhg=, tarball: ora/download/ora-5.4.1.tgz}
-    engines: {node: '>=10'}
-    dependencies:
-      bl: 4.1.0
-      chalk: 4.1.2
-      cli-cursor: 3.1.0
-      cli-spinners: 2.6.1
-      is-interactive: 1.0.0
-      is-unicode-supported: 0.1.0
-      log-symbols: 4.1.0
-      strip-ansi: 6.0.1
-      wcwidth: 1.0.1
-    dev: true
-
-  /os-filter-obj/2.0.0:
-    resolution: {integrity: sha1-HAti1fOiRCdJotE55t3e5ugdjRY=, tarball: os-filter-obj/download/os-filter-obj-2.0.0.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      arch: 2.2.0
-    dev: true
-
-  /os-tmpdir/1.0.2:
-    resolution: {integrity: sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=, tarball: os-tmpdir/download/os-tmpdir-1.0.2.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /ow/0.17.0:
-    resolution: {integrity: sha1-T5OJmf7WJkyQSM1iVDVuDx5/aIw=, tarball: ow/download/ow-0.17.0.tgz}
-    engines: {node: '>=10'}
-    dependencies:
-      type-fest: 0.11.0
-    dev: true
-
-  /p-cancelable/0.3.0:
-    resolution: {integrity: sha1-ueEjgAvOu3rBOkeb4ZW1B7mNMPo=, tarball: p-cancelable/download/p-cancelable-0.3.0.tgz}
-    engines: {node: '>=4'}
-    dev: true
-
-  /p-cancelable/0.4.1:
-    resolution: {integrity: sha1-NfNj1n1SCByNlYXje8zrfgu8sqA=, tarball: p-cancelable/download/p-cancelable-0.4.1.tgz}
-    engines: {node: '>=4'}
-    dev: true
-
-  /p-event/1.3.0:
-    resolution: {integrity: sha1-jmtPT2XHK8W2/ii3XtqHT5akoIU=, tarball: p-event/download/p-event-1.3.0.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      p-timeout: 1.2.1
-    dev: true
-
-  /p-event/2.3.1:
-    resolution: {integrity: sha1-WWJ57xaassPgyuiMHPuwgHmZPvY=, tarball: p-event/download/p-event-2.3.1.tgz}
-    engines: {node: '>=6'}
-    dependencies:
-      p-timeout: 2.0.1
-    dev: true
-
-  /p-finally/1.0.0:
-    resolution: {integrity: sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=, tarball: p-finally/download/p-finally-1.0.0.tgz}
-    engines: {node: '>=4'}
-    dev: true
-
-  /p-is-promise/1.1.0:
-    resolution: {integrity: sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=, tarball: p-is-promise/download/p-is-promise-1.1.0.tgz}
-    engines: {node: '>=4'}
-    dev: true
-
-  /p-limit/2.3.0:
-    resolution: {integrity: sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE=, tarball: p-limit/download/p-limit-2.3.0.tgz}
-    engines: {node: '>=6'}
-    dependencies:
-      p-try: 2.2.0
-    dev: false
-
-  /p-locate/4.1.0:
-    resolution: {integrity: sha1-o0KLtwiLOmApL2aRkni3wpetTwc=, tarball: p-locate/download/p-locate-4.1.0.tgz}
-    engines: {node: '>=8'}
-    dependencies:
-      p-limit: 2.3.0
-    dev: false
-
-  /p-map-series/1.0.0:
-    resolution: {integrity: sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco=, tarball: p-map-series/download/p-map-series-1.0.0.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      p-reduce: 1.0.0
-    dev: true
-
-  /p-pipe/3.1.0:
-    resolution: {integrity: sha1-SLV8kiqi4a9qZATLfGvw65zI5g4=, tarball: p-pipe/download/p-pipe-3.1.0.tgz}
-    engines: {node: '>=8'}
-    dev: true
-
-  /p-reduce/1.0.0:
-    resolution: {integrity: sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=, tarball: p-reduce/download/p-reduce-1.0.0.tgz}
-    engines: {node: '>=4'}
-    dev: true
-
-  /p-timeout/1.2.1:
-    resolution: {integrity: sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=, tarball: p-timeout/download/p-timeout-1.2.1.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      p-finally: 1.0.0
-    dev: true
-
-  /p-timeout/2.0.1:
-    resolution: {integrity: sha1-2N0ZeVldLcATnh/ka4tkbLPN8Dg=, tarball: p-timeout/download/p-timeout-2.0.1.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      p-finally: 1.0.0
-    dev: true
-
-  /p-try/2.2.0:
-    resolution: {integrity: sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=, tarball: p-try/download/p-try-2.2.0.tgz}
-    engines: {node: '>=6'}
-    dev: false
-
-  /param-case/3.0.4:
-    resolution: {integrity: sha1-fRf+SqEr3jTUp32RrPtiGcqtAcU=, tarball: param-case/download/param-case-3.0.4.tgz}
-    dependencies:
-      dot-case: 3.0.4
-      tslib: 2.3.1
-    dev: true
-
-  /parse-json/2.2.0:
-    resolution: {integrity: sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=, tarball: parse-json/download/parse-json-2.2.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      error-ex: 1.3.2
-    dev: true
-
-  /parse-node-version/1.0.1:
-    resolution: {integrity: sha1-4rXb7eAOf6m8NjYH9TMn6LBzGJs=, tarball: parse-node-version/download/parse-node-version-1.0.1.tgz}
-    engines: {node: '>= 0.10'}
-    dev: true
-
-  /parseurl/1.3.3:
-    resolution: {integrity: sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=, tarball: parseurl/download/parseurl-1.3.3.tgz}
-    engines: {node: '>= 0.8'}
-    dev: true
-
-  /pascal-case/3.1.2:
-    resolution: {integrity: sha1-tI4O8rmOIF58Ha50fQsVCCN2YOs=, tarball: pascal-case/download/pascal-case-3.1.2.tgz}
-    dependencies:
-      no-case: 3.0.4
-      tslib: 2.3.1
-    dev: true
-
-  /pascalcase/0.1.1:
-    resolution: {integrity: sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=, tarball: pascalcase/download/pascalcase-0.1.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /path-case/3.0.4:
-    resolution: {integrity: sha1-kWhkUzTrlCZYN1xW+AtMDLX4LG8=, tarball: path-case/download/path-case-3.0.4.tgz}
-    dependencies:
-      dot-case: 3.0.4
-      tslib: 2.3.1
-    dev: true
-
-  /path-exists/2.1.0:
-    resolution: {integrity: sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=, tarball: path-exists/download/path-exists-2.1.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      pinkie-promise: 2.0.1
-    dev: true
-
-  /path-exists/4.0.0:
-    resolution: {integrity: sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=, tarball: path-exists/download/path-exists-4.0.0.tgz}
-    engines: {node: '>=8'}
-    dev: false
-
-  /path-is-absolute/1.0.1:
-    resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=, tarball: path-is-absolute/download/path-is-absolute-1.0.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /path-key/2.0.1:
-    resolution: {integrity: sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=, tarball: path-key/download/path-key-2.0.1.tgz}
-    engines: {node: '>=4'}
-    dev: true
-
-  /path-key/3.1.1:
-    resolution: {integrity: sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=, tarball: path-key/download/path-key-3.1.1.tgz}
-    engines: {node: '>=8'}
-    dev: true
-
-  /path-parse/1.0.7:
-    resolution: {integrity: sha1-+8EUtgykKzDZ2vWFjkvWi77bZzU=, tarball: path-parse/download/path-parse-1.0.7.tgz}
-    dev: true
-
-  /path-to-regexp/6.2.0:
-    resolution: {integrity: sha1-97OAMzYQTDRoia3s5hRmkjBkXzg=, tarball: path-to-regexp/download/path-to-regexp-6.2.0.tgz?cache=0&sync_timestamp=1632822736183&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpath-to-regexp%2Fdownload%2Fpath-to-regexp-6.2.0.tgz}
-
-  /path-type/1.1.0:
-    resolution: {integrity: sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=, tarball: path-type/download/path-type-1.1.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      graceful-fs: 4.2.8
-      pify: 2.3.0
-      pinkie-promise: 2.0.1
-    dev: true
-
-  /path-type/4.0.0:
-    resolution: {integrity: sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs=, tarball: path-type/download/path-type-4.0.0.tgz}
-    engines: {node: '>=8'}
-    dev: true
-
-  /pend/1.2.0:
-    resolution: {integrity: sha1-elfrVQpng/kRUzH89GY9XI4AelA=, tarball: pend/download/pend-1.2.0.tgz}
-    dev: true
-
-  /picocolors/1.0.0:
-    resolution: {integrity: sha1-y1vcdP8/UYkiNur3nWi8RFZKuBw=, tarball: picocolors/download/picocolors-1.0.0.tgz?cache=0&sync_timestamp=1634097134444&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fpicocolors%2Fdownload%2Fpicocolors-1.0.0.tgz}
-
-  /picomatch/2.3.0:
-    resolution: {integrity: sha1-8fBh3o9qS/AiiS4tEoI0+5gwKXI=, tarball: picomatch/download/picomatch-2.3.0.tgz}
-    engines: {node: '>=8.6'}
-    dev: true
-
-  /pify/2.3.0:
-    resolution: {integrity: sha1-7RQaasBDqEnqWISY59yosVMw6Qw=, tarball: pify/download/pify-2.3.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /pify/3.0.0:
-    resolution: {integrity: sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=, tarball: pify/download/pify-3.0.0.tgz}
-    engines: {node: '>=4'}
-    dev: true
-
-  /pify/4.0.1:
-    resolution: {integrity: sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=, tarball: pify/download/pify-4.0.1.tgz}
-    engines: {node: '>=6'}
-    dev: true
-
-  /pinia/2.0.0_typescript@4.5.4+vue@3.2.26:
-    resolution: {integrity: sha1-asd696T/LiyHpZZ7WqK+jgSGjzg=, tarball: pinia/download/pinia-2.0.0.tgz}
-    peerDependencies:
-      '@vue/composition-api': ^1.2.4
-      typescript: ^4.4.4
-      vue: ^2.6.14 || ^3.2.0
-    peerDependenciesMeta:
-      '@vue/composition-api':
-        optional: true
-      typescript:
-        optional: true
-    dependencies:
-      '@vue/devtools-api': 6.0.0-beta.21.1
-      typescript: 4.5.4
-      vue: 3.2.26
-      vue-demi: 0.12.1_vue@3.2.26
-    dev: false
-
-  /pinkie-promise/2.0.1:
-    resolution: {integrity: sha1-ITXW36ejWMBprJsXh3YogihFD/o=, tarball: pinkie-promise/download/pinkie-promise-2.0.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      pinkie: 2.0.4
-    dev: true
-
-  /pinkie/2.0.4:
-    resolution: {integrity: sha1-clVrgM+g1IqXToDnckjoDtT3+HA=, tarball: pinkie/download/pinkie-2.0.4.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /pngjs/5.0.0:
-    resolution: {integrity: sha1-553SshV2f9nARWHAEjbflgvOf7s=, tarball: pngjs/download/pngjs-5.0.0.tgz}
-    engines: {node: '>=10.13.0'}
-    dev: false
-
-  /pngquant-bin/6.0.1:
-    resolution: {integrity: sha1-K1eJyiGe602FCasa4IIJKAG38H4=, tarball: pngquant-bin/download/pngquant-bin-6.0.1.tgz}
-    engines: {node: '>=10'}
-    hasBin: true
-    requiresBuild: true
-    dependencies:
-      bin-build: 3.0.0
-      bin-wrapper: /bin-wrapper-china/0.1.0
-      execa: 4.1.0
-    dev: true
-
-  /posix-character-classes/0.1.1:
-    resolution: {integrity: sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=, tarball: posix-character-classes/download/posix-character-classes-0.1.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /postcss-prefix-selector/1.14.0_postcss@5.2.18:
-    resolution: {integrity: sha512-8d5fiBQZWMtGWH/7ewEeo6RnBNyT2kLD5wTIfV2oHYqH4hjiofg/rP5X3SUwnqOINzE4mM/K/UOAiNrIaKzd4w==, tarball: postcss-prefix-selector/download/postcss-prefix-selector-1.14.0.tgz}
-    peerDependencies:
-      postcss: 7.x || 8.x
-    dependencies:
-      postcss: 5.2.18
-    dev: true
-
-  /postcss/5.2.18:
-    resolution: {integrity: sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==, tarball: postcss/download/postcss-5.2.18.tgz}
-    engines: {node: '>=0.12'}
-    dependencies:
-      chalk: 1.1.3
-      js-base64: 2.6.4
-      source-map: 0.5.7
-      supports-color: 3.2.3
-    dev: true
-
-  /postcss/8.4.5:
-    resolution: {integrity: sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==, tarball: postcss/download/postcss-8.4.5.tgz}
-    engines: {node: ^10 || ^12 || >=14}
-    dependencies:
-      nanoid: 3.1.30
-      picocolors: 1.0.0
-      source-map-js: 1.0.1
-
-  /posthtml-parser/0.2.1:
-    resolution: {integrity: sha1-NdUw3jhnQMK6JP8usvrznM3ycd0=, tarball: posthtml-parser/download/posthtml-parser-0.2.1.tgz}
-    dependencies:
-      htmlparser2: 3.10.1
-      isobject: 2.1.0
-    dev: true
-
-  /posthtml-rename-id/1.0.12:
-    resolution: {integrity: sha1-z39us3FGvxr6wx5o8YxswZrmFDM=, tarball: posthtml-rename-id/download/posthtml-rename-id-1.0.12.tgz}
-    dependencies:
-      escape-string-regexp: 1.0.5
-    dev: true
-
-  /posthtml-render/1.4.0:
-    resolution: {integrity: sha1-QBFAcMRYgcrLkzR9rj7/U6+8/xM=, tarball: posthtml-render/download/posthtml-render-1.4.0.tgz}
-    engines: {node: '>=10'}
-    dev: true
-
-  /posthtml-svg-mode/1.0.3:
-    resolution: {integrity: sha1-q9VU+s6BIjyrDLNn4Y5O/SpOdLA=, tarball: posthtml-svg-mode/download/posthtml-svg-mode-1.0.3.tgz}
-    dependencies:
-      merge-options: 1.0.1
-      posthtml: 0.9.2
-      posthtml-parser: 0.2.1
-      posthtml-render: 1.4.0
-    dev: true
-
-  /posthtml/0.9.2:
-    resolution: {integrity: sha1-9MBtufZ7Yf0XxOJW5+PZUVv3Jv0=, tarball: posthtml/download/posthtml-0.9.2.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      posthtml-parser: 0.2.1
-      posthtml-render: 1.4.0
-    dev: true
-
-  /prepend-http/1.0.4:
-    resolution: {integrity: sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=, tarball: prepend-http/download/prepend-http-1.0.4.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /prepend-http/2.0.0:
-    resolution: {integrity: sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=, tarball: prepend-http/download/prepend-http-2.0.0.tgz}
-    engines: {node: '>=4'}
-    dev: true
-
-  /pretty-bytes/5.6.0:
-    resolution: {integrity: sha1-NWJW9kOAR3PIL2RyP+eMksYr6us=, tarball: pretty-bytes/download/pretty-bytes-5.6.0.tgz}
-    engines: {node: '>=6'}
-    dev: true
-
-  /process-nextick-args/2.0.1:
-    resolution: {integrity: sha1-eCDZsWEgzFXKmud5JoCufbptf+I=, tarball: process-nextick-args/download/process-nextick-args-2.0.1.tgz}
-    dev: true
-
-  /proto-list/1.2.4:
-    resolution: {integrity: sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=, tarball: proto-list/download/proto-list-1.2.4.tgz}
-    dev: true
-
-  /prr/1.0.1:
-    resolution: {integrity: sha1-0/wRS6BplaRexok/SEzrHXj19HY=, tarball: prr/download/prr-1.0.1.tgz}
-    dev: true
-    optional: true
-
-  /pseudomap/1.0.2:
-    resolution: {integrity: sha1-8FKijacOYYkX7wqKw0wa5aaChrM=, tarball: pseudomap/download/pseudomap-1.0.2.tgz}
-    dev: true
-
-  /pump/3.0.0:
-    resolution: {integrity: sha1-tKIRaBW94vTh6mAjVOjHVWUQemQ=, tarball: pump/download/pump-3.0.0.tgz}
-    dependencies:
-      end-of-stream: 1.4.4
-      once: 1.4.0
-    dev: true
-
-  /punycode/2.1.1:
-    resolution: {integrity: sha1-tYsBCsQMIsVldhbI0sLALHv0eew=, tarball: punycode/download/punycode-2.1.1.tgz}
-    engines: {node: '>=6'}
-    dev: true
-
-  /qrcode/1.5.0:
-    resolution: {integrity: sha512-9MgRpgVc+/+47dFvQeD6U2s0Z92EsKzcHogtum4QB+UNd025WOJSHvn/hjk9xmzj7Stj95CyUAs31mrjxliEsQ==, tarball: qrcode/download/qrcode-1.5.0.tgz}
-    engines: {node: '>=10.13.0'}
-    hasBin: true
-    dependencies:
-      dijkstrajs: 1.0.2
-      encode-utf8: 1.0.3
-      pngjs: 5.0.0
-      yargs: 15.4.1
-    dev: false
-
-  /qs/6.10.2:
-    resolution: {integrity: sha512-mSIdjzqznWgfd4pMii7sHtaYF8rx8861hBO80SraY5GT0XQibWZWJSid0avzHGkDIZLImux2S5mXO0Hfct2QCw==, tarball: qs/download/qs-6.10.2.tgz}
-    engines: {node: '>=0.6'}
-    dependencies:
-      side-channel: 1.0.4
-    dev: false
-
-  /query-string/4.3.4:
-    resolution: {integrity: sha1-u7aTucqRXCMlFbIosaArYJBD2+s=, tarball: query-string/download/query-string-4.3.4.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      object-assign: 4.1.1
-      strict-uri-encode: 1.1.0
-    dev: true
-
-  /query-string/5.1.1:
-    resolution: {integrity: sha1-p4wBK3HBfgXy4/ojGd0zBoLvs8s=, tarball: query-string/download/query-string-5.1.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      decode-uri-component: 0.2.0
-      object-assign: 4.1.1
-      strict-uri-encode: 1.1.0
-    dev: true
-
-  /queue-microtask/1.2.3:
-    resolution: {integrity: sha1-SSkii7xyTfrEPg77BYyve2z7YkM=, tarball: queue-microtask/download/queue-microtask-1.2.3.tgz}
-    dev: true
-
-  /randombytes/2.1.0:
-    resolution: {integrity: sha1-32+ENy8CcNxlzfYpE0mrekc9Tyo=, tarball: randombytes/download/randombytes-2.1.0.tgz}
-    dependencies:
-      safe-buffer: 5.2.1
-    dev: true
-
-  /read-pkg-up/1.0.1:
-    resolution: {integrity: sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=, tarball: read-pkg-up/download/read-pkg-up-1.0.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      find-up: 1.1.2
-      read-pkg: 1.1.0
-    dev: true
-
-  /read-pkg/1.1.0:
-    resolution: {integrity: sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=, tarball: read-pkg/download/read-pkg-1.1.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      load-json-file: 1.1.0
-      normalize-package-data: 2.5.0
-      path-type: 1.1.0
-    dev: true
-
-  /readable-stream/2.3.7:
-    resolution: {integrity: sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c=, tarball: readable-stream/download/readable-stream-2.3.7.tgz}
-    dependencies:
-      core-util-is: 1.0.3
-      inherits: 2.0.4
-      isarray: 1.0.0
-      process-nextick-args: 2.0.1
-      safe-buffer: 5.1.2
-      string_decoder: 1.1.1
-      util-deprecate: 1.0.2
-    dev: true
-
-  /readable-stream/3.6.0:
-    resolution: {integrity: sha1-M3u9o63AcGvT4CRCaihtS0sskZg=, tarball: readable-stream/download/readable-stream-3.6.0.tgz}
-    engines: {node: '>= 6'}
-    dependencies:
-      inherits: 2.0.4
-      string_decoder: 1.3.0
-      util-deprecate: 1.0.2
-    dev: true
-
-  /readdirp/3.6.0:
-    resolution: {integrity: sha1-dKNwvYVxFuJFspzJc0DNQxoCpsc=, tarball: readdirp/download/readdirp-3.6.0.tgz}
-    engines: {node: '>=8.10.0'}
-    dependencies:
-      picomatch: 2.3.0
-    dev: true
-
-  /redent/1.0.0:
-    resolution: {integrity: sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=, tarball: redent/download/redent-1.0.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      indent-string: 2.1.0
-      strip-indent: 1.0.1
-    dev: true
-
-  /regenerate-unicode-properties/9.0.0:
-    resolution: {integrity: sha1-VNCccRXh9T3CMUqXSzLBw0Tv4yY=, tarball: regenerate-unicode-properties/download/regenerate-unicode-properties-9.0.0.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      regenerate: 1.4.2
-    dev: true
-
-  /regenerate/1.4.2:
-    resolution: {integrity: sha1-uTRtiCfo9aMve6KWN9OYtpAUhIo=, tarball: regenerate/download/regenerate-1.4.2.tgz}
-    dev: true
-
-  /regenerator-runtime/0.13.9:
-    resolution: {integrity: sha1-iSV0Kpj/2QgUmI11Zq0wyjsmO1I=, tarball: regenerator-runtime/download/regenerator-runtime-0.13.9.tgz?cache=0&sync_timestamp=1632822710900&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fregenerator-runtime%2Fdownload%2Fregenerator-runtime-0.13.9.tgz}
-
-  /regenerator-transform/0.14.5:
-    resolution: {integrity: sha1-yY2hVGg2ccnE3LFuznNlF+G3/rQ=, tarball: regenerator-transform/download/regenerator-transform-0.14.5.tgz}
-    dependencies:
-      '@babel/runtime': 7.16.5
-    dev: true
-
-  /regex-not/1.0.2:
-    resolution: {integrity: sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=, tarball: regex-not/download/regex-not-1.0.2.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      extend-shallow: 3.0.2
-      safe-regex: 1.1.0
-    dev: true
-
-  /regexp.prototype.flags/1.3.1:
-    resolution: {integrity: sha1-fvNSro0VnnWMDq3Kb4/LTu8HviY=, tarball: regexp.prototype.flags/download/regexp.prototype.flags-1.3.1.tgz}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      call-bind: 1.0.2
-      define-properties: 1.1.3
-    dev: true
-
-  /regexpu-core/4.8.0:
-    resolution: {integrity: sha1-5WBbo2G2excYR4UBMnUC9EeamPA=, tarball: regexpu-core/download/regexpu-core-4.8.0.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      regenerate: 1.4.2
-      regenerate-unicode-properties: 9.0.0
-      regjsgen: 0.5.2
-      regjsparser: 0.7.0
-      unicode-match-property-ecmascript: 2.0.0
-      unicode-match-property-value-ecmascript: 2.0.0
-    dev: true
-
-  /regjsgen/0.5.2:
-    resolution: {integrity: sha1-kv8pX7He7L9uzaslQ9IH6RqjNzM=, tarball: regjsgen/download/regjsgen-0.5.2.tgz}
-    dev: true
-
-  /regjsparser/0.7.0:
-    resolution: {integrity: sha1-prZntUyIXhi1JVTLSWDvcRh+mWg=, tarball: regjsparser/download/regjsparser-0.7.0.tgz}
-    hasBin: true
-    dependencies:
-      jsesc: 0.5.0
-    dev: true
-
-  /relateurl/0.2.7:
-    resolution: {integrity: sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=, tarball: relateurl/download/relateurl-0.2.7.tgz}
-    engines: {node: '>= 0.10'}
-    dev: true
-
-  /repeat-element/1.1.4:
-    resolution: {integrity: sha1-vmgVIIR6tYx1aKx1+/rSjtQtOek=, tarball: repeat-element/download/repeat-element-1.1.4.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /repeat-string/1.6.1:
-    resolution: {integrity: sha1-jcrkcOHIirwtYA//Sndihtp15jc=, tarball: repeat-string/download/repeat-string-1.6.1.tgz}
-    engines: {node: '>=0.10'}
-    dev: true
-
-  /repeating/2.0.1:
-    resolution: {integrity: sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=, tarball: repeating/download/repeating-2.0.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      is-finite: 1.1.0
-    dev: true
-
-  /replace-ext/1.0.1:
-    resolution: {integrity: sha1-LW2ZbQShWFXZZ0Q2Md1fd4JbAWo=, tarball: replace-ext/download/replace-ext-1.0.1.tgz}
-    engines: {node: '>= 0.10'}
-    dev: true
-
-  /require-directory/2.1.1:
-    resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=, tarball: require-directory/download/require-directory-2.1.1.tgz}
-    engines: {node: '>=0.10.0'}
-
-  /require-from-string/2.0.2:
-    resolution: {integrity: sha1-iaf92TgmEmcxjq/hT5wy5ZjDaQk=, tarball: require-from-string/download/require-from-string-2.0.2.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /require-main-filename/2.0.0:
-    resolution: {integrity: sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=, tarball: require-main-filename/download/require-main-filename-2.0.0.tgz}
-    dev: false
-
-  /resize-observer-polyfill/1.5.1:
-    resolution: {integrity: sha1-DpAg3T0hAkRY1OvSfiPkAmmBBGQ=, tarball: resize-observer-polyfill/download/resize-observer-polyfill-1.5.1.tgz}
-    dev: false
-
-  /resolve-url/0.2.1:
-    resolution: {integrity: sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=, tarball: resolve-url/download/resolve-url-0.2.1.tgz}
-    deprecated: https://github.com/lydell/resolve-url#deprecated
-    dev: true
-
-  /resolve/1.20.0:
-    resolution: {integrity: sha1-YpoBP7P3B1XW8LeTXMHCxTeLGXU=, tarball: resolve/download/resolve-1.20.0.tgz}
-    dependencies:
-      is-core-module: 2.8.0
-      path-parse: 1.0.7
-    dev: true
-
-  /responselike/1.0.2:
-    resolution: {integrity: sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=, tarball: responselike/download/responselike-1.0.2.tgz}
-    dependencies:
-      lowercase-keys: 1.0.1
-    dev: true
-
-  /restore-cursor/3.1.0:
-    resolution: {integrity: sha1-OfZ8VLOnpYzqUjbZXPADQjljH34=, tarball: restore-cursor/download/restore-cursor-3.1.0.tgz}
-    engines: {node: '>=8'}
-    dependencies:
-      onetime: 5.1.2
-      signal-exit: 3.0.6
-    dev: true
-
-  /ret/0.1.15:
-    resolution: {integrity: sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w=, tarball: ret/download/ret-0.1.15.tgz}
-    engines: {node: '>=0.12'}
-    dev: true
-
-  /reusify/1.0.4:
-    resolution: {integrity: sha1-kNo4Kx4SbvwCFG6QhFqI2xKSXXY=, tarball: reusify/download/reusify-1.0.4.tgz}
-    engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
-    dev: true
-
-  /rimraf/2.7.1:
-    resolution: {integrity: sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w=, tarball: rimraf/download/rimraf-2.7.1.tgz}
-    hasBin: true
-    dependencies:
-      glob: 7.2.0
-    dev: true
-
-  /rollup-plugin-purge-icons/0.7.0:
-    resolution: {integrity: sha1-RBm4ENXXXxu6OvcqI45wtKZ18Dw=, tarball: rollup-plugin-purge-icons/download/rollup-plugin-purge-icons-0.7.0.tgz}
-    engines: {node: '>= 12'}
-    dependencies:
-      '@purge-icons/core': 0.7.0
-      '@purge-icons/generated': 0.7.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /rollup-plugin-terser/7.0.2_rollup@2.61.1:
-    resolution: {integrity: sha1-6Pu6SGmYGy3DWufopQLVxsBNMk0=, tarball: rollup-plugin-terser/download/rollup-plugin-terser-7.0.2.tgz}
-    peerDependencies:
-      rollup: ^2.0.0
-    dependencies:
-      '@babel/code-frame': 7.16.0
-      jest-worker: 26.6.2
-      rollup: 2.61.1
-      serialize-javascript: 4.0.0
-      terser: 5.10.0
-    transitivePeerDependencies:
-      - acorn
-    dev: true
-
-  /rollup-plugin-visualizer/5.5.2:
-    resolution: {integrity: sha1-riEw7lrkotkB52TkkrcTV8uV7tc=, tarball: rollup-plugin-visualizer/download/rollup-plugin-visualizer-5.5.2.tgz}
-    engines: {node: '>=10.16'}
-    hasBin: true
-    peerDependencies:
-      rollup: ^2.0.0
-    dependencies:
-      nanoid: 3.1.30
-      open: 7.4.2
-      source-map: 0.7.3
-      yargs: 16.2.0
-    dev: true
-
-  /rollup/2.61.1:
-    resolution: {integrity: sha512-BbTXlEvB8d+XFbK/7E5doIcRtxWPRiqr0eb5vQ0+2paMM04Ye4PZY5nHOQef2ix24l/L0SpLd5hwcH15QHPdvA==, tarball: rollup/download/rollup-2.61.1.tgz}
-    engines: {node: '>=10.0.0'}
-    hasBin: true
-    optionalDependencies:
-      fsevents: 2.3.2
-    dev: true
-
-  /run-async/2.4.1:
-    resolution: {integrity: sha1-hEDsz5nqPnC9QJ1JqriOEMGJpFU=, tarball: run-async/download/run-async-2.4.1.tgz}
-    engines: {node: '>=0.12.0'}
-    dev: true
-
-  /run-parallel/1.2.0:
-    resolution: {integrity: sha1-ZtE2jae9+SHrnZW9GpIp5/IaQ+4=, tarball: run-parallel/download/run-parallel-1.2.0.tgz}
-    dependencies:
-      queue-microtask: 1.2.3
-    dev: true
-
-  /rxjs/7.4.0:
-    resolution: {integrity: sha1-oSpE1+6/AW9f8kQbh/KMmlHOvGg=, tarball: rxjs/download/rxjs-7.4.0.tgz}
-    dependencies:
-      tslib: 2.1.0
-    dev: true
-
-  /safe-buffer/5.1.2:
-    resolution: {integrity: sha1-mR7GnSluAxN0fVm9/St0XDX4go0=, tarball: safe-buffer/download/safe-buffer-5.1.2.tgz}
-    dev: true
-
-  /safe-buffer/5.2.1:
-    resolution: {integrity: sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY=, tarball: safe-buffer/download/safe-buffer-5.2.1.tgz}
-    dev: true
-
-  /safe-regex/1.1.0:
-    resolution: {integrity: sha1-QKNmnzsHfR6UPURinhV91IAjvy4=, tarball: safe-regex/download/safe-regex-1.1.0.tgz}
-    dependencies:
-      ret: 0.1.15
-    dev: true
-
-  /safer-buffer/2.1.2:
-    resolution: {integrity: sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=, tarball: safer-buffer/download/safer-buffer-2.1.2.tgz}
-    dev: true
-
-  /sax/1.2.4:
-    resolution: {integrity: sha1-KBYjTiN4vdxOU1T6tcqold9xANk=, tarball: sax/download/sax-1.2.4.tgz}
-    dev: true
-    optional: true
-
-  /scroll-into-view-if-needed/2.2.28:
-    resolution: {integrity: sha1-WhWy9YpSZCyIyOylhGROAXA9ZFo=, tarball: scroll-into-view-if-needed/download/scroll-into-view-if-needed-2.2.28.tgz}
-    dependencies:
-      compute-scroll-into-view: 1.0.17
-    dev: false
-
-  /seek-bzip/1.0.6:
-    resolution: {integrity: sha1-NcQXH1WmgJFrUqB4WezztYV/IcQ=, tarball: seek-bzip/download/seek-bzip-1.0.6.tgz}
-    hasBin: true
-    dependencies:
-      commander: 2.20.3
-    dev: true
-
-  /semver-regex/2.0.0:
-    resolution: {integrity: sha1-qTwsWERTmncCMzeRB7OMe0rJ0zg=, tarball: semver-regex/download/semver-regex-2.0.0.tgz}
-    engines: {node: '>=6'}
-    dev: true
-
-  /semver-truncate/1.1.2:
-    resolution: {integrity: sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g=, tarball: semver-truncate/download/semver-truncate-1.1.2.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      semver: 5.7.1
-    dev: true
-
-  /semver/5.7.1:
-    resolution: {integrity: sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=, tarball: semver/download/semver-5.7.1.tgz}
-    hasBin: true
-    dev: true
-
-  /semver/6.3.0:
-    resolution: {integrity: sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0=, tarball: semver/download/semver-6.3.0.tgz}
-    hasBin: true
-    dev: true
-
-  /semver/7.0.0:
-    resolution: {integrity: sha1-XzyjV2HkfgWyBsba/yz4FPAxa44=, tarball: semver/download/semver-7.0.0.tgz}
-    hasBin: true
-    dev: true
-
-  /sentence-case/3.0.4:
-    resolution: {integrity: sha1-NkWnuMEXx4f96HAgViJbtipFEx8=, tarball: sentence-case/download/sentence-case-3.0.4.tgz}
-    dependencies:
-      no-case: 3.0.4
-      tslib: 2.3.1
-      upper-case-first: 2.0.2
-    dev: true
-
-  /serialize-javascript/4.0.0:
-    resolution: {integrity: sha1-tSXhI4SJpez8Qq+sw/6Z5mb0sao=, tarball: serialize-javascript/download/serialize-javascript-4.0.0.tgz}
-    dependencies:
-      randombytes: 2.1.0
-    dev: true
-
-  /set-blocking/2.0.0:
-    resolution: {integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc=, tarball: set-blocking/download/set-blocking-2.0.0.tgz}
-    dev: false
-
-  /set-value/2.0.1:
-    resolution: {integrity: sha1-oY1AUw5vB95CKMfe/kInr4ytAFs=, tarball: set-value/download/set-value-2.0.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      extend-shallow: 2.0.1
-      is-extendable: 0.1.1
-      is-plain-object: 2.0.4
-      split-string: 3.1.0
-    dev: true
-
-  /shallow-equal/1.2.1:
-    resolution: {integrity: sha1-TBar+lYEOqINBQMk76aJQLDaedo=, tarball: shallow-equal/download/shallow-equal-1.2.1.tgz}
-    dev: false
-
-  /shebang-command/1.2.0:
-    resolution: {integrity: sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=, tarball: shebang-command/download/shebang-command-1.2.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      shebang-regex: 1.0.0
-    dev: true
-
-  /shebang-command/2.0.0:
-    resolution: {integrity: sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=, tarball: shebang-command/download/shebang-command-2.0.0.tgz}
-    engines: {node: '>=8'}
-    dependencies:
-      shebang-regex: 3.0.0
-    dev: true
-
-  /shebang-regex/1.0.0:
-    resolution: {integrity: sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=, tarball: shebang-regex/download/shebang-regex-1.0.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /shebang-regex/3.0.0:
-    resolution: {integrity: sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=, tarball: shebang-regex/download/shebang-regex-3.0.0.tgz}
-    engines: {node: '>=8'}
-    dev: true
-
-  /side-channel/1.0.4:
-    resolution: {integrity: sha1-785cj9wQTudRslxY1CkAEfpeos8=, tarball: side-channel/download/side-channel-1.0.4.tgz}
-    dependencies:
-      call-bind: 1.0.2
-      get-intrinsic: 1.1.1
-      object-inspect: 1.12.0
-
-  /signal-exit/3.0.6:
-    resolution: {integrity: sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==, tarball: signal-exit/download/signal-exit-3.0.6.tgz?cache=0&sync_timestamp=1637292968320&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fsignal-exit%2Fdownload%2Fsignal-exit-3.0.6.tgz}
-    dev: true
-
-  /slash/3.0.0:
-    resolution: {integrity: sha1-ZTm+hwwWWtvVJAIg2+Nh8bxNRjQ=, tarball: slash/download/slash-3.0.0.tgz?cache=0&sync_timestamp=1632822671385&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fslash%2Fdownload%2Fslash-3.0.0.tgz}
-    engines: {node: '>=8'}
-    dev: true
-
-  /snake-case/3.0.4:
-    resolution: {integrity: sha1-Tyu9Vo6ZNavf1ZPzTGkdrbScRSw=, tarball: snake-case/download/snake-case-3.0.4.tgz}
-    dependencies:
-      dot-case: 3.0.4
-      tslib: 2.3.1
-    dev: true
-
-  /snapdragon-node/2.1.1:
-    resolution: {integrity: sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=, tarball: snapdragon-node/download/snapdragon-node-2.1.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      define-property: 1.0.0
-      isobject: 3.0.1
-      snapdragon-util: 3.0.1
-    dev: true
-
-  /snapdragon-util/3.0.1:
-    resolution: {integrity: sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=, tarball: snapdragon-util/download/snapdragon-util-3.0.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      kind-of: 3.2.2
-    dev: true
-
-  /snapdragon/0.8.2:
-    resolution: {integrity: sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=, tarball: snapdragon/download/snapdragon-0.8.2.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      base: 0.11.2
-      debug: 2.6.9
-      define-property: 0.2.5
-      extend-shallow: 2.0.1
-      map-cache: 0.2.2
-      source-map: 0.5.7
-      source-map-resolve: 0.5.3
-      use: 3.1.1
-    dev: true
-
-  /sort-keys-length/1.0.1:
-    resolution: {integrity: sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=, tarball: sort-keys-length/download/sort-keys-length-1.0.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      sort-keys: 1.1.2
-    dev: true
-
-  /sort-keys/1.1.2:
-    resolution: {integrity: sha1-RBttTTRnmPG05J6JIK37oOVD+a0=, tarball: sort-keys/download/sort-keys-1.1.2.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      is-plain-obj: 1.1.0
-    dev: true
-
-  /sort-keys/2.0.0:
-    resolution: {integrity: sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=, tarball: sort-keys/download/sort-keys-2.0.0.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      is-plain-obj: 1.1.0
-    dev: true
-
-  /sortablejs/1.14.0:
-    resolution: {integrity: sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==, tarball: sortablejs/download/sortablejs-1.14.0.tgz}
-    dev: false
-
-  /source-map-js/1.0.1:
-    resolution: {integrity: sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==, tarball: source-map-js/download/source-map-js-1.0.1.tgz}
-    engines: {node: '>=0.10.0'}
-
-  /source-map-resolve/0.5.3:
-    resolution: {integrity: sha1-GQhmvs51U+H48mei7oLGBrVQmho=, tarball: source-map-resolve/download/source-map-resolve-0.5.3.tgz}
-    dependencies:
-      atob: 2.1.2
-      decode-uri-component: 0.2.0
-      resolve-url: 0.2.1
-      source-map-url: 0.4.1
-      urix: 0.1.0
-    dev: true
-
-  /source-map-support/0.5.21:
-    resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==, tarball: source-map-support/download/source-map-support-0.5.21.tgz}
-    dependencies:
-      buffer-from: 1.1.2
-      source-map: 0.6.1
-    dev: true
-
-  /source-map-url/0.4.1:
-    resolution: {integrity: sha1-CvZmBadFpaL5HPG7+KevvCg97FY=, tarball: source-map-url/download/source-map-url-0.4.1.tgz}
-    dev: true
-
-  /source-map/0.5.7:
-    resolution: {integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=, tarball: source-map/download/source-map-0.5.7.tgz?cache=0&sync_timestamp=1632822727980&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fsource-map%2Fdownload%2Fsource-map-0.5.7.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /source-map/0.6.1:
-    resolution: {integrity: sha1-dHIq8y6WFOnCh6jQu95IteLxomM=, tarball: source-map/download/source-map-0.6.1.tgz?cache=0&sync_timestamp=1632822727980&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fsource-map%2Fdownload%2Fsource-map-0.6.1.tgz}
-    engines: {node: '>=0.10.0'}
-
-  /source-map/0.7.3:
-    resolution: {integrity: sha1-UwL4FpAxc1ImVECS5kmB91F1A4M=, tarball: source-map/download/source-map-0.7.3.tgz?cache=0&sync_timestamp=1632822727980&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fsource-map%2Fdownload%2Fsource-map-0.7.3.tgz}
-    engines: {node: '>= 8'}
-    dev: true
-
-  /source-map/0.8.0-beta.0:
-    resolution: {integrity: sha1-1MG7QsP37pJfAFknuhBwng0dHxE=, tarball: source-map/download/source-map-0.8.0-beta.0.tgz?cache=0&sync_timestamp=1632822727980&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fsource-map%2Fdownload%2Fsource-map-0.8.0-beta.0.tgz}
-    engines: {node: '>= 8'}
-    dependencies:
-      whatwg-url: 7.1.0
-    dev: true
-
-  /sourcemap-codec/1.4.8:
-    resolution: {integrity: sha1-6oBL2UhXQC5pktBaOO8a41qatMQ=, tarball: sourcemap-codec/download/sourcemap-codec-1.4.8.tgz}
-
-  /spdx-correct/3.1.1:
-    resolution: {integrity: sha1-3s6BrJweZxPl99G28X1Gj6U9iak=, tarball: spdx-correct/download/spdx-correct-3.1.1.tgz}
-    dependencies:
-      spdx-expression-parse: 3.0.1
-      spdx-license-ids: 3.0.11
-    dev: true
-
-  /spdx-exceptions/2.3.0:
-    resolution: {integrity: sha1-PyjOGnegA3JoPq3kpDMYNSeiFj0=, tarball: spdx-exceptions/download/spdx-exceptions-2.3.0.tgz}
-    dev: true
-
-  /spdx-expression-parse/3.0.1:
-    resolution: {integrity: sha1-z3D1BILu/cmOPOCmgz5KU87rpnk=, tarball: spdx-expression-parse/download/spdx-expression-parse-3.0.1.tgz}
-    dependencies:
-      spdx-exceptions: 2.3.0
-      spdx-license-ids: 3.0.11
-    dev: true
-
-  /spdx-license-ids/3.0.11:
-    resolution: {integrity: sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==, tarball: spdx-license-ids/download/spdx-license-ids-3.0.11.tgz}
-    dev: true
-
-  /split-string/3.1.0:
-    resolution: {integrity: sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=, tarball: split-string/download/split-string-3.1.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      extend-shallow: 3.0.2
-    dev: true
-
-  /squeak/1.3.0:
-    resolution: {integrity: sha1-MwRQN7ZDiLVnZ0uEMiplIQc5FsM=, tarball: squeak/download/squeak-1.3.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      chalk: 1.1.3
-      console-stream: 0.1.1
-      lpad-align: 1.1.2
-    dev: true
-
-  /stable/0.1.8:
-    resolution: {integrity: sha1-g26zyDgv4pNv6vVEYxAXzn1Ho88=, tarball: stable/download/stable-0.1.8.tgz}
-    dev: true
-
-  /static-extend/0.1.2:
-    resolution: {integrity: sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=, tarball: static-extend/download/static-extend-0.1.2.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      define-property: 0.2.5
-      object-copy: 0.1.0
-    dev: true
-
-  /statuses/1.5.0:
-    resolution: {integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=, tarball: statuses/download/statuses-1.5.0.tgz}
-    engines: {node: '>= 0.6'}
-    dev: true
-
-  /strict-uri-encode/1.1.0:
-    resolution: {integrity: sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=, tarball: strict-uri-encode/download/strict-uri-encode-1.1.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /string-width/4.2.3:
-    resolution: {integrity: sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=, tarball: string-width/download/string-width-4.2.3.tgz}
-    engines: {node: '>=8'}
-    dependencies:
-      emoji-regex: 8.0.0
-      is-fullwidth-code-point: 3.0.0
-      strip-ansi: 6.0.1
-
-  /string.prototype.matchall/4.0.6:
-    resolution: {integrity: sha1-Wrtdq8lMew6iOA9lumELOlRLFfo=, tarball: string.prototype.matchall/download/string.prototype.matchall-4.0.6.tgz}
-    dependencies:
-      call-bind: 1.0.2
-      define-properties: 1.1.3
-      es-abstract: 1.19.1
-      get-intrinsic: 1.1.1
-      has-symbols: 1.0.2
-      internal-slot: 1.0.3
-      regexp.prototype.flags: 1.3.1
-      side-channel: 1.0.4
-    dev: true
-
-  /string.prototype.trimend/1.0.4:
-    resolution: {integrity: sha1-51rpDClCxjUEaGwYsoe0oLGkX4A=, tarball: string.prototype.trimend/download/string.prototype.trimend-1.0.4.tgz}
-    dependencies:
-      call-bind: 1.0.2
-      define-properties: 1.1.3
-    dev: true
-
-  /string.prototype.trimstart/1.0.4:
-    resolution: {integrity: sha1-s2OZr0qymZtMnGSL16P7K7Jv7u0=, tarball: string.prototype.trimstart/download/string.prototype.trimstart-1.0.4.tgz}
-    dependencies:
-      call-bind: 1.0.2
-      define-properties: 1.1.3
-    dev: true
-
-  /string_decoder/1.1.1:
-    resolution: {integrity: sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=, tarball: string_decoder/download/string_decoder-1.1.1.tgz}
-    dependencies:
-      safe-buffer: 5.1.2
-    dev: true
-
-  /string_decoder/1.3.0:
-    resolution: {integrity: sha1-QvEUWUpGzxqOMLCoT1bHjD7awh4=, tarball: string_decoder/download/string_decoder-1.3.0.tgz}
-    dependencies:
-      safe-buffer: 5.2.1
-    dev: true
-
-  /stringify-object/3.3.0:
-    resolution: {integrity: sha1-cDBlrvyhkwDTzoivT1s5VtdVZik=, tarball: stringify-object/download/stringify-object-3.3.0.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      get-own-enumerable-property-symbols: 3.0.2
-      is-obj: 1.0.1
-      is-regexp: 1.0.0
-    dev: true
-
-  /strip-ansi/3.0.1:
-    resolution: {integrity: sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=, tarball: strip-ansi/download/strip-ansi-3.0.1.tgz?cache=0&sync_timestamp=1632822728166&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-3.0.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      ansi-regex: 2.1.1
-    dev: true
-
-  /strip-ansi/6.0.1:
-    resolution: {integrity: sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=, tarball: strip-ansi/download/strip-ansi-6.0.1.tgz?cache=0&sync_timestamp=1632822728166&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fstrip-ansi%2Fdownload%2Fstrip-ansi-6.0.1.tgz}
-    engines: {node: '>=8'}
-    dependencies:
-      ansi-regex: 5.0.1
-
-  /strip-bom/2.0.0:
-    resolution: {integrity: sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=, tarball: strip-bom/download/strip-bom-2.0.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      is-utf8: 0.2.1
-    dev: true
-
-  /strip-comments/2.0.1:
-    resolution: {integrity: sha1-StEcP7ysF3pnpArCJMoznKHBups=, tarball: strip-comments/download/strip-comments-2.0.1.tgz}
-    engines: {node: '>=10'}
-    dev: true
-
-  /strip-dirs/2.1.0:
-    resolution: {integrity: sha1-SYdzYmT8NEzyD2w0rKnRPR1O1sU=, tarball: strip-dirs/download/strip-dirs-2.1.0.tgz}
-    dependencies:
-      is-natural-number: 4.0.1
-    dev: true
-
-  /strip-eof/1.0.0:
-    resolution: {integrity: sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=, tarball: strip-eof/download/strip-eof-1.0.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /strip-final-newline/2.0.0:
-    resolution: {integrity: sha1-ibhS+y/L6Tb29LMYevsKEsGrWK0=, tarball: strip-final-newline/download/strip-final-newline-2.0.0.tgz}
-    engines: {node: '>=6'}
-    dev: true
-
-  /strip-indent/1.0.1:
-    resolution: {integrity: sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=, tarball: strip-indent/download/strip-indent-1.0.1.tgz}
-    engines: {node: '>=0.10.0'}
-    hasBin: true
-    dependencies:
-      get-stdin: 4.0.1
-    dev: true
-
-  /strip-outer/1.0.1:
-    resolution: {integrity: sha1-sv0qv2YEudHmATBXGV34Nrip1jE=, tarball: strip-outer/download/strip-outer-1.0.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      escape-string-regexp: 1.0.5
-    dev: true
-
-  /strnum/1.0.5:
-    resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==, tarball: strnum/download/strnum-1.0.5.tgz}
-    dev: true
-
-  /supports-color/2.0.0:
-    resolution: {integrity: sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=, tarball: supports-color/download/supports-color-2.0.0.tgz}
-    engines: {node: '>=0.8.0'}
-    dev: true
-
-  /supports-color/3.2.3:
-    resolution: {integrity: sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=, tarball: supports-color/download/supports-color-3.2.3.tgz}
-    engines: {node: '>=0.8.0'}
-    dependencies:
-      has-flag: 1.0.0
-    dev: true
-
-  /supports-color/5.5.0:
-    resolution: {integrity: sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=, tarball: supports-color/download/supports-color-5.5.0.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      has-flag: 3.0.0
-    dev: true
-
-  /supports-color/7.2.0:
-    resolution: {integrity: sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=, tarball: supports-color/download/supports-color-7.2.0.tgz}
-    engines: {node: '>=8'}
-    dependencies:
-      has-flag: 4.0.0
-    dev: true
-
-  /svg-baker/1.7.0:
-    resolution: {integrity: sha1-g2f3jYdVUMUv5HVvcwPVxdfC6ac=, tarball: svg-baker/download/svg-baker-1.7.0.tgz}
-    dependencies:
-      bluebird: 3.7.2
-      clone: 2.1.2
-      he: 1.2.0
-      image-size: 0.5.5
-      loader-utils: 1.4.0
-      merge-options: 1.0.1
-      micromatch: 3.1.0
-      postcss: 5.2.18
-      postcss-prefix-selector: 1.14.0_postcss@5.2.18
-      posthtml-rename-id: 1.0.12
-      posthtml-svg-mode: 1.0.3
-      query-string: 4.3.4
-      traverse: 0.6.6
-    dev: true
-
-  /svg-tags/1.0.0:
-    resolution: {integrity: sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=, tarball: svg-tags/download/svg-tags-1.0.0.tgz}
-    dev: true
-
-  /svgo/2.8.0:
-    resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==, tarball: svgo/download/svgo-2.8.0.tgz}
-    engines: {node: '>=10.13.0'}
-    hasBin: true
-    dependencies:
-      '@trysound/sax': 0.2.0
-      commander: 7.2.0
-      css-select: 4.2.0
-      css-tree: 1.1.3
-      csso: 4.2.0
-      picocolors: 1.0.0
-      stable: 0.1.8
-    dev: true
-
-  /systemjs/6.11.0:
-    resolution: {integrity: sha1-jfjnT8BYIubEAXCqQJucpkgzMV8=, tarball: systemjs/download/systemjs-6.11.0.tgz}
-    dev: true
-
-  /tar-stream/1.6.2:
-    resolution: {integrity: sha1-jqVdqzeXIlPZqa+Q/c1VmuQ1xVU=, tarball: tar-stream/download/tar-stream-1.6.2.tgz}
-    engines: {node: '>= 0.8.0'}
-    dependencies:
-      bl: 1.2.3
-      buffer-alloc: 1.2.0
-      end-of-stream: 1.4.4
-      fs-constants: 1.0.0
-      readable-stream: 2.3.7
-      to-buffer: 1.1.1
-      xtend: 4.0.2
-    dev: true
-
-  /temp-dir/1.0.0:
-    resolution: {integrity: sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=, tarball: temp-dir/download/temp-dir-1.0.0.tgz}
-    engines: {node: '>=4'}
-    dev: true
-
-  /temp-dir/2.0.0:
-    resolution: {integrity: sha1-vekrBb3+sVFugEycAK1FF38xMh4=, tarball: temp-dir/download/temp-dir-2.0.0.tgz}
-    engines: {node: '>=8'}
-    dev: true
-
-  /tempfile/2.0.0:
-    resolution: {integrity: sha1-awRGhWqbERTRhW/8vlCczLCXcmU=, tarball: tempfile/download/tempfile-2.0.0.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      temp-dir: 1.0.0
-      uuid: 3.4.0
-    dev: true
-
-  /tempy/0.6.0:
-    resolution: {integrity: sha1-ZeLDWrwG8RJKl/OHsIMDRCveWfM=, tarball: tempy/download/tempy-0.6.0.tgz}
-    engines: {node: '>=10'}
-    dependencies:
-      is-stream: 2.0.1
-      temp-dir: 2.0.0
-      type-fest: 0.16.0
-      unique-string: 2.0.0
-    dev: true
-
-  /terser/4.8.0:
-    resolution: {integrity: sha1-YwVjQ9fHC7KfOvZlhlpG/gOg3xc=, tarball: terser/download/terser-4.8.0.tgz}
-    engines: {node: '>=6.0.0'}
-    hasBin: true
-    dependencies:
-      commander: 2.20.3
-      source-map: 0.6.1
-      source-map-support: 0.5.21
-    dev: true
-
-  /terser/5.10.0:
-    resolution: {integrity: sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==, tarball: terser/download/terser-5.10.0.tgz}
-    engines: {node: '>=10'}
-    hasBin: true
-    peerDependencies:
-      acorn: ^8.5.0
-    peerDependenciesMeta:
-      acorn:
-        optional: true
-    dependencies:
-      commander: 2.20.3
-      source-map: 0.7.3
-      source-map-support: 0.5.21
-    dev: true
-
-  /through/2.3.8:
-    resolution: {integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=, tarball: through/download/through-2.3.8.tgz?cache=0&sync_timestamp=1632822694437&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Fthrough%2Fdownload%2Fthrough-2.3.8.tgz}
-    dev: true
-
-  /timed-out/4.0.1:
-    resolution: {integrity: sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=, tarball: timed-out/download/timed-out-4.0.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /tinycolor2/1.4.2:
-    resolution: {integrity: sha1-P2pNEHGtB2dtf6Ry4frECnGdiAM=, tarball: tinycolor2/download/tinycolor2-1.4.2.tgz}
-    dev: true
-
-  /tmp/0.0.33:
-    resolution: {integrity: sha1-bTQzWIl2jSGyvNoKonfO07G/rfk=, tarball: tmp/download/tmp-0.0.33.tgz}
-    engines: {node: '>=0.6.0'}
-    dependencies:
-      os-tmpdir: 1.0.2
-    dev: true
-
-  /to-buffer/1.1.1:
-    resolution: {integrity: sha1-STvUj2LXxD/N7TE6A9ytsuEhOoA=, tarball: to-buffer/download/to-buffer-1.1.1.tgz}
-    dev: true
-
-  /to-fast-properties/2.0.0:
-    resolution: {integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=, tarball: to-fast-properties/download/to-fast-properties-2.0.0.tgz}
-    engines: {node: '>=4'}
-    dev: true
-
-  /to-object-path/0.3.0:
-    resolution: {integrity: sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=, tarball: to-object-path/download/to-object-path-0.3.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      kind-of: 3.2.2
-    dev: true
-
-  /to-regex-range/2.1.1:
-    resolution: {integrity: sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=, tarball: to-regex-range/download/to-regex-range-2.1.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      is-number: 3.0.0
-      repeat-string: 1.6.1
-    dev: true
-
-  /to-regex-range/5.0.1:
-    resolution: {integrity: sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=, tarball: to-regex-range/download/to-regex-range-5.0.1.tgz}
-    engines: {node: '>=8.0'}
-    dependencies:
-      is-number: 7.0.0
-    dev: true
-
-  /to-regex/3.0.2:
-    resolution: {integrity: sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=, tarball: to-regex/download/to-regex-3.0.2.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      define-property: 2.0.2
-      extend-shallow: 3.0.2
-      regex-not: 1.0.2
-      safe-regex: 1.1.0
-    dev: true
-
-  /tr46/1.0.1:
-    resolution: {integrity: sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=, tarball: tr46/download/tr46-1.0.1.tgz}
-    dependencies:
-      punycode: 2.1.1
-    dev: true
-
-  /traverse/0.6.6:
-    resolution: {integrity: sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=, tarball: traverse/download/traverse-0.6.6.tgz}
-    dev: true
-
-  /trim-newlines/1.0.0:
-    resolution: {integrity: sha1-WIeWa7WCpFA6QetST301ARgVphM=, tarball: trim-newlines/download/trim-newlines-1.0.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /trim-repeated/1.0.0:
-    resolution: {integrity: sha1-42RqLqTokTEr9+rObPsFOAvAHCE=, tarball: trim-repeated/download/trim-repeated-1.0.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      escape-string-regexp: 1.0.5
-    dev: true
-
-  /tslib/2.1.0:
-    resolution: {integrity: sha1-2mCGDxwuyqVwOrfTm8Bba/mIuXo=, tarball: tslib/download/tslib-2.1.0.tgz}
-    dev: true
-
-  /tslib/2.3.0:
-    resolution: {integrity: sha1-gDuM2rPhK6WBpMpByIObuw2ssJ4=, tarball: tslib/download/tslib-2.3.0.tgz}
-    dev: false
-
-  /tslib/2.3.1:
-    resolution: {integrity: sha1-6KM1rdXOrlGqJh0ypJAVjvBC7wE=, tarball: tslib/download/tslib-2.3.1.tgz}
-    dev: true
-
-  /tunnel-agent/0.6.0:
-    resolution: {integrity: sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=, tarball: tunnel-agent/download/tunnel-agent-0.6.0.tgz}
-    dependencies:
-      safe-buffer: 5.2.1
-    dev: true
-
-  /type-fest/0.11.0:
-    resolution: {integrity: sha1-l6vwhyMQ/tiKXEZrJWgVdhReM/E=, tarball: type-fest/download/type-fest-0.11.0.tgz}
-    engines: {node: '>=8'}
-    dev: true
-
-  /type-fest/0.16.0:
-    resolution: {integrity: sha1-MkC4kaeLDerpENvrhlU+VSoUiGA=, tarball: type-fest/download/type-fest-0.16.0.tgz}
-    engines: {node: '>=10'}
-    dev: true
-
-  /type-fest/0.21.3:
-    resolution: {integrity: sha1-0mCiSwGYQ24TP6JqUkptZfo7Ljc=, tarball: type-fest/download/type-fest-0.21.3.tgz}
-    engines: {node: '>=10'}
-    dev: true
-
-  /typescript/4.5.4:
-    resolution: {integrity: sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==, tarball: typescript/download/typescript-4.5.4.tgz}
-    engines: {node: '>=4.2.0'}
-    hasBin: true
-    dev: true
-
-  /unbox-primitive/1.0.1:
-    resolution: {integrity: sha1-CF4hViXsMWJXTciFmr7nilmxRHE=, tarball: unbox-primitive/download/unbox-primitive-1.0.1.tgz}
-    dependencies:
-      function-bind: 1.1.1
-      has-bigints: 1.0.1
-      has-symbols: 1.0.2
-      which-boxed-primitive: 1.0.2
-    dev: true
-
-  /unbzip2-stream/1.4.3:
-    resolution: {integrity: sha1-sNoExDcTEd93HNwhXofyEwmRrOc=, tarball: unbzip2-stream/download/unbzip2-stream-1.4.3.tgz}
-    dependencies:
-      buffer: 5.7.1
-      through: 2.3.8
-    dev: true
-
-  /unicode-canonical-property-names-ecmascript/2.0.0:
-    resolution: {integrity: sha1-MBrNxSVjFnDTn2FG4Od/9rvevdw=, tarball: unicode-canonical-property-names-ecmascript/download/unicode-canonical-property-names-ecmascript-2.0.0.tgz}
-    engines: {node: '>=4'}
-    dev: true
-
-  /unicode-match-property-ecmascript/2.0.0:
-    resolution: {integrity: sha1-VP0W4OyxZ88Ezx91a9zJLrp5dsM=, tarball: unicode-match-property-ecmascript/download/unicode-match-property-ecmascript-2.0.0.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      unicode-canonical-property-names-ecmascript: 2.0.0
-      unicode-property-aliases-ecmascript: 2.0.0
-    dev: true
-
-  /unicode-match-property-value-ecmascript/2.0.0:
-    resolution: {integrity: sha1-GgGqVyR8FMVouJd1pUk4eIGJpxQ=, tarball: unicode-match-property-value-ecmascript/download/unicode-match-property-value-ecmascript-2.0.0.tgz}
-    engines: {node: '>=4'}
-    dev: true
-
-  /unicode-property-aliases-ecmascript/2.0.0:
-    resolution: {integrity: sha1-CjbLmlhcT2q9Ua0d7dsoXBZSl8g=, tarball: unicode-property-aliases-ecmascript/download/unicode-property-aliases-ecmascript-2.0.0.tgz}
-    engines: {node: '>=4'}
-    dev: true
-
-  /union-value/1.0.1:
-    resolution: {integrity: sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc=, tarball: union-value/download/union-value-1.0.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      arr-union: 3.1.0
-      get-value: 2.0.6
-      is-extendable: 0.1.1
-      set-value: 2.0.1
-    dev: true
-
-  /unique-string/2.0.0:
-    resolution: {integrity: sha1-OcZFH4GvsnSd4rIz4/fF6IQ72J0=, tarball: unique-string/download/unique-string-2.0.0.tgz}
-    engines: {node: '>=8'}
-    dependencies:
-      crypto-random-string: 2.0.0
-    dev: true
-
-  /universalify/2.0.0:
-    resolution: {integrity: sha1-daSYTv7cSwiXXFrrc/Uw0C3yVxc=, tarball: universalify/download/universalify-2.0.0.tgz}
-    engines: {node: '>= 10.0.0'}
-    dev: true
-
-  /unpipe/1.0.0:
-    resolution: {integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=, tarball: unpipe/download/unpipe-1.0.0.tgz}
-    engines: {node: '>= 0.8'}
-    dev: true
-
-  /unset-value/1.0.0:
-    resolution: {integrity: sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=, tarball: unset-value/download/unset-value-1.0.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      has-value: 0.3.1
-      isobject: 3.0.1
-    dev: true
-
-  /upath/1.2.0:
-    resolution: {integrity: sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ=, tarball: upath/download/upath-1.2.0.tgz}
-    engines: {node: '>=4'}
-    dev: true
-
-  /upper-case-first/2.0.2:
-    resolution: {integrity: sha1-mSwyc/iCq9GdHgKJTMFHEX+EQyQ=, tarball: upper-case-first/download/upper-case-first-2.0.2.tgz}
-    dependencies:
-      tslib: 2.3.1
-    dev: true
-
-  /upper-case/2.0.2:
-    resolution: {integrity: sha1-2JgQgj+qsd8VSbfZenb4Ziuub3o=, tarball: upper-case/download/upper-case-2.0.2.tgz}
-    dependencies:
-      tslib: 2.3.1
-    dev: true
-
-  /uri-js/4.4.1:
-    resolution: {integrity: sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34=, tarball: uri-js/download/uri-js-4.4.1.tgz}
-    dependencies:
-      punycode: 2.1.1
-    dev: true
-
-  /urix/0.1.0:
-    resolution: {integrity: sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=, tarball: urix/download/urix-0.1.0.tgz}
-    deprecated: Please see https://github.com/lydell/urix#deprecated
-    dev: true
-
-  /url-parse-lax/1.0.0:
-    resolution: {integrity: sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=, tarball: url-parse-lax/download/url-parse-lax-1.0.0.tgz}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      prepend-http: 1.0.4
-    dev: true
-
-  /url-parse-lax/3.0.0:
-    resolution: {integrity: sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=, tarball: url-parse-lax/download/url-parse-lax-3.0.0.tgz}
-    engines: {node: '>=4'}
-    dependencies:
-      prepend-http: 2.0.0
-    dev: true
-
-  /url-to-options/1.0.1:
-    resolution: {integrity: sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=, tarball: url-to-options/download/url-to-options-1.0.1.tgz}
-    engines: {node: '>= 4'}
-    dev: true
-
-  /use/3.1.1:
-    resolution: {integrity: sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8=, tarball: use/download/use-3.1.1.tgz}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /util-deprecate/1.0.2:
-    resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=, tarball: util-deprecate/download/util-deprecate-1.0.2.tgz}
-    dev: true
-
-  /utils-merge/1.0.1:
-    resolution: {integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=, tarball: utils-merge/download/utils-merge-1.0.1.tgz}
-    engines: {node: '>= 0.4.0'}
-    dev: true
-
-  /uuid/3.4.0:
-    resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==, tarball: uuid/download/uuid-3.4.0.tgz}
-    deprecated: Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.
-    hasBin: true
-    dev: true
-
-  /validate-npm-package-license/3.0.4:
-    resolution: {integrity: sha1-/JH2uce6FchX9MssXe/uw51PQQo=, tarball: validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz}
-    dependencies:
-      spdx-correct: 3.1.1
-      spdx-expression-parse: 3.0.1
-    dev: true
-
-  /vary/1.1.2:
-    resolution: {integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=, tarball: vary/download/vary-1.1.2.tgz}
-    engines: {node: '>= 0.8'}
-    dev: true
-
-  /vite-plugin-compression/0.3.6_vite@2.7.6:
-    resolution: {integrity: sha512-aSskQCJsP3VQ8PsnY+vO7UfD5qoFMOEuzg0PG2E9Zqyx+ARmc3wr9KCgOFraZOFW1Y4UAa5BR0SMTjoxHRMJoQ==, tarball: vite-plugin-compression/download/vite-plugin-compression-0.3.6.tgz}
-    peerDependencies:
-      vite: '>=2.0.0'
-    dependencies:
-      chalk: 4.1.2
-      debug: 4.3.3
-      fs-extra: 10.0.0
-      vite: 2.7.6_less@4.1.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /vite-plugin-html/2.1.1_vite@2.7.6:
-    resolution: {integrity: sha1-AUtEEmpy1FnNRgvRVoAMIl0STL4=, tarball: vite-plugin-html/download/vite-plugin-html-2.1.1.tgz}
-    peerDependencies:
-      vite: '>=2.0.0'
-    dependencies:
-      '@rollup/pluginutils': 4.1.2
-      dotenv: 10.0.0
-      dotenv-expand: 5.1.0
-      ejs: 3.1.6
-      fs-extra: 10.0.0
-      html-minifier-terser: 5.1.1
-      vite: 2.7.6_less@4.1.2
-    dev: true
-
-  /vite-plugin-imagemin/0.4.6_vite@2.7.6:
-    resolution: {integrity: sha1-9VHaywUpyjJ6gNL1gwtcwMy1Z3o=, tarball: vite-plugin-imagemin/download/vite-plugin-imagemin-0.4.6.tgz}
-    peerDependencies:
-      vite: '>=2.0.0'
-    dependencies:
-      '@types/imagemin': 7.0.1
-      '@types/imagemin-gifsicle': 7.0.1
-      '@types/imagemin-jpegtran': 5.0.1
-      '@types/imagemin-mozjpeg': 8.0.1
-      '@types/imagemin-optipng': 5.2.1
-      '@types/imagemin-svgo': 9.0.1
-      '@types/imagemin-webp': 5.1.2
-      '@types/svgo': 2.6.0
-      chalk: 4.1.2
-      debug: 4.3.3
-      esbuild: 0.13.15
-      fs-extra: 10.0.0
-      imagemin: 7.0.1
-      imagemin-gifsicle: 7.0.0
-      imagemin-jpegtran: 7.0.0
-      imagemin-mozjpeg: 9.0.0
-      imagemin-optipng: 8.0.0
-      imagemin-pngquant: 9.0.2
-      imagemin-svgo: 9.0.0
-      imagemin-webp: 6.0.0
-      vite: 2.7.6_less@4.1.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /vite-plugin-mock/2.9.6_mockjs@1.1.0+vite@2.7.6:
-    resolution: {integrity: sha1-BN0j3muqBS+qW5rTF1FMkNYgXiU=, tarball: vite-plugin-mock/download/vite-plugin-mock-2.9.6.tgz}
-    engines: {node: '>=12.0.0'}
-    peerDependencies:
-      mockjs: '>=1.1.0'
-      vite: '>=2.0.0'
-    dependencies:
-      '@rollup/plugin-node-resolve': 13.1.1
-      '@types/mockjs': 1.0.4
-      chalk: 4.1.2
-      chokidar: 3.5.2
-      connect: 3.7.0
-      debug: 4.3.3
-      esbuild: 0.11.3
-      fast-glob: 3.2.7
-      mockjs: 1.1.0
-      path-to-regexp: 6.2.0
-      vite: 2.7.6_less@4.1.2
-    transitivePeerDependencies:
-      - rollup
-      - supports-color
-    dev: true
-
-  /vite-plugin-purge-icons/0.7.0_vite@2.7.6:
-    resolution: {integrity: sha1-xGADdDj9cTchUzYMy559l7Aw+1g=, tarball: vite-plugin-purge-icons/download/vite-plugin-purge-icons-0.7.0.tgz}
-    engines: {node: '>= 12'}
-    peerDependencies:
-      vite: ^2.0.0-beta.3
-    dependencies:
-      '@purge-icons/core': 0.7.0
-      '@purge-icons/generated': 0.7.0
-      rollup-plugin-purge-icons: 0.7.0
-      vite: 2.7.6_less@4.1.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /vite-plugin-pwa/0.11.12_vite@2.7.6:
-    resolution: {integrity: sha512-XqFmA4y9C4RBb5osSsa26GVwOSwbzf2GNVcT5+06KYYdguqLpuI9FW7iV/akZqg0OUNUpH4tHfme8SnHA4PIXA==, tarball: vite-plugin-pwa/download/vite-plugin-pwa-0.11.12.tgz}
-    peerDependencies:
-      vite: ^2.0.0
-    dependencies:
-      debug: 4.3.3
-      fast-glob: 3.2.7
-      pretty-bytes: 5.6.0
-      rollup: 2.61.1
-      vite: 2.7.6_less@4.1.2
-      workbox-build: 6.4.2
-      workbox-window: 6.4.2
-    transitivePeerDependencies:
-      - '@types/babel__core'
-      - acorn
-      - supports-color
-    dev: true
-
-  /vite-plugin-style-import/1.4.0_vite@2.7.6:
-    resolution: {integrity: sha512-EGAx0zVGUkwAwvDaC66zxgzXyHE0CwAXp4O1xGKnpMcrDT9L1nlojiCjjLRQzL8C3zwY1jn9ilq+m0VABKiiLg==, tarball: vite-plugin-style-import/download/vite-plugin-style-import-1.4.0.tgz}
-    peerDependencies:
-      vite: '>=2.0.0'
-    dependencies:
-      '@rollup/pluginutils': 4.1.2
-      change-case: 4.1.2
-      debug: 4.3.3
-      es-module-lexer: 0.9.3
-      fs-extra: 10.0.0
-      magic-string: 0.25.7
-      vite: 2.7.6_less@4.1.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /vite-plugin-svg-icons/1.0.5_vite@2.7.6:
-    resolution: {integrity: sha1-gHHj2nxQ1WFOk3JlW5uR+vkd9ZE=, tarball: vite-plugin-svg-icons/download/vite-plugin-svg-icons-1.0.5.tgz}
-    peerDependencies:
-      vite: '>=2.0.0'
-    dependencies:
-      '@types/svgo': 2.6.0
-      cors: 2.8.5
-      debug: 4.3.3
-      etag: 1.8.1
-      fs-extra: 10.0.0
-      svg-baker: 1.7.0
-      svgo: 2.8.0
-      vite: 2.7.6_less@4.1.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /vite-plugin-theme/0.8.1_vite@2.7.6:
-    resolution: {integrity: sha1-kAglalilfcqBAE/6HeY86fYL+es=, tarball: vite-plugin-theme/download/vite-plugin-theme-0.8.1.tgz}
-    peerDependencies:
-      vite: '>=2.0.0-beta.49'
-    dependencies:
-      '@types/node': 14.18.2
-      '@types/tinycolor2': 1.4.3
-      chalk: 4.1.2
-      clean-css: 5.2.2
-      debug: 4.3.3
-      esbuild: 0.11.23
-      esbuild-plugin-alias: 0.1.2
-      tinycolor2: 1.4.2
-      vite: 2.7.6_less@4.1.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /vite-plugin-vue-setup-extend/0.1.0_vite@2.7.6:
-    resolution: {integrity: sha1-nwjvu8Ku0QP1SbNpbe5dRi2yPzg=, tarball: vite-plugin-vue-setup-extend/download/vite-plugin-vue-setup-extend-0.1.0.tgz}
-    peerDependencies:
-      vite: '>=2.0.0'
-    dependencies:
-      '@vue/compiler-sfc': 3.2.21
-      magic-string: 0.25.7
-      vite: 2.7.6_less@4.1.2
-    dev: true
-
-  /vite-plugin-windicss/1.6.1_vite@2.7.6:
-    resolution: {integrity: sha512-63uv4HqBxtSZB0WOtrZS8yhyfQPgGQwYgcBald+/BpLSlYJREcDKgX9Xd/qDgTAjpDRozxKQj/JWreIlyIahGg==, tarball: vite-plugin-windicss/download/vite-plugin-windicss-1.6.1.tgz}
-    peerDependencies:
-      vite: ^2.0.1
-    dependencies:
-      '@windicss/plugin-utils': 1.6.1
-      debug: 4.3.3
-      kolorist: 1.5.1
-      vite: 2.7.6_less@4.1.2
-      windicss: 3.4.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /vite/2.7.6_less@4.1.2:
-    resolution: {integrity: sha512-PBNoc87rDYLtkpFU9dbVeGdbcyKzz6c34oScqivE3FEa3BhVa4ASupCzcz0eDIiSECovfLcQnLUJt9vhiEU08g==, tarball: vite/download/vite-2.7.6.tgz}
-    engines: {node: '>=12.2.0'}
-    hasBin: true
-    peerDependencies:
-      less: '*'
-      sass: '*'
-      stylus: '*'
-    peerDependenciesMeta:
-      less:
-        optional: true
-      sass:
-        optional: true
-      stylus:
-        optional: true
-    dependencies:
-      esbuild: 0.13.15
-      less: 4.1.2
-      postcss: 8.4.5
-      resolve: 1.20.0
-      rollup: 2.61.1
-    optionalDependencies:
-      fsevents: 2.3.2
-    dev: true
-
-  /vue-demi/0.12.1_vue@3.2.26:
-    resolution: {integrity: sha1-9+GO++z/0RqwadFHLXoG4xm0F0w=, tarball: vue-demi/download/vue-demi-0.12.1.tgz}
-    engines: {node: '>=12'}
-    hasBin: true
-    requiresBuild: true
-    peerDependencies:
-      '@vue/composition-api': ^1.0.0-rc.1
-      vue: ^3.0.0-0 || ^2.6.0
-    peerDependenciesMeta:
-      '@vue/composition-api':
-        optional: true
-    dependencies:
-      vue: 3.2.26
-    dev: false
-
-  /vue-i18n/9.1.9_vue@3.2.26:
-    resolution: {integrity: sha1-y1PgarXMW37tWTMvFRyvSNR76bs=, tarball: vue-i18n/download/vue-i18n-9.1.9.tgz}
-    engines: {node: '>= 10'}
-    peerDependencies:
-      vue: ^3.0.0
-    dependencies:
-      '@intlify/core-base': 9.1.9
-      '@intlify/shared': 9.1.9
-      '@intlify/vue-devtools': 9.1.9
-      '@vue/devtools-api': 6.0.0-beta.21.1
-      vue: 3.2.26
-    dev: false
-
-  /vue-router/4.0.12_vue@3.2.26:
-    resolution: {integrity: sha512-CPXvfqe+mZLB1kBWssssTiWg4EQERyqJZes7USiqfW9B5N2x+nHlnsM1D3b5CaJ6qgCvMmYJnz+G0iWjNCvXrg==, tarball: vue-router/download/vue-router-4.0.12.tgz}
-    peerDependencies:
-      vue: ^3.0.0
-    dependencies:
-      '@vue/devtools-api': 6.0.0-beta.21.1
-      vue: 3.2.26
-    dev: false
-
-  /vue-types/3.0.2_vue@3.2.26:
-    resolution: {integrity: sha1-7BbgXUEsA4Ji/B76TOuWR+f7YB0=, tarball: vue-types/download/vue-types-3.0.2.tgz}
-    engines: {node: '>=10.15.0'}
-    peerDependencies:
-      vue: ^3.0.0
-    dependencies:
-      is-plain-object: 3.0.1
-      vue: 3.2.26
-    dev: false
-
-  /vue-types/4.1.1_vue@3.2.26:
-    resolution: {integrity: sha1-fXpOSgEkmlG22j+qMBJIwupfW5c=, tarball: vue-types/download/vue-types-4.1.1.tgz}
-    engines: {node: '>=12.16.0'}
-    peerDependencies:
-      vue: ^2.0.0 || ^3.0.0
-    dependencies:
-      is-plain-object: 5.0.0
-      vue: 3.2.26
-    dev: false
-
-  /vue/3.2.26:
-    resolution: {integrity: sha512-KD4lULmskL5cCsEkfhERVRIOEDrfEL9CwAsLYpzptOGjaGFNWo3BQ9g8MAb7RaIO71rmVOziZ/uEN/rHwcUIhg==, tarball: vue/download/vue-3.2.26.tgz}
-    dependencies:
-      '@vue/compiler-dom': 3.2.26
-      '@vue/compiler-sfc': 3.2.26
-      '@vue/runtime-dom': 3.2.26
-      '@vue/server-renderer': 3.2.26_vue@3.2.26
-      '@vue/shared': 3.2.26
-    dev: false
-
-  /warning/4.0.3:
-    resolution: {integrity: sha1-Fungd+uKhtavfWSqHgX9hbRnjKM=, tarball: warning/download/warning-4.0.3.tgz}
-    dependencies:
-      loose-envify: 1.4.0
-    dev: false
-
-  /wcwidth/1.0.1:
-    resolution: {integrity: sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=, tarball: wcwidth/download/wcwidth-1.0.1.tgz}
-    dependencies:
-      defaults: 1.0.3
-    dev: true
-
-  /webidl-conversions/4.0.2:
-    resolution: {integrity: sha1-qFWYCx8LazWbodXZ+zmulB+qY60=, tarball: webidl-conversions/download/webidl-conversions-4.0.2.tgz}
-    dev: true
-
-  /whatwg-url/7.1.0:
-    resolution: {integrity: sha1-wsSS8eymEpiO/T0iZr4bn8YXDQY=, tarball: whatwg-url/download/whatwg-url-7.1.0.tgz}
-    dependencies:
-      lodash.sortby: 4.7.0
-      tr46: 1.0.1
-      webidl-conversions: 4.0.2
-    dev: true
-
-  /which-boxed-primitive/1.0.2:
-    resolution: {integrity: sha1-E3V7yJsgmwSf5dhkMOIc9AqJqOY=, tarball: which-boxed-primitive/download/which-boxed-primitive-1.0.2.tgz}
-    dependencies:
-      is-bigint: 1.0.4
-      is-boolean-object: 1.1.2
-      is-number-object: 1.0.6
-      is-string: 1.0.7
-      is-symbol: 1.0.4
-    dev: true
-
-  /which-module/2.0.0:
-    resolution: {integrity: sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=, tarball: which-module/download/which-module-2.0.0.tgz}
-    dev: false
-
-  /which/1.3.1:
-    resolution: {integrity: sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=, tarball: which/download/which-1.3.1.tgz}
-    hasBin: true
-    dependencies:
-      isexe: 2.0.0
-    dev: true
-
-  /which/2.0.2:
-    resolution: {integrity: sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=, tarball: which/download/which-2.0.2.tgz}
-    engines: {node: '>= 8'}
-    hasBin: true
-    dependencies:
-      isexe: 2.0.0
-    dev: true
-
-  /windicss/3.4.0:
-    resolution: {integrity: sha512-X+9Y1/FPxX253Xo4Hk/qfVuvoAxgKx686Z6yHxmBFMH7wRCPdRO42na9k/yEnrW6EqCFJP/GcMIHn3QENaE42g==, tarball: windicss/download/windicss-3.4.0.tgz}
-    engines: {node: '>= 12'}
-    hasBin: true
-    dev: true
-
-  /workbox-background-sync/6.4.2:
-    resolution: {integrity: sha512-P7c8uG5X2k+DMICH9xeSA9eUlCOjHHYoB42Rq+RtUpuwBxUOflAXR1zdsMWj81LopE4gjKXlTw7BFd1BDAHo7g==, tarball: workbox-background-sync/download/workbox-background-sync-6.4.2.tgz}
-    dependencies:
-      idb: 6.1.5
-      workbox-core: 6.4.2
-    dev: true
-
-  /workbox-broadcast-update/6.4.2:
-    resolution: {integrity: sha512-qnBwQyE0+PWFFc/n4ISXINE49m44gbEreJUYt2ldGH3+CNrLmJ1egJOOyUqqu9R4Eb7QrXcmB34ClXG7S37LbA==, tarball: workbox-broadcast-update/download/workbox-broadcast-update-6.4.2.tgz}
-    dependencies:
-      workbox-core: 6.4.2
-    dev: true
-
-  /workbox-build/6.4.2:
-    resolution: {integrity: sha512-WMdYLhDIsuzViOTXDH+tJ1GijkFp5khSYolnxR/11zmfhNDtuo7jof72xPGFy+KRpsz6tug39RhivCj77qqO0w==, tarball: workbox-build/download/workbox-build-6.4.2.tgz}
-    engines: {node: '>=10.0.0'}
-    dependencies:
-      '@apideck/better-ajv-errors': 0.3.1_ajv@8.8.2
-      '@babel/core': 7.16.5
-      '@babel/preset-env': 7.16.5_@babel+core@7.16.5
-      '@babel/runtime': 7.16.5
-      '@rollup/plugin-babel': 5.3.0_@babel+core@7.16.5+rollup@2.61.1
-      '@rollup/plugin-node-resolve': 11.2.1_rollup@2.61.1
-      '@rollup/plugin-replace': 2.4.2_rollup@2.61.1
-      '@surma/rollup-plugin-off-main-thread': 2.2.3
-      ajv: 8.8.2
-      common-tags: 1.8.2
-      fast-json-stable-stringify: 2.1.0
-      fs-extra: 9.1.0
-      glob: 7.2.0
-      lodash: 4.17.21
-      pretty-bytes: 5.6.0
-      rollup: 2.61.1
-      rollup-plugin-terser: 7.0.2_rollup@2.61.1
-      source-map: 0.8.0-beta.0
-      source-map-url: 0.4.1
-      stringify-object: 3.3.0
-      strip-comments: 2.0.1
-      tempy: 0.6.0
-      upath: 1.2.0
-      workbox-background-sync: 6.4.2
-      workbox-broadcast-update: 6.4.2
-      workbox-cacheable-response: 6.4.2
-      workbox-core: 6.4.2
-      workbox-expiration: 6.4.2
-      workbox-google-analytics: 6.4.2
-      workbox-navigation-preload: 6.4.2
-      workbox-precaching: 6.4.2
-      workbox-range-requests: 6.4.2
-      workbox-recipes: 6.4.2
-      workbox-routing: 6.4.2
-      workbox-strategies: 6.4.2
-      workbox-streams: 6.4.2
-      workbox-sw: 6.4.2
-      workbox-window: 6.4.2
-    transitivePeerDependencies:
-      - '@types/babel__core'
-      - acorn
-      - supports-color
-    dev: true
-
-  /workbox-cacheable-response/6.4.2:
-    resolution: {integrity: sha512-9FE1W/cKffk1AJzImxgEN0ceWpyz1tqNjZVtA3/LAvYL3AC5SbIkhc7ZCO82WmO9IjTfu8Vut2X/C7ViMSF7TA==, tarball: workbox-cacheable-response/download/workbox-cacheable-response-6.4.2.tgz}
-    dependencies:
-      workbox-core: 6.4.2
-    dev: true
-
-  /workbox-core/6.4.2:
-    resolution: {integrity: sha512-1U6cdEYPcajRXiboSlpJx6U7TvhIKbxRRerfepAJu2hniKwJ3DHILjpU/zx3yvzSBCWcNJDoFalf7Vgd7ey/rw==, tarball: workbox-core/download/workbox-core-6.4.2.tgz}
-    dev: true
-
-  /workbox-expiration/6.4.2:
-    resolution: {integrity: sha512-0hbpBj0tDnW+DZOUmwZqntB/8xrXOgO34i7s00Si/VlFJvvpRKg1leXdHHU8ykoSBd6+F2KDcMP3swoCi5guLw==, tarball: workbox-expiration/download/workbox-expiration-6.4.2.tgz}
-    dependencies:
-      idb: 6.1.5
-      workbox-core: 6.4.2
-    dev: true
-
-  /workbox-google-analytics/6.4.2:
-    resolution: {integrity: sha512-u+gxs3jXovPb1oul4CTBOb+T9fS1oZG+ZE6AzS7l40vnyfJV79DaLBvlpEZfXGv3CjMdV1sT/ltdOrKzo7HcGw==, tarball: workbox-google-analytics/download/workbox-google-analytics-6.4.2.tgz}
-    dependencies:
-      workbox-background-sync: 6.4.2
-      workbox-core: 6.4.2
-      workbox-routing: 6.4.2
-      workbox-strategies: 6.4.2
-    dev: true
-
-  /workbox-navigation-preload/6.4.2:
-    resolution: {integrity: sha512-viyejlCtlKsbJCBHwhSBbWc57MwPXvUrc8P7d+87AxBGPU+JuWkT6nvBANgVgFz6FUhCvRC8aYt+B1helo166g==, tarball: workbox-navigation-preload/download/workbox-navigation-preload-6.4.2.tgz}
-    dependencies:
-      workbox-core: 6.4.2
-    dev: true
-
-  /workbox-precaching/6.4.2:
-    resolution: {integrity: sha512-CZ6uwFN/2wb4noHVlALL7UqPFbLfez/9S2GAzGAb0Sk876ul9ukRKPJJ6gtsxfE2HSTwqwuyNVa6xWyeyJ1XSA==, tarball: workbox-precaching/download/workbox-precaching-6.4.2.tgz}
-    dependencies:
-      workbox-core: 6.4.2
-      workbox-routing: 6.4.2
-      workbox-strategies: 6.4.2
-    dev: true
-
-  /workbox-range-requests/6.4.2:
-    resolution: {integrity: sha512-SowF3z69hr3Po/w7+xarWfzxJX/3Fo0uSG72Zg4g5FWWnHpq2zPvgbWerBZIa81zpJVUdYpMa3akJJsv+LaO1Q==, tarball: workbox-range-requests/download/workbox-range-requests-6.4.2.tgz}
-    dependencies:
-      workbox-core: 6.4.2
-    dev: true
-
-  /workbox-recipes/6.4.2:
-    resolution: {integrity: sha512-/oVxlZFpAjFVbY+3PoGEXe8qyvtmqMrTdWhbOfbwokNFtUZ/JCtanDKgwDv9x3AebqGAoJRvQNSru0F4nG+gWA==, tarball: workbox-recipes/download/workbox-recipes-6.4.2.tgz}
-    dependencies:
-      workbox-cacheable-response: 6.4.2
-      workbox-core: 6.4.2
-      workbox-expiration: 6.4.2
-      workbox-precaching: 6.4.2
-      workbox-routing: 6.4.2
-      workbox-strategies: 6.4.2
-    dev: true
-
-  /workbox-routing/6.4.2:
-    resolution: {integrity: sha512-0ss/n9PAcHjTy4Ad7l2puuod4WtsnRYu9BrmHcu6Dk4PgWeJo1t5VnGufPxNtcuyPGQ3OdnMdlmhMJ57sSrrSw==, tarball: workbox-routing/download/workbox-routing-6.4.2.tgz}
-    dependencies:
-      workbox-core: 6.4.2
-    dev: true
-
-  /workbox-strategies/6.4.2:
-    resolution: {integrity: sha512-YXh9E9dZGEO1EiPC3jPe2CbztO5WT8Ruj8wiYZM56XqEJp5YlGTtqRjghV+JovWOqkWdR+amJpV31KPWQUvn1Q==, tarball: workbox-strategies/download/workbox-strategies-6.4.2.tgz}
-    dependencies:
-      workbox-core: 6.4.2
-    dev: true
-
-  /workbox-streams/6.4.2:
-    resolution: {integrity: sha512-ROEGlZHGVEgpa5bOZefiJEVsi5PsFjJG9Xd+wnDbApsCO9xq9rYFopF+IRq9tChyYzhBnyk2hJxbQVWphz3sog==, tarball: workbox-streams/download/workbox-streams-6.4.2.tgz}
-    dependencies:
-      workbox-core: 6.4.2
-      workbox-routing: 6.4.2
-    dev: true
-
-  /workbox-sw/6.4.2:
-    resolution: {integrity: sha512-A2qdu9TLktfIM5NE/8+yYwfWu+JgDaCkbo5ikrky2c7r9v2X6DcJ+zSLphNHHLwM/0eVk5XVf1mC5HGhYpMhhg==, tarball: workbox-sw/download/workbox-sw-6.4.2.tgz}
-    dev: true
-
-  /workbox-window/6.4.2:
-    resolution: {integrity: sha512-KVyRKmrJg7iB+uym/B/CnEUEFG9CvnTU1Bq5xpXHbtgD9l+ShDekSl1wYpqw/O0JfeeQVOFb8CiNfvnwWwqnWQ==, tarball: workbox-window/download/workbox-window-6.4.2.tgz}
-    dependencies:
-      '@types/trusted-types': 2.0.2
-      workbox-core: 6.4.2
-    dev: true
-
-  /wrap-ansi/6.2.0:
-    resolution: {integrity: sha1-6Tk7oHEC5skaOyIUePAlfNKFblM=, tarball: wrap-ansi/download/wrap-ansi-6.2.0.tgz}
-    engines: {node: '>=8'}
-    dependencies:
-      ansi-styles: 4.3.0
-      string-width: 4.2.3
-      strip-ansi: 6.0.1
-    dev: false
-
-  /wrap-ansi/7.0.0:
-    resolution: {integrity: sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM=, tarball: wrap-ansi/download/wrap-ansi-7.0.0.tgz}
-    engines: {node: '>=10'}
-    dependencies:
-      ansi-styles: 4.3.0
-      string-width: 4.2.3
-      strip-ansi: 6.0.1
-    dev: true
-
-  /wrappy/1.0.2:
-    resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=, tarball: wrappy/download/wrappy-1.0.2.tgz}
-    dev: true
-
-  /xtend/4.0.2:
-    resolution: {integrity: sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q=, tarball: xtend/download/xtend-4.0.2.tgz}
-    engines: {node: '>=0.4'}
-    dev: true
-
-  /y18n/4.0.3:
-    resolution: {integrity: sha1-tfJZyCzW4zaSHv17/Yv1YN6e7t8=, tarball: y18n/download/y18n-4.0.3.tgz}
-    dev: false
-
-  /y18n/5.0.8:
-    resolution: {integrity: sha1-f0k00PfKjFb5UxSTndzS3ZHOHVU=, tarball: y18n/download/y18n-5.0.8.tgz}
-    engines: {node: '>=10'}
-    dev: true
-
-  /yallist/2.1.2:
-    resolution: {integrity: sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=, tarball: yallist/download/yallist-2.1.2.tgz}
-    dev: true
-
-  /yargs-parser/18.1.3:
-    resolution: {integrity: sha1-vmjEl1xrKr9GkjawyHA2L6sJp7A=, tarball: yargs-parser/download/yargs-parser-18.1.3.tgz}
-    engines: {node: '>=6'}
-    dependencies:
-      camelcase: 5.3.1
-      decamelize: 1.2.0
-    dev: false
-
-  /yargs-parser/20.2.9:
-    resolution: {integrity: sha1-LrfcOwKJcY/ClfNidThFxBoMlO4=, tarball: yargs-parser/download/yargs-parser-20.2.9.tgz}
-    engines: {node: '>=10'}
-    dev: true
-
-  /yargs/15.4.1:
-    resolution: {integrity: sha1-DYehbeAa7p2L7Cv7909nhRcw9Pg=, tarball: yargs/download/yargs-15.4.1.tgz}
-    engines: {node: '>=8'}
-    dependencies:
-      cliui: 6.0.0
-      decamelize: 1.2.0
-      find-up: 4.1.0
-      get-caller-file: 2.0.5
-      require-directory: 2.1.1
-      require-main-filename: 2.0.0
-      set-blocking: 2.0.0
-      string-width: 4.2.3
-      which-module: 2.0.0
-      y18n: 4.0.3
-      yargs-parser: 18.1.3
-    dev: false
-
-  /yargs/16.2.0:
-    resolution: {integrity: sha1-HIK/D2tqZur85+8w43b0mhJHf2Y=, tarball: yargs/download/yargs-16.2.0.tgz}
-    engines: {node: '>=10'}
-    dependencies:
-      cliui: 7.0.4
-      escalade: 3.1.1
-      get-caller-file: 2.0.5
-      require-directory: 2.1.1
-      string-width: 4.2.3
-      y18n: 5.0.8
-      yargs-parser: 20.2.9
-    dev: true
-
-  /yauzl/2.10.0:
-    resolution: {integrity: sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=, tarball: yauzl/download/yauzl-2.10.0.tgz}
-    dependencies:
-      buffer-crc32: 0.2.13
-      fd-slicer: 1.1.0
-    dev: true
-
-  /zrender/5.2.1:
-    resolution: {integrity: sha1-X0u9qRW6bUErCxncJDG+qtBUF7s=, tarball: zrender/download/zrender-5.2.1.tgz}
-    dependencies:
-      tslib: 2.3.0
-    dev: false
diff --git a/postcss.config.js b/postcss.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..a47ef4f95284d3103dd43c01eb27677a3ef833fd
--- /dev/null
+++ b/postcss.config.js
@@ -0,0 +1,5 @@
+module.exports = {
+  plugins: {
+    autoprefixer: {},
+  },
+};
diff --git a/prettier.config.js b/prettier.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..4ef37f9551ca9c3e1da67320ab675170bd069129
--- /dev/null
+++ b/prettier.config.js
@@ -0,0 +1,10 @@
+module.exports = {
+  printWidth: 100,
+  semi: true,
+  vueIndentScriptAndStyle: true,
+  singleQuote: false,
+  trailingComma: "all",
+  proseWrap: "never",
+  htmlWhitespaceSensitivity: "strict",
+  endOfLine: "auto",
+};
diff --git a/public/resource/img/pwa-192x192.png b/public/resource/img/pwa-192x192.png
new file mode 100644
index 0000000000000000000000000000000000000000..00fb815215e1fcb171d1c62fca6c54018663cb72
Binary files /dev/null and b/public/resource/img/pwa-192x192.png differ
diff --git a/public/resource/img/pwa-512x512.png b/public/resource/img/pwa-512x512.png
new file mode 100644
index 0000000000000000000000000000000000000000..a41707331ae71ba92e29e379848fcc7f0981025d
Binary files /dev/null and b/public/resource/img/pwa-512x512.png differ
diff --git a/src/App.vue b/src/App.vue
index f8df489e3a35cce2fcc6f10fcc70bd1ebfe54595..a4028a76475967ae0771e9ae0ec18cb983e9a8e4 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -7,11 +7,12 @@
 </template>
 
 <script lang="ts" setup>
-  import { ConfigProvider } from 'ant-design-vue';
-  import { AppProvider } from '/@/components/Application';
-  import { useTitle } from '/@/hooks/web/useTitle';
-  import { useLocale } from '/@/locales/useLocale';
+  import { ConfigProvider } from "ant-design-vue";
+  import { AppProvider } from "/@/components/Application";
+  import { useTitle } from "/@/hooks/web/useTitle";
+  import { useLocale } from "/@/locales/useLocale";
 
+  import "dayjs/locale/zh-cn";
   // support Multi-language
   const { getAntdLocale } = useLocale();
 
diff --git a/src/api/demo/error.ts b/src/api/demo/error.ts
index 3ce6072172bcc455c110ec0ebf9f605e2a2ac412..7dc82b16274caac02560785102f3bdd453dd92c8 100644
--- a/src/api/demo/error.ts
+++ b/src/api/demo/error.ts
@@ -1,8 +1,8 @@
-import { defHttp } from '/@/utils/http/axios';
+import { defHttp } from "/@/utils/http/axios";
 
 enum Api {
   // The address does not exist
-  Error = '/error',
+  Error = "/error",
 }
 
 /**
diff --git a/src/api/model/baseModel.ts b/src/api/model/baseModel.ts
index 1a36511824a62252e952a9b8da2512403d84a707..6ae825e76eada9ceff1390b3ea596a6975f70ed4 100644
--- a/src/api/model/baseModel.ts
+++ b/src/api/model/baseModel.ts
@@ -1,9 +1,9 @@
 export interface BasicPageParams {
-  page: number;
+  pageNum: number;
   pageSize: number;
 }
 
 export interface BasicFetchResult<T> {
-  items: T[];
+  content: T[];
   total: number;
 }
diff --git a/src/api/student/model/practice-model.ts b/src/api/student/model/practice-model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e698ebd29773ebf8ffb1bb26981f9cb51c024162
--- /dev/null
+++ b/src/api/student/model/practice-model.ts
@@ -0,0 +1,57 @@
+import { BasicFetchResult } from "../../model/baseModel";
+
+interface BasicPracticeModel {
+  //教学(教研)过程
+  teachingProcess: string;
+  //个人总结
+  personalSummary: string;
+  //小组评价
+  groupEvaluation: string;
+  //日期
+  startDate: string;
+  //文件链接
+  docLink: string;
+}
+
+//教育实习听课记录
+export interface LectureNoteItemModel extends BasicPracticeModel {
+  noteId: number;
+  //听课内容
+  lectureContent: string;
+  //任课教师名称
+  teacherName: string;
+  //听课班级名称
+  className: string;
+  //课程类型
+  lectureType: string;
+  //听课体会与建议
+  experience: string;
+}
+
+export type LectureNoteListResultModel = BasicFetchResult<LectureNoteItemModel>;
+
+//教育实习教案信息
+export interface LessonPlanItemModel extends BasicPracticeModel {
+  planId: number;
+  //课题名称
+  subjectName: string;
+  //课程类型
+  subjectType: string;
+  //课程设计思路
+  designIdea: string;
+}
+
+export type LessonPlanListResultModel = BasicFetchResult<LessonPlanItemModel>;
+
+//教研活动心得体会
+export interface TeachingStudyItemModel extends BasicPracticeModel {
+  studyId: number;
+  //教研内容
+  content: string;
+  //教研方式
+  type: string;
+  //教研思路
+  designIdea: string;
+}
+
+export type TeachingStudyListResultModel = BasicFetchResult<TeachingStudyItemModel>;
diff --git a/src/api/student/practice.ts b/src/api/student/practice.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9cdbe693842e08ece17175adf1ad42be11b46eef
--- /dev/null
+++ b/src/api/student/practice.ts
@@ -0,0 +1,236 @@
+import {
+  LectureNoteItemModel,
+  LectureNoteListResultModel,
+  LessonPlanItemModel,
+  LessonPlanListResultModel,
+  TeachingStudyItemModel,
+  TeachingStudyListResultModel,
+} from "./model/practice-model";
+import { BasicPageParams } from "../model/baseModel";
+import { defHttp } from "/@/utils/http/axios";
+
+enum Api {
+  GetLectureNotePage = "/lectureNote/page",
+  SaveLectureNote = "/lectureNote/save",
+  UpdateLectureNote = "/lectureNote/update",
+  RemoveLectureNote = "/lectureNote/remove",
+  GetLessonPlanPage = "/lessonPlan/page",
+  SaveLessonPlan = "/lessonPlan/save",
+  UpdateLessonPlan = "/lessonPlan/update",
+  RemoveLessonPlan = "/lessonPlan/remove",
+  SetLessonPlanRemark = "/lessonPlan/setRemark",
+  GetLessonPlanRemark = "/lessonPlan/getRemark",
+  GetTeachingStudyPage = "/teachingStudy/page",
+  SaveTeachingStudy = "/teachingStudy/save",
+  UpdateTeachingStudy = "/teachingStudy/update",
+  RemoveTeachingStudy = "/teachingStudy/remove",
+  SetTeachingStudyRemark = "/teachingStudy/setRemark",
+}
+
+/**
+ * @description 分页查询用户本人的实习听课记录
+ * @param params 分页查询参数
+ */
+export const getLectureNotePage = (params: BasicPageParams) =>
+  defHttp.get<LectureNoteListResultModel>({
+    url: Api.GetLectureNotePage,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+/**
+ * @description 分页查询特定用户的实习听课记录
+ * @param params 分页查询参数
+ * @param userId 用户Id
+ */
+export const getLectureNotePageById = (params: BasicPageParams, userId: number) =>
+  defHttp.get<LectureNoteListResultModel>({
+    url: Api.GetLectureNotePage + `/${userId}`,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+/**
+ * @description 新增实习听课记录
+ * @param record
+ */
+export const saveLectureNote = (record: LectureNoteItemModel) =>
+  defHttp.post({
+    url: Api.SaveLectureNote,
+    params: record,
+  });
+
+/**
+ * @description 更新实习听课记录
+ * @param record
+ */
+export const updateLectureNote = (record: LectureNoteItemModel) =>
+  defHttp.put({
+    url: Api.UpdateLectureNote,
+    params: record,
+  });
+
+/**
+ * @description 删除实习听课记录
+ * @param noteId
+ */
+export const removeLectureNote = (noteId: number) =>
+  defHttp.delete({
+    url: Api.RemoveLectureNote + `/${noteId}`,
+  });
+
+/**
+ * @description 查询本人的实习教案信息
+ * @param params 分页查询参数
+ */
+export const getLessonPlanPage = (params: BasicPageParams) =>
+  defHttp.get<LessonPlanListResultModel>({
+    url: Api.GetLessonPlanPage,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+/**
+ * @description 查询特定用户的实习教案信息
+ * @param params 分页查询参数
+ * @param userId 用户ID
+ */
+export const getLessonPlanPageById = (params: BasicPageParams, userId: number) =>
+  defHttp.get<LessonPlanListResultModel>({
+    url: Api.GetLessonPlanPage + `/${userId}`,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+/**
+ * @description 新增实习教案信息
+ * @param lessonPlan
+ */
+export const saveLessonPlan = (lessonPlan: LessonPlanItemModel) =>
+  defHttp.post({
+    url: Api.SaveLessonPlan,
+    params: lessonPlan,
+  });
+
+/**
+ * @description 更新实习教案信息
+ * @param lessonPlan
+ */
+export const updateLessonPlan = (lessonPlan: LessonPlanItemModel) =>
+  defHttp.put({
+    url: Api.UpdateLessonPlan,
+    params: lessonPlan,
+  });
+
+/**
+ * @description 删除实习教案信息
+ * @param planId
+ */
+export const removeLessonPlanById = (planId: number) =>
+  defHttp.delete({
+    url: Api.RemoveLessonPlan + `/${planId}`,
+  });
+
+/**
+ * @description 小组长评价小组成员的实习教案
+ * @param userId 小组长要评价的组员用户ID
+ * @param planId 小组长要评价的组员教案ID
+ * @param content 评价内容
+ */
+export const remarkLessonPlan = (userId: number, planId: number, content: string) =>
+  defHttp.put({
+    url: Api.SetLessonPlanRemark + `/${userId}/${planId}`,
+    params: { content },
+  });
+
+/**
+ * @description 小组长获取小组成员实习教案的评语内容
+ * @param userId 小组成员用户ID
+ * @param planId 小组成员教案ID
+ */
+export const getLessonPlanRemark = (userId: number, planId: number) =>
+  defHttp.get<string>({
+    url: Api.GetLessonPlanRemark + `/${userId}/${planId}`,
+  });
+
+/**
+ * @description 分页查询本人的教研活动信息
+ * @param params 分页查询参数
+ */
+export const getTeachingStudyPage = (params: BasicPageParams) =>
+  defHttp.get<TeachingStudyListResultModel>({
+    url: Api.GetTeachingStudyPage,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+/**
+ * @description 分页查询特定用户的教研活动信息
+ * @param params 分页查询参数
+ * @param userId 用户ID
+ */
+export const getTeachingStudyPageById = (params: BasicPageParams, userId: number) =>
+  defHttp.get<TeachingStudyListResultModel>({
+    url: Api.GetTeachingStudyPage + `/${userId}`,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+/**
+ * @description 新增教研活动信息
+ * @param teachingStudy
+ */
+export const saveTeachingStudy = (teachingStudy: TeachingStudyItemModel) =>
+  defHttp.post({
+    url: Api.SaveTeachingStudy,
+    params: teachingStudy,
+  });
+
+/**
+ * @description 更新教研活动信息
+ * @param teachingStudy
+ */
+export const updateTeachingStudy = (teachingStudy: TeachingStudyItemModel) =>
+  defHttp.put({
+    url: Api.UpdateTeachingStudy,
+    params: teachingStudy,
+  });
+
+/**
+ * @description 删除教研活动信息
+ * @param studyId
+ */
+export const removeTeachingStudyById = (studyId: number) =>
+  defHttp.delete({
+    url: Api.RemoveTeachingStudy + `/${studyId}`,
+  });
+
+/**
+ * @description 小组长评价小组成员的教研活动
+ * @param userId 小组长要评价的组员用户ID
+ * @param studyId 小组长要评价的组员教研活动ID
+ * @param content 评价内容
+ */
+export const remarkTeachingStudy = (userId: number, studyId: number, content: string) =>
+  defHttp.put({
+    url: Api.SetLessonPlanRemark + `/${userId}/${studyId}`,
+    params: { content },
+  });
diff --git a/src/api/sys/menu.ts b/src/api/sys/menu.ts
index de9fa56362fd4b33db87598d4ded9ce2fc5a78ce..4c7062ab2c5215eceb31203c9971ef47fdf5fa8c 100644
--- a/src/api/sys/menu.ts
+++ b/src/api/sys/menu.ts
@@ -1,8 +1,8 @@
-import { defHttp } from '/@/utils/http/axios';
-import { getMenuListResultModel } from './model/menuModel';
+import { defHttp } from "/@/utils/http/axios";
+import { getMenuListResultModel } from "./model/menuModel";
 
 enum Api {
-  GetMenuList = '/getMenuList',
+  GetMenuList = "/getMenuList",
 }
 
 /**
diff --git a/src/api/sys/model/menuModel.ts b/src/api/sys/model/menuModel.ts
index 8d19eeabacf80f6598ec3354efb717089f866bf4..8e00362c32e481e1ada3141bcb071fe04cac44d4 100644
--- a/src/api/sys/model/menuModel.ts
+++ b/src/api/sys/model/menuModel.ts
@@ -1,4 +1,4 @@
-import type { RouteMeta } from 'vue-router';
+import type { RouteMeta } from "vue-router";
 export interface RouteItem {
   path: string;
   component: any;
diff --git a/src/api/sys/upload.ts b/src/api/sys/upload.ts
index c47baf433558db17017629bd79f0026e8be0ef02..c9fa505fc015d6229fbd59c3d73f6db5a8e810f5 100644
--- a/src/api/sys/upload.ts
+++ b/src/api/sys/upload.ts
@@ -1,9 +1,9 @@
-import { UploadApiResult } from './model/uploadModel';
-import { defHttp } from '/@/utils/http/axios';
-import { UploadFileParams } from '/#/axios';
-import { useGlobSetting } from '/@/hooks/setting';
+import { UploadApiResult } from "./model/uploadModel";
+import { defHttp } from "/@/utils/http/axios";
+import { UploadFileParams } from "/#/axios";
+import { useGlobSetting } from "/@/hooks/setting";
 
-const { uploadUrl = '' } = useGlobSetting();
+const { uploadUrl = "" } = useGlobSetting();
 
 /**
  * @description: Upload interface
diff --git a/src/api/sys/user.ts b/src/api/sys/user.ts
index 1e883b6dd4e48259b90a320d541c4864e5959db9..506e40fee2709d645a9552bbe3da96d6ba6e448c 100644
--- a/src/api/sys/user.ts
+++ b/src/api/sys/user.ts
@@ -1,19 +1,20 @@
-import { defHttp } from '/@/utils/http/axios';
-import { LoginParams, LoginResultModel, GetUserInfoModel } from './model/userModel';
+import { defHttp } from "/@/utils/http/axios";
+import { LoginParams, LoginResultModel, GetUserInfoModel } from "./model/userModel";
 
-import { ErrorMessageMode } from '/#/axios';
+import { ErrorMessageMode } from "/#/axios";
 
 enum Api {
-  Login = '/login',
-  Logout = '/logout',
-  GetUserInfo = '/getUserInfo',
-  GetPermCode = '/getPermCode',
+  Login = "/login",
+  Logout = "/logout",
+  GetUserInfo = "/getUserInfo",
+  GetPermCode = "/getPermCode",
+  TestRetry = "/testRetry",
 }
 
 /**
  * @description: user login api
  */
-export function loginApi(params: LoginParams, mode: ErrorMessageMode = 'modal') {
+export function loginApi(params: LoginParams, mode: ErrorMessageMode = "modal") {
   return defHttp.post<LoginResultModel>(
     {
       url: Api.Login,
@@ -29,7 +30,7 @@ export function loginApi(params: LoginParams, mode: ErrorMessageMode = 'modal')
  * @description: getUserInfo
  */
 export function getUserInfo() {
-  return defHttp.get<GetUserInfoModel>({ url: Api.GetUserInfo }, { errorMessageMode: 'none' });
+  return defHttp.get<GetUserInfoModel>({ url: Api.GetUserInfo }, { errorMessageMode: "none" });
 }
 
 export function getPermCode() {
@@ -39,3 +40,16 @@ export function getPermCode() {
 export function doLogout() {
   return defHttp.get({ url: Api.Logout });
 }
+
+export function testRetry() {
+  return defHttp.get(
+    { url: Api.TestRetry },
+    {
+      retryRequest: {
+        isOpenRetry: true,
+        count: 5,
+        waitTime: 1000,
+      },
+    },
+  );
+}
diff --git a/src/components/Application/index.ts b/src/components/Application/index.ts
index d7c5133064713f4a1e258288753d8efe07d8036a..fcc1c5fb5f05add0cb65ae3a47414e8f3309a085 100644
--- a/src/components/Application/index.ts
+++ b/src/components/Application/index.ts
@@ -1,12 +1,12 @@
-import { withInstall } from '/@/utils';
+import { withInstall } from "/@/utils";
 
-import appLogo from './src/AppLogo.vue';
-import appProvider from './src/AppProvider.vue';
-import appSearch from './src/search/AppSearch.vue';
-import appLocalePicker from './src/AppLocalePicker.vue';
-import appDarkModeToggle from './src/AppDarkModeToggle.vue';
+import appLogo from "./src/AppLogo.vue";
+import appProvider from "./src/AppProvider.vue";
+import appSearch from "./src/search/AppSearch.vue";
+import appLocalePicker from "./src/AppLocalePicker.vue";
+import appDarkModeToggle from "./src/AppDarkModeToggle.vue";
 
-export { useAppProviderContext } from './src/useAppContext';
+export { useAppProviderContext } from "./src/useAppContext";
 
 export const AppLogo = withInstall(appLogo);
 export const AppProvider = withInstall(appProvider);
diff --git a/src/components/Application/src/AppDarkModeToggle.vue b/src/components/Application/src/AppDarkModeToggle.vue
index 19ba3b15147ff9de4195d2be898b03e3c7545c0b..d284818ba2b931d7efdf6231a6e88044c3f82152 100644
--- a/src/components/Application/src/AppDarkModeToggle.vue
+++ b/src/components/Application/src/AppDarkModeToggle.vue
@@ -6,15 +6,15 @@
   </div>
 </template>
 <script lang="ts" setup>
-  import { computed, unref } from 'vue';
-  import { SvgIcon } from '/@/components/Icon';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useRootSetting } from '/@/hooks/setting/useRootSetting';
-  import { updateHeaderBgColor, updateSidebarBgColor } from '/@/logics/theme/updateBackground';
-  import { updateDarkTheme } from '/@/logics/theme/dark';
-  import { ThemeEnum } from '/@/enums/appEnum';
+  import { computed, unref } from "vue";
+  import { SvgIcon } from "/@/components/Icon";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useRootSetting } from "/@/hooks/setting/useRootSetting";
+  import { updateHeaderBgColor, updateSidebarBgColor } from "/@/logics/theme/updateBackground";
+  import { updateDarkTheme } from "/@/logics/theme/dark";
+  import { ThemeEnum } from "/@/enums/appEnum";
 
-  const { prefixCls } = useDesign('dark-switch');
+  const { prefixCls } = useDesign("dark-switch");
   const { getDarkMode, setDarkMode, getShowDarkModeToggle } = useRootSetting();
 
   const isDark = computed(() => getDarkMode.value === ThemeEnum.DARK);
@@ -35,9 +35,9 @@
   }
 </script>
 <style lang="less" scoped>
-  @prefix-cls: ~'@{namespace}-dark-switch';
+  @prefix-cls: ~"@{namespace}-dark-switch";
 
-  html[data-theme='dark'] {
+  html[data-theme="dark"] {
     .@{prefix-cls} {
       border: 1px solid rgb(196 188 188);
     }
diff --git a/src/components/Application/src/AppLocalePicker.vue b/src/components/Application/src/AppLocalePicker.vue
index 3d40a53b74f739b3bffec922b3f49a8e1d1bcf62..55759d2ed8551399c224b60d07cc3eb0e79148bc 100644
--- a/src/components/Application/src/AppLocalePicker.vue
+++ b/src/components/Application/src/AppLocalePicker.vue
@@ -4,11 +4,11 @@
 -->
 <template>
   <Dropdown
-    placement="bottomCenter"
+    placement="bottom"
     :trigger="['click']"
     :dropMenuList="localeList"
     :selectedKeys="selectedKeys"
-    @menuEvent="handleMenuEvent"
+    @menu-event="handleMenuEvent"
     overlayClassName="app-locale-picker-overlay"
   >
     <span class="cursor-pointer flex items-center">
@@ -18,13 +18,13 @@
   </Dropdown>
 </template>
 <script lang="ts" setup>
-  import type { LocaleType } from '/#/config';
-  import type { DropMenu } from '/@/components/Dropdown';
-  import { ref, watchEffect, unref, computed } from 'vue';
-  import { Dropdown } from '/@/components/Dropdown';
-  import { Icon } from '/@/components/Icon';
-  import { useLocale } from '/@/locales/useLocale';
-  import { localeList } from '/@/settings/localeSetting';
+  import type { LocaleType } from "/#/config";
+  import type { DropMenu } from "/@/components/Dropdown";
+  import { ref, watchEffect, unref, computed } from "vue";
+  import { Dropdown } from "/@/components/Dropdown";
+  import { Icon } from "/@/components/Icon";
+  import { useLocale } from "/@/locales/useLocale";
+  import { localeList } from "/@/settings/localeSetting";
 
   const props = defineProps({
     /**
@@ -44,7 +44,7 @@
   const getLocaleText = computed(() => {
     const key = selectedKeys.value[0];
     if (!key) {
-      return '';
+      return "";
     }
     return localeList.find((item) => item.event === key)?.text;
   });
diff --git a/src/components/Application/src/AppLogo.vue b/src/components/Application/src/AppLogo.vue
index 86aaf76adbaa2529cb6a9833a68411c9f6dae6e0..df22a9d946eeceb2c6d4e8ac1175949d9447c11e 100644
--- a/src/components/Application/src/AppLogo.vue
+++ b/src/components/Application/src/AppLogo.vue
@@ -11,19 +11,19 @@
   </div>
 </template>
 <script lang="ts" setup>
-  import { computed, unref } from 'vue';
-  import { useGlobSetting } from '/@/hooks/setting';
-  import { useGo } from '/@/hooks/web/usePage';
-  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { PageEnum } from '/@/enums/pageEnum';
-  import { useUserStore } from '/@/store/modules/user';
+  import { computed, unref } from "vue";
+  import { useGlobSetting } from "/@/hooks/setting";
+  import { useGo } from "/@/hooks/web/usePage";
+  import { useMenuSetting } from "/@/hooks/setting/useMenuSetting";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { PageEnum } from "/@/enums/pageEnum";
+  import { useUserStore } from "/@/store/modules/user";
 
   const props = defineProps({
     /**
      * The theme of the current parent component
      */
-    theme: { type: String, validator: (v: string) => ['light', 'dark'].includes(v) },
+    theme: { type: String, validator: (v: string) => ["light", "dark"].includes(v) },
     /**
      * Whether to show title
      */
@@ -34,7 +34,7 @@
     alwaysShowTitle: { type: Boolean },
   });
 
-  const { prefixCls } = useDesign('app-logo');
+  const { prefixCls } = useDesign("app-logo");
   const { getCollapsedShowTitle } = useMenuSetting();
   const userStore = useUserStore();
   const { title } = useGlobSetting();
@@ -43,13 +43,13 @@
   const getAppLogoClass = computed(() => [
     prefixCls,
     props.theme,
-    { 'collapsed-show-title': unref(getCollapsedShowTitle) },
+    { "collapsed-show-title": unref(getCollapsedShowTitle) },
   ]);
 
   const getTitleClass = computed(() => [
     `${prefixCls}__title`,
     {
-      'xs:opacity-0': !props.alwaysShowTitle,
+      "xs:opacity-0": !props.alwaysShowTitle,
     },
   ]);
 
@@ -58,7 +58,7 @@
   }
 </script>
 <style lang="less" scoped>
-  @prefix-cls: ~'@{namespace}-app-logo';
+  @prefix-cls: ~"@{namespace}-app-logo";
 
   .@{prefix-cls} {
     display: flex;
diff --git a/src/components/Application/src/AppProvider.vue b/src/components/Application/src/AppProvider.vue
index fe19a800009d4ed542c935276b77abfd8939162d..244470e8a4855b06d940c5720c545206866d1726 100644
--- a/src/components/Application/src/AppProvider.vue
+++ b/src/components/Application/src/AppProvider.vue
@@ -1,10 +1,10 @@
 <script lang="ts">
-  import { defineComponent, toRefs, ref, unref } from 'vue';
-  import { createAppProviderContext } from './useAppContext';
-  import { createBreakpointListen } from '/@/hooks/event/useBreakpoint';
-  import { prefixCls } from '/@/settings/designSetting';
-  import { useAppStore } from '/@/store/modules/app';
-  import { MenuModeEnum, MenuTypeEnum } from '/@/enums/menuEnum';
+  import { defineComponent, toRefs, ref, unref } from "vue";
+  import { createAppProviderContext } from "./useAppContext";
+  import { createBreakpointListen } from "/@/hooks/event/useBreakpoint";
+  import { prefixCls } from "/@/settings/designSetting";
+  import { useAppStore } from "/@/store/modules/app";
+  import { MenuModeEnum, MenuTypeEnum } from "/@/enums/menuEnum";
 
   const props = {
     /**
@@ -14,7 +14,7 @@
   };
 
   export default defineComponent({
-    name: 'AppProvider',
+    name: "AppProvider",
     inheritAttrs: false,
     props,
     setup(props, { slots }) {
diff --git a/src/components/Application/src/search/AppSearch.vue b/src/components/Application/src/search/AppSearch.vue
index 63d346ee366cb830f4b0f48f19adc046e138f290..8075171d59590a59c91ea37fd364c56fdefbaae3 100644
--- a/src/components/Application/src/search/AppSearch.vue
+++ b/src/components/Application/src/search/AppSearch.vue
@@ -1,12 +1,12 @@
 <script lang="tsx">
-  import { defineComponent, ref, unref } from 'vue';
-  import { Tooltip } from 'ant-design-vue';
-  import { SearchOutlined } from '@ant-design/icons-vue';
-  import AppSearchModal from './AppSearchModal.vue';
-  import { useI18n } from '/@/hooks/web/useI18n';
+  import { defineComponent, ref, unref } from "vue";
+  import { Tooltip } from "ant-design-vue";
+  import { SearchOutlined } from "@ant-design/icons-vue";
+  import AppSearchModal from "./AppSearchModal.vue";
+  import { useI18n } from "/@/hooks/web/useI18n";
 
   export default defineComponent({
-    name: 'AppSearch',
+    name: "AppSearch",
     setup() {
       const showModal = ref(false);
       const { t } = useI18n();
@@ -20,7 +20,7 @@
           <div class="p-1" onClick={changeModal.bind(null, true)}>
             <Tooltip>
               {{
-                title: () => t('common.searchText'),
+                title: () => t("common.searchText"),
                 default: () => <SearchOutlined />,
               }}
             </Tooltip>
diff --git a/src/components/Application/src/search/AppSearchFooter.vue b/src/components/Application/src/search/AppSearchFooter.vue
index 97bd93a934e3f1803605e7a1379171020237044b..612a7122f5f1866df0dcd197baa3c66a37a97731 100644
--- a/src/components/Application/src/search/AppSearchFooter.vue
+++ b/src/components/Application/src/search/AppSearchFooter.vue
@@ -1,24 +1,24 @@
 <template>
   <div :class="`${prefixCls}`">
     <AppSearchKeyItem :class="`${prefixCls}-item`" icon="ant-design:enter-outlined" />
-    <span>{{ t('component.app.toSearch') }}</span>
+    <span>{{ t("component.app.toSearch") }}</span>
     <AppSearchKeyItem :class="`${prefixCls}-item`" icon="ion:arrow-up-outline" />
     <AppSearchKeyItem :class="`${prefixCls}-item`" icon="ion:arrow-down-outline" />
-    <span>{{ t('component.app.toNavigate') }}</span>
+    <span>{{ t("component.app.toNavigate") }}</span>
     <AppSearchKeyItem :class="`${prefixCls}-item`" icon="mdi:keyboard-esc" />
-    <span>{{ t('common.closeText') }}</span>
+    <span>{{ t("common.closeText") }}</span>
   </div>
 </template>
 
 <script lang="ts" setup>
-  import AppSearchKeyItem from './AppSearchKeyItem.vue';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  const { prefixCls } = useDesign('app-search-footer');
+  import AppSearchKeyItem from "./AppSearchKeyItem.vue";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  const { prefixCls } = useDesign("app-search-footer");
   const { t } = useI18n();
 </script>
 <style lang="less" scoped>
-  @prefix-cls: ~'@{namespace}-app-search-footer';
+  @prefix-cls: ~"@{namespace}-app-search-footer";
 
   .@{prefix-cls} {
     position: relative;
diff --git a/src/components/Application/src/search/AppSearchKeyItem.vue b/src/components/Application/src/search/AppSearchKeyItem.vue
index aba36a5afdeee8124e8eb916a40f184074fef495..289b721ff950c747d9e852267b02d9e3579395c4 100644
--- a/src/components/Application/src/search/AppSearchKeyItem.vue
+++ b/src/components/Application/src/search/AppSearchKeyItem.vue
@@ -4,7 +4,7 @@
   </span>
 </template>
 <script lang="ts" setup>
-  import { Icon } from '/@/components/Icon';
+  import { Icon } from "/@/components/Icon";
   defineProps({
     icon: String,
   });
diff --git a/src/components/Application/src/search/AppSearchModal.vue b/src/components/Application/src/search/AppSearchModal.vue
index 76b788240427447df2053c633f54997ec8a42b68..c71453b26862b3519377ce3417da88601ee7b3c5 100644
--- a/src/components/Application/src/search/AppSearchModal.vue
+++ b/src/components/Application/src/search/AppSearchModal.vue
@@ -16,12 +16,12 @@
               </template>
             </a-input>
             <span :class="`${prefixCls}-cancel`" @click="handleClose">
-              {{ t('common.cancelText') }}
+              {{ t("common.cancelText") }}
             </span>
           </div>
 
           <div :class="`${prefixCls}-not-data`" v-show="getIsNotData">
-            {{ t('component.app.searchNotData') }}
+            {{ t("component.app.searchNotData") }}
           </div>
 
           <ul :class="`${prefixCls}-list`" v-show="!getIsNotData" ref="scrollWrap">
@@ -58,29 +58,29 @@
 </template>
 
 <script lang="ts" setup>
-  import { computed, unref, ref, watch, nextTick } from 'vue';
-  import { SearchOutlined } from '@ant-design/icons-vue';
-  import AppSearchFooter from './AppSearchFooter.vue';
-  import Icon from '/@/components/Icon';
+  import { computed, unref, ref, watch, nextTick } from "vue";
+  import { SearchOutlined } from "@ant-design/icons-vue";
+  import AppSearchFooter from "./AppSearchFooter.vue";
+  import Icon from "/@/components/Icon";
   // @ts-ignore
-  import vClickOutside from '/@/directives/clickOutside';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useRefs } from '/@/hooks/core/useRefs';
-  import { useMenuSearch } from './useMenuSearch';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { useAppInject } from '/@/hooks/web/useAppInject';
+  import vClickOutside from "/@/directives/clickOutside";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useRefs } from "/@/hooks/core/useRefs";
+  import { useMenuSearch } from "./useMenuSearch";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { useAppInject } from "/@/hooks/web/useAppInject";
 
   const props = defineProps({
     visible: { type: Boolean },
   });
 
-  const emit = defineEmits(['close']);
+  const emit = defineEmits(["close"]);
 
   const scrollWrap = ref(null);
   const inputRef = ref<Nullable<HTMLElement>>(null);
 
   const { t } = useI18n();
-  const { prefixCls } = useDesign('app-search-modal');
+  const { prefixCls } = useDesign("app-search-modal");
   const [refs, setRefs] = useRefs();
   const { getIsMobile } = useAppInject();
 
@@ -110,12 +110,12 @@
 
   function handleClose() {
     searchResult.value = [];
-    emit('close');
+    emit("close");
   }
 </script>
 <style lang="less" scoped>
-  @prefix-cls: ~'@{namespace}-app-search-modal';
-  @footer-prefix-cls: ~'@{namespace}-app-search-footer';
+  @prefix-cls: ~"@{namespace}-app-search-modal";
+  @footer-prefix-cls: ~"@{namespace}-app-search-footer";
   .@{prefix-cls} {
     position: fixed;
     top: 0;
@@ -189,7 +189,7 @@
       color: #1c1e21;
       border-radius: 6px;
 
-      span[role='img'] {
+      span[role="img"] {
         color: #999;
       }
     }
diff --git a/src/components/Application/src/search/useMenuSearch.ts b/src/components/Application/src/search/useMenuSearch.ts
index 9101b4ac942bd6baaeafda7c9fb19591a39435d0..b762b53bf4e039a111ee3b8560c8c6b5307103fd 100644
--- a/src/components/Application/src/search/useMenuSearch.ts
+++ b/src/components/Application/src/search/useMenuSearch.ts
@@ -1,12 +1,12 @@
-import type { Menu } from '/@/router/types';
-import { ref, onBeforeMount, unref, Ref, nextTick } from 'vue';
-import { getMenus } from '/@/router/menus';
-import { cloneDeep } from 'lodash-es';
-import { filter, forEach } from '/@/utils/helper/treeHelper';
-import { useGo } from '/@/hooks/web/usePage';
-import { useScrollTo } from '/@/hooks/event/useScrollTo';
-import { onKeyStroke, useDebounceFn } from '@vueuse/core';
-import { useI18n } from '/@/hooks/web/useI18n';
+import type { Menu } from "/@/router/types";
+import { ref, onBeforeMount, unref, Ref, nextTick } from "vue";
+import { getMenus } from "/@/router/menus";
+import { cloneDeep } from "lodash-es";
+import { filter, forEach } from "/@/utils/helper/treeHelper";
+import { useGo } from "/@/hooks/web/usePage";
+import { useScrollTo } from "/@/hooks/event/useScrollTo";
+import { onKeyStroke, useDebounceFn } from "@vueuse/core";
+import { useI18n } from "/@/hooks/web/useI18n";
 
 export interface SearchResult {
   name: string;
@@ -16,19 +16,19 @@ export interface SearchResult {
 
 // Translate special characters
 function transform(c: string) {
-  const code: string[] = ['$', '(', ')', '*', '+', '.', '[', ']', '?', '\\', '^', '{', '}', '|'];
+  const code: string[] = ["$", "(", ")", "*", "+", ".", "[", "]", "?", "\\", "^", "{", "}", "|"];
   return code.includes(c) ? `\\${c}` : c;
 }
 
 function createSearchReg(key: string) {
   const keys = [...key].map((item) => transform(item));
-  const str = ['', ...keys, ''].join('.*');
+  const str = ["", ...keys, ""].join(".*");
   return new RegExp(str);
 }
 
 export function useMenuSearch(refs: Ref<HTMLElement[]>, scrollWrap: Ref<ElRef>, emit: EmitType) {
   const searchResult = ref<SearchResult[]>([]);
-  const keyword = ref('');
+  const keyword = ref("");
   const activeIndex = ref(-1);
 
   let menuList: Menu[] = [];
@@ -151,16 +151,16 @@ export function useMenuSearch(refs: Ref<HTMLElement[]>, scrollWrap: Ref<ElRef>,
   // close search modal
   function handleClose() {
     searchResult.value = [];
-    emit('close');
+    emit("close");
   }
 
   // enter search
-  onKeyStroke('Enter', handleEnter);
+  onKeyStroke("Enter", handleEnter);
   // Monitor keyboard arrow keys
-  onKeyStroke('ArrowUp', handleUp);
-  onKeyStroke('ArrowDown', handleDown);
+  onKeyStroke("ArrowUp", handleUp);
+  onKeyStroke("ArrowDown", handleDown);
   // esc close
-  onKeyStroke('Escape', handleClose);
+  onKeyStroke("Escape", handleClose);
 
   return { handleSearch, searchResult, keyword, activeIndex, handleMouseenter, handleEnter };
 }
diff --git a/src/components/Application/src/useAppContext.ts b/src/components/Application/src/useAppContext.ts
index 8bdfb4f880563d59cc849bc27e7188ab44935db7..6e0f0fdeb51b22dff3fb1341a7b7bbfb3c4f77ec 100644
--- a/src/components/Application/src/useAppContext.ts
+++ b/src/components/Application/src/useAppContext.ts
@@ -1,5 +1,5 @@
-import { InjectionKey, Ref } from 'vue';
-import { createContext, useContext } from '/@/hooks/core/useContext';
+import { InjectionKey, Ref } from "vue";
+import { createContext, useContext } from "/@/hooks/core/useContext";
 
 export interface AppProviderContextProps {
   prefixCls: Ref<string>;
diff --git a/src/components/Authority/index.ts b/src/components/Authority/index.ts
index 2f0eab7f2c2d23153945f840b2aa645665f43af5..02d5c3dfdcfcc9ad3bc7ffac05c5e5b833196afb 100644
--- a/src/components/Authority/index.ts
+++ b/src/components/Authority/index.ts
@@ -1,4 +1,4 @@
-import { withInstall } from '/@/utils';
-import authority from './src/Authority.vue';
+import { withInstall } from "/@/utils";
+import authority from "./src/Authority.vue";
 
 export const Authority = withInstall(authority);
diff --git a/src/components/Authority/src/Authority.vue b/src/components/Authority/src/Authority.vue
index 0d359382797dd4e9fe6d5c843905c76e68037249..100155a5c2f28bcdef977490291c25abd3c1a866 100644
--- a/src/components/Authority/src/Authority.vue
+++ b/src/components/Authority/src/Authority.vue
@@ -2,14 +2,14 @@
  Access control component for fine-grained access control.
 -->
 <script lang="ts">
-  import type { PropType } from 'vue';
-  import { defineComponent } from 'vue';
-  import { RoleEnum } from '/@/enums/roleEnum';
-  import { usePermission } from '/@/hooks/web/usePermission';
-  import { getSlot } from '/@/utils/helper/tsxHelper';
+  import type { PropType } from "vue";
+  import { defineComponent } from "vue";
+  import { RoleEnum } from "/@/enums/roleEnum";
+  import { usePermission } from "/@/hooks/web/usePermission";
+  import { getSlot } from "/@/utils/helper/tsxHelper";
 
   export default defineComponent({
-    name: 'Authority',
+    name: "Authority",
     props: {
       /**
        * Specified role is visible
@@ -19,7 +19,7 @@
        */
       value: {
         type: [Number, Array, String] as PropType<RoleEnum | RoleEnum[] | string | string[]>,
-        default: '',
+        default: "",
       },
     },
     setup(props, { slots }) {
diff --git a/src/components/Basic/index.ts b/src/components/Basic/index.ts
index 97a53a10152725e114527d7793ef9e8ce3cc255c..e4c65a5797e09bac5b1be3df1d8849eedacb6ff5 100644
--- a/src/components/Basic/index.ts
+++ b/src/components/Basic/index.ts
@@ -1,7 +1,7 @@
-import { withInstall } from '/@/utils';
-import basicArrow from './src/BasicArrow.vue';
-import basicTitle from './src/BasicTitle.vue';
-import basicHelp from './src/BasicHelp.vue';
+import { withInstall } from "/@/utils";
+import basicArrow from "./src/BasicArrow.vue";
+import basicTitle from "./src/BasicTitle.vue";
+import basicHelp from "./src/BasicHelp.vue";
 
 export const BasicArrow = withInstall(basicArrow);
 export const BasicTitle = withInstall(basicTitle);
diff --git a/src/components/Basic/src/BasicArrow.vue b/src/components/Basic/src/BasicArrow.vue
index 6a4cd01adfb53f6e44c020a713791da12be9130f..a1381d6454f3d8ccddcb2be8142c04a10d5c73e2 100644
--- a/src/components/Basic/src/BasicArrow.vue
+++ b/src/components/Basic/src/BasicArrow.vue
@@ -8,9 +8,9 @@
   </span>
 </template>
 <script lang="ts" setup>
-  import { computed } from 'vue';
-  import { Icon } from '/@/components/Icon';
-  import { useDesign } from '/@/hooks/web/useDesign';
+  import { computed } from "vue";
+  import { Icon } from "/@/components/Icon";
+  import { useDesign } from "/@/hooks/web/useDesign";
 
   const props = defineProps({
     /**
@@ -31,7 +31,7 @@
     inset: { type: Boolean },
   });
 
-  const { prefixCls } = useDesign('basic-arrow');
+  const { prefixCls } = useDesign("basic-arrow");
 
   // get component class
   const getClass = computed(() => {
@@ -48,7 +48,7 @@
   });
 </script>
 <style lang="less" scoped>
-  @prefix-cls: ~'@{namespace}-basic-arrow';
+  @prefix-cls: ~"@{namespace}-basic-arrow";
 
   .@{prefix-cls} {
     display: inline-block;
diff --git a/src/components/Basic/src/BasicHelp.vue b/src/components/Basic/src/BasicHelp.vue
index 1a1debb25394923dec10a6d5f5f5119e091535ab..f04b67de7802d7052f0ee7aa97649736345e96a5 100644
--- a/src/components/Basic/src/BasicHelp.vue
+++ b/src/components/Basic/src/BasicHelp.vue
@@ -1,19 +1,19 @@
 <script lang="tsx">
-  import type { CSSProperties, PropType } from 'vue';
-  import { defineComponent, computed, unref } from 'vue';
-  import { Tooltip } from 'ant-design-vue';
-  import { InfoCircleOutlined } from '@ant-design/icons-vue';
-  import { getPopupContainer } from '/@/utils';
-  import { isString, isArray } from '/@/utils/is';
-  import { getSlot } from '/@/utils/helper/tsxHelper';
-  import { useDesign } from '/@/hooks/web/useDesign';
+  import type { CSSProperties, PropType } from "vue";
+  import { defineComponent, computed, unref } from "vue";
+  import { Tooltip } from "ant-design-vue";
+  import { InfoCircleOutlined } from "@ant-design/icons-vue";
+  import { getPopupContainer } from "/@/utils";
+  import { isString, isArray } from "/@/utils/is";
+  import { getSlot } from "/@/utils/helper/tsxHelper";
+  import { useDesign } from "/@/hooks/web/useDesign";
 
   const props = {
     /**
      * Help text max-width
      * @default: 600px
      */
-    maxWidth: { type: String, default: '600px' },
+    maxWidth: { type: String, default: "600px" },
     /**
      * Whether to display the serial number
      * @default: false
@@ -23,16 +23,16 @@
      * Help text font color
      * @default: #ffffff
      */
-    color: { type: String, default: '#ffffff' },
+    color: { type: String, default: "#ffffff" },
     /**
      * Help text font size
      * @default: 14px
      */
-    fontSize: { type: String, default: '14px' },
+    fontSize: { type: String, default: "14px" },
     /**
      * Help text list
      */
-    placement: { type: String, default: 'right' },
+    placement: { type: String, default: "right" },
     /**
      * Help text list
      */
@@ -40,11 +40,11 @@
   };
 
   export default defineComponent({
-    name: 'BasicHelp',
+    name: "BasicHelp",
     components: { Tooltip },
     props,
     setup(props, { slots }) {
-      const { prefixCls } = useDesign('basic-help');
+      const { prefixCls } = useDesign("basic-help");
 
       const getTooltipStyle = computed(
         (): CSSProperties => ({ color: props.color, fontSize: props.fontSize }),
@@ -64,7 +64,7 @@
             return (
               <p key={text}>
                 <>
-                  {props.showIndex ? `${index + 1}. ` : ''}
+                  {props.showIndex ? `${index + 1}. ` : ""}
                   {text}
                 </>
               </p>
@@ -81,7 +81,7 @@
             title={<div style={unref(getTooltipStyle)}>{renderTitle()}</div>}
             autoAdjustOverflow={true}
             overlayStyle={unref(getOverlayStyle)}
-            placement={props.placement as 'right'}
+            placement={props.placement as "right"}
             getPopupContainer={() => getPopupContainer()}
           >
             <span class={prefixCls}>{getSlot(slots) || <InfoCircleOutlined />}</span>
@@ -92,7 +92,7 @@
   });
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-basic-help';
+  @prefix-cls: ~"@{namespace}-basic-help";
 
   .@{prefix-cls} {
     display: inline-block;
diff --git a/src/components/Basic/src/BasicTitle.vue b/src/components/Basic/src/BasicTitle.vue
index 3b96328f8b02734cce5570a7ca014f628b63ed12..bf0c9024df7dc8290b38461b576c1e744e58f5f5 100644
--- a/src/components/Basic/src/BasicTitle.vue
+++ b/src/components/Basic/src/BasicTitle.vue
@@ -5,10 +5,10 @@
   </span>
 </template>
 <script lang="ts" setup>
-  import type { PropType } from 'vue';
-  import { useSlots, computed } from 'vue';
-  import BasicHelp from './BasicHelp.vue';
-  import { useDesign } from '/@/hooks/web/useDesign';
+  import type { PropType } from "vue";
+  import { useSlots, computed } from "vue";
+  import BasicHelp from "./BasicHelp.vue";
+  import { useDesign } from "/@/hooks/web/useDesign";
 
   const props = defineProps({
     /**
@@ -17,7 +17,7 @@
      */
     helpMessage: {
       type: [String, Array] as PropType<string | string[]>,
-      default: '',
+      default: "",
     },
     /**
      * Whether the color block on the left side of the title
@@ -31,7 +31,7 @@
     normal: { type: Boolean },
   });
 
-  const { prefixCls } = useDesign('basic-title');
+  const { prefixCls } = useDesign("basic-title");
   const slots = useSlots();
   const getClass = computed(() => [
     prefixCls,
@@ -40,7 +40,7 @@
   ]);
 </script>
 <style lang="less" scoped>
-  @prefix-cls: ~'@{namespace}-basic-title';
+  @prefix-cls: ~"@{namespace}-basic-title";
 
   .@{prefix-cls} {
     position: relative;
@@ -66,7 +66,7 @@
       height: 16px;
       margin-right: 4px;
       background-color: @primary-color;
-      content: '';
+      content: "";
     }
 
     &-help {
diff --git a/src/components/Button/index.ts b/src/components/Button/index.ts
index 98add5c30f9f4a8f937e0254077d5da60b2f98b4..aaec6d06c51c5cf0b7315dc266c7c55439d4f8f5 100644
--- a/src/components/Button/index.ts
+++ b/src/components/Button/index.ts
@@ -1,8 +1,8 @@
-import { withInstall } from '/@/utils';
-import type { ExtractPropTypes } from 'vue';
-import button from './src/BasicButton.vue';
-import popConfirmButton from './src/PopConfirmButton.vue';
-import { buttonProps } from './src/props';
+import { withInstall } from "/@/utils";
+import type { ExtractPropTypes } from "vue";
+import button from "./src/BasicButton.vue";
+import popConfirmButton from "./src/PopConfirmButton.vue";
+import { buttonProps } from "./src/props";
 
 export const Button = withInstall(button);
 export const PopConfirmButton = withInstall(popConfirmButton);
diff --git a/src/components/Button/src/BasicButton.vue b/src/components/Button/src/BasicButton.vue
index 73f0c449f52f2417994d56ba231b8425eec54528..a6fc16ad54a5eb1d5e92b995acece1a154d7fe7b 100644
--- a/src/components/Button/src/BasicButton.vue
+++ b/src/components/Button/src/BasicButton.vue
@@ -9,18 +9,18 @@
 </template>
 
 <script lang="ts">
-  import { defineComponent } from 'vue';
+  import { defineComponent } from "vue";
   export default defineComponent({
-    name: 'AButton',
+    name: "AButton",
     inheritAttrs: false,
   });
 </script>
 <script lang="ts" setup>
-  import { computed, unref } from 'vue';
-  import { Button } from 'ant-design-vue';
-  import Icon from '/@/components/Icon/src/Icon.vue';
-  import { buttonProps } from './props';
-  import { useAttrs } from '/@/hooks/core/useAttrs';
+  import { computed, unref } from "vue";
+  import { Button } from "ant-design-vue";
+  import Icon from "/@/components/Icon/src/Icon.vue";
+  import { buttonProps } from "./props";
+  import { useAttrs } from "/@/hooks/core/useAttrs";
 
   const props = defineProps(buttonProps);
   // get component class
diff --git a/src/components/Button/src/PopConfirmButton.vue b/src/components/Button/src/PopConfirmButton.vue
index b24225faa9226eb39d909dd5b73fd68f45397634..6aea61093b7e51b4ed3716dfd5f959f238dc7c57 100644
--- a/src/components/Button/src/PopConfirmButton.vue
+++ b/src/components/Button/src/PopConfirmButton.vue
@@ -1,11 +1,11 @@
 <script lang="ts">
-  import { computed, defineComponent, h, unref } from 'vue';
-  import BasicButton from './BasicButton.vue';
-  import { Popconfirm } from 'ant-design-vue';
-  import { extendSlots } from '/@/utils/helper/tsxHelper';
-  import { omit } from 'lodash-es';
-  import { useAttrs } from '/@/hooks/core/useAttrs';
-  import { useI18n } from '/@/hooks/web/useI18n';
+  import { computed, defineComponent, h, unref } from "vue";
+  import BasicButton from "./BasicButton.vue";
+  import { Popconfirm } from "ant-design-vue";
+  import { extendSlots } from "/@/utils/helper/tsxHelper";
+  import { omit } from "lodash-es";
+  import { useAttrs } from "/@/hooks/core/useAttrs";
+  import { useI18n } from "/@/hooks/web/useI18n";
 
   const props = {
     /**
@@ -19,7 +19,7 @@
   };
 
   export default defineComponent({
-    name: 'PopButton',
+    name: "PopButton",
     inheritAttrs: false,
     props,
     setup(props, { slots }) {
@@ -30,17 +30,17 @@
       const getBindValues = computed(() => {
         return Object.assign(
           {
-            okText: t('common.okText'),
-            cancelText: t('common.cancelText'),
+            okText: t("common.okText"),
+            cancelText: t("common.cancelText"),
           },
           { ...props, ...unref(attrs) },
         );
       });
 
       return () => {
-        const bindValues = omit(unref(getBindValues), 'icon');
-        const btnBind = omit(bindValues, 'title') as Recordable;
-        if (btnBind.disabled) btnBind.color = '';
+        const bindValues = omit(unref(getBindValues), "icon");
+        const btnBind = omit(bindValues, "title") as Recordable;
+        if (btnBind.disabled) btnBind.color = "";
         const Button = h(BasicButton, btnBind, extendSlots(slots));
 
         // If it is not enabled, it is a normal button
diff --git a/src/components/Button/src/props.ts b/src/components/Button/src/props.ts
index d79d378af42060e155151a664792b16d7e9a83fe..c2b9727a5435660a585d8a484910021f7e376c72 100644
--- a/src/components/Button/src/props.ts
+++ b/src/components/Button/src/props.ts
@@ -1,5 +1,5 @@
 export const buttonProps = {
-  color: { type: String, validator: (v) => ['error', 'warning', 'success', ''].includes(v) },
+  color: { type: String, validator: (v) => ["error", "warning", "success", ""].includes(v) },
   loading: { type: Boolean },
   disabled: { type: Boolean },
   /**
diff --git a/src/components/CardList/index.ts b/src/components/CardList/index.ts
index b977c1b16e2648ecbae9bd02ceac9f593b329259..21acf8932407db48b707300b9739ae6ec1268cba 100644
--- a/src/components/CardList/index.ts
+++ b/src/components/CardList/index.ts
@@ -1,4 +1,4 @@
-import { withInstall } from '/@/utils';
-import cardList from './src/CardList.vue';
+import { withInstall } from "/@/utils";
+import cardList from "./src/CardList.vue";
 
 export const CardList = withInstall(cardList);
diff --git a/src/components/CardList/src/CardList.vue b/src/components/CardList/src/CardList.vue
index 0000cd4fddaf4486d8a38e16aa99bbaad10e9e87..0385a2d96c7aac8c327107744cf878951d937e29 100644
--- a/src/components/CardList/src/CardList.vue
+++ b/src/components/CardList/src/CardList.vue
@@ -1,17 +1,95 @@
+<template>
+  <div class="p-2">
+    <div class="p-4 mb-2 bg-white">
+      <BasicForm @register="registerForm" />
+    </div>
+    <div class="p-2 bg-white">
+      <List
+        :grid="{ gutter: 5, xs: 1, sm: 2, md: 4, lg: 4, xl: 6, xxl: grid }"
+        :data-source="data"
+        :pagination="paginationProp"
+      >
+        <template #header>
+          <div class="flex justify-end space-x-2"
+            ><slot name="header"></slot>
+            <Tooltip>
+              <template #title>
+                <div class="w-50">每行显示数量</div
+                ><Slider
+                  id="slider"
+                  v-bind="sliderProp"
+                  v-model:value="grid"
+                  @change="sliderChange"
+              /></template>
+              <Button><TableOutlined /></Button>
+            </Tooltip>
+            <Tooltip @click="fetch">
+              <template #title>刷新</template>
+              <Button><RedoOutlined /></Button>
+            </Tooltip>
+          </div>
+        </template>
+        <template #renderItem="{ item }">
+          <ListItem>
+            <Card>
+              <template #title></template>
+              <template #cover>
+                <div :class="height">
+                  <Image :src="item.imgs[0]" />
+                </div>
+              </template>
+              <template #actions>
+                <!--              <SettingOutlined key="setting" />-->
+                <EditOutlined key="edit" />
+                <Dropdown
+                  :trigger="['hover']"
+                  :dropMenuList="[
+                    {
+                      text: '删除',
+                      event: '1',
+                      popConfirm: {
+                        title: '是否确认删除',
+                        confirm: handleDelete.bind(null, item.id),
+                      },
+                    },
+                  ]"
+                  popconfirm
+                >
+                  <EllipsisOutlined key="ellipsis" />
+                </Dropdown>
+              </template>
+
+              <CardMeta>
+                <template #title>
+                  <TypographyText :content="item.name" :ellipsis="{ tooltip: item.address }" />
+                </template>
+                <template #avatar>
+                  <Avatar :src="item.avatar" />
+                </template>
+                <template #description>{{ item.time }}</template>
+              </CardMeta>
+            </Card>
+          </ListItem>
+        </template>
+      </List>
+    </div>
+  </div>
+</template>
 <script lang="ts" setup>
-  import { computed, onMounted, ref } from 'vue';
+  import { computed, onMounted, ref } from "vue";
   import {
     EditOutlined,
     EllipsisOutlined,
     RedoOutlined,
     TableOutlined,
-  } from '@ant-design/icons-vue';
-  import { List, Card, Image, Typography, Tooltip, Slider, Avatar } from 'ant-design-vue';
-  import { Dropdown } from '/@/components/Dropdown';
-  import { BasicForm, useForm } from '/@/components/Form';
-  import { Button } from '/@/components/Button';
-  import { isFunction } from '/@/utils/is';
-  import { useSlider, grid } from './data';
+  } from "@ant-design/icons-vue";
+  import { List, Card, Image, Typography, Tooltip, Slider, Avatar } from "ant-design-vue";
+  import { Dropdown } from "/@/components/Dropdown";
+  import { BasicForm, useForm } from "/@/components/Form";
+  import { propTypes } from "/@/utils/propTypes";
+  import { Button } from "/@/components/Button";
+  import { isFunction } from "/@/utils/is";
+  import { useSlider, grid } from "./data";
   const ListItem = List.Item;
   const CardMeta = Card.Meta;
   const TypographyText = Typography.Text;
@@ -20,18 +98,12 @@
   // 组件接收参数
   const props = defineProps({
     // 请求API的参数
-    params: {
-      type: Object,
-      default: () => ({}),
-    },
+    params: propTypes.object.def({}),
     //api
-    api: {
-      type: Function,
-      default: null,
-    },
+    api: propTypes.func,
   });
   //暴露内部方法
-  const emit = defineEmits(['getMethod', 'delete']);
+  const emit = defineEmits(["getMethod", "delete"]);
   //数据
   const data = ref([]);
   // 切换每行个数
@@ -43,7 +115,7 @@
   });
   //表单
   const [registerForm, { validate }] = useForm({
-    schemas: [{ field: 'type', component: 'Input', label: '类型' }],
+    schemas: [{ field: "type", component: "Input", label: "类型" }],
     labelWidth: 80,
     baseColProps: { span: 6 },
     actionColOptions: { span: 24 },
@@ -63,7 +135,7 @@
   // 自动请求并暴露内部方法
   onMounted(() => {
     fetch();
-    emit('getMethod', fetch);
+    emit("getMethod", fetch);
   });
 
   async function fetch(p = {}) {
@@ -100,84 +172,6 @@
   }
 
   async function handleDelete(id) {
-    emit('delete', id);
+    emit("delete", id);
   }
 </script>
-
-<template>
-  <div class="p-2">
-    <div class="p-4 mb-2 bg-white">
-      <BasicForm @register="registerForm" />
-    </div>
-    {{ sliderProp.width }}
-    <div class="p-2 bg-white">
-      <List
-        :grid="{ gutter: 5, xs: 1, sm: 2, md: 4, lg: 4, xl: 6, xxl: grid }"
-        :data-source="data"
-        :pagination="paginationProp"
-      >
-        <template #header>
-          <div class="flex justify-end space-x-2"
-            ><slot name="header"></slot>
-            <Tooltip>
-              <template #title>
-                <div class="w-50">每行显示数量</div
-                ><Slider
-                  id="slider"
-                  v-bind="sliderProp"
-                  v-model:value="grid"
-                  @change="sliderChange"
-              /></template>
-              <Button><TableOutlined /></Button>
-            </Tooltip>
-            <Tooltip @click="fetch">
-              <template #title>刷新</template>
-              <Button><RedoOutlined /></Button>
-            </Tooltip>
-          </div>
-        </template>
-        <template #renderItem="{ item }">
-          <ListItem>
-            <Card>
-              <template #title></template>
-              <template #cover>
-                <div :class="height">
-                  <Image :src="item.imgs[0]" />
-                </div>
-              </template>
-              <template #actions>
-                <EditOutlined key="edit" />
-                <Dropdown
-                  :trigger="['hover']"
-                  :dropMenuList="[
-                    {
-                      text: '删除',
-                      event: '1',
-                      popConfirm: {
-                        title: '是否确认删除',
-                        confirm: handleDelete.bind(null, item.id),
-                      },
-                    },
-                  ]"
-                  popconfirm
-                >
-                  <EllipsisOutlined key="ellipsis" />
-                </Dropdown>
-              </template>
-
-              <CardMeta>
-                <template #title>
-                  <TypographyText :content="item.name" :ellipsis="{ tooltip: item.address }" />
-                </template>
-                <template #avatar>
-                  <Avatar :src="item.avatar" />
-                </template>
-                <template #description>{{ item.time }}</template>
-              </CardMeta>
-            </Card>
-          </ListItem>
-        </template>
-      </List>
-    </div>
-  </div>
-</template>
diff --git a/src/components/CardList/src/data.ts b/src/components/CardList/src/data.ts
index ac56cad9192817b7bcc9ab2187c25854bb072bc4..6d12f2e522552a228b6fa4db3f8c98869f594cb9 100644
--- a/src/components/CardList/src/data.ts
+++ b/src/components/CardList/src/data.ts
@@ -1,5 +1,5 @@
-import { ref } from 'vue';
-//每行个数
+import { ref } from "vue";
+// 每行个数
 export const grid = ref(12);
 // slider属性
 export const useSlider = (min = 6, max = 12) => {
@@ -9,7 +9,7 @@ export const useSlider = (min = 6, max = 12) => {
     for (let i = min; i < max + 1; i++) {
       l[i] = {
         style: {
-          color: '#fff',
+          color: "#fff",
         },
         label: i,
       };
diff --git a/src/components/ClickOutSide/index.ts b/src/components/ClickOutSide/index.ts
index 5e7dd2d337ee9786358add7a7b5800179ff6d166..06a0b8a3bce9359c8c370fbc4c87da75d6894b6f 100644
--- a/src/components/ClickOutSide/index.ts
+++ b/src/components/ClickOutSide/index.ts
@@ -1,4 +1,4 @@
-import { withInstall } from '/@/utils';
-import clickOutSide from './src/ClickOutSide.vue';
+import { withInstall } from "/@/utils";
+import clickOutSide from "./src/ClickOutSide.vue";
 
 export const ClickOutSide = withInstall(clickOutSide);
diff --git a/src/components/ClickOutSide/src/ClickOutSide.vue b/src/components/ClickOutSide/src/ClickOutSide.vue
index c043cc190e3e9f6a2b588c27f97cb3748ed712e2..0e81ccde6870aeeae0c3ff7d39587ab929b6f902 100644
--- a/src/components/ClickOutSide/src/ClickOutSide.vue
+++ b/src/components/ClickOutSide/src/ClickOutSide.vue
@@ -4,16 +4,16 @@
   </div>
 </template>
 <script lang="ts" setup>
-  import { ref, onMounted } from 'vue';
-  import { onClickOutside } from '@vueuse/core';
-  const emit = defineEmits(['mounted', 'clickOutside']);
+  import { ref, onMounted } from "vue";
+  import { onClickOutside } from "@vueuse/core";
+  const emit = defineEmits(["mounted", "clickOutside"]);
   const wrap = ref<ElRef>(null);
 
   onClickOutside(wrap, () => {
-    emit('clickOutside');
+    emit("clickOutside");
   });
 
   onMounted(() => {
-    emit('mounted');
+    emit("mounted");
   });
 </script>
diff --git a/src/components/CodeEditor/index.ts b/src/components/CodeEditor/index.ts
index 872bfedf9fb787a3162ee416186516a02512a607..fa2fb43e2ed29b62c92efd7b9984a75b767a83c9 100644
--- a/src/components/CodeEditor/index.ts
+++ b/src/components/CodeEditor/index.ts
@@ -1,8 +1,8 @@
-import { withInstall } from '/@/utils';
-import codeEditor from './src/CodeEditor.vue';
-import jsonPreview from './src/json-preview/JsonPreview.vue';
+import { withInstall } from "/@/utils";
+import codeEditor from "./src/CodeEditor.vue";
+import jsonPreview from "./src/json-preview/JsonPreview.vue";
 
 export const CodeEditor = withInstall(codeEditor);
 export const JsonPreview = withInstall(jsonPreview);
 
-export * from './src/typing';
+export * from "./src/typing";
diff --git a/src/components/CodeEditor/src/CodeEditor.vue b/src/components/CodeEditor/src/CodeEditor.vue
index db9042b506d2d90e93198b75e3d14aa5464b5a99..82fd1afbf6ca2f54b54250880f8aadc37bfddd0b 100644
--- a/src/components/CodeEditor/src/CodeEditor.vue
+++ b/src/components/CodeEditor/src/CodeEditor.vue
@@ -9,10 +9,10 @@
   </div>
 </template>
 <script lang="ts" setup>
-  import { computed } from 'vue';
-  import CodeMirrorEditor from './codemirror/CodeMirror.vue';
-  import { isString } from '/@/utils/is';
-  import { MODE } from './typing';
+  import { computed } from "vue";
+  import CodeMirrorEditor from "./codemirror/CodeMirror.vue";
+  import { isString } from "/@/utils/is";
+  import { MODE } from "./typing";
 
   const props = defineProps({
     value: { type: [Object, String] as PropType<Record<string, any> | string> },
@@ -28,7 +28,7 @@
     autoFormat: { type: Boolean, default: true },
   });
 
-  const emit = defineEmits(['change', 'update:value', 'format-error']);
+  const emit = defineEmits(["change", "update:value", "format-error"]);
 
   const getValue = computed(() => {
     const { value, mode, autoFormat } = props;
@@ -40,7 +40,7 @@
       try {
         result = JSON.parse(value);
       } catch (e) {
-        emit('format-error', value);
+        emit("format-error", value);
         return value as string;
       }
     }
@@ -48,7 +48,7 @@
   });
 
   function handleValueChange(v) {
-    emit('update:value', v);
-    emit('change', v);
+    emit("update:value", v);
+    emit("change", v);
   }
 </script>
diff --git a/src/components/CodeEditor/src/codemirror/CodeMirror.vue b/src/components/CodeEditor/src/codemirror/CodeMirror.vue
index 426ac36e5cf72b24100be83bfed555b13f2a107b..b2bed9f2ac59f48f5806aee7d372005638213fdf 100644
--- a/src/components/CodeEditor/src/codemirror/CodeMirror.vue
+++ b/src/components/CodeEditor/src/codemirror/CodeMirror.vue
@@ -3,20 +3,20 @@
 </template>
 
 <script lang="ts" setup>
-  import { ref, onMounted, onUnmounted, watchEffect, watch, unref, nextTick } from 'vue';
-  import { useDebounceFn } from '@vueuse/core';
-  import { useAppStore } from '/@/store/modules/app';
-  import { useWindowSizeFn } from '/@/hooks/event/useWindowSizeFn';
-  import CodeMirror from 'codemirror';
-  import { MODE } from './../typing';
+  import { ref, onMounted, onUnmounted, watchEffect, watch, unref, nextTick } from "vue";
+  import { useDebounceFn } from "@vueuse/core";
+  import { useAppStore } from "/@/store/modules/app";
+  import { useWindowSizeFn } from "/@/hooks/event/useWindowSizeFn";
+  import CodeMirror from "codemirror";
+  import { MODE } from "./../typing";
   // css
-  import './codemirror.css';
-  import 'codemirror/theme/idea.css';
-  import 'codemirror/theme/material-palenight.css';
+  import "./codemirror.css";
+  import "codemirror/theme/idea.css";
+  import "codemirror/theme/material-palenight.css";
   // modes
-  import 'codemirror/mode/javascript/javascript';
-  import 'codemirror/mode/css/css';
-  import 'codemirror/mode/htmlmixed/htmlmixed';
+  import "codemirror/mode/javascript/javascript";
+  import "codemirror/mode/css/css";
+  import "codemirror/mode/htmlmixed/htmlmixed";
 
   const props = defineProps({
     mode: {
@@ -27,11 +27,11 @@
         return Object.values(MODE).includes(value);
       },
     },
-    value: { type: String, default: '' },
+    value: { type: String, default: "" },
     readonly: { type: Boolean, default: false },
   });
 
-  const emit = defineEmits(['change']);
+  const emit = defineEmits(["change"]);
 
   const el = ref();
   let editor: Nullable<CodeMirror.Editor>;
@@ -45,14 +45,14 @@
       await nextTick();
       const oldValue = editor?.getValue();
       if (value !== oldValue) {
-        editor?.setValue(value ? value : '');
+        editor?.setValue(value ? value : "");
       }
     },
-    { flush: 'post' },
+    { flush: "post" },
   );
 
   watchEffect(() => {
-    editor?.setOption('mode', props.mode);
+    editor?.setOption("mode", props.mode);
   });
 
   watch(
@@ -67,8 +67,8 @@
 
   function setTheme() {
     unref(editor)?.setOption(
-      'theme',
-      appStore.getDarkMode === 'light' ? 'idea' : 'material-palenight',
+      "theme",
+      appStore.getDarkMode === "light" ? "idea" : "material-palenight",
     );
   }
 
@@ -81,23 +81,23 @@
       autoCloseBrackets: true,
       autoCloseTags: true,
       foldGutter: true,
-      gutters: ['CodeMirror-linenumbers'],
+      gutters: ["CodeMirror-linenumbers"],
     };
 
     editor = CodeMirror(el.value!, {
-      value: '',
+      value: "",
       mode: props.mode,
       readOnly: props.readonly,
       tabSize: 2,
-      theme: 'material-palenight',
+      theme: "material-palenight",
       lineWrapping: true,
       lineNumbers: true,
       ...addonOptions,
     });
     editor?.setValue(props.value);
     setTheme();
-    editor?.on('change', () => {
-      emit('change', editor?.getValue());
+    editor?.on("change", () => {
+      emit("change", editor?.getValue());
     });
   }
 
diff --git a/src/components/CodeEditor/src/codemirror/codeMirror.ts b/src/components/CodeEditor/src/codemirror/codeMirror.ts
index e04f51be2dc6fd60a50145e7d7dd2ddfbfaa9f59..d70f2825fa2af6e5339fffc4e479210f4a3b6de8 100644
--- a/src/components/CodeEditor/src/codemirror/codeMirror.ts
+++ b/src/components/CodeEditor/src/codemirror/codeMirror.ts
@@ -1,13 +1,13 @@
-import CodeMirror from 'codemirror';
-import './codemirror.css';
-import 'codemirror/theme/idea.css';
-import 'codemirror/theme/material-palenight.css';
+import CodeMirror from "codemirror";
+import "./codemirror.css";
+import "codemirror/theme/idea.css";
+import "codemirror/theme/material-palenight.css";
 // import 'codemirror/addon/lint/lint.css';
 
 // modes
-import 'codemirror/mode/javascript/javascript';
-import 'codemirror/mode/css/css';
-import 'codemirror/mode/htmlmixed/htmlmixed';
+import "codemirror/mode/javascript/javascript";
+import "codemirror/mode/css/css";
+import "codemirror/mode/htmlmixed/htmlmixed";
 // addons
 // import 'codemirror/addon/edit/closebrackets';
 // import 'codemirror/addon/edit/closetag';
diff --git a/src/components/CodeEditor/src/codemirror/codemirror.css b/src/components/CodeEditor/src/codemirror/codemirror.css
index 8e9cbd8641657537af05eb5171bb8c3ba2b26349..a2001809106786f0fe02d75303f485bfd8b85a73 100644
--- a/src/components/CodeEditor/src/codemirror/codemirror.css
+++ b/src/components/CodeEditor/src/codemirror/codemirror.css
@@ -53,7 +53,7 @@
   color: var(--comment);
   text-align: right;
   white-space: nowrap;
-  opacity: 60%;
+  opacity: 0.6;
 }
 
 .CodeMirror-guttermarker {
@@ -89,8 +89,8 @@
   top: -0.1em;
   display: inline-block;
   font-size: 0.8em;
-  content: '>';
-  opacity: 80%;
+  content: ">";
+  opacity: 0.8;
   transform: rotate(90deg);
   transition: transform 0.2s;
 }
@@ -516,7 +516,7 @@ div.CodeMirror-dragcursors {
 
 /* See issue #2901 */
 .cm-tab-wrap-hack::after {
-  content: '';
+  content: "";
 }
 
 /* Help users use markselection to safely style text background */
diff --git a/src/components/CodeEditor/src/json-preview/JsonPreview.vue b/src/components/CodeEditor/src/json-preview/JsonPreview.vue
index 75890c336c25b06c9d3c349e8c4b6149127d4347..5ee8286e2b11225c10a3507795cf7f23a898f1c8 100644
--- a/src/components/CodeEditor/src/json-preview/JsonPreview.vue
+++ b/src/components/CodeEditor/src/json-preview/JsonPreview.vue
@@ -3,8 +3,8 @@
 </template>
 
 <script lang="ts" setup>
-  import VueJsonPretty from 'vue-json-pretty';
-  import 'vue-json-pretty/lib/styles.css';
+  import VueJsonPretty from "vue-json-pretty";
+  import "vue-json-pretty/lib/styles.css";
 
   defineProps({
     data: Object,
diff --git a/src/components/CodeEditor/src/typing.ts b/src/components/CodeEditor/src/typing.ts
index 34b5ed1f40b4b8bc93b8537dc9d9cdb3f6a617ea..16eee6b41ae57c3c1506196027ac7edc8648388c 100644
--- a/src/components/CodeEditor/src/typing.ts
+++ b/src/components/CodeEditor/src/typing.ts
@@ -1,5 +1,5 @@
 export enum MODE {
-  JSON = 'application/json',
-  HTML = 'htmlmixed',
-  JS = 'javascript',
+  JSON = "application/json",
+  HTML = "htmlmixed",
+  JS = "javascript",
 }
diff --git a/src/components/Container/index.ts b/src/components/Container/index.ts
index e1230a0939bc7a66d899f12f94d24dd167e46ce4..21a7dd3c614fdbc5bc7d4aa4986ec17d7b285768 100644
--- a/src/components/Container/index.ts
+++ b/src/components/Container/index.ts
@@ -1,10 +1,10 @@
-import { withInstall } from '/@/utils';
-import collapseContainer from './src/collapse/CollapseContainer.vue';
-import scrollContainer from './src/ScrollContainer.vue';
-import lazyContainer from './src/LazyContainer.vue';
+import { withInstall } from "/@/utils";
+import collapseContainer from "./src/collapse/CollapseContainer.vue";
+import scrollContainer from "./src/ScrollContainer.vue";
+import lazyContainer from "./src/LazyContainer.vue";
 
 export const CollapseContainer = withInstall(collapseContainer);
 export const ScrollContainer = withInstall(scrollContainer);
 export const LazyContainer = withInstall(lazyContainer);
 
-export * from './src/typing';
+export * from "./src/typing";
diff --git a/src/components/Container/src/LazyContainer.vue b/src/components/Container/src/LazyContainer.vue
index a7ad2b69f76aa9023afa83dda980565c88be2d82..853e7624b708f0eaebe1863ccc114686d3ce6473 100644
--- a/src/components/Container/src/LazyContainer.vue
+++ b/src/components/Container/src/LazyContainer.vue
@@ -17,11 +17,11 @@
   </transition-group>
 </template>
 <script lang="ts">
-  import type { PropType } from 'vue';
-  import { defineComponent, reactive, onMounted, ref, toRef, toRefs } from 'vue';
-  import { Skeleton } from 'ant-design-vue';
-  import { useTimeoutFn } from '/@/hooks/core/useTimeout';
-  import { useIntersectionObserver } from '/@/hooks/event/useIntersectionObserver';
+  import type { PropType } from "vue";
+  import { defineComponent, reactive, onMounted, ref, toRef, toRefs } from "vue";
+  import { Skeleton } from "ant-design-vue";
+  import { useTimeoutFn } from "/@/hooks/core/useTimeout";
+  import { useIntersectionObserver } from "/@/hooks/event/useIntersectionObserver";
 
   interface State {
     isInit: boolean;
@@ -39,38 +39,38 @@
      * If the component is scrolling in the page container, the viewport is the container
      */
     viewport: {
-      type: (typeof window !== 'undefined' ? window.HTMLElement : Object) as PropType<HTMLElement>,
+      type: (typeof window !== "undefined" ? window.HTMLElement : Object) as PropType<HTMLElement>,
       default: () => null,
     },
     /**
      * Preload threshold, css unit
      */
-    threshold: { type: String, default: '0px' },
+    threshold: { type: String, default: "0px" },
     /**
      * The scroll direction of the viewport, vertical represents the vertical direction, horizontal represents the horizontal direction
      */
     direction: {
       type: String,
-      default: 'vertical',
-      validator: (v) => ['vertical', 'horizontal'].includes(v),
+      default: "vertical",
+      validator: (v) => ["vertical", "horizontal"].includes(v),
     },
     /**
      * The label name of the outer container that wraps the component
      */
-    tag: { type: String, default: 'div' },
+    tag: { type: String, default: "div" },
     maxWaitingTime: { type: Number, default: 80 },
     /**
      * transition name
      */
-    transitionName: { type: String, default: 'lazy-container' },
+    transitionName: { type: String, default: "lazy-container" },
   };
 
   export default defineComponent({
-    name: 'LazyContainer',
+    name: "LazyContainer",
     components: { Skeleton },
     inheritAttrs: false,
     props,
-    emits: ['init'],
+    emits: ["init"],
     setup(props, { emit }) {
       const elRef = ref();
       const state = reactive<State>({
@@ -99,7 +99,7 @@
         useTimeoutFn(() => {
           if (state.isInit) return;
           state.isInit = true;
-          emit('init');
+          emit("init");
         }, props.maxWaitingTime || 80);
       }
 
@@ -107,12 +107,12 @@
         const { timeout, direction, threshold } = props;
         if (timeout) return;
         // According to the scrolling direction to construct the viewport margin, used to load in advance
-        let rootMargin = '0px';
+        let rootMargin = "0px";
         switch (direction) {
-          case 'vertical':
+          case "vertical":
             rootMargin = `${threshold} 0px`;
             break;
-          case 'horizontal':
+          case "horizontal":
             rootMargin = `0px ${threshold}`;
             break;
         }
@@ -120,7 +120,7 @@
         try {
           const { stop, observer } = useIntersectionObserver({
             rootMargin,
-            target: toRef(elRef.value, '$el'),
+            target: toRef(elRef.value, "$el"),
             onIntersect: (entries: any[]) => {
               const isIntersecting = entries[0].isIntersecting || entries[0].intersectionRatio;
               if (isIntersecting) {
@@ -130,7 +130,7 @@
                 }
               }
             },
-            root: toRef(props, 'viewport'),
+            root: toRef(props, "viewport"),
           });
         } catch (e) {
           init();
diff --git a/src/components/Container/src/ScrollContainer.vue b/src/components/Container/src/ScrollContainer.vue
index 65c71edcea81a9241061b80899bccc172a3f7dc0..a73c5a52cc8d4b18438159d961a3d3a8c7211fe1 100644
--- a/src/components/Container/src/ScrollContainer.vue
+++ b/src/components/Container/src/ScrollContainer.vue
@@ -5,12 +5,12 @@
 </template>
 
 <script lang="ts">
-  import { defineComponent, ref, unref, nextTick } from 'vue';
-  import { Scrollbar, ScrollbarType } from '/@/components/Scrollbar';
-  import { useScrollTo } from '/@/hooks/event/useScrollTo';
+  import { defineComponent, ref, unref, nextTick } from "vue";
+  import { Scrollbar, ScrollbarType } from "/@/components/Scrollbar";
+  import { useScrollTo } from "/@/hooks/event/useScrollTo";
 
   export default defineComponent({
-    name: 'ScrollContainer',
+    name: "ScrollContainer",
     components: { Scrollbar },
     setup() {
       const scrollbarRef = ref<Nullable<ScrollbarType>>(null);
diff --git a/src/components/Container/src/collapse/CollapseContainer.vue b/src/components/Container/src/collapse/CollapseContainer.vue
index 4b629f21ae69f5f26c9567db48c0b39112526783..4cfacfd178cfff48f980e7f6ba87c5b5abdfb593 100644
--- a/src/components/Container/src/collapse/CollapseContainer.vue
+++ b/src/components/Container/src/collapse/CollapseContainer.vue
@@ -1,6 +1,6 @@
 <template>
   <div :class="prefixCls">
-    <CollapseHeader v-bind="$props" :prefixCls="prefixCls" :show="show" @expand="handleExpand">
+    <CollapseHeader v-bind="props" :prefixCls="prefixCls" :show="show" @expand="handleExpand">
       <template #title>
         <slot name="title"></slot>
       </template>
@@ -23,19 +23,20 @@
   </div>
 </template>
 <script lang="ts" setup>
-  import type { PropType } from 'vue';
-  import { ref } from 'vue';
+  import type { PropType } from "vue";
+  import { ref } from "vue";
+  import { isNil } from "lodash-es";
   // component
-  import { Skeleton } from 'ant-design-vue';
-  import { CollapseTransition } from '/@/components/Transition';
-  import CollapseHeader from './CollapseHeader.vue';
-  import { triggerWindowResize } from '/@/utils/event';
+  import { Skeleton } from "ant-design-vue";
+  import { CollapseTransition } from "/@/components/Transition";
+  import CollapseHeader from "./CollapseHeader.vue";
+  import { triggerWindowResize } from "/@/utils/event";
   // hook
-  import { useTimeoutFn } from '/@/hooks/core/useTimeout';
-  import { useDesign } from '/@/hooks/web/useDesign';
+  import { useTimeoutFn } from "/@/hooks/core/useTimeout";
+  import { useDesign } from "/@/hooks/web/useDesign";
 
   const props = defineProps({
-    title: { type: String, default: '' },
+    title: { type: String, default: "" },
     loading: { type: Boolean },
     /**
      *  Can it be expanded
@@ -46,7 +47,7 @@
      */
     helpMessage: {
       type: [Array, String] as PropType<string[] | string>,
-      default: '',
+      default: "",
     },
     /**
      * Whether to trigger window.resize when expanding and contracting,
@@ -61,21 +62,25 @@
 
   const show = ref(true);
 
-  const { prefixCls } = useDesign('collapse-container');
+  const { prefixCls } = useDesign("collapse-container");
 
   /**
    * @description: Handling development events
    */
-  function handleExpand() {
-    show.value = !show.value;
+  function handleExpand(val: boolean) {
+    show.value = isNil(val) ? !show.value : val;
     if (props.triggerWindowResize) {
       // 200 milliseconds here is because the expansion has animation,
       useTimeoutFn(triggerWindowResize, 200);
     }
   }
+
+  defineExpose({
+    handleExpand,
+  });
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-collapse-container';
+  @prefix-cls: ~"@{namespace}-collapse-container";
 
   .@{prefix-cls} {
     background-color: @component-background;
diff --git a/src/components/Container/src/collapse/CollapseHeader.vue b/src/components/Container/src/collapse/CollapseHeader.vue
index 4196c0a6f975206a998b5af27b032c2145b9084c..b6f5d0b30b5a77f61aa2404b0d9560ad7d315655 100644
--- a/src/components/Container/src/collapse/CollapseHeader.vue
+++ b/src/components/Container/src/collapse/CollapseHeader.vue
@@ -15,14 +15,14 @@
   </div>
 </template>
 <script lang="ts">
-  import { defineComponent } from 'vue';
-  import { BasicArrow, BasicTitle } from '/@/components/Basic';
+  import { defineComponent } from "vue";
+  import { BasicArrow, BasicTitle } from "/@/components/Basic";
 
   const props = {
     prefixCls: { type: String },
     helpMessage: {
       type: [Array, String] as PropType<string[] | string>,
-      default: '',
+      default: "",
     },
     title: { type: String },
     show: { type: Boolean },
@@ -33,6 +33,6 @@
     components: { BasicArrow, BasicTitle },
     inheritAttrs: false,
     props,
-    emits: ['expand'],
+    emits: ["expand"],
   });
 </script>
diff --git a/src/components/Container/src/typing.ts b/src/components/Container/src/typing.ts
index 86c03bea6569aa947162133b7ac2e1467d121b7c..371144eaa6a6e55d04df6ba59fba4f4ddd568180 100644
--- a/src/components/Container/src/typing.ts
+++ b/src/components/Container/src/typing.ts
@@ -1,4 +1,4 @@
-export type ScrollType = 'default' | 'main';
+export type ScrollType = "default" | "main";
 
 export interface CollapseContainerOptions {
   canExpand?: boolean;
diff --git a/src/components/ContextMenu/index.ts b/src/components/ContextMenu/index.ts
index ed294d7bb20ed8dd148adf856fda84e07deb05f2..206bfaaff1dd0dac1ef81af7eaa15d449e04bae3 100644
--- a/src/components/ContextMenu/index.ts
+++ b/src/components/ContextMenu/index.ts
@@ -1,3 +1,3 @@
-export { createContextMenu, destroyContextMenu } from './src/createContextMenu';
+export { createContextMenu, destroyContextMenu } from "./src/createContextMenu";
 
-export * from './src/typing';
+export * from "./src/typing";
diff --git a/src/components/ContextMenu/src/ContextMenu.vue b/src/components/ContextMenu/src/ContextMenu.vue
index 77f250fd23e897db2bf0a556d7340571835b2efa..16946e5a866aa9810122ba89cbcb1b04d51c05aa 100644
--- a/src/components/ContextMenu/src/ContextMenu.vue
+++ b/src/components/ContextMenu/src/ContextMenu.vue
@@ -1,11 +1,11 @@
 <script lang="tsx">
-  import type { ContextMenuItem, ItemContentProps, Axis } from './typing';
-  import type { FunctionalComponent, CSSProperties } from 'vue';
-  import { defineComponent, nextTick, onMounted, computed, ref, unref, onUnmounted } from 'vue';
-  import Icon from '/@/components/Icon';
-  import { Menu, Divider } from 'ant-design-vue';
+  import type { ContextMenuItem, ItemContentProps, Axis } from "./typing";
+  import type { FunctionalComponent, CSSProperties, PropType } from "vue";
+  import { defineComponent, nextTick, onMounted, computed, ref, unref, onUnmounted } from "vue";
+  import Icon from "/@/components/Icon";
+  import { Menu, Divider } from "ant-design-vue";
 
-  const prefixCls = 'context-menu';
+  const prefixCls = "context-menu";
 
   const props = {
     width: { type: Number, default: 156 },
@@ -43,7 +43,7 @@
   };
 
   export default defineComponent({
-    name: 'ContextMenu',
+    name: "ContextMenu",
     props,
     setup(props) {
       const wrapRef = ref(null);
@@ -60,9 +60,11 @@
         const top = body.clientHeight < y + menuHeight ? y - menuHeight : y;
         return {
           ...styles,
+          position: "absolute",
           width: `${width}px`,
           left: `${left + 1}px`,
           top: `${top + 1}px`,
+          zIndex: 9999,
         };
       });
 
@@ -87,7 +89,8 @@
       }
 
       function renderMenuItem(items: ContextMenuItem[]) {
-        return items.map((item) => {
+        const visibleItems = items.filter((item) => !item.hidden);
+        return visibleItems.map((item) => {
           const { disabled, label, children, divider = false } = item;
 
           const contentProps = {
@@ -124,15 +127,11 @@
         }
         const { items } = props;
         return (
-          <Menu
-            inlineIndent={12}
-            mode="vertical"
-            class={prefixCls}
-            ref={wrapRef}
-            style={unref(getStyle)}
-          >
-            {renderMenuItem(items)}
-          </Menu>
+          <div class={prefixCls}>
+            <Menu inlineIndent={12} mode="vertical" ref={wrapRef} style={unref(getStyle)}>
+              {renderMenuItem(items)}
+            </Menu>
+          </div>
         );
       };
     },
@@ -185,6 +184,9 @@
     background-clip: padding-box;
     user-select: none;
 
+    &__item {
+      margin: 0 !important;
+    }
     .item-style();
 
     .ant-divider {
diff --git a/src/components/ContextMenu/src/createContextMenu.ts b/src/components/ContextMenu/src/createContextMenu.ts
index 8f7a1c82bb3955f738297b42a41150ecb4134518..56b29ef69435d85d08471f93933617c54ef93628 100644
--- a/src/components/ContextMenu/src/createContextMenu.ts
+++ b/src/components/ContextMenu/src/createContextMenu.ts
@@ -1,7 +1,7 @@
-import contextMenuVue from './ContextMenu.vue';
-import { isClient } from '/@/utils/is';
-import { CreateContextOptions, ContextMenuProps } from './typing';
-import { createVNode, render } from 'vue';
+import contextMenuVue from "./ContextMenu.vue";
+import { isClient } from "/@/utils/is";
+import { CreateContextOptions, ContextMenuProps } from "./typing";
+import { createVNode, render } from "vue";
 
 const menuManager: {
   domList: Element[];
@@ -22,7 +22,7 @@ export const createContextMenu = function (options: CreateContextOptions) {
   return new Promise((resolve) => {
     const body = document.body;
 
-    const container = document.createElement('div');
+    const container = document.createElement("div");
     const propsData: Partial<ContextMenuProps> = {};
     if (options.styles) {
       propsData.styles = options.styles;
@@ -41,7 +41,7 @@ export const createContextMenu = function (options: CreateContextOptions) {
     render(vm, container);
 
     const handleClick = function () {
-      menuManager.resolve('');
+      menuManager.resolve("");
     };
 
     menuManager.domList.push(container);
@@ -52,8 +52,8 @@ export const createContextMenu = function (options: CreateContextOptions) {
           dom && body.removeChild(dom);
         } catch (error) {}
       });
-      body.removeEventListener('click', handleClick);
-      body.removeEventListener('scroll', handleClick);
+      body.removeEventListener("click", handleClick);
+      body.removeEventListener("scroll", handleClick);
     };
 
     menuManager.resolve = function (arg) {
@@ -62,14 +62,14 @@ export const createContextMenu = function (options: CreateContextOptions) {
     };
     remove();
     body.appendChild(container);
-    body.addEventListener('click', handleClick);
-    body.addEventListener('scroll', handleClick);
+    body.addEventListener("click", handleClick);
+    body.addEventListener("scroll", handleClick);
   });
 };
 
 export const destroyContextMenu = function () {
   if (menuManager) {
-    menuManager.resolve('');
+    menuManager.resolve("");
     menuManager.domList = [];
   }
 };
diff --git a/src/components/ContextMenu/src/typing.ts b/src/components/ContextMenu/src/typing.ts
index 899d36b26ce2fbc09ae025c5e3be9b1455fd2900..63d3d37fea6cbe5615b7feca0af175f8b24c0839 100644
--- a/src/components/ContextMenu/src/typing.ts
+++ b/src/components/ContextMenu/src/typing.ts
@@ -6,6 +6,7 @@ export interface Axis {
 export interface ContextMenuItem {
   label: string;
   icon?: string;
+  hidden?: boolean;
   disabled?: boolean;
   handler?: Fn;
   divider?: boolean;
diff --git a/src/components/CountDown/index.ts b/src/components/CountDown/index.ts
index 9809416949352f4398c30106c1d2568842642e43..467f85ab944cb7f354af311500e6d269012d073b 100644
--- a/src/components/CountDown/index.ts
+++ b/src/components/CountDown/index.ts
@@ -1,6 +1,6 @@
-import { withInstall } from '/@/utils';
-import countButton from './src/CountButton.vue';
-import countdownInput from './src/CountdownInput.vue';
+import { withInstall } from "/@/utils";
+import countButton from "./src/CountButton.vue";
+import countdownInput from "./src/CountdownInput.vue";
 
 export const CountdownInput = withInstall(countdownInput);
 export const CountButton = withInstall(countButton);
diff --git a/src/components/CountDown/src/CountButton.vue b/src/components/CountDown/src/CountButton.vue
index 1ef520edec00a2597f588fa5b68fcd5bb21e514d..475412a5050941ee69f4c11a6c07d7e1e228ff99 100644
--- a/src/components/CountDown/src/CountButton.vue
+++ b/src/components/CountDown/src/CountButton.vue
@@ -4,11 +4,11 @@
   </Button>
 </template>
 <script lang="ts">
-  import { defineComponent, ref, watchEffect, computed, unref } from 'vue';
-  import { Button } from 'ant-design-vue';
-  import { useCountdown } from './useCountdown';
-  import { isFunction } from '/@/utils/is';
-  import { useI18n } from '/@/hooks/web/useI18n';
+  import { defineComponent, ref, watchEffect, computed, unref } from "vue";
+  import { Button } from "ant-design-vue";
+  import { useCountdown } from "./useCountdown";
+  import { isFunction } from "/@/utils/is";
+  import { useI18n } from "/@/hooks/web/useI18n";
 
   const props = {
     value: { type: [Object, Number, String, Array] },
@@ -20,7 +20,7 @@
   };
 
   export default defineComponent({
-    name: 'CountButton',
+    name: "CountButton",
     components: { Button },
     props,
     setup(props) {
@@ -31,8 +31,8 @@
 
       const getButtonText = computed(() => {
         return !unref(isStart)
-          ? t('component.countdown.normalText')
-          : t('component.countdown.sendText', [unref(currentCount)]);
+          ? t("component.countdown.normalText")
+          : t("component.countdown.sendText", [unref(currentCount)]);
       });
 
       watchEffect(() => {
diff --git a/src/components/CountDown/src/CountdownInput.vue b/src/components/CountDown/src/CountdownInput.vue
index 8da89cd6ba399ec82f7abb2f527cb77323ab84c2..27e6b7e2fda1958ec039259511f8e95ce0002324 100644
--- a/src/components/CountDown/src/CountdownInput.vue
+++ b/src/components/CountDown/src/CountdownInput.vue
@@ -9,14 +9,14 @@
   </a-input>
 </template>
 <script lang="ts">
-  import { defineComponent, PropType } from 'vue';
-  import CountButton from './CountButton.vue';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useRuleFormItem } from '/@/hooks/component/useFormItem';
+  import { defineComponent, PropType } from "vue";
+  import CountButton from "./CountButton.vue";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useRuleFormItem } from "/@/hooks/component/useFormItem";
 
   const props = {
     value: { type: String },
-    size: { type: String, validator: (v) => ['default', 'large', 'small'].includes(v) },
+    size: { type: String, validator: (v) => ["default", "large", "small"].includes(v) },
     count: { type: Number, default: 60 },
     sendCodeApi: {
       type: Function as PropType<() => Promise<boolean>>,
@@ -25,12 +25,12 @@
   };
 
   export default defineComponent({
-    name: 'CountDownInput',
+    name: "CountDownInput",
     components: { CountButton },
     inheritAttrs: false,
     props,
     setup(props) {
-      const { prefixCls } = useDesign('countdown-input');
+      const { prefixCls } = useDesign("countdown-input");
       const [state] = useRuleFormItem(props);
 
       return { prefixCls, state };
@@ -38,7 +38,7 @@
   });
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-countdown-input';
+  @prefix-cls: ~"@{namespace}-countdown-input";
 
   .@{prefix-cls} {
     .ant-input-group-addon {
diff --git a/src/components/CountDown/src/useCountdown.ts b/src/components/CountDown/src/useCountdown.ts
index 316d69a867b46dcfdc2cf4b71c75a87b2f803422..72a3b6e634ad8993accaf9db41014fbcf3f7e9ca 100644
--- a/src/components/CountDown/src/useCountdown.ts
+++ b/src/components/CountDown/src/useCountdown.ts
@@ -1,5 +1,5 @@
-import { ref, unref } from 'vue';
-import { tryOnUnmounted } from '@vueuse/core';
+import { ref, unref } from "vue";
+import { tryOnUnmounted } from "@vueuse/core";
 
 export function useCountdown(count: number) {
   const currentCount = ref(count);
diff --git a/src/components/CountTo/index.ts b/src/components/CountTo/index.ts
index 36a4e65a37e335487c4336684e14a71b7c816923..4369da90f708e512821e6ff1e53a7ba0b49aad64 100644
--- a/src/components/CountTo/index.ts
+++ b/src/components/CountTo/index.ts
@@ -1,4 +1,4 @@
-import { withInstall } from '/@/utils';
-import countTo from './src/CountTo.vue';
+import { withInstall } from "/@/utils";
+import countTo from "./src/CountTo.vue";
 
 export const CountTo = withInstall(countTo);
diff --git a/src/components/CountTo/src/CountTo.vue b/src/components/CountTo/src/CountTo.vue
index 7de336165b0f17182aed13961c73a993b716a0f9..7c95bca2b4d03d0e92dacdee2240716a63b6d966 100644
--- a/src/components/CountTo/src/CountTo.vue
+++ b/src/components/CountTo/src/CountTo.vue
@@ -4,9 +4,9 @@
   </span>
 </template>
 <script lang="ts">
-  import { defineComponent, ref, computed, watchEffect, unref, onMounted, watch } from 'vue';
-  import { useTransition, TransitionPresets } from '@vueuse/core';
-  import { isNumber } from '/@/utils/is';
+  import { defineComponent, ref, computed, watchEffect, unref, onMounted, watch } from "vue";
+  import { useTransition, TransitionPresets } from "@vueuse/core";
+  import { isNumber } from "/@/utils/is";
 
   const props = {
     startVal: { type: Number, default: 0 },
@@ -20,10 +20,10 @@
         return value >= 0;
       },
     },
-    prefix: { type: String, default: '' },
-    suffix: { type: String, default: '' },
-    separator: { type: String, default: ',' },
-    decimal: { type: String, default: '.' },
+    prefix: { type: String, default: "" },
+    suffix: { type: String, default: "" },
+    separator: { type: String, default: "," },
+    decimal: { type: String, default: "." },
     /**
      * font color
      */
@@ -35,13 +35,13 @@
     /**
      * Digital animation
      */
-    transition: { type: String, default: 'linear' },
+    transition: { type: String, default: "linear" },
   };
 
   export default defineComponent({
-    name: 'CountTo',
+    name: "CountTo",
     props,
-    emits: ['onStarted', 'onFinished'],
+    emits: ["onStarted", "onFinished"],
     setup(props, { emit }) {
       const source = ref(props.startVal);
       const disabled = ref(false);
@@ -77,28 +77,28 @@
         outputValue = useTransition(source, {
           disabled,
           duration: props.duration,
-          onFinished: () => emit('onFinished'),
-          onStarted: () => emit('onStarted'),
+          onFinished: () => emit("onFinished"),
+          onStarted: () => emit("onStarted"),
           ...(props.useEasing ? { transition: TransitionPresets[props.transition] } : {}),
         });
       }
 
       function formatNumber(num: number | string) {
         if (!num && num !== 0) {
-          return '';
+          return "";
         }
         const { decimals, decimal, separator, suffix, prefix } = props;
         num = Number(num).toFixed(decimals);
-        num += '';
+        num += "";
 
-        const x = num.split('.');
+        const x = num.split(".");
         let x1 = x[0];
-        const x2 = x.length > 1 ? decimal + x[1] : '';
+        const x2 = x.length > 1 ? decimal + x[1] : "";
 
         const rgx = /(\d+)(\d{3})/;
         if (separator && !isNumber(separator)) {
           while (rgx.test(x1)) {
-            x1 = x1.replace(rgx, '$1' + separator + '$2');
+            x1 = x1.replace(rgx, "$1" + separator + "$2");
           }
         }
         return prefix + x1 + x2 + suffix;
diff --git a/src/components/Cropper/index.ts b/src/components/Cropper/index.ts
index 88d6d1d5382cd214d8ada083749a298b48b7b3ad..994781caf2a851c8a9b769549f15dcf2a54e9afa 100644
--- a/src/components/Cropper/index.ts
+++ b/src/components/Cropper/index.ts
@@ -1,7 +1,7 @@
-import { withInstall } from '/@/utils';
-import cropperImage from './src/Cropper.vue';
-import avatarCropper from './src/CropperAvatar.vue';
+import { withInstall } from "/@/utils";
+import cropperImage from "./src/Cropper.vue";
+import avatarCropper from "./src/CropperAvatar.vue";
 
-export * from './src/typing';
+export * from "./src/typing";
 export const CropperImage = withInstall(cropperImage);
 export const CropperAvatar = withInstall(avatarCropper);
diff --git a/src/components/Cropper/src/CopperModal.vue b/src/components/Cropper/src/CopperModal.vue
index 2ec7f4fd01a25c15f9f6b5d96f0810e897698fe3..2c42fdd38686448e2720b1830c9b06eedafa9937 100644
--- a/src/components/Cropper/src/CopperModal.vue
+++ b/src/components/Cropper/src/CopperModal.vue
@@ -111,16 +111,16 @@
   </BasicModal>
 </template>
 <script lang="ts">
-  import type { CropendResult, Cropper } from './typing';
+  import type { CropendResult, Cropper } from "./typing";
 
-  import { defineComponent, ref } from 'vue';
-  import CropperImage from './Cropper.vue';
-  import { Space, Upload, Avatar, Tooltip } from 'ant-design-vue';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { BasicModal, useModalInner } from '/@/components/Modal';
-  import { dataURLtoBlob } from '/@/utils/file/base64Conver';
-  import { isFunction } from '/@/utils/is';
-  import { useI18n } from '/@/hooks/web/useI18n';
+  import { defineComponent, ref } from "vue";
+  import CropperImage from "./Cropper.vue";
+  import { Space, Upload, Avatar, Tooltip } from "ant-design-vue";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { BasicModal, useModalInner } from "/@/components/Modal";
+  import { dataURLtoBlob } from "/@/utils/file/base64Conver";
+  import { isFunction } from "/@/utils/is";
+  import { useI18n } from "/@/hooks/web/useI18n";
 
   type apiFunParams = { file: Blob; name: string; filename: string };
 
@@ -132,19 +132,19 @@
   };
 
   export default defineComponent({
-    name: 'CropperModal',
+    name: "CropperModal",
     components: { BasicModal, Space, CropperImage, Upload, Avatar, Tooltip },
     props,
-    emits: ['uploadSuccess', 'register'],
+    emits: ["uploadSuccess", "register"],
     setup(props, { emit }) {
-      let filename = '';
-      const src = ref('');
-      const previewSource = ref('');
+      let filename = "";
+      const src = ref("");
+      const previewSource = ref("");
       const cropper = ref<Cropper>();
       let scaleX = 1;
       let scaleY = 1;
 
-      const { prefixCls } = useDesign('cropper-am');
+      const { prefixCls } = useDesign("cropper-am");
       const [register, { closeModal, setModalProps }] = useModalInner();
       const { t } = useI18n();
 
@@ -152,10 +152,10 @@
       function handleBeforeUpload(file: File) {
         const reader = new FileReader();
         reader.readAsDataURL(file);
-        src.value = '';
-        previewSource.value = '';
+        src.value = "";
+        previewSource.value = "";
         reader.onload = function (e) {
-          src.value = (e.target?.result as string) ?? '';
+          src.value = (e.target?.result as string) ?? "";
           filename = file.name;
         };
         return false;
@@ -170,10 +170,10 @@
       }
 
       function handlerToolbar(event: string, arg?: number) {
-        if (event === 'scaleX') {
+        if (event === "scaleX") {
           scaleX = arg = scaleX === -1 ? 1 : -1;
         }
-        if (event === 'scaleY') {
+        if (event === "scaleY") {
           scaleY = arg = scaleY === -1 ? 1 : -1;
         }
         cropper?.value?.[event]?.(arg);
@@ -185,8 +185,8 @@
           const blob = dataURLtoBlob(previewSource.value);
           try {
             setModalProps({ confirmLoading: true });
-            const result = await uploadApi({ name: 'file', file: blob, filename });
-            emit('uploadSuccess', { source: previewSource.value, data: result.data });
+            const result = await uploadApi({ name: "file", file: blob, filename });
+            emit("uploadSuccess", { source: previewSource.value, data: result.data });
             closeModal();
           } finally {
             setModalProps({ confirmLoading: false });
@@ -211,7 +211,7 @@
 </script>
 
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-cropper-am';
+  @prefix-cls: ~"@{namespace}-cropper-am";
 
   .@{prefix-cls} {
     display: flex;
diff --git a/src/components/Cropper/src/Cropper.vue b/src/components/Cropper/src/Cropper.vue
index 4523ad434c8031ed3abce20017f6d9a75581659b..dca459fda4351f8b495d7401f2ecbc2a79b584ac 100644
--- a/src/components/Cropper/src/Cropper.vue
+++ b/src/components/Cropper/src/Cropper.vue
@@ -11,12 +11,12 @@
   </div>
 </template>
 <script lang="ts">
-  import type { CSSProperties } from 'vue';
-  import { defineComponent, onMounted, ref, unref, computed, onUnmounted } from 'vue';
-  import Cropper from 'cropperjs';
-  import 'cropperjs/dist/cropper.css';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useDebounceFn } from '@vueuse/shared';
+  import type { CSSProperties } from "vue";
+  import { defineComponent, onMounted, ref, unref, computed, onUnmounted } from "vue";
+  import Cropper from "cropperjs";
+  import "cropperjs/dist/cropper.css";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useDebounceFn } from "@vueuse/shared";
 
   type Options = Cropper.Options;
 
@@ -48,9 +48,9 @@
     alt: { type: String },
     circled: { type: Boolean, default: false },
     realTimePreview: { type: Boolean, default: true },
-    height: { type: [String, Number], default: '360px' },
+    height: { type: [String, Number], default: "360px" },
     crossorigin: {
-      type: String as PropType<'' | 'anonymous' | 'use-credentials' | undefined>,
+      type: String as PropType<"" | "anonymous" | "use-credentials" | undefined>,
       default: undefined,
     },
     imageStyle: { type: Object as PropType<CSSProperties>, default: () => ({}) },
@@ -58,21 +58,21 @@
   };
 
   export default defineComponent({
-    name: 'CropperImage',
+    name: "CropperImage",
     props,
-    emits: ['cropend', 'ready', 'cropendError'],
+    emits: ["cropend", "ready", "cropendError"],
     setup(props, { attrs, emit }) {
       const imgElRef = ref<ElRef<HTMLImageElement>>();
       const cropper = ref<Nullable<Cropper>>();
       const isReady = ref(false);
 
-      const { prefixCls } = useDesign('cropper-image');
+      const { prefixCls } = useDesign("cropper-image");
       const debounceRealTimeCroppered = useDebounceFn(realTimeCroppered, 80);
 
       const getImageStyle = computed((): CSSProperties => {
         return {
           height: props.height,
-          maxWidth: '100%',
+          maxWidth: "100%",
           ...props.imageStyle,
         };
       });
@@ -88,7 +88,7 @@
       });
 
       const getWrapperStyle = computed((): CSSProperties => {
-        return { height: `${props.height}`.replace(/px/, '') + 'px' };
+        return { height: `${props.height}`.replace(/px/, "") + "px" };
       });
 
       onMounted(init);
@@ -107,7 +107,7 @@
           ready: () => {
             isReady.value = true;
             realTimeCroppered();
-            emit('ready', cropper.value);
+            emit("ready", cropper.value);
           },
           crop() {
             debounceRealTimeCroppered();
@@ -141,29 +141,29 @@
           let fileReader: FileReader = new FileReader();
           fileReader.readAsDataURL(blob);
           fileReader.onloadend = (e) => {
-            emit('cropend', {
-              imgBase64: e.target?.result ?? '',
+            emit("cropend", {
+              imgBase64: e.target?.result ?? "",
               imgInfo,
             });
           };
           fileReader.onerror = () => {
-            emit('cropendError');
+            emit("cropendError");
           };
-        }, 'image/png');
+        }, "image/png");
       }
 
       // Get a circular picture canvas
       function getRoundedCanvas() {
         const sourceCanvas = cropper.value!.getCroppedCanvas();
-        const canvas = document.createElement('canvas');
-        const context = canvas.getContext('2d')!;
+        const canvas = document.createElement("canvas");
+        const context = canvas.getContext("2d")!;
         const width = sourceCanvas.width;
         const height = sourceCanvas.height;
         canvas.width = width;
         canvas.height = height;
         context.imageSmoothingEnabled = true;
         context.drawImage(sourceCanvas, 0, 0, width, height);
-        context.globalCompositeOperation = 'destination-in';
+        context.globalCompositeOperation = "destination-in";
         context.beginPath();
         context.arc(width / 2, height / 2, Math.min(width, height) / 2, 0, 2 * Math.PI, true);
         context.fill();
@@ -175,7 +175,7 @@
   });
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-cropper-image';
+  @prefix-cls: ~"@{namespace}-cropper-image";
 
   .@{prefix-cls} {
     &--circled {
diff --git a/src/components/Cropper/src/CropperAvatar.vue b/src/components/Cropper/src/CropperAvatar.vue
index 6478e7e4e017208b54a868aa5ef42ccbd41fe8df..ad60fd717bf0ccf26166c58f8c9a37e1394dac90 100644
--- a/src/components/Cropper/src/CropperAvatar.vue
+++ b/src/components/Cropper/src/CropperAvatar.vue
@@ -17,12 +17,12 @@
       v-if="showBtn"
       v-bind="btnProps"
     >
-      {{ btnText ? btnText : t('component.cropper.selectImage') }}
+      {{ btnText ? btnText : t("component.cropper.selectImage") }}
     </a-button>
 
     <CopperModal
       @register="register"
-      @uploadSuccess="handleUploadSuccess"
+      @upload-success="handleUploadSuccess"
       :uploadApi="uploadApi"
       :src="sourceValue"
     />
@@ -38,41 +38,41 @@
     watchEffect,
     watch,
     PropType,
-  } from 'vue';
-  import CopperModal from './CopperModal.vue';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useModal } from '/@/components/Modal';
-  import { useMessage } from '/@/hooks/web/useMessage';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import type { ButtonProps } from '/@/components/Button';
-  import Icon from '/@/components/Icon';
+  } from "vue";
+  import CopperModal from "./CopperModal.vue";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useModal } from "/@/components/Modal";
+  import { useMessage } from "/@/hooks/web/useMessage";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import type { ButtonProps } from "/@/components/Button";
+  import Icon from "/@/components/Icon";
 
   const props = {
-    width: { type: [String, Number], default: '200px' },
+    width: { type: [String, Number], default: "200px" },
     value: { type: String },
     showBtn: { type: Boolean, default: true },
     btnProps: { type: Object as PropType<ButtonProps> },
-    btnText: { type: String, default: '' },
+    btnText: { type: String, default: "" },
     uploadApi: { type: Function as PropType<({ file: Blob, name: string }) => Promise<void>> },
   };
 
   export default defineComponent({
-    name: 'CropperAvatar',
+    name: "CropperAvatar",
     components: { CopperModal, Icon },
     props,
-    emits: ['update:value', 'change'],
+    emits: ["update:value", "change"],
     setup(props, { emit, expose }) {
-      const sourceValue = ref(props.value || '');
-      const { prefixCls } = useDesign('cropper-avatar');
+      const sourceValue = ref(props.value || "");
+      const { prefixCls } = useDesign("cropper-avatar");
       const [register, { openModal, closeModal }] = useModal();
       const { createMessage } = useMessage();
       const { t } = useI18n();
 
       const getClass = computed(() => [prefixCls]);
 
-      const getWidth = computed(() => `${props.width}`.replace(/px/, '') + 'px');
+      const getWidth = computed(() => `${props.width}`.replace(/px/, "") + "px");
 
-      const getIconWidth = computed(() => parseInt(`${props.width}`.replace(/px/, '')) / 2 + 'px');
+      const getIconWidth = computed(() => parseInt(`${props.width}`.replace(/px/, "")) / 2 + "px");
 
       const getStyle = computed((): CSSProperties => ({ width: unref(getWidth) }));
 
@@ -81,20 +81,20 @@
       );
 
       watchEffect(() => {
-        sourceValue.value = props.value || '';
+        sourceValue.value = props.value || "";
       });
 
       watch(
         () => sourceValue.value,
         (v: string) => {
-          emit('update:value', v);
+          emit("update:value", v);
         },
       );
 
       function handleUploadSuccess({ source }) {
         sourceValue.value = source;
-        emit('change', source);
-        createMessage.success(t('component.cropper.uploadSuccess'));
+        emit("change", source);
+        createMessage.success(t("component.cropper.uploadSuccess"));
       }
 
       expose({ openModal: openModal.bind(null, true), closeModal });
@@ -116,7 +116,7 @@
 </script>
 
 <style lang="less" scoped>
-  @prefix-cls: ~'@{namespace}-cropper-avatar';
+  @prefix-cls: ~"@{namespace}-cropper-avatar";
 
   .@{prefix-cls} {
     display: inline-block;
diff --git a/src/components/Cropper/src/typing.ts b/src/components/Cropper/src/typing.ts
index e76cc6f8edf7ffd2ae5ccb30bfeeff53d0eaf33d..8d64bc6b6f83b725b82ac9a89e4d200fb5895fa6 100644
--- a/src/components/Cropper/src/typing.ts
+++ b/src/components/Cropper/src/typing.ts
@@ -1,4 +1,4 @@
-import type Cropper from 'cropperjs';
+import type Cropper from "cropperjs";
 
 export interface CropendResult {
   imgBase64: string;
diff --git a/src/components/Description/index.ts b/src/components/Description/index.ts
index 58277d0639da21b5616d04a8a4852dfe7349470b..9b4cd6639c476fc9756fd7739b1ccd2d61520bbe 100644
--- a/src/components/Description/index.ts
+++ b/src/components/Description/index.ts
@@ -1,6 +1,6 @@
-import { withInstall } from '/@/utils';
-import description from './src/Description.vue';
+import { withInstall } from "/@/utils";
+import description from "./src/Description.vue";
 
-export * from './src/typing';
-export { useDescription } from './src/useDescription';
+export * from "./src/typing";
+export { useDescription } from "./src/useDescription";
 export const Description = withInstall(description);
diff --git a/src/components/Description/src/Description.vue b/src/components/Description/src/Description.vue
index 17b8c74c2ddd3b76e5bcb6570b8cdc15d62dc627..c3f17e41d9aeae92214e3e0c12824c534d69c027 100644
--- a/src/components/Description/src/Description.vue
+++ b/src/components/Description/src/Description.vue
@@ -1,24 +1,24 @@
 <script lang="tsx">
-  import type { DescriptionProps, DescInstance, DescItem } from './typing';
-  import type { DescriptionsProps } from 'ant-design-vue/es/descriptions/index';
-  import type { CSSProperties } from 'vue';
-  import type { CollapseContainerOptions } from '/@/components/Container/index';
-  import { defineComponent, computed, ref, unref } from 'vue';
-  import { get } from 'lodash-es';
-  import { Descriptions } from 'ant-design-vue';
-  import { CollapseContainer } from '/@/components/Container/index';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { isFunction } from '/@/utils/is';
-  import { getSlot } from '/@/utils/helper/tsxHelper';
-  import { useAttrs } from '/@/hooks/core/useAttrs';
+  import type { DescriptionProps, DescInstance, DescItem } from "./typing";
+  import type { DescriptionsProps } from "ant-design-vue/es/descriptions/index";
+  import type { CSSProperties } from "vue";
+  import type { CollapseContainerOptions } from "/@/components/Container/index";
+  import { defineComponent, computed, ref, unref, toRefs } from "vue";
+  import { get } from "lodash-es";
+  import { Descriptions } from "ant-design-vue";
+  import { CollapseContainer } from "/@/components/Container/index";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { isFunction } from "/@/utils/is";
+  import { getSlot } from "/@/utils/helper/tsxHelper";
+  import { useAttrs } from "/@/hooks/core/useAttrs";
 
   const props = {
     useCollapse: { type: Boolean, default: true },
-    title: { type: String, default: '' },
+    title: { type: String, default: "" },
     size: {
       type: String,
-      validator: (v) => ['small', 'default', 'middle', undefined].includes(v),
-      default: 'small',
+      validator: (v) => ["small", "default", "middle", undefined].includes(v),
+      default: "small",
     },
     bordered: { type: Boolean, default: true },
     column: {
@@ -39,13 +39,13 @@
   };
 
   export default defineComponent({
-    name: 'Description',
+    name: "Description",
     props,
-    emits: ['register'],
+    emits: ["register"],
     setup(props, { slots, emit }) {
       const propsRef = ref<Partial<DescriptionProps> | null>(null);
 
-      const { prefixCls } = useDesign('description');
+      const { prefixCls } = useDesign("description");
       const attrs = useAttrs();
 
       // Custom title component: get title
@@ -121,7 +121,10 @@
                 return null;
               }
               const getField = get(_data, field);
-              return isFunction(render) ? render(getField, _data) : getField ?? '';
+              if (getField && !toRefs(_data).hasOwnProperty(field)) {
+                return isFunction(render) ? render("", _data) : "";
+              }
+              return isFunction(render) ? render(getField, _data) : getField ?? "";
             };
 
             const width = contentMinWidth;
@@ -164,7 +167,7 @@
           <CollapseContainer title={title} canExpan={canExpand} helpMessage={helpMessage}>
             {{
               default: () => content,
-              action: () => getSlot(slots, 'action'),
+              action: () => getSlot(slots, "action"),
             }}
           </CollapseContainer>
         );
@@ -174,7 +177,7 @@
         setDescProps,
       };
 
-      emit('register', methods);
+      emit("register", methods);
       return () => (unref(useWrapper) ? renderContainer() : renderDesc());
     },
   });
diff --git a/src/components/Description/src/typing.ts b/src/components/Description/src/typing.ts
index ee96084b316d73d28571dc04e91d5ed2ce48273d..ad76225921b44e695f61220a029378dcef740a2b 100644
--- a/src/components/Description/src/typing.ts
+++ b/src/components/Description/src/typing.ts
@@ -1,6 +1,6 @@
-import type { VNode, CSSProperties } from 'vue';
-import type { CollapseContainerOptions } from '/@/components/Container/index';
-import type { DescriptionsProps } from 'ant-design-vue/es/descriptions/index';
+import type { VNode, CSSProperties } from "vue";
+import type { CollapseContainerOptions } from "/@/components/Container/index";
+import type { DescriptionsProps } from "ant-design-vue/es/descriptions/index";
 
 export interface DescItem {
   labelMinWidth?: number;
diff --git a/src/components/Description/src/useDescription.ts b/src/components/Description/src/useDescription.ts
index d1037d065364d0cbf59ecc68decacdb76bbd3b01..5933c02183486622b662940d4c61de82c5644408 100644
--- a/src/components/Description/src/useDescription.ts
+++ b/src/components/Description/src/useDescription.ts
@@ -1,10 +1,10 @@
-import type { DescriptionProps, DescInstance, UseDescReturnType } from './typing';
-import { ref, getCurrentInstance, unref } from 'vue';
-import { isProdMode } from '/@/utils/env';
+import type { DescriptionProps, DescInstance, UseDescReturnType } from "./typing";
+import { ref, getCurrentInstance, unref } from "vue";
+import { isProdMode } from "/@/utils/env";
 
 export function useDescription(props?: Partial<DescriptionProps>): UseDescReturnType {
   if (!getCurrentInstance()) {
-    throw new Error('useDescription() can only be used inside setup() or functional components!');
+    throw new Error("useDescription() can only be used inside setup() or functional components!");
   }
   const desc = ref<Nullable<DescInstance>>(null);
   const loaded = ref(false);
diff --git a/src/components/Drawer/index.ts b/src/components/Drawer/index.ts
index 820ade56992bfbd3841c95e52dca53b73e2a0b79..c14a01caada5b3633dda4f54ea35eb56242d2cd1 100644
--- a/src/components/Drawer/index.ts
+++ b/src/components/Drawer/index.ts
@@ -1,6 +1,6 @@
-import { withInstall } from '/@/utils';
-import basicDrawer from './src/BasicDrawer.vue';
+import { withInstall } from "/@/utils";
+import basicDrawer from "./src/BasicDrawer.vue";
 
 export const BasicDrawer = withInstall(basicDrawer);
-export * from './src/typing';
-export { useDrawer, useDrawerInner } from './src/useDrawer';
+export * from "./src/typing";
+export { useDrawer, useDrawerInner } from "./src/useDrawer";
diff --git a/src/components/Drawer/src/BasicDrawer.vue b/src/components/Drawer/src/BasicDrawer.vue
index 93a4a5844057e9e494030ff382f9d8368f8b2c8d..39ab3c9fd171b9f11ebf632e1d183a73a672ffa7 100644
--- a/src/components/Drawer/src/BasicDrawer.vue
+++ b/src/components/Drawer/src/BasicDrawer.vue
@@ -31,8 +31,8 @@
   </Drawer>
 </template>
 <script lang="ts">
-  import type { DrawerInstance, DrawerProps } from './typing';
-  import type { CSSProperties } from 'vue';
+  import type { DrawerInstance, DrawerProps } from "./typing";
+  import type { CSSProperties } from "vue";
   import {
     defineComponent,
     ref,
@@ -42,30 +42,30 @@
     nextTick,
     toRaw,
     getCurrentInstance,
-  } from 'vue';
-  import { Drawer } from 'ant-design-vue';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { isFunction, isNumber } from '/@/utils/is';
-  import { deepMerge } from '/@/utils';
-  import DrawerFooter from './components/DrawerFooter.vue';
-  import DrawerHeader from './components/DrawerHeader.vue';
-  import { ScrollContainer } from '/@/components/Container';
-  import { basicProps } from './props';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useAttrs } from '/@/hooks/core/useAttrs';
+  } from "vue";
+  import { Drawer } from "ant-design-vue";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { isFunction, isNumber } from "/@/utils/is";
+  import { deepMerge } from "/@/utils";
+  import DrawerFooter from "./components/DrawerFooter.vue";
+  import DrawerHeader from "./components/DrawerHeader.vue";
+  import { ScrollContainer } from "/@/components/Container";
+  import { basicProps } from "./props";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useAttrs } from "/@/hooks/core/useAttrs";
 
   export default defineComponent({
     components: { Drawer, ScrollContainer, DrawerFooter, DrawerHeader },
     inheritAttrs: false,
     props: basicProps,
-    emits: ['visible-change', 'ok', 'close', 'register'],
+    emits: ["visible-change", "ok", "close", "register"],
     setup(props, { emit }) {
       const visibleRef = ref(false);
       const attrs = useAttrs();
       const propsRef = ref<Partial<Nullable<DrawerProps>>>(null);
 
       const { t } = useI18n();
-      const { prefixVar, prefixCls } = useDesign('basic-drawer');
+      const { prefixVar, prefixCls } = useDesign("basic-drawer");
 
       const drawerInstance: DrawerInstance = {
         setDrawerProps: setDrawerProps,
@@ -74,7 +74,7 @@
 
       const instance = getCurrentInstance();
 
-      instance && emit('register', drawerInstance, instance.uid);
+      instance && emit("register", drawerInstance, instance.uid);
 
       const getMergeProps = computed((): DrawerProps => {
         return deepMerge(toRaw(props), unref(propsRef));
@@ -82,7 +82,7 @@
 
       const getProps = computed((): DrawerProps => {
         const opt = {
-          placement: 'right',
+          placement: "right",
           ...unref(attrs),
           ...unref(getMergeProps),
           visible: unref(visibleRef),
@@ -91,10 +91,10 @@
         const { isDetail, width, wrapClassName, getContainer } = opt;
         if (isDetail) {
           if (!width) {
-            opt.width = '100%';
+            opt.width = "100%";
           }
           const detailCls = `${prefixCls}__detail`;
-          opt.wrapClassName = wrapClassName ? `${wrapClassName} ${detailCls}` : detailCls;
+          opt.class = wrapClassName ? `${wrapClassName} ${detailCls}` : detailCls;
 
           if (!getContainer) {
             // TODO type error?
@@ -117,7 +117,7 @@
         if (showFooter && footerHeight) {
           return isNumber(footerHeight)
             ? `${footerHeight}px`
-            : `${footerHeight.replace('px', '')}px`;
+            : `${footerHeight.replace("px", "")}px`;
         }
         return `0px`;
       });
@@ -125,7 +125,7 @@
       const getScrollContentStyle = computed((): CSSProperties => {
         const footerHeight = unref(getFooterHeight);
         return {
-          position: 'relative',
+          position: "relative",
           height: `calc(100% - ${footerHeight})`,
         };
       });
@@ -146,7 +146,7 @@
         () => visibleRef.value,
         (visible) => {
           nextTick(() => {
-            emit('visible-change', visible);
+            emit("visible-change", visible);
             instance && drawerInstance.emitVisible?.(visible, instance.uid);
           });
         },
@@ -155,7 +155,7 @@
       // Cancel event
       async function onClose(e: Recordable) {
         const { closeFunc } = unref(getProps);
-        emit('close', e);
+        emit("close", e);
         if (closeFunc && isFunction(closeFunc)) {
           const res = await closeFunc();
           visibleRef.value = !res;
@@ -168,13 +168,13 @@
         // Keep the last setDrawerProps
         propsRef.value = deepMerge(unref(propsRef) || ({} as any), props);
 
-        if (Reflect.has(props, 'visible')) {
+        if (Reflect.has(props, "visible")) {
           visibleRef.value = !!props.visible;
         }
       }
 
       function handleOk() {
-        emit('ok');
+        emit("ok");
       }
 
       return {
@@ -195,8 +195,8 @@
 <style lang="less">
   @header-height: 60px;
   @detail-header-height: 40px;
-  @prefix-cls: ~'@{namespace}-basic-drawer';
-  @prefix-cls-detail: ~'@{namespace}-basic-drawer__detail';
+  @prefix-cls: ~"@{namespace}-basic-drawer";
+  @prefix-cls-detail: ~"@{namespace}-basic-drawer__detail";
 
   .@{prefix-cls} {
     .ant-drawer-wrapper-body {
diff --git a/src/components/Drawer/src/components/DrawerFooter.vue b/src/components/Drawer/src/components/DrawerFooter.vue
index 903aa832160d0aa0966b9584b08424165a5f6d9e..a56c67b72f519d4f2e59aa76d58be7a2c5f9bda7 100644
--- a/src/components/Drawer/src/components/DrawerFooter.vue
+++ b/src/components/Drawer/src/components/DrawerFooter.vue
@@ -25,38 +25,38 @@
   </div>
 </template>
 <script lang="ts">
-  import type { CSSProperties } from 'vue';
-  import { defineComponent, computed } from 'vue';
-  import { useDesign } from '/@/hooks/web/useDesign';
+  import type { CSSProperties } from "vue";
+  import { defineComponent, computed } from "vue";
+  import { useDesign } from "/@/hooks/web/useDesign";
 
-  import { footerProps } from '../props';
+  import { footerProps } from "../props";
   export default defineComponent({
-    name: 'BasicDrawerFooter',
+    name: "BasicDrawerFooter",
     props: {
       ...footerProps,
       height: {
         type: String,
-        default: '60px',
+        default: "60px",
       },
     },
-    emits: ['ok', 'close'],
+    emits: ["ok", "close"],
     setup(props, { emit }) {
-      const { prefixCls } = useDesign('basic-drawer-footer');
+      const { prefixCls } = useDesign("basic-drawer-footer");
 
       const getStyle = computed((): CSSProperties => {
         const heightStr = `${props.height}`;
         return {
           height: heightStr,
-          lineHeight: heightStr,
+          lineHeight: `calc(${heightStr} - 1px)`,
         };
       });
 
       function handleOk() {
-        emit('ok');
+        emit("ok");
       }
 
       function handleClose() {
-        emit('close');
+        emit("close");
       }
       return { handleOk, prefixCls, handleClose, getStyle };
     },
@@ -64,7 +64,7 @@
 </script>
 
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-basic-drawer-footer';
+  @prefix-cls: ~"@{namespace}-basic-drawer-footer";
   @footer-height: 60px;
   .@{prefix-cls} {
     position: absolute;
diff --git a/src/components/Drawer/src/components/DrawerHeader.vue b/src/components/Drawer/src/components/DrawerHeader.vue
index 8232128730aab737229a0a6d4f13315f06ed019e..54b21f10d618d7337529e85fea0ed6e4a4fe26b8 100644
--- a/src/components/Drawer/src/components/DrawerHeader.vue
+++ b/src/components/Drawer/src/components/DrawerHeader.vue
@@ -1,7 +1,7 @@
 <template>
   <BasicTitle v-if="!isDetail" :class="prefixCls">
     <slot name="title"></slot>
-    {{ !$slots.title ? title : '' }}
+    {{ !$slots.title ? title : "" }}
   </BasicTitle>
 
   <div :class="[prefixCls, `${prefixCls}--detail`]" v-else>
@@ -18,27 +18,27 @@
   </div>
 </template>
 <script lang="ts">
-  import { defineComponent } from 'vue';
-  import { BasicTitle } from '/@/components/Basic';
-  import { ArrowLeftOutlined } from '@ant-design/icons-vue';
+  import { defineComponent } from "vue";
+  import { BasicTitle } from "/@/components/Basic";
+  import { ArrowLeftOutlined } from "@ant-design/icons-vue";
 
-  import { useDesign } from '/@/hooks/web/useDesign';
+  import { useDesign } from "/@/hooks/web/useDesign";
 
-  import { propTypes } from '/@/utils/propTypes';
+  import { propTypes } from "/@/utils/propTypes";
   export default defineComponent({
-    name: 'BasicDrawerHeader',
+    name: "BasicDrawerHeader",
     components: { BasicTitle, ArrowLeftOutlined },
     props: {
       isDetail: propTypes.bool,
       showDetailBack: propTypes.bool,
       title: propTypes.string,
     },
-    emits: ['close'],
+    emits: ["close"],
     setup(_, { emit }) {
-      const { prefixCls } = useDesign('basic-drawer-header');
+      const { prefixCls } = useDesign("basic-drawer-header");
 
       function handleClose() {
-        emit('close');
+        emit("close");
       }
 
       return { prefixCls, handleClose };
@@ -47,7 +47,7 @@
 </script>
 
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-basic-drawer-header';
+  @prefix-cls: ~"@{namespace}-basic-drawer-header";
   @footer-height: 60px;
   .@{prefix-cls} {
     display: flex;
diff --git a/src/components/Drawer/src/props.ts b/src/components/Drawer/src/props.ts
index 0a7ca8cdfe88d5f311628313c3c8fd6167920926..5ec98ee431c4fc908f2188eb578f0edb4e6e335d 100644
--- a/src/components/Drawer/src/props.ts
+++ b/src/components/Drawer/src/props.ts
@@ -1,6 +1,6 @@
-import type { PropType } from 'vue';
+import type { PropType } from "vue";
 
-import { useI18n } from '/@/hooks/web/useI18n';
+import { useI18n } from "/@/hooks/web/useI18n";
 const { t } = useI18n();
 
 export const footerProps = {
@@ -10,14 +10,14 @@ export const footerProps = {
    */
   showCancelBtn: { type: Boolean, default: true },
   cancelButtonProps: Object as PropType<Recordable>,
-  cancelText: { type: String, default: t('common.cancelText') },
+  cancelText: { type: String, default: t("common.cancelText") },
   /**
    * @description: Show confirmation button
    */
   showOkBtn: { type: Boolean, default: true },
   okButtonProps: Object as PropType<Recordable>,
-  okText: { type: String, default: t('common.okText') },
-  okType: { type: String, default: 'primary' },
+  okText: { type: String, default: t("common.okText") },
+  okType: { type: String, default: "primary" },
   showFooter: { type: Boolean },
   footerHeight: {
     type: [String, Number] as PropType<string | number>,
@@ -26,7 +26,7 @@ export const footerProps = {
 };
 export const basicProps = {
   isDetail: { type: Boolean },
-  title: { type: String, default: '' },
+  title: { type: String, default: "" },
   loadingText: { type: String },
   showDetailBack: { type: Boolean, default: true },
   visible: { type: Boolean },
diff --git a/src/components/Drawer/src/typing.ts b/src/components/Drawer/src/typing.ts
index 0df3dfdd1d6c661269219d3bc6b65736ac064848..ee3ed3d47d7be5863e0d47d104bd271e58be37cc 100644
--- a/src/components/Drawer/src/typing.ts
+++ b/src/components/Drawer/src/typing.ts
@@ -1,6 +1,6 @@
-import type { ButtonProps } from 'ant-design-vue/lib/button/buttonTypes';
-import type { CSSProperties, VNodeChild, ComputedRef } from 'vue';
-import type { ScrollContainerOptions } from '/@/components/Container/index';
+import type { ButtonProps } from "ant-design-vue/lib/button/buttonTypes";
+import type { CSSProperties, VNodeChild, ComputedRef } from "vue";
+import type { ScrollContainerOptions } from "/@/components/Container/index";
 
 export interface DrawerInstance {
   setDrawerProps: (props: Partial<DrawerProps> | boolean) => void;
@@ -47,7 +47,7 @@ export interface DrawerFooterProps {
    * @default 'primary'
    * @type string
    */
-  okType: 'primary' | 'danger' | 'dashed' | 'ghost' | 'default';
+  okType: "primary" | "danger" | "dashed" | "ghost" | "default";
   /**
    * The ok button props, follow jsx rules
    * @type object
@@ -128,13 +128,12 @@ export interface DrawerProps extends DrawerFooterProps {
    * @type any (string | slot)
    */
   title?: VNodeChild | JSX.Element;
-
   /**
    * The class name of the container of the Drawer dialog.
    * @type string
    */
   wrapClassName?: string;
-
+  class?: string;
   /**
    * Style of wrapper element which **contains mask** compare to `drawerStyle`
    * @type object
@@ -179,7 +178,7 @@ export interface DrawerProps extends DrawerFooterProps {
    * @default 'right'
    * @type string
    */
-  placement?: 'top' | 'right' | 'bottom' | 'left';
+  placement?: "top" | "right" | "bottom" | "left";
   afterVisibleChange?: (visible?: boolean) => void;
   keyboard?: boolean;
   /**
diff --git a/src/components/Drawer/src/useDrawer.ts b/src/components/Drawer/src/useDrawer.ts
index bcb9e76640b729d826c2758a9c020ff8c47f190c..dc341326fd4739dec8d1191d65d8452e3379dc50 100644
--- a/src/components/Drawer/src/useDrawer.ts
+++ b/src/components/Drawer/src/useDrawer.ts
@@ -4,7 +4,7 @@ import type {
   ReturnMethods,
   DrawerProps,
   UseDrawerInnerReturnType,
-} from './typing';
+} from "./typing";
 import {
   ref,
   getCurrentInstance,
@@ -14,12 +14,12 @@ import {
   nextTick,
   toRaw,
   computed,
-} from 'vue';
-import { isProdMode } from '/@/utils/env';
-import { isFunction } from '/@/utils/is';
-import { tryOnUnmounted } from '@vueuse/core';
-import { isEqual } from 'lodash-es';
-import { error } from '/@/utils/log';
+} from "vue";
+import { isProdMode } from "/@/utils/env";
+import { isFunction } from "/@/utils/is";
+import { tryOnUnmounted } from "@vueuse/core";
+import { isEqual } from "lodash-es";
+import { error } from "/@/utils/log";
 
 const dataTransferRef = reactive<any>({});
 
@@ -30,11 +30,11 @@ const visibleData = reactive<{ [key: number]: boolean }>({});
  */
 export function useDrawer(): UseDrawerReturnType {
   if (!getCurrentInstance()) {
-    throw new Error('useDrawer() can only be used inside setup() or functional components!');
+    throw new Error("useDrawer() can only be used inside setup() or functional components!");
   }
   const drawer = ref<DrawerInstance | null>(null);
   const loaded = ref<Nullable<boolean>>(false);
-  const uid = ref<string>('');
+  const uid = ref<string>("");
 
   function register(drawerInstance: DrawerInstance, uuid: string) {
     isProdMode() &&
@@ -59,7 +59,7 @@ export function useDrawer(): UseDrawerReturnType {
   const getInstance = () => {
     const instance = unref(drawer);
     if (!instance) {
-      error('useDrawer instance is undefined!');
+      error("useDrawer instance is undefined!");
     }
     return instance;
   };
@@ -100,16 +100,16 @@ export function useDrawer(): UseDrawerReturnType {
 export const useDrawerInner = (callbackFn?: Fn): UseDrawerInnerReturnType => {
   const drawerInstanceRef = ref<Nullable<DrawerInstance>>(null);
   const currentInstance = getCurrentInstance();
-  const uidRef = ref<string>('');
+  const uidRef = ref<string>("");
 
   if (!getCurrentInstance()) {
-    throw new Error('useDrawerInner() can only be used inside setup() or functional components!');
+    throw new Error("useDrawerInner() can only be used inside setup() or functional components!");
   }
 
   const getInstance = () => {
     const instance = unref(drawerInstanceRef);
     if (!instance) {
-      error('useDrawerInner instance is undefined!');
+      error("useDrawerInner instance is undefined!");
       return;
     }
     return instance;
@@ -123,7 +123,7 @@ export const useDrawerInner = (callbackFn?: Fn): UseDrawerInnerReturnType => {
 
     uidRef.value = uuid;
     drawerInstanceRef.value = modalInstance;
-    currentInstance?.emit('register', modalInstance, uuid);
+    currentInstance?.emit("register", modalInstance, uuid);
   };
 
   watchEffect(() => {
diff --git a/src/components/Dropdown/index.ts b/src/components/Dropdown/index.ts
index 80439e50e913753949991aeb1c77793497af6932..ebdf4c302f7dbb66a9bd9513f9b9a23256c5c789 100644
--- a/src/components/Dropdown/index.ts
+++ b/src/components/Dropdown/index.ts
@@ -1,5 +1,5 @@
-import { withInstall } from '/@/utils';
-import dropdown from './src/Dropdown.vue';
+import { withInstall } from "/@/utils";
+import dropdown from "./src/Dropdown.vue";
 
-export * from './src/typing';
+export * from "./src/typing";
 export const Dropdown = withInstall(dropdown);
diff --git a/src/components/Dropdown/src/Dropdown.vue b/src/components/Dropdown/src/Dropdown.vue
index c70a99ef39077893fb9a72bd3d34c80efa667111..32087a62ace5d6389427dc49ed87c5462e0ca16b 100644
--- a/src/components/Dropdown/src/Dropdown.vue
+++ b/src/components/Dropdown/src/Dropdown.vue
@@ -36,12 +36,12 @@
 </template>
 
 <script lang="ts" setup>
-  import { computed, PropType } from 'vue';
-  import type { DropMenu } from './typing';
-  import { Dropdown, Menu, Popconfirm } from 'ant-design-vue';
-  import { Icon } from '/@/components/Icon';
-  import { omit } from 'lodash-es';
-  import { isFunction } from '/@/utils/is';
+  import { computed, PropType } from "vue";
+  import type { DropMenu } from "./typing";
+  import { Dropdown, Menu, Popconfirm } from "ant-design-vue";
+  import { Icon } from "/@/components/Icon";
+  import { omit } from "lodash-es";
+  import { isFunction } from "/@/utils/is";
 
   const ADropdown = Dropdown;
   const AMenu = Menu;
@@ -57,9 +57,9 @@
      * @type string[]
      */
     trigger: {
-      type: [Array] as PropType<('contextmenu' | 'click' | 'hover')[]>,
+      type: [Array] as PropType<("contextmenu" | "click" | "hover")[]>,
       default: () => {
-        return ['contextmenu'];
+        return ["contextmenu"];
       },
     },
     dropMenuList: {
@@ -72,22 +72,22 @@
     },
   });
 
-  const emit = defineEmits(['menuEvent']);
+  const emit = defineEmits(["menuEvent"]);
 
   function handleClickMenu(item: DropMenu) {
     const { event } = item;
     const menu = props.dropMenuList.find((item) => `${item.event}` === `${event}`);
-    emit('menuEvent', menu);
+    emit("menuEvent", menu);
     item.onClick?.();
   }
 
   const getPopConfirmAttrs = computed(() => {
     return (attrs) => {
-      const originAttrs = omit(attrs, ['confirm', 'cancel', 'icon']);
+      const originAttrs = omit(attrs, ["confirm", "cancel", "icon"]);
       if (!attrs.onConfirm && attrs.confirm && isFunction(attrs.confirm))
-        originAttrs['onConfirm'] = attrs.confirm;
+        originAttrs["onConfirm"] = attrs.confirm;
       if (!attrs.onCancel && attrs.cancel && isFunction(attrs.cancel))
-        originAttrs['onCancel'] = attrs.cancel;
+        originAttrs["onCancel"] = attrs.cancel;
       return originAttrs;
     };
   });
diff --git a/src/components/Excel/index.ts b/src/components/Excel/index.ts
index cece07c4ddf7e0b30bc36340ad352915eddd7eed..15be92e0e7121a2ea98d69fd6f9e4f883ab10aa9 100644
--- a/src/components/Excel/index.ts
+++ b/src/components/Excel/index.ts
@@ -1,8 +1,8 @@
-import { withInstall } from '/@/utils';
-import impExcel from './src/ImportExcel.vue';
-import expExcelModal from './src/ExportExcelModal.vue';
+import { withInstall } from "/@/utils";
+import impExcel from "./src/ImportExcel.vue";
+import expExcelModal from "./src/ExportExcelModal.vue";
 
 export const ImpExcel = withInstall(impExcel);
 export const ExpExcelModal = withInstall(expExcelModal);
-export * from './src/typing';
-export { jsonToSheetXlsx, aoaToSheetXlsx } from './src/Export2Excel';
+export * from "./src/typing";
+export { jsonToSheetXlsx, aoaToSheetXlsx } from "./src/Export2Excel";
diff --git a/src/components/Excel/src/Export2Excel.ts b/src/components/Excel/src/Export2Excel.ts
index 11efbe03c2468fd0a4b945fecdc0653ed9b81452..d618c4a06c507160c198a2ce4f4a933e10dbbe6d 100644
--- a/src/components/Excel/src/Export2Excel.ts
+++ b/src/components/Excel/src/Export2Excel.ts
@@ -1,17 +1,17 @@
-import xlsx from 'xlsx';
-import type { WorkBook } from 'xlsx';
-import type { JsonToSheet, AoAToSheet } from './typing';
+import * as xlsx from "xlsx";
+import type { WorkBook } from "xlsx";
+import type { JsonToSheet, AoAToSheet } from "./typing";
 
 const { utils, writeFile } = xlsx;
 
-const DEF_FILE_NAME = 'excel-list.xlsx';
+const DEF_FILE_NAME = "excel-list.xlsx";
 
 export function jsonToSheetXlsx<T = any>({
   data,
   header,
   filename = DEF_FILE_NAME,
   json2sheetOpts = {},
-  write2excelOpts = { bookType: 'xlsx' },
+  write2excelOpts = { bookType: "xlsx" },
 }: JsonToSheet<T>) {
   const arrData = [...data];
   if (header) {
@@ -37,7 +37,7 @@ export function aoaToSheetXlsx<T = any>({
   data,
   header,
   filename = DEF_FILE_NAME,
-  write2excelOpts = { bookType: 'xlsx' },
+  write2excelOpts = { bookType: "xlsx" },
 }: AoAToSheet<T>) {
   const arrData = [...data];
   if (header) {
diff --git a/src/components/Excel/src/ExportExcelModal.vue b/src/components/Excel/src/ExportExcelModal.vue
index efa32926d4f30888d4fb25e228c53990ff996214..bb6132a93342e66a0dd1c90be4624e477d9a9c92 100644
--- a/src/components/Excel/src/ExportExcelModal.vue
+++ b/src/components/Excel/src/ExportExcelModal.vue
@@ -14,49 +14,49 @@
   </BasicModal>
 </template>
 <script lang="ts">
-  import type { ExportModalResult } from './typing';
-  import { defineComponent } from 'vue';
-  import { BasicModal, useModalInner } from '/@/components/Modal';
-  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
+  import type { ExportModalResult } from "./typing";
+  import { defineComponent } from "vue";
+  import { BasicModal, useModalInner } from "/@/components/Modal";
+  import { BasicForm, FormSchema, useForm } from "/@/components/Form/index";
 
-  import { useI18n } from '/@/hooks/web/useI18n';
+  import { useI18n } from "/@/hooks/web/useI18n";
 
   const { t } = useI18n();
 
   const schemas: FormSchema[] = [
     {
-      field: 'filename',
-      component: 'Input',
-      label: t('component.excel.fileName'),
+      field: "filename",
+      component: "Input",
+      label: t("component.excel.fileName"),
       rules: [{ required: true }],
     },
     {
-      field: 'bookType',
-      component: 'Select',
-      label: t('component.excel.fileType'),
-      defaultValue: 'xlsx',
+      field: "bookType",
+      component: "Select",
+      label: t("component.excel.fileType"),
+      defaultValue: "xlsx",
       rules: [{ required: true }],
       componentProps: {
         options: [
           {
-            label: 'xlsx',
-            value: 'xlsx',
-            key: 'xlsx',
+            label: "xlsx",
+            value: "xlsx",
+            key: "xlsx",
           },
           {
-            label: 'html',
-            value: 'html',
-            key: 'html',
+            label: "html",
+            value: "html",
+            key: "html",
           },
           {
-            label: 'csv',
-            value: 'csv',
-            key: 'csv',
+            label: "csv",
+            value: "csv",
+            key: "csv",
           },
           {
-            label: 'txt',
-            value: 'txt',
-            key: 'txt',
+            label: "txt",
+            value: "txt",
+            key: "txt",
           },
         ],
       },
@@ -64,7 +64,7 @@
   ];
   export default defineComponent({
     components: { BasicModal, BasicForm },
-    emits: ['success', 'register'],
+    emits: ["success", "register"],
     setup(_, { emit }) {
       const [registerForm, { validateFields }] = useForm();
       const [registerModal, { closeModal }] = useModalInner();
@@ -72,8 +72,8 @@
       async function handleOk() {
         const res = (await validateFields()) as ExportModalResult;
         const { filename, bookType } = res;
-        emit('success', {
-          filename: `${filename.split('.').shift()}.${bookType}`,
+        emit("success", {
+          filename: `${filename.split(".").shift()}.${bookType}`,
           bookType,
         });
         closeModal();
diff --git a/src/components/Excel/src/ImportExcel.vue b/src/components/Excel/src/ImportExcel.vue
index c94d07b121fc3fc39f8464fef58c694be969dbe1..996bfdd51844a5dc1ac7ff18aae3f071449d0087 100644
--- a/src/components/Excel/src/ImportExcel.vue
+++ b/src/components/Excel/src/ImportExcel.vue
@@ -13,13 +13,13 @@
   </div>
 </template>
 <script lang="ts">
-  import { defineComponent, ref, unref } from 'vue';
-  import XLSX from 'xlsx';
-  import { dateUtil } from '/@/utils/dateUtil';
+  import { defineComponent, ref, unref } from "vue";
+  import * as XLSX from "xlsx";
+  import { dateUtil } from "/@/utils/dateUtil";
 
-  import type { ExcelData } from './typing';
+  import type { ExcelData } from "./typing";
   export default defineComponent({
-    name: 'ImportExcel',
+    name: "ImportExcel",
     props: {
       // 日期时间格式。如果不提供或者提供空值,将返回原始Date对象
       dateFormat: {
@@ -31,8 +31,13 @@
         type: Number,
         default: 8,
       },
+      // 是否直接返回选中文件
+      isReturnFile: {
+        type: Boolean,
+        default: false,
+      },
     },
-    emits: ['success', 'error'],
+    emits: ["success", "error"],
     setup(props, { emit }) {
       const inputRef = ref<HTMLInputElement | null>(null);
       const loadingRef = ref<Boolean>(false);
@@ -41,10 +46,10 @@
        * @description: 第一行作为头部
        */
       function getHeaderRow(sheet: XLSX.WorkSheet) {
-        if (!sheet || !sheet['!ref']) return [];
+        if (!sheet || !sheet["!ref"]) return [];
         const headers: string[] = [];
         // A3:B7=>{s:{c:0, r:2}, e:{c:1, r:6}}
-        const range = XLSX.utils.decode_range(sheet['!ref']);
+        const range = XLSX.utils.decode_range(sheet["!ref"]);
 
         const R = range.s.r;
         /* start in the first row */
@@ -52,7 +57,7 @@
           /* walk every column in the range */
           const cell = sheet[XLSX.utils.encode_cell({ c: C, r: R })];
           /* find the cell in the first row */
-          let hdr = 'UNKNOWN ' + C; // <-- replace with your desired default
+          let hdr = "UNKNOWN " + C; // <-- replace with your desired default
           if (cell && cell.t) hdr = XLSX.utils.format_cell(cell);
           headers.push(hdr);
         }
@@ -107,15 +112,15 @@
           reader.onload = async (e) => {
             try {
               const data = e.target && e.target.result;
-              const workbook = XLSX.read(data, { type: 'array', cellDates: true });
+              const workbook = XLSX.read(data, { type: "array", cellDates: true });
               // console.log(workbook);
               /* DO SOMETHING WITH workbook HERE */
               const excelData = getExcelData(workbook);
-              emit('success', excelData);
-              resolve('');
+              emit("success", excelData);
+              resolve("");
             } catch (error) {
               reject(error);
-              emit('error');
+              emit("error");
             } finally {
               loadingRef.value = false;
             }
@@ -128,7 +133,7 @@
         const inputRefDom = unref(inputRef);
         if (inputRefDom) {
           // fix can't select the same excel
-          inputRefDom.value = '';
+          inputRefDom.value = "";
         }
         await readerData(rawFile);
       }
@@ -140,6 +145,10 @@
         const files = e && (e.target as HTMLInputElement).files;
         const rawFile = files && files[0]; // only setting files[0]
         if (!rawFile) return;
+        if (props.isReturnFile) {
+          emit("success", rawFile);
+          return;
+        }
         upload(rawFile);
       }
 
diff --git a/src/components/Excel/src/typing.ts b/src/components/Excel/src/typing.ts
index e55e549eac91b57d7d5b94524551b3cc11e7ed72..1626781e278ce13472cd0c449a17ec8117560a8d 100644
--- a/src/components/Excel/src/typing.ts
+++ b/src/components/Excel/src/typing.ts
@@ -1,4 +1,4 @@
-import type { JSON2SheetOpts, WritingOptions, BookType } from 'xlsx';
+import type { JSON2SheetOpts, WritingOptions, BookType } from "xlsx";
 
 export interface ExcelData<T = any> {
   header: string[];
diff --git a/src/components/FlowChart/index.ts b/src/components/FlowChart/index.ts
index edbeb5591975cdf3354b6e1f9d0f528521c6ff84..67c810b8cf530487df992a25f5477e3e4fdd7e8f 100644
--- a/src/components/FlowChart/index.ts
+++ b/src/components/FlowChart/index.ts
@@ -1,4 +1,4 @@
-import { withInstall } from '/@/utils';
-import flowChart from './src/FlowChart.vue';
+import { withInstall } from "/@/utils";
+import flowChart from "./src/FlowChart.vue";
 
 export const FlowChart = withInstall(flowChart);
diff --git a/src/components/FlowChart/src/FlowChart.vue b/src/components/FlowChart/src/FlowChart.vue
index 419b0fea7f6353fc2008b54aa8d66edd10441155..98c030c8a2af760f99617499492c99ae59921f24 100644
--- a/src/components/FlowChart/src/FlowChart.vue
+++ b/src/components/FlowChart/src/FlowChart.vue
@@ -8,24 +8,24 @@
   </div>
 </template>
 <script lang="ts">
-  import type { Ref } from 'vue';
-  import type { Definition } from '@logicflow/core';
-  import { defineComponent, ref, onMounted, unref, nextTick, computed, watch } from 'vue';
-  import FlowChartToolbar from './FlowChartToolbar.vue';
-  import LogicFlow from '@logicflow/core';
-  import { Snapshot, BpmnElement, Menu, DndPanel, SelectionSelect } from '@logicflow/extension';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useAppStore } from '/@/store/modules/app';
-  import { createFlowChartContext } from './useFlowContext';
-  import { toLogicFlowData } from './adpterForTurbo';
-  import { useModal, BasicModal } from '/@/components/Modal';
-  import { JsonPreview } from '/@/components/CodeEditor';
-  import { configDefaultDndPanel } from './config';
-  import '@logicflow/core/dist/style/index.css';
-  import '@logicflow/extension/lib/style/index.css';
+  import type { Ref } from "vue";
+  import type { Definition } from "@logicflow/core";
+  import { defineComponent, ref, onMounted, unref, nextTick, computed, watch } from "vue";
+  import FlowChartToolbar from "./FlowChartToolbar.vue";
+  import LogicFlow from "@logicflow/core";
+  import { Snapshot, BpmnElement, Menu, DndPanel, SelectionSelect } from "@logicflow/extension";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useAppStore } from "/@/store/modules/app";
+  import { createFlowChartContext } from "./useFlowContext";
+  import { toLogicFlowData } from "./adpterForTurbo";
+  import { useModal, BasicModal } from "/@/components/Modal";
+  import { JsonPreview } from "/@/components/CodeEditor";
+  import { configDefaultDndPanel } from "./config";
+  import "@logicflow/core/dist/style/index.css";
+  import "@logicflow/extension/lib/style/index.css";
 
   export default defineComponent({
-    name: 'FlowChart',
+    name: "FlowChart",
     components: { BasicModal, FlowChartToolbar, JsonPreview },
     props: {
       flowOptions: {
@@ -52,7 +52,7 @@
 
       const lfInstance = ref(null) as Ref<LogicFlow | null>;
 
-      const { prefixCls } = useDesign('flow-chart');
+      const { prefixCls } = useDesign("flow-chart");
       const appStore = useAppStore();
       const [register, { openModal }] = useModal();
       createFlowChartContext({
@@ -65,7 +65,7 @@
         const defaultOptions: Partial<Definition> = {
           grid: true,
           background: {
-            color: appStore.getDarkMode === 'light' ? '#f7f9ff' : '#151515',
+            color: appStore.getDarkMode === "light" ? "#f7f9ff" : "#151515",
           },
           keyboard: {
             enabled: true,
@@ -120,7 +120,7 @@
           container: lfEl,
         });
         const lf = unref(lfInstance)!;
-        lf?.setDefaultEdgeType('line');
+        lf?.setDefaultEdgeType("line");
         onRender();
         lf?.setPatternItems(props.patternItems || configDefaultDndPanel(lf));
       }
diff --git a/src/components/FlowChart/src/FlowChartToolbar.vue b/src/components/FlowChart/src/FlowChartToolbar.vue
index c88af5ca468090e358d60e224c4349714e4a9359..c1615b673fa9f286c65f7c036ef781d897cb1e7d 100644
--- a/src/components/FlowChart/src/FlowChartToolbar.vue
+++ b/src/components/FlowChart/src/FlowChartToolbar.vue
@@ -15,62 +15,62 @@
   </div>
 </template>
 <script lang="ts">
-  import type { ToolbarConfig } from './types';
+  import type { ToolbarConfig } from "./types";
 
-  import { defineComponent, ref, onUnmounted, unref, nextTick, watchEffect } from 'vue';
-  import { Divider, Tooltip } from 'ant-design-vue';
-  import { Icon } from '/@/components/Icon';
+  import { defineComponent, ref, onUnmounted, unref, nextTick, watchEffect } from "vue";
+  import { Divider, Tooltip } from "ant-design-vue";
+  import { Icon } from "/@/components/Icon";
 
-  import { useFlowChartContext } from './useFlowContext';
-  import { ToolbarTypeEnum } from './enum';
+  import { useFlowChartContext } from "./useFlowContext";
+  import { ToolbarTypeEnum } from "./enum";
 
   export default defineComponent({
-    name: 'FlowChartToolbar',
+    name: "FlowChartToolbar",
     components: { Icon, Divider, Tooltip },
     props: {
       prefixCls: String,
     },
-    emits: ['view-data'],
+    emits: ["view-data"],
     setup(_, { emit }) {
       const toolbarItemList = ref<ToolbarConfig[]>([
         {
           type: ToolbarTypeEnum.ZOOM_IN,
-          icon: 'codicon:zoom-out',
-          tooltip: '缩小',
+          icon: "codicon:zoom-out",
+          tooltip: "缩小",
         },
         {
           type: ToolbarTypeEnum.ZOOM_OUT,
-          icon: 'codicon:zoom-in',
-          tooltip: '放大',
+          icon: "codicon:zoom-in",
+          tooltip: "放大",
         },
         {
           type: ToolbarTypeEnum.RESET_ZOOM,
-          icon: 'codicon:screen-normal',
-          tooltip: '重置比例',
+          icon: "codicon:screen-normal",
+          tooltip: "重置比例",
         },
         { separate: true },
         {
           type: ToolbarTypeEnum.UNDO,
-          icon: 'ion:arrow-undo-outline',
-          tooltip: '后退',
+          icon: "ion:arrow-undo-outline",
+          tooltip: "后退",
           disabled: true,
         },
         {
           type: ToolbarTypeEnum.REDO,
-          icon: 'ion:arrow-redo-outline',
-          tooltip: '前进',
+          icon: "ion:arrow-redo-outline",
+          tooltip: "前进",
           disabled: true,
         },
         { separate: true },
         {
           type: ToolbarTypeEnum.SNAPSHOT,
-          icon: 'ion:download-outline',
-          tooltip: '下载',
+          icon: "ion:download-outline",
+          tooltip: "下载",
         },
         {
           type: ToolbarTypeEnum.VIEW_DATA,
-          icon: 'carbon:document-view',
-          tooltip: '查看数据',
+          icon: "carbon:document-view",
+          tooltip: "查看数据",
         },
       ]);
 
@@ -113,7 +113,7 @@
             lf.getSnapshot();
             break;
           case ToolbarTypeEnum.VIEW_DATA:
-            emit('view-data');
+            emit("view-data");
             break;
         }
       };
@@ -121,21 +121,21 @@
       watchEffect(async () => {
         if (unref(logicFlow)) {
           await nextTick();
-          unref(logicFlow)?.on('history:change', onHistoryChange);
+          unref(logicFlow)?.on("history:change", onHistoryChange);
         }
       });
 
       onUnmounted(() => {
-        unref(logicFlow)?.off('history:change', onHistoryChange);
+        unref(logicFlow)?.off("history:change", onHistoryChange);
       });
       return { toolbarItemList, onControl };
     },
   });
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-flow-chart-toolbar';
+  @prefix-cls: ~"@{namespace}-flow-chart-toolbar";
 
-  html[data-theme='dark'] {
+  html[data-theme="dark"] {
     .lf-dnd {
       background: #080808;
     }
diff --git a/src/components/FlowChart/src/adpterForTurbo.ts b/src/components/FlowChart/src/adpterForTurbo.ts
index b68b276c3b8580ff27237cedfe5c6bb1b0996651..85c2d16c94d4aebed20f875750501a6ad304b015 100644
--- a/src/components/FlowChart/src/adpterForTurbo.ts
+++ b/src/components/FlowChart/src/adpterForTurbo.ts
@@ -21,7 +21,7 @@ function convertFlowElementToEdge(element) {
     pointsList,
     properties: {},
   };
-  const excludeProperties = ['startPoint', 'endPoint', 'pointsList', 'text', 'logicFlowType'];
+  const excludeProperties = ["startPoint", "endPoint", "pointsList", "text", "logicFlowType"];
   Object.keys(element.properties).forEach((property) => {
     if (excludeProperties.indexOf(property) === -1) {
       edge.properties[property] = element.properties[property];
@@ -41,7 +41,7 @@ function convertFlowElementToNode(element) {
     text,
     properties: {},
   };
-  const excludeProperties = ['x', 'y', 'text', 'logicFlowType'];
+  const excludeProperties = ["x", "y", "text", "logicFlowType"];
   Object.keys(element.properties).forEach((property) => {
     if (excludeProperties.indexOf(property) === -1) {
       node.properties[property] = element.properties[property];
diff --git a/src/components/FlowChart/src/config.ts b/src/components/FlowChart/src/config.ts
index 4f10d2ca8991bcdef1c95218412f87834928915e..dc16733c372ec2d209f7a8c8f04db8374a1c52c2 100644
--- a/src/components/FlowChart/src/config.ts
+++ b/src/components/FlowChart/src/config.ts
@@ -1,64 +1,64 @@
 export const nodeList = [
   {
-    text: '开始',
-    type: 'start',
-    class: 'node-start',
+    text: "开始",
+    type: "start",
+    class: "node-start",
   },
   {
-    text: '矩形',
-    type: 'rect',
-    class: 'node-rect',
+    text: "矩形",
+    type: "rect",
+    class: "node-rect",
   },
   {
-    type: 'user',
-    text: '用户',
-    class: 'node-user',
+    type: "user",
+    text: "用户",
+    class: "node-user",
   },
   {
-    type: 'push',
-    text: '推送',
-    class: 'node-push',
+    type: "push",
+    text: "推送",
+    class: "node-push",
   },
   {
-    type: 'download',
-    text: '位置',
-    class: 'node-download',
+    type: "download",
+    text: "位置",
+    class: "node-download",
   },
   {
-    type: 'end',
-    text: '结束',
-    class: 'node-end',
+    type: "end",
+    text: "结束",
+    class: "node-end",
   },
 ];
 
 export const BpmnNode = [
   {
-    type: 'bpmn:startEvent',
-    text: '开始',
-    class: 'bpmn-start',
+    type: "bpmn:startEvent",
+    text: "开始",
+    class: "bpmn-start",
   },
   {
-    type: 'bpmn:endEvent',
-    text: '结束',
-    class: 'bpmn-end',
+    type: "bpmn:endEvent",
+    text: "结束",
+    class: "bpmn-end",
   },
   {
-    type: 'bpmn:exclusiveGateway',
-    text: '网关',
-    class: 'bpmn-exclusiveGateway',
+    type: "bpmn:exclusiveGateway",
+    text: "网关",
+    class: "bpmn-exclusiveGateway",
   },
   {
-    type: 'bpmn:userTask',
-    text: '用户',
-    class: 'bpmn-user',
+    type: "bpmn:userTask",
+    text: "用户",
+    class: "bpmn-user",
   },
 ];
 
 export function configDefaultDndPanel(lf) {
   return [
     {
-      text: '选区',
-      icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAAH6ji2bAAAABGdBTUEAALGPC/xhBQAAAOVJREFUOBGtVMENwzAIjKP++2026ETdpv10iy7WFbqFyyW6GBywLCv5gI+Dw2Bluj1znuSjhb99Gkn6QILDY2imo60p8nsnc9bEo3+QJ+AKHfMdZHnl78wyTnyHZD53Zzx73MRSgYvnqgCUHj6gwdck7Zsp1VOrz0Uz8NbKunzAW+Gu4fYW28bUYutYlzSa7B84Fh7d1kjLwhcSdYAYrdkMQVpsBr5XgDGuXwQfQr0y9zwLda+DUYXLaGKdd2ZTtvbolaO87pdo24hP7ov16N0zArH1ur3iwJpXxm+v7oAJNR4JEP8DoAuSFEkYH7cAAAAASUVORK5CYII=',
+      text: "选区",
+      icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAAH6ji2bAAAABGdBTUEAALGPC/xhBQAAAOVJREFUOBGtVMENwzAIjKP++2026ETdpv10iy7WFbqFyyW6GBywLCv5gI+Dw2Bluj1znuSjhb99Gkn6QILDY2imo60p8nsnc9bEo3+QJ+AKHfMdZHnl78wyTnyHZD53Zzx73MRSgYvnqgCUHj6gwdck7Zsp1VOrz0Uz8NbKunzAW+Gu4fYW28bUYutYlzSa7B84Fh7d1kjLwhcSdYAYrdkMQVpsBr5XgDGuXwQfQr0y9zwLda+DUYXLaGKdd2ZTtvbolaO87pdo24hP7ov16N0zArH1ur3iwJpXxm+v7oAJNR4JEP8DoAuSFEkYH7cAAAAASUVORK5CYII=",
       callback: () => {
         lf.updateEditConfig({
           stopMoveGraph: true,
@@ -66,31 +66,31 @@ export function configDefaultDndPanel(lf) {
       },
     },
     {
-      type: 'circle',
-      text: '开始',
-      icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAAH6ji2bAAAABGdBTUEAALGPC/xhBQAAAnBJREFUOBGdVL1rU1EcPfdGBddmaZLiEhdx1MHZQXApraCzQ7GKLgoRBxMfcRELuihWKcXFRcEWF8HBf0DdDCKYRZpnl7p0svLe9Zzbd29eQhTbC8nv+9zf130AT63jvooOGS8Vf9Nt5zxba7sXQwODfkWpkbjTQfCGUd9gIp3uuPP8bZ946g56dYQvnBg+b1HB8VIQmMFrazKcKSvFW2dQTxJnJdQ77urmXWOMBCmXM2Rke4S7UAW+/8ywwFoewmBps2tu7mbTdp8VMOkIRAkKfrVawalJTtIliclFbaOBqa0M2xImHeVIfd/nKAfVq/LGnPss5Kh00VEdSzfwnBXPUpmykNss4lUI9C1ga+8PNrBD5YeqRY2Zz8PhjooIbfJXjowvQJBqkmEkVnktWhwu2SM7SMx7Cj0N9IC0oQXRo8xwAGzQms+xrB/nNSUWVveI48ayrFGyC2+E2C+aWrZHXvOuz+CiV6iycWe1Rd1Q6+QUG07nb5SbPrL4426d+9E1axKjY3AoRrlEeSQo2Eu0T6BWAAr6COhTcWjRaYfKG5csnvytvUr/WY4rrPMB53Uo7jZRjXaG6/CFfNMaXEu75nG47X+oepU7PKJvvzGDY1YLSKHJrK7vFUwXKkaxwhCW3u+sDFMVrIju54RYYbFKpALZAo7sB6wcKyyrd+aBMryMT2gPyD6GsQoRFkGHr14TthZni9ck0z+Pnmee460mHXbRAypKNy3nuMdrWgVKj8YVV8E7PSzp1BZ9SJnJAsXdryw/h5ctboUVi4AFiCd+lQaYMw5z3LGTBKjLQOeUF35k89f58Vv/tGh+l+PE/wG0rgfIUbZK5AAAAABJRU5ErkJggg==',
+      type: "circle",
+      text: "开始",
+      icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAAH6ji2bAAAABGdBTUEAALGPC/xhBQAAAnBJREFUOBGdVL1rU1EcPfdGBddmaZLiEhdx1MHZQXApraCzQ7GKLgoRBxMfcRELuihWKcXFRcEWF8HBf0DdDCKYRZpnl7p0svLe9Zzbd29eQhTbC8nv+9zf130AT63jvooOGS8Vf9Nt5zxba7sXQwODfkWpkbjTQfCGUd9gIp3uuPP8bZ946g56dYQvnBg+b1HB8VIQmMFrazKcKSvFW2dQTxJnJdQ77urmXWOMBCmXM2Rke4S7UAW+/8ywwFoewmBps2tu7mbTdp8VMOkIRAkKfrVawalJTtIliclFbaOBqa0M2xImHeVIfd/nKAfVq/LGnPss5Kh00VEdSzfwnBXPUpmykNss4lUI9C1ga+8PNrBD5YeqRY2Zz8PhjooIbfJXjowvQJBqkmEkVnktWhwu2SM7SMx7Cj0N9IC0oQXRo8xwAGzQms+xrB/nNSUWVveI48ayrFGyC2+E2C+aWrZHXvOuz+CiV6iycWe1Rd1Q6+QUG07nb5SbPrL4426d+9E1axKjY3AoRrlEeSQo2Eu0T6BWAAr6COhTcWjRaYfKG5csnvytvUr/WY4rrPMB53Uo7jZRjXaG6/CFfNMaXEu75nG47X+oepU7PKJvvzGDY1YLSKHJrK7vFUwXKkaxwhCW3u+sDFMVrIju54RYYbFKpALZAo7sB6wcKyyrd+aBMryMT2gPyD6GsQoRFkGHr14TthZni9ck0z+Pnmee460mHXbRAypKNy3nuMdrWgVKj8YVV8E7PSzp1BZ9SJnJAsXdryw/h5ctboUVi4AFiCd+lQaYMw5z3LGTBKjLQOeUF35k89f58Vv/tGh+l+PE/wG0rgfIUbZK5AAAAABJRU5ErkJggg==",
     },
     {
-      type: 'rect',
-      text: '用户任务',
-      icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAEFVwZaAAAABGdBTUEAALGPC/xhBQAAAqlJREFUOBF9VM9rE0EUfrMJNUKLihGbpLGtaCOIR8VjQMGDePCgCCIiCNqzCAp2MyYUCXhUtF5E0D+g1t48qAd7CCLqQUQKEWkStcEfVGlLdp/fm3aW2QQdyLzf33zz5m2IsAZ9XhDpyaaIZkTS4ASzK41TFao88GuJ3hsr2pAbipHxuSYyKRugagICGANkfFnNh3HeE2N0b3nN2cgnpcictw5veJIzxmDamSlxxQZicq/mflxhbaH8BLRbuRwNtZp0JAhoplVRUdzmCe/vO27wFuuA3S5qXruGdboy5/PRGFsbFGKo/haRtQHIrM83bVeTrOgNhZReWaYGnE4aUQgTJNvijJFF4jQ8BxJE5xfKatZWmZcTQ+BVgh7s8SgPlCkcec4mGTmieTP4xd7PcpIEg1TX6gdeLW8rTVMVLVvb7ctXoH0Cydl2QOPJBG21STE5OsnbweVYzAnD3A7PVILuY0yiiyDwSm2g441r6rMSgp6iK42yqroI2QoXeJVeA+YeZSa47gZdXaZWQKTrG93rukk/l2Al6Kzh5AZEl7dDQy+JjgFahQjRopSxPbrbvK7GRe9ePWBo1wcU7sYrFZtavXALwGw/7Dnc50urrHJuTPSoO2IMV3gUQGNg87IbSOIY9BpiT9HV7FCZ94nPXb3MSnwHn/FFFE1vG6DTby+r31KAkUktB3Qf6ikUPWxW1BkXSPQeMHHiW0+HAd2GelJsZz1OJegCxqzl+CLVHa/IibuHeJ1HAKzhuDR+ymNaRFM+4jU6UWKXorRmbyqkq/D76FffevwdCp+jN3UAN/C9JRVTDuOxC/oh+EdMnqIOrlYteKSfadVRGLJFJPSB/ti/6K8f0CNymg/iH2gO/f0DwE0yjAFO6l8JaR5j0VPwPwfaYHqOqrCI319WzwhwzNW/aQAAAABJRU5ErkJggg==',
-      cls: 'important-node',
+      type: "rect",
+      text: "用户任务",
+      icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAEFVwZaAAAABGdBTUEAALGPC/xhBQAAAqlJREFUOBF9VM9rE0EUfrMJNUKLihGbpLGtaCOIR8VjQMGDePCgCCIiCNqzCAp2MyYUCXhUtF5E0D+g1t48qAd7CCLqQUQKEWkStcEfVGlLdp/fm3aW2QQdyLzf33zz5m2IsAZ9XhDpyaaIZkTS4ASzK41TFao88GuJ3hsr2pAbipHxuSYyKRugagICGANkfFnNh3HeE2N0b3nN2cgnpcictw5veJIzxmDamSlxxQZicq/mflxhbaH8BLRbuRwNtZp0JAhoplVRUdzmCe/vO27wFuuA3S5qXruGdboy5/PRGFsbFGKo/haRtQHIrM83bVeTrOgNhZReWaYGnE4aUQgTJNvijJFF4jQ8BxJE5xfKatZWmZcTQ+BVgh7s8SgPlCkcec4mGTmieTP4xd7PcpIEg1TX6gdeLW8rTVMVLVvb7ctXoH0Cydl2QOPJBG21STE5OsnbweVYzAnD3A7PVILuY0yiiyDwSm2g441r6rMSgp6iK42yqroI2QoXeJVeA+YeZSa47gZdXaZWQKTrG93rukk/l2Al6Kzh5AZEl7dDQy+JjgFahQjRopSxPbrbvK7GRe9ePWBo1wcU7sYrFZtavXALwGw/7Dnc50urrHJuTPSoO2IMV3gUQGNg87IbSOIY9BpiT9HV7FCZ94nPXb3MSnwHn/FFFE1vG6DTby+r31KAkUktB3Qf6ikUPWxW1BkXSPQeMHHiW0+HAd2GelJsZz1OJegCxqzl+CLVHa/IibuHeJ1HAKzhuDR+ymNaRFM+4jU6UWKXorRmbyqkq/D76FffevwdCp+jN3UAN/C9JRVTDuOxC/oh+EdMnqIOrlYteKSfadVRGLJFJPSB/ti/6K8f0CNymg/iH2gO/f0DwE0yjAFO6l8JaR5j0VPwPwfaYHqOqrCI319WzwhwzNW/aQAAAABJRU5ErkJggg==",
+      cls: "important-node",
     },
     {
-      type: 'rect',
-      text: '系统任务',
-      icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAEFVwZaAAAABGdBTUEAALGPC/xhBQAAAqlJREFUOBF9VM9rE0EUfrMJNUKLihGbpLGtaCOIR8VjQMGDePCgCCIiCNqzCAp2MyYUCXhUtF5E0D+g1t48qAd7CCLqQUQKEWkStcEfVGlLdp/fm3aW2QQdyLzf33zz5m2IsAZ9XhDpyaaIZkTS4ASzK41TFao88GuJ3hsr2pAbipHxuSYyKRugagICGANkfFnNh3HeE2N0b3nN2cgnpcictw5veJIzxmDamSlxxQZicq/mflxhbaH8BLRbuRwNtZp0JAhoplVRUdzmCe/vO27wFuuA3S5qXruGdboy5/PRGFsbFGKo/haRtQHIrM83bVeTrOgNhZReWaYGnE4aUQgTJNvijJFF4jQ8BxJE5xfKatZWmZcTQ+BVgh7s8SgPlCkcec4mGTmieTP4xd7PcpIEg1TX6gdeLW8rTVMVLVvb7ctXoH0Cydl2QOPJBG21STE5OsnbweVYzAnD3A7PVILuY0yiiyDwSm2g441r6rMSgp6iK42yqroI2QoXeJVeA+YeZSa47gZdXaZWQKTrG93rukk/l2Al6Kzh5AZEl7dDQy+JjgFahQjRopSxPbrbvK7GRe9ePWBo1wcU7sYrFZtavXALwGw/7Dnc50urrHJuTPSoO2IMV3gUQGNg87IbSOIY9BpiT9HV7FCZ94nPXb3MSnwHn/FFFE1vG6DTby+r31KAkUktB3Qf6ikUPWxW1BkXSPQeMHHiW0+HAd2GelJsZz1OJegCxqzl+CLVHa/IibuHeJ1HAKzhuDR+ymNaRFM+4jU6UWKXorRmbyqkq/D76FffevwdCp+jN3UAN/C9JRVTDuOxC/oh+EdMnqIOrlYteKSfadVRGLJFJPSB/ti/6K8f0CNymg/iH2gO/f0DwE0yjAFO6l8JaR5j0VPwPwfaYHqOqrCI319WzwhwzNW/aQAAAABJRU5ErkJggg==',
-      cls: 'import_icon',
+      type: "rect",
+      text: "系统任务",
+      icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAEFVwZaAAAABGdBTUEAALGPC/xhBQAAAqlJREFUOBF9VM9rE0EUfrMJNUKLihGbpLGtaCOIR8VjQMGDePCgCCIiCNqzCAp2MyYUCXhUtF5E0D+g1t48qAd7CCLqQUQKEWkStcEfVGlLdp/fm3aW2QQdyLzf33zz5m2IsAZ9XhDpyaaIZkTS4ASzK41TFao88GuJ3hsr2pAbipHxuSYyKRugagICGANkfFnNh3HeE2N0b3nN2cgnpcictw5veJIzxmDamSlxxQZicq/mflxhbaH8BLRbuRwNtZp0JAhoplVRUdzmCe/vO27wFuuA3S5qXruGdboy5/PRGFsbFGKo/haRtQHIrM83bVeTrOgNhZReWaYGnE4aUQgTJNvijJFF4jQ8BxJE5xfKatZWmZcTQ+BVgh7s8SgPlCkcec4mGTmieTP4xd7PcpIEg1TX6gdeLW8rTVMVLVvb7ctXoH0Cydl2QOPJBG21STE5OsnbweVYzAnD3A7PVILuY0yiiyDwSm2g441r6rMSgp6iK42yqroI2QoXeJVeA+YeZSa47gZdXaZWQKTrG93rukk/l2Al6Kzh5AZEl7dDQy+JjgFahQjRopSxPbrbvK7GRe9ePWBo1wcU7sYrFZtavXALwGw/7Dnc50urrHJuTPSoO2IMV3gUQGNg87IbSOIY9BpiT9HV7FCZ94nPXb3MSnwHn/FFFE1vG6DTby+r31KAkUktB3Qf6ikUPWxW1BkXSPQeMHHiW0+HAd2GelJsZz1OJegCxqzl+CLVHa/IibuHeJ1HAKzhuDR+ymNaRFM+4jU6UWKXorRmbyqkq/D76FffevwdCp+jN3UAN/C9JRVTDuOxC/oh+EdMnqIOrlYteKSfadVRGLJFJPSB/ti/6K8f0CNymg/iH2gO/f0DwE0yjAFO6l8JaR5j0VPwPwfaYHqOqrCI319WzwhwzNW/aQAAAABJRU5ErkJggg==",
+      cls: "import_icon",
     },
     {
-      type: 'diamond',
-      text: '条件判断',
-      icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAAHeEJUAAAAABGdBTUEAALGPC/xhBQAAAvVJREFUOBGNVEFrE0EU/mY3bQoiFlOkaUJrQUQoWMGePLX24EH0IIoHKQiCV0G8iE1covgLiqA/QTzVm1JPogc9tIJYFaQtlhQxqYjSpunu+L7JvmUTU3AgmTfvffPNN++9WSA1DO182f6xwILzD5btfAoQmwL5KJEwiQyVbSVZ0IgRyV6PTpIJ81E5ZvqfHQR0HUOBHW4L5Et2kQ6Zf7iAOhTFAA8s0pEP7AXO1uAA52SbqGk6h/6J45LaLhO64ByfcUzM39V7ZiAdS2yCePPEIQYvTUHqM/n7dgQNfBKWPjpF4ISk8q3J4nB11qw6X8l+FsF3EhlkEMfrjIer3wJTLwS2aCNcj4DbGxXTw00JmAuO+Ni6bBxVUCvS5d9aa04+so4pHW5jLTywuXAL7jJ+D06sl82Sgl2JuVBQn498zkc2bGKxULHjCnSMadBKYDYYHAtsby1EQ5lNGrQd4Y3v4Zo0XdGEmDno46yCM9Tk+RiJmUYHS/aXHPNTcjxcbTFna000PFJHIVZ5lFRqRpJWk9/+QtlOUYJj9HG5pVFEU7zqIYDVsw2s+AJaD8wTd2umgSCCyUxgGsS1Y6TBwXQQTFuZaHcd8gAGioE90hlsY+wMcs30RduYtxanjMGal8H5dMW67dmT1JFtYUEe8LiQLRsPZ6IIc7A4J5tqco3T0pnv/4u0kyzrYUq7gASuEyI8VXKvB9Odytv6jS/PNaZBln0nioJG/AVQRZvApOdhjj3Jt8QC8Im09SafwdBdvIpztpxWxpeKCC+EsFdS8DCyuCn2munFpL7ctHKp+Xc5cMybeIyMAN33SPL3ZR9QV1XVwLyzHm6Iv0/yeUuUb7PPlZC4D4HZkeu6dpF4v9j9MreGtMbxMMRLIcjJic9yHi7WQ3yVKzZVWUr5UrViJvn1FfUlwe/KYVfYyWRLSGNu16hR01U9IacajXPei0wx/5BqgInvJN+MMNtNme7ReU9SBbgntovn0kKHpFg7UogZvaZiOue/q1SBo9ktHzQAAAAASUVORK5CYII=',
+      type: "diamond",
+      text: "条件判断",
+      icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAAHeEJUAAAAABGdBTUEAALGPC/xhBQAAAvVJREFUOBGNVEFrE0EU/mY3bQoiFlOkaUJrQUQoWMGePLX24EH0IIoHKQiCV0G8iE1covgLiqA/QTzVm1JPogc9tIJYFaQtlhQxqYjSpunu+L7JvmUTU3AgmTfvffPNN++9WSA1DO182f6xwILzD5btfAoQmwL5KJEwiQyVbSVZ0IgRyV6PTpIJ81E5ZvqfHQR0HUOBHW4L5Et2kQ6Zf7iAOhTFAA8s0pEP7AXO1uAA52SbqGk6h/6J45LaLhO64ByfcUzM39V7ZiAdS2yCePPEIQYvTUHqM/n7dgQNfBKWPjpF4ISk8q3J4nB11qw6X8l+FsF3EhlkEMfrjIer3wJTLwS2aCNcj4DbGxXTw00JmAuO+Ni6bBxVUCvS5d9aa04+so4pHW5jLTywuXAL7jJ+D06sl82Sgl2JuVBQn498zkc2bGKxULHjCnSMadBKYDYYHAtsby1EQ5lNGrQd4Y3v4Zo0XdGEmDno46yCM9Tk+RiJmUYHS/aXHPNTcjxcbTFna000PFJHIVZ5lFRqRpJWk9/+QtlOUYJj9HG5pVFEU7zqIYDVsw2s+AJaD8wTd2umgSCCyUxgGsS1Y6TBwXQQTFuZaHcd8gAGioE90hlsY+wMcs30RduYtxanjMGal8H5dMW67dmT1JFtYUEe8LiQLRsPZ6IIc7A4J5tqco3T0pnv/4u0kyzrYUq7gASuEyI8VXKvB9Odytv6jS/PNaZBln0nioJG/AVQRZvApOdhjj3Jt8QC8Im09SafwdBdvIpztpxWxpeKCC+EsFdS8DCyuCn2munFpL7ctHKp+Xc5cMybeIyMAN33SPL3ZR9QV1XVwLyzHm6Iv0/yeUuUb7PPlZC4D4HZkeu6dpF4v9j9MreGtMbxMMRLIcjJic9yHi7WQ3yVKzZVWUr5UrViJvn1FfUlwe/KYVfYyWRLSGNu16hR01U9IacajXPei0wx/5BqgInvJN+MMNtNme7ReU9SBbgntovn0kKHpFg7UogZvaZiOue/q1SBo9ktHzQAAAAASUVORK5CYII=",
     },
     {
-      type: 'circle',
-      text: '结束',
-      icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAAH6ji2bAAAABGdBTUEAALGPC/xhBQAAA1BJREFUOBFtVE1IVUEYPXOf+tq40Y3vPcmFIdSjIorWoRG0ERWUgnb5FwVhYQSl72oUoZAboxKNFtWiwKRN0M+jpfSzqJAQclHo001tKkjl3emc8V69igP3znzfnO/M9zcDcKT67azmjYWTwl9Vn7Vumeqzj1DVb6cleQY4oAVnIOPb+mKAGxQmKI5CWNJ2aLPatxWa3aB9K7/fB+/Z0jUF6TmMlFLQqrkECWQzOZxYGjTlOl8eeKaIY5yHnFn486xBustDjWT6dG7pmjHOJd+33t0iitTPkK6tEvjxq4h2MozQ6WFSX/LkDUGfFwfhEZj1Auz/U4pyAi5Sznd7uKzznXeVHlI/Aywmk6j7fsUsEuCGADrWARXXwjxWQsUbIupDHJI7kF5dRktg0eN81IbiZXiTESic50iwS+t1oJgL83jAiBupLDCQqwziaWSoAFSeIR3P5Xv5az00wyIn35QRYTwdSYbz8pH8fxUUAtxnFvYmEmgI0wYXUXcCCSpeEVpXlsRhBnCEATxWylL9+EKCAYhe1NGstUa6356kS9NVvt3DU2fd+Wtbm/+lSbylJqsqkSm9CRhvoJVlvKPvF1RKY/FcPn5j4UfIMLn8D4UYb54BNsilTDXKnF4CfTobA0FpoW/LSp306wkXM+XaOJhZaFkcNM82ASNAWMrhrUbRfmyeI1FvRBTpN06WKxa9BK0o2E4Pd3zfBBEwPsv9sQBnmLVbLEIZ/Xe9LYwJu/Er17W6HYVBc7vmuk0xUQ+pqxdom5Fnp55SiytXLPYoMXNM4u4SNSCFWnrVIzKG3EGyMXo6n/BQOe+bX3FClY4PwydVhthOZ9NnS+ntiLh0fxtlUJHAuGaFoVmttpVMeum0p3WEXbcll94l1wM/gZ0Ccczop77VvN2I7TlsZCsuXf1WHvWEhjO8DPtyOVg2/mvK9QqboEth+7pD6NUQC1HN/TwvydGBARi9MZSzLE4b8Ru3XhX2PBxf8E1er2A6516o0w4sIA+lwURhAON82Kwe2iDAC1Watq4XHaGQ7skLcFOtI5lDxuM2gZe6WFIotPAhbaeYlU4to5cuarF1QrcZ/lwrLaCJl66JBocYZnrNlvm2+MBCTmUymPrYZVbjdlr/BxlMjmNmNI3SAAAAAElFTkSuQmCC',
+      type: "circle",
+      text: "结束",
+      icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAAH6ji2bAAAABGdBTUEAALGPC/xhBQAAA1BJREFUOBFtVE1IVUEYPXOf+tq40Y3vPcmFIdSjIorWoRG0ERWUgnb5FwVhYQSl72oUoZAboxKNFtWiwKRN0M+jpfSzqJAQclHo001tKkjl3emc8V69igP3znzfnO/M9zcDcKT67azmjYWTwl9Vn7Vumeqzj1DVb6cleQY4oAVnIOPb+mKAGxQmKI5CWNJ2aLPatxWa3aB9K7/fB+/Z0jUF6TmMlFLQqrkECWQzOZxYGjTlOl8eeKaIY5yHnFn486xBustDjWT6dG7pmjHOJd+33t0iitTPkK6tEvjxq4h2MozQ6WFSX/LkDUGfFwfhEZj1Auz/U4pyAi5Sznd7uKzznXeVHlI/Aywmk6j7fsUsEuCGADrWARXXwjxWQsUbIupDHJI7kF5dRktg0eN81IbiZXiTESic50iwS+t1oJgL83jAiBupLDCQqwziaWSoAFSeIR3P5Xv5az00wyIn35QRYTwdSYbz8pH8fxUUAtxnFvYmEmgI0wYXUXcCCSpeEVpXlsRhBnCEATxWylL9+EKCAYhe1NGstUa6356kS9NVvt3DU2fd+Wtbm/+lSbylJqsqkSm9CRhvoJVlvKPvF1RKY/FcPn5j4UfIMLn8D4UYb54BNsilTDXKnF4CfTobA0FpoW/LSp306wkXM+XaOJhZaFkcNM82ASNAWMrhrUbRfmyeI1FvRBTpN06WKxa9BK0o2E4Pd3zfBBEwPsv9sQBnmLVbLEIZ/Xe9LYwJu/Er17W6HYVBc7vmuk0xUQ+pqxdom5Fnp55SiytXLPYoMXNM4u4SNSCFWnrVIzKG3EGyMXo6n/BQOe+bX3FClY4PwydVhthOZ9NnS+ntiLh0fxtlUJHAuGaFoVmttpVMeum0p3WEXbcll94l1wM/gZ0Ccczop77VvN2I7TlsZCsuXf1WHvWEhjO8DPtyOVg2/mvK9QqboEth+7pD6NUQC1HN/TwvydGBARi9MZSzLE4b8Ru3XhX2PBxf8E1er2A6516o0w4sIA+lwURhAON82Kwe2iDAC1Watq4XHaGQ7skLcFOtI5lDxuM2gZe6WFIotPAhbaeYlU4to5cuarF1QrcZ/lwrLaCJl66JBocYZnrNlvm2+MBCTmUymPrYZVbjdlr/BxlMjmNmNI3SAAAAAElFTkSuQmCC",
     },
   ];
 }
diff --git a/src/components/FlowChart/src/enum.ts b/src/components/FlowChart/src/enum.ts
index 8ea134ca5eba3580d75f23754ee59df02be24441..1a0c9997f577d49cee9a58edb255bd172e68530b 100644
--- a/src/components/FlowChart/src/enum.ts
+++ b/src/components/FlowChart/src/enum.ts
@@ -1,11 +1,11 @@
 export enum ToolbarTypeEnum {
-  ZOOM_IN = 'zoomIn',
-  ZOOM_OUT = 'zoomOut',
-  RESET_ZOOM = 'resetZoom',
+  ZOOM_IN = "zoomIn",
+  ZOOM_OUT = "zoomOut",
+  RESET_ZOOM = "resetZoom",
 
-  UNDO = 'undo',
-  REDO = 'redo',
+  UNDO = "undo",
+  REDO = "redo",
 
-  SNAPSHOT = 'snapshot',
-  VIEW_DATA = 'viewData',
+  SNAPSHOT = "snapshot",
+  VIEW_DATA = "viewData",
 }
diff --git a/src/components/FlowChart/src/types.ts b/src/components/FlowChart/src/types.ts
index 94992ba1a1edb71eec011f5387095fe726b242c9..7a6613b92fa4cf9420b76e9f528cbb031e473d77 100644
--- a/src/components/FlowChart/src/types.ts
+++ b/src/components/FlowChart/src/types.ts
@@ -1,5 +1,5 @@
-import { NodeConfig } from '@logicflow/core';
-import { ToolbarTypeEnum } from './enum';
+import { NodeConfig } from "@logicflow/core";
+import { ToolbarTypeEnum } from "./enum";
 
 export interface NodeItem extends NodeConfig {
   icon: string;
diff --git a/src/components/FlowChart/src/useFlowContext.ts b/src/components/FlowChart/src/useFlowContext.ts
index 7d15f3b3404386f229dc1a923be340376f578e5e..3dab7b772f74c739bd8f10a9dfbc882e367d8e15 100644
--- a/src/components/FlowChart/src/useFlowContext.ts
+++ b/src/components/FlowChart/src/useFlowContext.ts
@@ -1,8 +1,8 @@
-import type LogicFlow from '@logicflow/core';
+import type LogicFlow from "@logicflow/core";
 
-import { provide, inject } from 'vue';
+import { provide, inject } from "vue";
 
-const key = Symbol('flow-chart');
+const key = Symbol("flow-chart");
 
 type Instance = {
   logicFlow: LogicFlow;
diff --git a/src/components/Form/index.ts b/src/components/Form/index.ts
index 8bca8a36553fd42143ba4b60902eee8855b02586..ed5b80a8ae4f3dd72f44c15cf5b5aee1b71070af 100644
--- a/src/components/Form/index.ts
+++ b/src/components/Form/index.ts
@@ -1,15 +1,17 @@
-import BasicForm from './src/BasicForm.vue';
+import BasicForm from "./src/BasicForm.vue";
 
-export * from './src/types/form';
-export * from './src/types/formItem';
+export * from "./src/types/form";
+export * from "./src/types/formItem";
 
-export { useComponentRegister } from './src/hooks/useComponentRegister';
-export { useForm } from './src/hooks/useForm';
+export { useComponentRegister } from "./src/hooks/useComponentRegister";
+export { useForm } from "./src/hooks/useForm";
 
-export { default as ApiSelect } from './src/components/ApiSelect.vue';
-export { default as RadioButtonGroup } from './src/components/RadioButtonGroup.vue';
-export { default as ApiTreeSelect } from './src/components/ApiTreeSelect.vue';
-export { default as ApiRadioGroup } from './src/components/ApiRadioGroup.vue';
-export { default as ApiCascader } from './src/components/ApiCascader.vue';
+export { default as ApiSelect } from "./src/components/ApiSelect.vue";
+export { default as RadioButtonGroup } from "./src/components/RadioButtonGroup.vue";
+export { default as ApiTreeSelect } from "./src/components/ApiTreeSelect.vue";
+export { default as ApiTree } from "./src/components/ApiTree.vue";
+export { default as ApiRadioGroup } from "./src/components/ApiRadioGroup.vue";
+export { default as ApiCascader } from "./src/components/ApiCascader.vue";
+export { default as ApiTransfer } from "./src/components/ApiTransfer.vue";
 
 export { BasicForm };
diff --git a/src/components/Form/src/BasicForm.vue b/src/components/Form/src/BasicForm.vue
index 4a2672763616921a486a6099a58054690f6c25cb..d109c5a769f91cdcdbf21ce97297895603c50436 100644
--- a/src/components/Form/src/BasicForm.vue
+++ b/src/components/Form/src/BasicForm.vue
@@ -37,36 +37,38 @@
   </Form>
 </template>
 <script lang="ts">
-  import type { FormActionType, FormProps, FormSchema } from './types/form';
-  import type { AdvanceState } from './types/hooks';
-  import type { Ref } from 'vue';
+  import type { FormActionType, FormProps, FormSchema } from "./types/form";
+  import type { AdvanceState } from "./types/hooks";
+  import type { Ref } from "vue";
 
-  import { defineComponent, reactive, ref, computed, unref, onMounted, watch, nextTick } from 'vue';
-  import { Form, Row } from 'ant-design-vue';
-  import FormItem from './components/FormItem.vue';
-  import FormAction from './components/FormAction.vue';
+  import { defineComponent, reactive, ref, computed, unref, onMounted, watch, nextTick } from "vue";
+  import { Form, Row } from "ant-design-vue";
+  import FormItem from "./components/FormItem.vue";
+  import FormAction from "./components/FormAction.vue";
 
-  import { dateItemType } from './helper';
-  import { dateUtil } from '/@/utils/dateUtil';
+  import { dateItemType } from "./helper";
+  import { dateUtil } from "/@/utils/dateUtil";
 
   // import { cloneDeep } from 'lodash-es';
-  import { deepMerge } from '/@/utils';
+  import { deepMerge } from "/@/utils";
 
-  import { useFormValues } from './hooks/useFormValues';
-  import useAdvanced from './hooks/useAdvanced';
-  import { useFormEvents } from './hooks/useFormEvents';
-  import { createFormContext } from './hooks/useFormContext';
-  import { useAutoFocus } from './hooks/useAutoFocus';
-  import { useModalContext } from '/@/components/Modal';
+  import { useFormValues } from "./hooks/useFormValues";
+  import useAdvanced from "./hooks/useAdvanced";
+  import { useFormEvents } from "./hooks/useFormEvents";
+  import { createFormContext } from "./hooks/useFormContext";
+  import { useAutoFocus } from "./hooks/useAutoFocus";
+  import { useModalContext } from "/@/components/Modal";
+  import { useDebounceFn } from "@vueuse/core";
 
-  import { basicProps } from './props';
-  import { useDesign } from '/@/hooks/web/useDesign';
+  import { basicProps } from "./props";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { cloneDeep } from "lodash-es";
 
   export default defineComponent({
-    name: 'BasicForm',
+    name: "BasicForm",
     components: { FormItem, Form, Row, FormAction },
     props: basicProps,
-    emits: ['advanced-change', 'reset', 'submit', 'register'],
+    emits: ["advanced-change", "reset", "submit", "register", "field-value-change"],
     setup(props, { emit, attrs }) {
       const formModel = reactive<Recordable>({});
       const modalFn = useModalContext();
@@ -84,7 +86,7 @@
       const schemaRef = ref<Nullable<FormSchema[]>>(null);
       const formElRef = ref<Nullable<FormActionType>>(null);
 
-      const { prefixCls } = useDesign('basic-form');
+      const { prefixCls } = useDesign("basic-form");
 
       // Get the basic configuration of the form
       const getProps = computed((): FormProps => {
@@ -122,7 +124,7 @@
             if (!Array.isArray(defaultValue)) {
               schema.defaultValue = dateUtil(defaultValue);
             } else {
-              const def: moment.Moment[] = [];
+              const def: any[] = [];
               defaultValue.forEach((item) => {
                 def.push(dateUtil(item));
               });
@@ -131,9 +133,11 @@
           }
         }
         if (unref(getProps).showAdvancedButton) {
-          return schemas.filter((schema) => schema.component !== 'Divider') as FormSchema[];
+          return cloneDeep(
+            schemas.filter((schema) => schema.component !== "Divider") as FormSchema[],
+          );
         } else {
-          return schemas as FormSchema[];
+          return cloneDeep(schemas as FormSchema[]);
         }
       });
 
@@ -225,6 +229,14 @@
         },
       );
 
+      watch(
+        () => formModel,
+        useDebounceFn(() => {
+          unref(getProps).submitOnChange && handleSubmit();
+        }, 300),
+        { deep: true },
+      );
+
       async function setProps(formProps: Partial<FormProps>): Promise<void> {
         propsRef.value = deepMerge(unref(propsRef) || {}, formProps);
       }
@@ -232,17 +244,18 @@
       function setFormModel(key: string, value: any) {
         formModel[key] = value;
         const { validateTrigger } = unref(getBindValue);
-        if (!validateTrigger || validateTrigger === 'change') {
+        if (!validateTrigger || validateTrigger === "change") {
           validateFields([key]).catch((_) => {});
         }
+        emit("field-value-change", key, value);
       }
 
       function handleEnterPress(e: KeyboardEvent) {
         const { autoSubmitOnEnter } = unref(getProps);
         if (!autoSubmitOnEnter) return;
-        if (e.key === 'Enter' && e.target && e.target instanceof HTMLElement) {
+        if (e.key === "Enter" && e.target && e.target instanceof HTMLElement) {
           const target: HTMLElement = e.target as HTMLElement;
-          if (target && target.tagName && target.tagName.toUpperCase() == 'INPUT') {
+          if (target && target.tagName && target.tagName.toUpperCase() == "INPUT") {
             handleSubmit();
           }
         }
@@ -266,7 +279,7 @@
 
       onMounted(() => {
         initDefault();
-        emit('register', formActionType);
+        emit("register", formActionType);
       });
 
       return {
@@ -292,7 +305,7 @@
   });
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-basic-form';
+  @prefix-cls: ~"@{namespace}-basic-form";
 
   .@{prefix-cls} {
     .ant-form-item {
diff --git a/src/components/Form/src/componentMap.ts b/src/components/Form/src/componentMap.ts
index 2f9003d56085cd64d792992a88e946b04aaada76..81d9110eb6e735365d289b66533cc639901918c0 100644
--- a/src/components/Form/src/componentMap.ts
+++ b/src/components/Form/src/componentMap.ts
@@ -1,5 +1,5 @@
-import type { Component } from 'vue';
-import type { ComponentType } from './types/index';
+import type { Component } from "vue";
+import type { ComponentType } from "./types/index";
 
 /**
  * Component list, register here to setting it in the form
@@ -19,54 +19,58 @@ import {
   Slider,
   Rate,
   Divider,
-} from 'ant-design-vue';
+} from "ant-design-vue";
 
-import ApiRadioGroup from './components/ApiRadioGroup.vue';
-import RadioButtonGroup from './components/RadioButtonGroup.vue';
-import ApiSelect from './components/ApiSelect.vue';
-import ApiTreeSelect from './components/ApiTreeSelect.vue';
-import ApiCascader from './components/ApiCascader.vue';
-import { BasicUpload } from '/@/components/Upload';
-import { StrengthMeter } from '/@/components/StrengthMeter';
-import { IconPicker } from '/@/components/Icon';
-import { CountdownInput } from '/@/components/CountDown';
+import ApiRadioGroup from "./components/ApiRadioGroup.vue";
+import RadioButtonGroup from "./components/RadioButtonGroup.vue";
+import ApiSelect from "./components/ApiSelect.vue";
+import ApiTree from "./components/ApiTree.vue";
+import ApiTreeSelect from "./components/ApiTreeSelect.vue";
+import ApiCascader from "./components/ApiCascader.vue";
+import ApiTransfer from "./components/ApiTransfer.vue";
+import { BasicUpload } from "/@/components/Upload";
+import { StrengthMeter } from "/@/components/StrengthMeter";
+import { IconPicker } from "/@/components/Icon";
+import { CountdownInput } from "/@/components/CountDown";
 
 const componentMap = new Map<ComponentType, Component>();
 
-componentMap.set('Input', Input);
-componentMap.set('InputGroup', Input.Group);
-componentMap.set('InputPassword', Input.Password);
-componentMap.set('InputSearch', Input.Search);
-componentMap.set('InputTextArea', Input.TextArea);
-componentMap.set('InputNumber', InputNumber);
-componentMap.set('AutoComplete', AutoComplete);
+componentMap.set("Input", Input);
+componentMap.set("InputGroup", Input.Group);
+componentMap.set("InputPassword", Input.Password);
+componentMap.set("InputSearch", Input.Search);
+componentMap.set("InputTextArea", Input.TextArea);
+componentMap.set("InputNumber", InputNumber);
+componentMap.set("AutoComplete", AutoComplete);
 
-componentMap.set('Select', Select);
-componentMap.set('ApiSelect', ApiSelect);
-componentMap.set('TreeSelect', TreeSelect);
-componentMap.set('ApiTreeSelect', ApiTreeSelect);
-componentMap.set('ApiRadioGroup', ApiRadioGroup);
-componentMap.set('Switch', Switch);
-componentMap.set('RadioButtonGroup', RadioButtonGroup);
-componentMap.set('RadioGroup', Radio.Group);
-componentMap.set('Checkbox', Checkbox);
-componentMap.set('CheckboxGroup', Checkbox.Group);
-componentMap.set('ApiCascader', ApiCascader);
-componentMap.set('Cascader', Cascader);
-componentMap.set('Slider', Slider);
-componentMap.set('Rate', Rate);
+componentMap.set("Select", Select);
+componentMap.set("ApiSelect", ApiSelect);
+componentMap.set("ApiTree", ApiTree);
+componentMap.set("TreeSelect", TreeSelect);
+componentMap.set("ApiTreeSelect", ApiTreeSelect);
+componentMap.set("ApiRadioGroup", ApiRadioGroup);
+componentMap.set("Switch", Switch);
+componentMap.set("RadioButtonGroup", RadioButtonGroup);
+componentMap.set("RadioGroup", Radio.Group);
+componentMap.set("Checkbox", Checkbox);
+componentMap.set("CheckboxGroup", Checkbox.Group);
+componentMap.set("ApiCascader", ApiCascader);
+componentMap.set("Cascader", Cascader);
+componentMap.set("Slider", Slider);
+componentMap.set("Rate", Rate);
+componentMap.set("ApiTransfer", ApiTransfer);
 
-componentMap.set('DatePicker', DatePicker);
-componentMap.set('MonthPicker', DatePicker.MonthPicker);
-componentMap.set('RangePicker', DatePicker.RangePicker);
-componentMap.set('WeekPicker', DatePicker.WeekPicker);
-componentMap.set('TimePicker', TimePicker);
-componentMap.set('StrengthMeter', StrengthMeter);
-componentMap.set('IconPicker', IconPicker);
-componentMap.set('InputCountDown', CountdownInput);
+componentMap.set("DatePicker", DatePicker);
+componentMap.set("MonthPicker", DatePicker.MonthPicker);
+componentMap.set("RangePicker", DatePicker.RangePicker);
+componentMap.set("WeekPicker", DatePicker.WeekPicker);
+componentMap.set("TimePicker", TimePicker);
+componentMap.set("StrengthMeter", StrengthMeter);
+componentMap.set("IconPicker", IconPicker);
+componentMap.set("InputCountDown", CountdownInput);
 
-componentMap.set('Upload', BasicUpload);
-componentMap.set('Divider', Divider);
+componentMap.set("Upload", BasicUpload);
+componentMap.set("Divider", Divider);
 
 export function add(compName: ComponentType, component: Component) {
   componentMap.set(compName, component);
diff --git a/src/components/Form/src/components/ApiCascader.vue b/src/components/Form/src/components/ApiCascader.vue
index 2bfd096a642aa5011fc2c756ca89662a9f000c3d..0bbecdc3b5364227cd2e0b76c7e1c87495f96fcc 100644
--- a/src/components/Form/src/components/ApiCascader.vue
+++ b/src/components/Form/src/components/ApiCascader.vue
@@ -13,20 +13,20 @@
     <template #notFoundContent v-if="loading">
       <span>
         <LoadingOutlined spin class="mr-1" />
-        {{ t('component.form.apiSelectNotFound') }}
+        {{ t("component.form.apiSelectNotFound") }}
       </span>
     </template>
   </a-cascader>
 </template>
 <script lang="ts">
-  import { defineComponent, PropType, ref, unref, watch, watchEffect } from 'vue';
-  import { Cascader } from 'ant-design-vue';
-  import { propTypes } from '/@/utils/propTypes';
-  import { isFunction } from '/@/utils/is';
-  import { get, omit } from 'lodash-es';
-  import { useRuleFormItem } from '/@/hooks/component/useFormItem';
-  import { LoadingOutlined } from '@ant-design/icons-vue';
-
+  import { defineComponent, PropType, ref, unref, watch, watchEffect } from "vue";
+  import { Cascader } from "ant-design-vue";
+  import { propTypes } from "/@/utils/propTypes";
+  import { isFunction } from "/@/utils/is";
+  import { get, omit } from "lodash-es";
+  import { useRuleFormItem } from "/@/hooks/component/useFormItem";
+  import { LoadingOutlined } from "@ant-design/icons-vue";
+  import { useI18n } from "/@/hooks/web/useI18n";
   interface Option {
     value: string;
     label: string;
@@ -35,7 +35,7 @@
     children?: Option[];
   }
   export default defineComponent({
-    name: 'ApiCascader',
+    name: "ApiCascader",
     components: {
       LoadingOutlined,
       [Cascader.name]: Cascader,
@@ -49,11 +49,11 @@
         default: null,
       },
       numberToString: propTypes.bool,
-      resultField: propTypes.string.def(''),
-      labelField: propTypes.string.def('label'),
-      valueField: propTypes.string.def('value'),
-      childrenField: propTypes.string.def('children'),
-      asyncFetchParamKey: propTypes.string.def('parentCode'),
+      resultField: propTypes.string.def(""),
+      labelField: propTypes.string.def("label"),
+      valueField: propTypes.string.def("value"),
+      childrenField: propTypes.string.def("children"),
+      asyncFetchParamKey: propTypes.string.def("parentCode"),
       immediate: propTypes.bool.def(true),
       // init fetch params
       initFetchParams: {
@@ -69,16 +69,16 @@
         type: Array,
       },
     },
-    emits: ['change', 'defaultChange'],
+    emits: ["change", "defaultChange"],
     setup(props, { emit }) {
       const apiData = ref<any[]>([]);
       const options = ref<Option[]>([]);
       const loading = ref<boolean>(false);
       const emitData = ref<any[]>([]);
       const isFirstLoad = ref(true);
-
+      const { t } = useI18n();
       // Embedded in the form, just use the hook binding to perform form verification
-      const [state] = useRuleFormItem(props, 'value', 'change', emitData);
+      const [state] = useRuleFormItem(props, "value", "change", emitData);
 
       watch(
         apiData,
@@ -98,7 +98,7 @@
               ...omit(next, [labelField, valueField]),
               label: next[labelField],
               value: numberToString ? `${value}` : value,
-              isLeaf: isLeaf && typeof isLeaf === 'function' ? isLeaf(next) : false,
+              isLeaf: isLeaf && typeof isLeaf === "function" ? isLeaf(next) : false,
             };
             const children = Reflect.get(next, childrenField);
             if (children) {
@@ -139,7 +139,7 @@
         if (!api || !isFunction(api)) return;
         try {
           const res = await api({
-            [props.asyncFetchParamKey]: Reflect.get(targetOption, 'value'),
+            [props.asyncFetchParamKey]: Reflect.get(targetOption, "value"),
           });
           if (Array.isArray(res)) {
             const children = generatorOptions(res);
@@ -171,23 +171,24 @@
 
       function handleChange(keys, args) {
         emitData.value = keys;
-        emit('defaultChange', keys, args);
+        emit("defaultChange", keys, args);
       }
 
       function handleRenderDisplay({ labels, selectedOptions }) {
         if (unref(emitData).length === selectedOptions.length) {
-          return labels.join(' / ');
+          return labels.join(" / ");
         }
         if (props.displayRenderArray) {
-          return props.displayRenderArray.join(' / ');
+          return props.displayRenderArray.join(" / ");
         }
-        return '';
+        return "";
       }
 
       return {
         state,
         options,
         loading,
+        t,
         handleChange,
         loadData,
         handleRenderDisplay,
diff --git a/src/components/Form/src/components/ApiRadioGroup.vue b/src/components/Form/src/components/ApiRadioGroup.vue
index 712cfba816d25cf2a9ab9545aa19e73dddade213..89f3d3e413f7df8d3fda218f90aaa92c2b4de465 100644
--- a/src/components/Form/src/components/ApiRadioGroup.vue
+++ b/src/components/Form/src/components/ApiRadioGroup.vue
@@ -14,18 +14,18 @@
   </RadioGroup>
 </template>
 <script lang="ts">
-  import { defineComponent, PropType, ref, watchEffect, computed, unref, watch } from 'vue';
-  import { Radio } from 'ant-design-vue';
-  import { isFunction } from '/@/utils/is';
-  import { useRuleFormItem } from '/@/hooks/component/useFormItem';
-  import { useAttrs } from '/@/hooks/core/useAttrs';
-  import { propTypes } from '/@/utils/propTypes';
-  import { get, omit } from 'lodash-es';
-  import { useI18n } from '/@/hooks/web/useI18n';
+  import { defineComponent, PropType, ref, watchEffect, computed, unref, watch } from "vue";
+  import { Radio } from "ant-design-vue";
+  import { isFunction } from "/@/utils/is";
+  import { useRuleFormItem } from "/@/hooks/component/useFormItem";
+  import { useAttrs } from "/@/hooks/core/useAttrs";
+  import { propTypes } from "/@/utils/propTypes";
+  import { get, omit } from "lodash-es";
+  import { useI18n } from "/@/hooks/web/useI18n";
   type OptionsItem = { label: string; value: string | number | boolean; disabled?: boolean };
 
   export default defineComponent({
-    name: 'ApiRadioGroup',
+    name: "ApiRadioGroup",
     components: {
       RadioGroup: Radio.Group,
       RadioButton: Radio.Button,
@@ -48,12 +48,12 @@
         default: false,
       },
       numberToString: propTypes.bool,
-      resultField: propTypes.string.def(''),
-      labelField: propTypes.string.def('label'),
-      valueField: propTypes.string.def('value'),
+      resultField: propTypes.string.def(""),
+      labelField: propTypes.string.def("label"),
+      valueField: propTypes.string.def("value"),
       immediate: propTypes.bool.def(true),
     },
-    emits: ['options-change', 'change'],
+    emits: ["options-change", "change"],
     setup(props, { emit }) {
       const options = ref<OptionsItem[]>([]);
       const loading = ref(false);
@@ -117,7 +117,7 @@
       }
 
       function emitChange() {
-        emit('options-change', unref(getOptions));
+        emit("options-change", unref(getOptions));
       }
 
       function handleChange(_, ...args) {
diff --git a/src/components/Form/src/components/ApiSelect.vue b/src/components/Form/src/components/ApiSelect.vue
index 7b6bad16ab2135550991bc2c55faef598b240a1a..1dea812614de06bb4ac4377ae8a28f35ca2fa294 100644
--- a/src/components/Form/src/components/ApiSelect.vue
+++ b/src/components/Form/src/components/ApiSelect.vue
@@ -1,6 +1,6 @@
 <template>
   <Select
-    @dropdownVisibleChange="handleFetch"
+    @dropdown-visible-change="handleFetch"
     v-bind="$attrs"
     @change="handleChange"
     :options="getOptions"
@@ -15,26 +15,26 @@
     <template #notFoundContent v-if="loading">
       <span>
         <LoadingOutlined spin class="mr-1" />
-        {{ t('component.form.apiSelectNotFound') }}
+        {{ t("component.form.apiSelectNotFound") }}
       </span>
     </template>
   </Select>
 </template>
 <script lang="ts">
-  import { defineComponent, PropType, ref, watchEffect, computed, unref, watch } from 'vue';
-  import { Select } from 'ant-design-vue';
-  import { isFunction } from '/@/utils/is';
-  import { useRuleFormItem } from '/@/hooks/component/useFormItem';
-  import { useAttrs } from '/@/hooks/core/useAttrs';
-  import { get, omit } from 'lodash-es';
-  import { LoadingOutlined } from '@ant-design/icons-vue';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { propTypes } from '/@/utils/propTypes';
+  import { defineComponent, PropType, ref, watchEffect, computed, unref, watch } from "vue";
+  import { Select } from "ant-design-vue";
+  import { isFunction } from "/@/utils/is";
+  import { useRuleFormItem } from "/@/hooks/component/useFormItem";
+  import { useAttrs } from "/@/hooks/core/useAttrs";
+  import { get, omit } from "lodash-es";
+  import { LoadingOutlined } from "@ant-design/icons-vue";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { propTypes } from "/@/utils/propTypes";
 
   type OptionsItem = { label: string; value: string; disabled?: boolean };
 
   export default defineComponent({
-    name: 'ApiSelect',
+    name: "ApiSelect",
     components: {
       Select,
       LoadingOutlined,
@@ -53,12 +53,13 @@
         default: () => ({}),
       },
       // support xxx.xxx.xx
-      resultField: propTypes.string.def(''),
-      labelField: propTypes.string.def('label'),
-      valueField: propTypes.string.def('value'),
+      resultField: propTypes.string.def(""),
+      labelField: propTypes.string.def("label"),
+      valueField: propTypes.string.def("value"),
       immediate: propTypes.bool.def(true),
+      alwaysLoad: propTypes.bool.def(false),
     },
-    emits: ['options-change', 'change'],
+    emits: ["options-change", "change"],
     setup(props, { emit }) {
       const options = ref<OptionsItem[]>([]);
       const loading = ref(false);
@@ -68,7 +69,7 @@
       const { t } = useI18n();
 
       // Embedded in the form, just use the hook binding to perform form verification
-      const [state] = useRuleFormItem(props, 'value', 'change', emitData);
+      const [state] = useRuleFormItem(props, "value", "change", emitData);
 
       const getOptions = computed(() => {
         const { labelField, valueField, numberToString } = props;
@@ -87,7 +88,7 @@
       });
 
       watchEffect(() => {
-        props.immediate && fetch();
+        props.immediate && !props.alwaysLoad && fetch();
       });
 
       watch(
@@ -121,15 +122,19 @@
         }
       }
 
-      async function handleFetch() {
-        if (!props.immediate && unref(isFirstLoad)) {
-          await fetch();
-          isFirstLoad.value = false;
+      async function handleFetch(visible) {
+        if (visible) {
+          if (props.alwaysLoad) {
+            await fetch();
+          } else if (!props.immediate && unref(isFirstLoad)) {
+            await fetch();
+            isFirstLoad.value = false;
+          }
         }
       }
 
       function emitChange() {
-        emit('options-change', unref(getOptions));
+        emit("options-change", unref(getOptions));
       }
 
       function handleChange(_, ...args) {
diff --git a/src/components/Form/src/components/ApiTransfer.vue b/src/components/Form/src/components/ApiTransfer.vue
new file mode 100644
index 0000000000000000000000000000000000000000..75f552e926b02f3c8faaa060ae8fc32f977b736e
--- /dev/null
+++ b/src/components/Form/src/components/ApiTransfer.vue
@@ -0,0 +1,135 @@
+<template>
+  <Transfer
+    :data-source="getdataSource"
+    show-search
+    :filter-option="filterOption"
+    :render="(item) => item.title"
+    :showSelectAll="showSelectAll"
+    :selectedKeys="selectedKeys"
+    :targetKeys="getTargetKeys"
+    :showSearch="showSearch"
+    @change="handleChange"
+  />
+</template>
+
+<script lang="ts">
+  import { computed, defineComponent, watch, ref, unref, watchEffect } from "vue";
+  import { Transfer } from "ant-design-vue";
+  import { isFunction } from "/@/utils/is";
+  import { get, omit } from "lodash-es";
+  import { propTypes } from "/@/utils/propTypes";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { TransferDirection, TransferItem } from "ant-design-vue/lib/transfer";
+  export default defineComponent({
+    name: "ApiTransfer",
+    components: { Transfer },
+    props: {
+      value: { type: Array<string> },
+      api: {
+        type: Function as PropType<(arg?: Recordable) => Promise<TransferItem[]>>,
+        default: null,
+      },
+      params: { type: Object },
+      dataSource: { type: Array<TransferItem> },
+      immediate: propTypes.bool.def(true),
+      alwaysLoad: propTypes.bool.def(false),
+      afterFetch: { type: Function as PropType<Fn> },
+      resultField: propTypes.string.def(""),
+      labelField: propTypes.string.def("title"),
+      valueField: propTypes.string.def("key"),
+      showSearch: { type: Boolean, default: false },
+      disabled: { type: Boolean, default: false },
+      filterOption: {
+        type: Function as PropType<(inputValue: string, item: TransferItem) => boolean>,
+      },
+      selectedKeys: { type: Array<string> },
+      showSelectAll: { type: Boolean, default: false },
+      targetKeys: { type: Array<string> },
+    },
+    emits: ["options-change", "change"],
+    setup(props, { attrs, emit }) {
+      const _dataSource = ref<TransferItem[]>([]);
+      const _targetKeys = ref<string[]>([]);
+      const { t } = useI18n();
+
+      const getAttrs = computed(() => {
+        return {
+          ...(!props.api ? { dataSource: unref(_dataSource) } : {}),
+          ...attrs,
+        };
+      });
+      const getdataSource = computed(() => {
+        const { labelField, valueField } = props;
+
+        return unref(_dataSource).reduce((prev, next: Recordable) => {
+          if (next) {
+            prev.push({
+              ...omit(next, [labelField, valueField]),
+              title: next[labelField],
+              key: next[valueField],
+            });
+          }
+          return prev;
+        }, [] as TransferItem[]);
+      });
+      const getTargetKeys = computed<string[]>(() => {
+        if (unref(_targetKeys).length > 0) {
+          return unref(_targetKeys);
+        }
+        if (Array.isArray(props.value)) {
+          return props.value;
+        }
+        return [];
+      });
+
+      function handleChange(keys: string[], direction: TransferDirection, moveKeys: string[]) {
+        _targetKeys.value = keys;
+        console.log(direction);
+        console.log(moveKeys);
+        emit("change", keys);
+      }
+
+      watchEffect(() => {
+        props.immediate && !props.alwaysLoad && fetch();
+      });
+
+      watch(
+        () => props.params,
+        () => {
+          fetch();
+        },
+        { deep: true },
+      );
+
+      async function fetch() {
+        const api = props.api;
+        if (!api || !isFunction(api)) {
+          if (Array.isArray(props.dataSource)) {
+            _dataSource.value = props.dataSource;
+          }
+          return;
+        }
+        _dataSource.value = [];
+        try {
+          const res = await api(props.params);
+          if (Array.isArray(res)) {
+            _dataSource.value = res;
+            emitChange();
+            return;
+          }
+          if (props.resultField) {
+            _dataSource.value = get(res, props.resultField) || [];
+          }
+          emitChange();
+        } catch (error) {
+          console.warn(error);
+        } finally {
+        }
+      }
+      function emitChange() {
+        emit("options-change", unref(getdataSource));
+      }
+      return { getTargetKeys, getdataSource, t, getAttrs, handleChange };
+    },
+  });
+</script>
diff --git a/src/components/Form/src/components/ApiTree.vue b/src/components/Form/src/components/ApiTree.vue
new file mode 100644
index 0000000000000000000000000000000000000000..0335a685c247db5618cc55de71c89fc671a34aa0
--- /dev/null
+++ b/src/components/Form/src/components/ApiTree.vue
@@ -0,0 +1,90 @@
+<template>
+  <a-tree v-bind="getAttrs" @change="handleChange">
+    <template #[item]="data" v-for="item in Object.keys($slots)">
+      <slot :name="item" v-bind="data || {}"></slot>
+    </template>
+    <template #suffixIcon v-if="loading">
+      <LoadingOutlined spin />
+    </template>
+  </a-tree>
+</template>
+
+<script lang="ts">
+  import { computed, defineComponent, watch, ref, onMounted, unref } from "vue";
+  import { Tree } from "ant-design-vue";
+  import { isArray, isFunction } from "/@/utils/is";
+  import { get } from "lodash-es";
+  import { propTypes } from "/@/utils/propTypes";
+  import { LoadingOutlined } from "@ant-design/icons-vue";
+  export default defineComponent({
+    name: "ApiTree",
+    components: { ATree: Tree, LoadingOutlined },
+    props: {
+      api: { type: Function as PropType<(arg?: Recordable) => Promise<Recordable>> },
+      params: { type: Object },
+      immediate: { type: Boolean, default: true },
+      resultField: propTypes.string.def(""),
+      afterFetch: { type: Function as PropType<Fn> },
+    },
+    emits: ["options-change", "change"],
+    setup(props, { attrs, emit }) {
+      const treeData = ref<Recordable[]>([]);
+      const isFirstLoaded = ref<Boolean>(false);
+      const loading = ref(false);
+      const getAttrs = computed(() => {
+        return {
+          ...(props.api ? { treeData: unref(treeData) } : {}),
+          ...attrs,
+        };
+      });
+
+      function handleChange(...args) {
+        emit("change", ...args);
+      }
+
+      watch(
+        () => props.params,
+        () => {
+          !unref(isFirstLoaded) && fetch();
+        },
+        { deep: true },
+      );
+
+      watch(
+        () => props.immediate,
+        (v) => {
+          v && !isFirstLoaded.value && fetch();
+        },
+      );
+
+      onMounted(() => {
+        props.immediate && fetch();
+      });
+
+      async function fetch() {
+        const { api, afterFetch } = props;
+        if (!api || !isFunction(api)) return;
+        loading.value = true;
+        treeData.value = [];
+        let result;
+        try {
+          result = await api(props.params);
+        } catch (e) {
+          console.error(e);
+        }
+        if (afterFetch && isFunction(afterFetch)) {
+          result = afterFetch(result);
+        }
+        loading.value = false;
+        if (!result) return;
+        if (!isArray(result)) {
+          result = get(result, props.resultField);
+        }
+        treeData.value = (result as Recordable[]) || [];
+        isFirstLoaded.value = true;
+        emit("options-change", treeData.value);
+      }
+      return { getAttrs, loading, handleChange };
+    },
+  });
+</script>
diff --git a/src/components/Form/src/components/ApiTreeSelect.vue b/src/components/Form/src/components/ApiTreeSelect.vue
index 3f073d34ba22aeac4d413dab249373fad85d727f..d10acc35d4bb8515a8a10dfda19688a4111f95b4 100644
--- a/src/components/Form/src/components/ApiTreeSelect.vue
+++ b/src/components/Form/src/components/ApiTreeSelect.vue
@@ -10,22 +10,22 @@
 </template>
 
 <script lang="ts">
-  import { computed, defineComponent, watch, ref, onMounted, unref } from 'vue';
-  import { TreeSelect } from 'ant-design-vue';
-  import { isArray, isFunction } from '/@/utils/is';
-  import { get } from 'lodash-es';
-  import { propTypes } from '/@/utils/propTypes';
-  import { LoadingOutlined } from '@ant-design/icons-vue';
+  import { computed, defineComponent, watch, ref, onMounted, unref } from "vue";
+  import { TreeSelect } from "ant-design-vue";
+  import { isArray, isFunction } from "/@/utils/is";
+  import { get } from "lodash-es";
+  import { propTypes } from "/@/utils/propTypes";
+  import { LoadingOutlined } from "@ant-design/icons-vue";
   export default defineComponent({
-    name: 'ApiTreeSelect',
+    name: "ApiTreeSelect",
     components: { ATreeSelect: TreeSelect, LoadingOutlined },
     props: {
       api: { type: Function as PropType<(arg?: Recordable) => Promise<Recordable>> },
       params: { type: Object },
       immediate: { type: Boolean, default: true },
-      resultField: propTypes.string.def(''),
+      resultField: propTypes.string.def(""),
     },
-    emits: ['options-change', 'change'],
+    emits: ["options-change", "change"],
     setup(props, { attrs, emit }) {
       const treeData = ref<Recordable[]>([]);
       const isFirstLoaded = ref<Boolean>(false);
@@ -38,7 +38,7 @@
       });
 
       function handleChange(...args) {
-        emit('change', ...args);
+        emit("change", ...args);
       }
 
       watch(
@@ -78,7 +78,7 @@
         }
         treeData.value = (result as Recordable[]) || [];
         isFirstLoaded.value = true;
-        emit('options-change', treeData.value);
+        emit("options-change", treeData.value);
       }
       return { getAttrs, loading, handleChange };
     },
diff --git a/src/components/Form/src/components/FormAction.vue b/src/components/Form/src/components/FormAction.vue
index 8dec49fe5bdbf3163b7c6e5fdd1a9554323b4b4d..6cf23b0f1f6dc290c53c0eec759be78469c8b61d 100644
--- a/src/components/Form/src/components/FormAction.vue
+++ b/src/components/Form/src/components/FormAction.vue
@@ -31,7 +31,7 @@
           @click="toggleAdvanced"
           v-if="showAdvancedButton && !hideAdvanceBtn"
         >
-          {{ isAdvanced ? t('component.form.putAway') : t('component.form.unfold') }}
+          {{ isAdvanced ? t("component.form.putAway") : t("component.form.unfold") }}
           <BasicArrow class="ml-1" :expand="!isAdvanced" up />
         </Button>
         <slot name="advanceAfter"></slot>
@@ -40,20 +40,20 @@
   </a-col>
 </template>
 <script lang="ts">
-  import type { ColEx } from '../types/index';
+  import type { ColEx } from "../types/index";
   //import type { ButtonProps } from 'ant-design-vue/es/button/buttonTypes';
-  import { defineComponent, computed, PropType } from 'vue';
-  import { Form, Col } from 'ant-design-vue';
-  import { Button, ButtonProps } from '/@/components/Button';
-  import { BasicArrow } from '/@/components/Basic';
-  import { useFormContext } from '../hooks/useFormContext';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { propTypes } from '/@/utils/propTypes';
+  import { defineComponent, computed, PropType } from "vue";
+  import { Form, Col } from "ant-design-vue";
+  import { Button, ButtonProps } from "/@/components/Button";
+  import { BasicArrow } from "/@/components/Basic";
+  import { useFormContext } from "../hooks/useFormContext";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { propTypes } from "/@/utils/propTypes";
 
   type ButtonOptions = Partial<ButtonProps> & { text: string };
 
   export default defineComponent({
-    name: 'BasicFormAction',
+    name: "BasicFormAction",
     components: {
       FormItem: Form.Item,
       Button,
@@ -81,7 +81,7 @@
       isAdvanced: propTypes.bool,
       hideAdvanceBtn: propTypes.bool,
     },
-    emits: ['toggle-advanced'],
+    emits: ["toggle-advanced"],
     setup(props, { emit }) {
       const { t } = useI18n();
 
@@ -92,7 +92,7 @@
           ? { span: actionSpan < 6 ? 24 : actionSpan }
           : {};
         const actionColOpt: Partial<ColEx> = {
-          style: { textAlign: 'right' },
+          style: { textAlign: "right" },
           span: showAdvancedButton ? 6 : 4,
           ...advancedSpanObj,
           ...actionColOptions,
@@ -103,7 +103,7 @@
       const getResetBtnOptions = computed((): ButtonOptions => {
         return Object.assign(
           {
-            text: t('common.resetText'),
+            text: t("common.resetText"),
           },
           props.resetButtonOptions,
         );
@@ -112,14 +112,14 @@
       const getSubmitBtnOptions = computed(() => {
         return Object.assign(
           {
-            text: t('common.queryText'),
+            text: t("common.queryText"),
           },
           props.submitButtonOptions,
         );
       });
 
       function toggleAdvanced() {
-        emit('toggle-advanced');
+        emit("toggle-advanced");
       }
 
       return {
diff --git a/src/components/Form/src/components/FormItem.vue b/src/components/Form/src/components/FormItem.vue
index e34e4b333a3b474fd48c7aee7df3344e6fac128d..3e7372c0fb9a34c5095b0dd693393d35a09a36f7 100644
--- a/src/components/Form/src/components/FormItem.vue
+++ b/src/components/Form/src/components/FormItem.vue
@@ -1,22 +1,21 @@
 <script lang="tsx">
-  import type { PropType, Ref } from 'vue';
-  import type { FormActionType, FormProps } from '../types/form';
-  import type { FormSchema } from '../types/form';
-  import type { ValidationRule } from 'ant-design-vue/lib/form/Form';
-  import type { TableActionType } from '/@/components/Table';
-  import { defineComponent, computed, unref, toRefs } from 'vue';
-  import { Form, Col, Divider } from 'ant-design-vue';
-  import { componentMap } from '../componentMap';
-  import { BasicHelp } from '/@/components/Basic';
-  import { isBoolean, isFunction, isNull } from '/@/utils/is';
-  import { getSlot } from '/@/utils/helper/tsxHelper';
-  import { createPlaceholderMessage, setComponentRuleType } from '../helper';
-  import { upperFirst, cloneDeep } from 'lodash-es';
-  import { useItemLabelWidth } from '../hooks/useLabelWidth';
-  import { useI18n } from '/@/hooks/web/useI18n';
+  import type { PropType, Ref } from "vue";
+  import { computed, defineComponent, toRefs, unref } from "vue";
+  import type { FormActionType, FormProps, FormSchema } from "../types/form";
+  import type { ValidationRule } from "ant-design-vue/lib/form/Form";
+  import type { TableActionType } from "/@/components/Table";
+  import { Col, Divider, Form } from "ant-design-vue";
+  import { componentMap } from "../componentMap";
+  import { BasicHelp } from "/@/components/Basic";
+  import { isBoolean, isFunction, isNull } from "/@/utils/is";
+  import { getSlot } from "/@/utils/helper/tsxHelper";
+  import { createPlaceholderMessage, setComponentRuleType } from "../helper";
+  import { cloneDeep, upperFirst } from "lodash-es";
+  import { useItemLabelWidth } from "../hooks/useLabelWidth";
+  import { useI18n } from "/@/hooks/web/useI18n";
 
   export default defineComponent({
-    name: 'BasicFormItem',
+    name: "BasicFormItem",
     inheritAttrs: false,
     props: {
       schema: {
@@ -77,9 +76,9 @@
         if (isFunction(componentProps)) {
           componentProps = componentProps({ schema, tableAction, formModel, formActionType }) ?? {};
         }
-        if (schema.component === 'Divider') {
-          componentProps = Object.assign({ type: 'horizontal' }, componentProps, {
-            orientation: 'left',
+        if (schema.component === "Divider") {
+          componentProps = Object.assign({ type: "horizontal" }, componentProps, {
+            orientation: "left",
             plain: true,
           });
         }
@@ -145,10 +144,10 @@
         let rules: ValidationRule[] = cloneDeep(defRules) as ValidationRule[];
         const { rulesMessageJoinLabel: globalRulesMessageJoinLabel } = props.formProps;
 
-        const joinLabel = Reflect.has(props.schema, 'rulesMessageJoinLabel')
+        const joinLabel = Reflect.has(props.schema, "rulesMessageJoinLabel")
           ? rulesMessageJoinLabel
           : globalRulesMessageJoinLabel;
-        const defaultMsg = createPlaceholderMessage(component) + `${joinLabel ? label : ''}`;
+        const defaultMsg = createPlaceholderMessage(component) + `${joinLabel ? label : ""}`;
 
         function validator(rule: any, value: any) {
           const msg = rule.message || defaultMsg;
@@ -158,13 +157,13 @@
           } else if (Array.isArray(value) && value.length === 0) {
             // 数组类型
             return Promise.reject(msg);
-          } else if (typeof value === 'string' && value.trim() === '') {
+          } else if (typeof value === "string" && value.trim() === "") {
             // 空字符串
             return Promise.reject(msg);
           } else if (
-            typeof value === 'object' &&
-            Reflect.has(value, 'checked') &&
-            Reflect.has(value, 'halfChecked') &&
+            typeof value === "object" &&
+            Reflect.has(value, "checked") &&
+            Reflect.has(value, "halfChecked") &&
             Array.isArray(value.checked) &&
             Array.isArray(value.halfChecked) &&
             value.checked.length === 0 &&
@@ -178,12 +177,25 @@
 
         const getRequired = isFunction(required) ? required(unref(getValues)) : required;
 
-        if ((!rules || rules.length === 0) && getRequired) {
-          rules = [{ required: getRequired, validator }];
+        /*
+         * 1、若设置了required属性,又没有其他的rules,就创建一个验证规则;
+         * 2、若设置了required属性,又存在其他的rules,则只rules中不存在required属性时,才添加验证required的规则
+         *     也就是说rules中的required,优先级大于required
+         */
+        if (getRequired) {
+          if (!rules || rules.length === 0) {
+            rules = [{ required: getRequired, validator }];
+          } else {
+            const requiredIndex: number = rules.findIndex((rule) => Reflect.has(rule, "required"));
+
+            if (requiredIndex === -1) {
+              rules.push({ required: getRequired, validator });
+            }
+          }
         }
 
         const requiredRuleIndex: number = rules.findIndex(
-          (rule) => Reflect.has(rule, 'required') && !Reflect.has(rule, 'validator'),
+          (rule) => Reflect.has(rule, "required") && !Reflect.has(rule, "validator"),
         );
 
         if (requiredRuleIndex !== -1) {
@@ -193,13 +205,13 @@
             rule.required = false;
           }
           if (component) {
-            if (!Reflect.has(rule, 'type')) {
-              rule.type = component === 'InputNumber' ? 'number' : 'string';
+            if (!Reflect.has(rule, "type")) {
+              rule.type = component === "InputNumber" ? "number" : "string";
             }
 
             rule.message = rule.message || defaultMsg;
 
-            if (component.includes('Input') || component.includes('Textarea')) {
+            if (component.includes("Input") || component.includes("Textarea")) {
               rule.whitespace = true;
             }
             const valueFormat = unref(getComponentsProps)?.valueFormat;
@@ -212,7 +224,7 @@
         if (characterInx !== -1 && !rules[characterInx].validator) {
           rules[characterInx].message =
             rules[characterInx].message ||
-            t('component.form.maxTip', [rules[characterInx].max] as Recordable);
+            t("component.form.maxTip", [rules[characterInx].max] as Recordable);
         }
         return rules;
       }
@@ -222,11 +234,11 @@
           renderComponentContent,
           component,
           field,
-          changeEvent = 'change',
+          changeEvent = "change",
           valueField,
         } = props.schema;
 
-        const isCheck = component && ['Switch', 'Checkbox'].includes(component);
+        const isCheck = component && ["Switch", "Checkbox"].includes(component);
 
         const eventKey = `on${upperFirst(changeEvent)}`;
 
@@ -254,7 +266,7 @@
 
         const isCreatePlaceholder = !propsData.disabled && autoSetPlaceHolder;
         // RangePicker place is an array
-        if (isCreatePlaceholder && component !== 'RangePicker' && component) {
+        if (isCreatePlaceholder && component !== "RangePicker" && component) {
           propsData.placeholder =
             unref(getComponentsProps)?.placeholder || createPlaceholderMessage(component);
         }
@@ -262,7 +274,7 @@
         propsData.formValues = unref(getValues);
 
         const bindValue: Recordable = {
-          [valueField || (isCheck ? 'checked' : 'value')]: props.formModel[field],
+          [valueField || (isCheck ? "checked" : "value")]: props.formModel[field],
         };
 
         const compAttr: Recordable = {
@@ -310,7 +322,7 @@
         const { labelCol, wrapperCol } = unref(itemLabelWidthProp);
         const { colon } = props.formProps;
 
-        if (component === 'Divider') {
+        if (component === "Divider") {
           return (
             <Col span={24}>
               <Divider {...unref(getComponentsProps)}>{renderLabelHelpMessage()}</Divider>
@@ -332,7 +344,7 @@
             <Form.Item
               name={field}
               colon={colon}
-              class={{ 'suffix-item': showSuffix }}
+              class={{ "suffix-item": showSuffix }}
               {...(itemProps as Recordable)}
               label={renderLabelHelpMessage()}
               rules={handleRules()}
diff --git a/src/components/Form/src/components/RadioButtonGroup.vue b/src/components/Form/src/components/RadioButtonGroup.vue
index c2c7b220bc08cab1701d9a1f517562beb884489e..94bc72df174464c2fcc628a3715eca4037bd4db5 100644
--- a/src/components/Form/src/components/RadioButtonGroup.vue
+++ b/src/components/Form/src/components/RadioButtonGroup.vue
@@ -11,17 +11,17 @@
   </RadioGroup>
 </template>
 <script lang="ts">
-  import { defineComponent, PropType, computed } from 'vue';
-  import { Radio } from 'ant-design-vue';
-  import { isString } from '/@/utils/is';
-  import { useRuleFormItem } from '/@/hooks/component/useFormItem';
-  import { useAttrs } from '/@/hooks/core/useAttrs';
+  import { defineComponent, PropType, computed } from "vue";
+  import { Radio } from "ant-design-vue";
+  import { isString } from "/@/utils/is";
+  import { useRuleFormItem } from "/@/hooks/component/useFormItem";
+  import { useAttrs } from "/@/hooks/core/useAttrs";
 
   type OptionsItem = { label: string; value: string | number | boolean; disabled?: boolean };
   type RadioItem = string | OptionsItem;
 
   export default defineComponent({
-    name: 'RadioButtonGroup',
+    name: "RadioButtonGroup",
     components: {
       RadioGroup: Radio.Group,
       RadioButton: Radio.Button,
diff --git a/src/components/Form/src/helper.ts b/src/components/Form/src/helper.ts
index 5a4595ac314a1d4be773d9cf2a746ef06fa21948..8ab0ddc6e06c7ae743401f8a9e8a6df7183543f6 100644
--- a/src/components/Form/src/helper.ts
+++ b/src/components/Form/src/helper.ts
@@ -1,8 +1,8 @@
-import type { ValidationRule } from 'ant-design-vue/lib/form/Form';
-import type { ComponentType } from './types/index';
-import { useI18n } from '/@/hooks/web/useI18n';
-import { dateUtil } from '/@/utils/dateUtil';
-import { isNumber, isObject } from '/@/utils/is';
+import type { ValidationRule } from "ant-design-vue/lib/form/Form";
+import type { ComponentType } from "./types/index";
+import { useI18n } from "/@/hooks/web/useI18n";
+import { dateUtil } from "/@/utils/dateUtil";
+import { isNumber, isObject } from "/@/utils/is";
 
 const { t } = useI18n();
 
@@ -10,29 +10,29 @@ const { t } = useI18n();
  * @description: 生成placeholder
  */
 export function createPlaceholderMessage(component: ComponentType) {
-  if (component.includes('Input') || component.includes('Complete')) {
-    return t('common.inputText');
+  if (component.includes("Input") || component.includes("Complete")) {
+    return t("common.inputText");
   }
-  if (component.includes('Picker')) {
-    return t('common.chooseText');
+  if (component.includes("Picker")) {
+    return t("common.chooseText");
   }
   if (
-    component.includes('Select') ||
-    component.includes('Cascader') ||
-    component.includes('Checkbox') ||
-    component.includes('Radio') ||
-    component.includes('Switch')
+    component.includes("Select") ||
+    component.includes("Cascader") ||
+    component.includes("Checkbox") ||
+    component.includes("Radio") ||
+    component.includes("Switch")
   ) {
     // return `请选择${label}`;
-    return t('common.chooseText');
+    return t("common.chooseText");
   }
-  return '';
+  return "";
 }
 
-const DATE_TYPE = ['DatePicker', 'MonthPicker', 'WeekPicker', 'TimePicker'];
+const DATE_TYPE = ["DatePicker", "MonthPicker", "WeekPicker", "TimePicker"];
 
 function genType() {
-  return [...DATE_TYPE, 'RangePicker'];
+  return [...DATE_TYPE, "RangePicker"];
 }
 
 export function setComponentRuleType(
@@ -40,12 +40,12 @@ export function setComponentRuleType(
   component: ComponentType,
   valueFormat: string,
 ) {
-  if (['DatePicker', 'MonthPicker', 'WeekPicker', 'TimePicker'].includes(component)) {
-    rule.type = valueFormat ? 'string' : 'object';
-  } else if (['RangePicker', 'Upload', 'CheckboxGroup', 'TimePicker'].includes(component)) {
-    rule.type = 'array';
-  } else if (['InputNumber'].includes(component)) {
-    rule.type = 'number';
+  if (["DatePicker", "MonthPicker", "WeekPicker", "TimePicker"].includes(component)) {
+    rule.type = valueFormat ? "string" : "object";
+  } else if (["RangePicker", "Upload", "CheckboxGroup", "TimePicker"].includes(component)) {
+    rule.type = "array";
+  } else if (["InputNumber"].includes(component)) {
+    rule.type = "number";
   }
 }
 
@@ -60,7 +60,7 @@ export function processDateValue(attr: Recordable, component: string) {
 
 export function handleInputNumberValue(component?: ComponentType, val?: any) {
   if (!component) return val;
-  if (['Input', 'InputPassword', 'InputSearch', 'InputTextArea'].includes(component)) {
+  if (["Input", "InputPassword", "InputSearch", "InputTextArea"].includes(component)) {
     return val && isNumber(val) ? `${val}` : val;
   }
   return val;
@@ -70,3 +70,5 @@ export function handleInputNumberValue(component?: ComponentType, val?: any) {
  * 时间字段
  */
 export const dateItemType = genType();
+
+export const defaultValueComponents = ["Input", "InputPassword", "InputSearch", "InputTextArea"];
diff --git a/src/components/Form/src/hooks/useAdvanced.ts b/src/components/Form/src/hooks/useAdvanced.ts
index 5c9603fb2c4bc11c1c4949de1e26d49e737be935..f8bfa6bd23a6dba9fc019c0f58e39c4449936116 100644
--- a/src/components/Form/src/hooks/useAdvanced.ts
+++ b/src/components/Form/src/hooks/useAdvanced.ts
@@ -1,11 +1,11 @@
-import type { ColEx } from '../types';
-import type { AdvanceState } from '../types/hooks';
-import type { ComputedRef, Ref } from 'vue';
-import type { FormProps, FormSchema } from '../types/form';
-import { computed, unref, watch } from 'vue';
-import { isBoolean, isFunction, isNumber, isObject } from '/@/utils/is';
-import { useBreakpoint } from '/@/hooks/event/useBreakpoint';
-import { useDebounceFn } from '@vueuse/core';
+import type { ColEx } from "../types";
+import type { AdvanceState } from "../types/hooks";
+import { ComputedRef, getCurrentInstance, Ref } from "vue";
+import type { FormProps, FormSchema } from "../types/form";
+import { computed, unref, watch } from "vue";
+import { isBoolean, isFunction, isNumber, isObject } from "/@/utils/is";
+import { useBreakpoint } from "/@/hooks/event/useBreakpoint";
+import { useDebounceFn } from "@vueuse/core";
 
 const BASIC_COL_LEN = 24;
 
@@ -26,6 +26,8 @@ export default function ({
   formModel,
   defaultValueRef,
 }: UseAdvancedContext) {
+  const vm = getCurrentInstance();
+
   const { realWidthRef, screenEnum, screenRef } = useBreakpoint();
 
   const getEmptySpan = computed((): number => {
@@ -150,11 +152,14 @@ export default function ({
       }
     }
 
+    // 确保页面发送更新
+    vm?.proxy?.$forceUpdate();
+
     advanceState.actionSpan = (realItemColSum % BASIC_COL_LEN) + unref(getEmptySpan);
 
     getAdvanced(unref(getProps).actionColOptions || { span: BASIC_COL_LEN }, itemColSum, true);
 
-    emit('advanced-change');
+    emit("advanced-change");
   }
 
   function handleToggleAdvanced() {
diff --git a/src/components/Form/src/hooks/useAutoFocus.ts b/src/components/Form/src/hooks/useAutoFocus.ts
index e24dd6bbdf0220a78ff3a2c8c5214dc4115364d2..5192c12c86438b902c9f2151f1a598969fa9fd09 100644
--- a/src/components/Form/src/hooks/useAutoFocus.ts
+++ b/src/components/Form/src/hooks/useAutoFocus.ts
@@ -1,7 +1,7 @@
-import type { ComputedRef, Ref } from 'vue';
-import type { FormSchema, FormActionType, FormProps } from '../types/form';
+import type { ComputedRef, Ref } from "vue";
+import type { FormSchema, FormActionType, FormProps } from "../types/form";
 
-import { unref, nextTick, watchEffect } from 'vue';
+import { unref, nextTick, watchEffect } from "vue";
 
 interface UseAutoFocusContext {
   getSchema: ComputedRef<FormSchema[]>;
@@ -29,11 +29,11 @@ export async function useAutoFocus({
 
     const firstItem = schemas[0];
     // Only open when the first form item is input type
-    if (!firstItem.component.includes('Input')) {
+    if (!firstItem.component.includes("Input")) {
       return;
     }
 
-    const inputEl = el.querySelector('.ant-row:first-child input') as Nullable<HTMLInputElement>;
+    const inputEl = el.querySelector(".ant-row:first-child input") as Nullable<HTMLInputElement>;
     if (!inputEl) return;
     inputEl?.focus();
   });
diff --git a/src/components/Form/src/hooks/useComponentRegister.ts b/src/components/Form/src/hooks/useComponentRegister.ts
index 218aaa9b2faa9b53770f4ce46f0c76ab9d83a683..9fce8c221c46e5a8966eed15a56e167bdc04abcf 100644
--- a/src/components/Form/src/hooks/useComponentRegister.ts
+++ b/src/components/Form/src/hooks/useComponentRegister.ts
@@ -1,7 +1,7 @@
-import type { ComponentType } from '../types/index';
-import { tryOnUnmounted } from '@vueuse/core';
-import { add, del } from '../componentMap';
-import type { Component } from 'vue';
+import type { ComponentType } from "../types/index";
+import { tryOnUnmounted } from "@vueuse/core";
+import { add, del } from "../componentMap";
+import type { Component } from "vue";
 
 export function useComponentRegister(compName: ComponentType, comp: Component) {
   add(compName, comp);
diff --git a/src/components/Form/src/hooks/useForm.ts b/src/components/Form/src/hooks/useForm.ts
index d026d690db2ac5deffdeab54ee9c2bb14536a8b7..07dc6ff8896c0571eba59370f6c83700af5ee3e0 100644
--- a/src/components/Form/src/hooks/useForm.ts
+++ b/src/components/Form/src/hooks/useForm.ts
@@ -1,10 +1,10 @@
-import type { FormProps, FormActionType, UseFormReturnType, FormSchema } from '../types/form';
-import type { NamePath } from 'ant-design-vue/lib/form/interface';
-import type { DynamicProps } from '/#/utils';
-import { ref, onUnmounted, unref, nextTick, watch } from 'vue';
-import { isProdMode } from '/@/utils/env';
-import { error } from '/@/utils/log';
-import { getDynamicProps } from '/@/utils';
+import type { FormProps, FormActionType, UseFormReturnType, FormSchema } from "../types/form";
+import type { NamePath } from "ant-design-vue/lib/form/interface";
+import type { DynamicProps } from "/#/utils";
+import { ref, onUnmounted, unref, nextTick, watch } from "vue";
+import { isProdMode } from "/@/utils/env";
+import { error } from "/@/utils/log";
+import { getDynamicProps } from "/@/utils";
 
 export declare type ValidateFields = (nameList?: NamePath[]) => Promise<Recordable>;
 
@@ -18,7 +18,7 @@ export function useForm(props?: Props): UseFormReturnType {
     const form = unref(formRef);
     if (!form) {
       error(
-        'The form instance has not been obtained, please make sure that the form has been rendered when performing the form operation!',
+        "The form instance has not been obtained, please make sure that the form has been rendered when performing the form operation!",
       );
     }
     await nextTick();
diff --git a/src/components/Form/src/hooks/useFormContext.ts b/src/components/Form/src/hooks/useFormContext.ts
index 01dfadd7619afa46209e0f695888b6b2e7a2e736..4758cfa8db6899a66a368f675f4bf563bd9858a3 100644
--- a/src/components/Form/src/hooks/useFormContext.ts
+++ b/src/components/Form/src/hooks/useFormContext.ts
@@ -1,5 +1,5 @@
-import type { InjectionKey } from 'vue';
-import { createContext, useContext } from '/@/hooks/core/useContext';
+import type { InjectionKey } from "vue";
+import { createContext, useContext } from "/@/hooks/core/useContext";
 
 export interface FormContextProps {
   resetAction: () => Promise<void>;
diff --git a/src/components/Form/src/hooks/useFormEvents.ts b/src/components/Form/src/hooks/useFormEvents.ts
index efb3b41fcf9c5ecbbffec5453123e168e20bd5b8..0b0da9d6b7a322152ab680c9d0a67196033817c0 100644
--- a/src/components/Form/src/hooks/useFormEvents.ts
+++ b/src/components/Form/src/hooks/useFormEvents.ts
@@ -1,13 +1,13 @@
-import type { ComputedRef, Ref } from 'vue';
-import type { FormProps, FormSchema, FormActionType } from '../types/form';
-import type { NamePath } from 'ant-design-vue/lib/form/interface';
-import { unref, toRaw } from 'vue';
-import { isArray, isFunction, isObject, isString } from '/@/utils/is';
-import { deepMerge } from '/@/utils';
-import { dateItemType, handleInputNumberValue } from '../helper';
-import { dateUtil } from '/@/utils/dateUtil';
-import { cloneDeep, uniqBy } from 'lodash-es';
-import { error } from '/@/utils/log';
+import type { ComputedRef, Ref } from "vue";
+import type { FormProps, FormSchema, FormActionType } from "../types/form";
+import type { NamePath } from "ant-design-vue/lib/form/interface";
+import { unref, toRaw, nextTick } from "vue";
+import { isArray, isFunction, isObject, isString, isDef, isNullOrUnDef } from "/@/utils/is";
+import { deepMerge } from "/@/utils";
+import { dateItemType, handleInputNumberValue, defaultValueComponents } from "../helper";
+import { dateUtil } from "/@/utils/dateUtil";
+import { cloneDeep, uniqBy } from "lodash-es";
+import { error } from "/@/utils/log";
 
 interface UseFormActionContext {
   emit: EmitType;
@@ -37,10 +37,14 @@ export function useFormEvents({
     if (!formEl) return;
 
     Object.keys(formModel).forEach((key) => {
-      formModel[key] = defaultValueRef.value[key];
+      const schema = unref(getSchema).find((item) => item.field === key);
+      const isInput = schema?.component && defaultValueComponents.includes(schema.component);
+      const defaultValue = cloneDeep(defaultValueRef.value[key]);
+      formModel[key] = isInput ? defaultValue || "" : defaultValue;
     });
-    clearValidate();
-    emit('reset', toRaw(formModel));
+    nextTick(() => clearValidate());
+
+    emit("reset", toRaw(formModel));
     submitOnReset && handleSubmit();
   }
 
@@ -52,6 +56,10 @@ export function useFormEvents({
       .map((item) => item.field)
       .filter(Boolean);
 
+    // key 支持 a.b.c 的嵌套写法
+    const delimiter = ".";
+    const nestKeyArray = fields.filter((item) => item.indexOf(delimiter) >= 0);
+
     const validKeys: string[] = [];
     Object.keys(values).forEach((key) => {
       const schema = unref(getSchema).find((item) => item.field === key);
@@ -73,7 +81,7 @@ export function useFormEvents({
           } else {
             const { componentProps } = schema || {};
             let _props = componentProps as any;
-            if (typeof componentProps === 'function') {
+            if (typeof componentProps === "function") {
               _props = _props({ formModel });
             }
             formModel[key] = value ? (_props?.valueFormat ? value : dateUtil(value)) : null;
@@ -82,6 +90,21 @@ export function useFormEvents({
           formModel[key] = value;
         }
         validKeys.push(key);
+      } else {
+        nestKeyArray.forEach((nestKey: string) => {
+          try {
+            const value = eval("values" + delimiter + nestKey);
+            if (isDef(value)) {
+              formModel[nestKey] = value;
+              validKeys.push(nestKey);
+            }
+          } catch (e) {
+            // key not exist
+            if (isDef(defaultValueRef.value[nestKey])) {
+              formModel[nestKey] = cloneDeep(defaultValueRef.value[nestKey]);
+            }
+          }
+        });
       }
     });
     validateFields(validKeys).catch((_) => {});
@@ -125,18 +148,18 @@ export function useFormEvents({
     const schemaList: FormSchema[] = cloneDeep(unref(getSchema));
 
     const index = schemaList.findIndex((schema) => schema.field === prefixField);
-    const hasInList = schemaList.some((item) => item.field === prefixField || schema.field);
-
-    if (!hasInList) return;
 
     if (!prefixField || index === -1 || first) {
       first ? schemaList.unshift(schema) : schemaList.push(schema);
       schemaRef.value = schemaList;
+      _setDefaultValue(schema);
       return;
     }
     if (index !== -1) {
       schemaList.splice(index + 1, 0, schema);
     }
+    _setDefaultValue(schema);
+
     schemaRef.value = schemaList;
   }
 
@@ -150,12 +173,12 @@ export function useFormEvents({
     }
 
     const hasField = updateData.every(
-      (item) => item.component === 'Divider' || (Reflect.has(item, 'field') && item.field),
+      (item) => item.component === "Divider" || (Reflect.has(item, "field") && item.field),
     );
 
     if (!hasField) {
       error(
-        'All children of the form Schema array that need to be updated must contain the `field` field',
+        "All children of the form Schema array that need to be updated must contain the `field` field",
       );
       return;
     }
@@ -172,12 +195,12 @@ export function useFormEvents({
     }
 
     const hasField = updateData.every(
-      (item) => item.component === 'Divider' || (Reflect.has(item, 'field') && item.field),
+      (item) => item.component === "Divider" || (Reflect.has(item, "field") && item.field),
     );
 
     if (!hasField) {
       error(
-        'All children of the form Schema array that need to be updated must contain the `field` field',
+        "All children of the form Schema array that need to be updated must contain the `field` field",
       );
       return;
     }
@@ -192,7 +215,34 @@ export function useFormEvents({
         }
       });
     });
-    schemaRef.value = uniqBy(schema, 'field');
+    _setDefaultValue(schema);
+
+    schemaRef.value = uniqBy(schema, "field");
+  }
+
+  function _setDefaultValue(data: FormSchema | FormSchema[]) {
+    let schemas: FormSchema[] = [];
+    if (isObject(data)) {
+      schemas.push(data as FormSchema);
+    }
+    if (isArray(data)) {
+      schemas = [...data];
+    }
+
+    const obj: Recordable = {};
+    const currentFieldsValue = getFieldsValue();
+    schemas.forEach((item) => {
+      if (
+        item.component != "Divider" &&
+        Reflect.has(item, "field") &&
+        item.field &&
+        !isNullOrUnDef(item.defaultValue) &&
+        !(item.field in currentFieldsValue)
+      ) {
+        obj[item.field] = item.defaultValue;
+      }
+    });
+    setFieldsValue(obj);
   }
 
   function getFieldsValue(): Recordable {
@@ -241,7 +291,7 @@ export function useFormEvents({
     try {
       const values = await validate();
       const res = handleFormValues(values);
-      emit('submit', res);
+      emit("submit", res);
     } catch (error: any) {
       throw new Error(error);
     }
diff --git a/src/components/Form/src/hooks/useFormValues.ts b/src/components/Form/src/hooks/useFormValues.ts
index c5f2a07a3795b6b73e5cccc4e407522790ac39a2..e4c94206d04c96f3bdf2379019357c3b09b3e5e3 100644
--- a/src/components/Form/src/hooks/useFormValues.ts
+++ b/src/components/Form/src/hooks/useFormValues.ts
@@ -1,9 +1,9 @@
-import { isArray, isFunction, isObject, isString, isNullOrUnDef } from '/@/utils/is';
-import { dateUtil } from '/@/utils/dateUtil';
-import { unref } from 'vue';
-import type { Ref, ComputedRef } from 'vue';
-import type { FormProps, FormSchema } from '../types/form';
-import { set } from 'lodash-es';
+import { isArray, isFunction, isObject, isString, isNullOrUnDef } from "/@/utils/is";
+import { dateUtil } from "/@/utils/dateUtil";
+import { unref } from "vue";
+import type { Ref, ComputedRef } from "vue";
+import type { FormProps, FormSchema } from "../types/form";
+import { cloneDeep, set } from "lodash-es";
 
 interface UseFormValuesContext {
   defaultValueRef: Ref<any>;
@@ -11,6 +11,43 @@ interface UseFormValuesContext {
   getProps: ComputedRef<FormProps>;
   formModel: Recordable;
 }
+
+/**
+ * @desription deconstruct array-link key. This method will mutate the target.
+ */
+function tryDeconstructArray(key: string, value: any, target: Recordable) {
+  const pattern = /^\[(.+)\]$/;
+  if (pattern.test(key)) {
+    const match = key.match(pattern);
+    if (match && match[1]) {
+      const keys = match[1].split(",");
+      value = Array.isArray(value) ? value : [value];
+      keys.forEach((k, index) => {
+        set(target, k.trim(), value[index]);
+      });
+      return true;
+    }
+  }
+}
+
+/**
+ * @desription deconstruct object-link key. This method will mutate the target.
+ */
+function tryDeconstructObject(key: string, value: any, target: Recordable) {
+  const pattern = /^\{(.+)\}$/;
+  if (pattern.test(key)) {
+    const match = key.match(pattern);
+    if (match && match[1]) {
+      const keys = match[1].split(",");
+      value = isObject(value) ? value : {};
+      keys.forEach((k) => {
+        set(target, k.trim(), value[k.trim()]);
+      });
+      return true;
+    }
+  }
+}
+
 export function useFormValues({
   defaultValueRef,
   getSchema,
@@ -33,14 +70,18 @@ export function useFormValues({
       if (isObject(value)) {
         value = transformDateFunc?.(value);
       }
-      if (isArray(value) && value[0]?._isAMomentObject && value[1]?._isAMomentObject) {
+
+      if (isArray(value) && value[0]?.format && value[1]?.format) {
         value = value.map((item) => transformDateFunc?.(item));
       }
       // Remove spaces
       if (isString(value)) {
         value = value.trim();
       }
-      set(res, key, value);
+      if (!tryDeconstructArray(key, value, res) && !tryDeconstructObject(key, value, res)) {
+        // 没有解构成功的,按原样赋值
+        set(res, key, value);
+      }
     }
     return handleRangeTimeValue(res);
   }
@@ -55,7 +96,7 @@ export function useFormValues({
       return values;
     }
 
-    for (const [field, [startTimeKey, endTimeKey], format = 'YYYY-MM-DD'] of fieldMapToTime) {
+    for (const [field, [startTimeKey, endTimeKey], format = "YYYY-MM-DD"] of fieldMapToTime) {
       if (!field || !startTimeKey || !endTimeKey || !values[field]) {
         continue;
       }
@@ -77,10 +118,13 @@ export function useFormValues({
       const { defaultValue } = item;
       if (!isNullOrUnDef(defaultValue)) {
         obj[item.field] = defaultValue;
-        formModel[item.field] = defaultValue;
+
+        if (formModel[item.field] === undefined) {
+          formModel[item.field] = defaultValue;
+        }
       }
     });
-    defaultValueRef.value = obj;
+    defaultValueRef.value = cloneDeep(obj);
   }
 
   return { handleFormValues, initDefault };
diff --git a/src/components/Form/src/hooks/useLabelWidth.ts b/src/components/Form/src/hooks/useLabelWidth.ts
index fb96ee3df1ddf89c53532bf0ee0c86387f97289c..89cce99222fed249e62ab1b2a04a2eb108d02a93 100644
--- a/src/components/Form/src/hooks/useLabelWidth.ts
+++ b/src/components/Form/src/hooks/useLabelWidth.ts
@@ -1,8 +1,7 @@
-import type { Ref } from 'vue';
-import type { FormProps, FormSchema } from '../types/form';
-
-import { computed, unref } from 'vue';
-import { isNumber } from '/@/utils/is';
+import type { Ref } from "vue";
+import { computed, unref } from "vue";
+import type { FormProps, FormSchema } from "../types/form";
+import { isNumber } from "/@/utils/is";
 
 export function useItemLabelWidth(schemaItemRef: Ref<FormSchema>, propsRef: Ref<FormProps>) {
   return computed(() => {
@@ -14,12 +13,13 @@ export function useItemLabelWidth(schemaItemRef: Ref<FormSchema>, propsRef: Ref<
       labelWidth: globalLabelWidth,
       labelCol: globalLabelCol,
       wrapperCol: globWrapperCol,
+      layout,
     } = unref(propsRef);
 
     // If labelWidth is set globally, all items setting
     if ((!globalLabelWidth && !labelWidth && !globalLabelCol) || disabledLabelWidth) {
       labelCol.style = {
-        textAlign: 'left',
+        textAlign: "left",
       };
       return { labelCol, wrapperCol };
     }
@@ -33,7 +33,10 @@ export function useItemLabelWidth(schemaItemRef: Ref<FormSchema>, propsRef: Ref<
 
     return {
       labelCol: { style: { width }, ...col },
-      wrapperCol: { style: { width: `calc(100% - ${width})` }, ...wrapCol },
+      wrapperCol: {
+        style: { width: layout === "vertical" ? "100%" : `calc(100% - ${width})` },
+        ...wrapCol,
+      },
     };
   });
 }
diff --git a/src/components/Form/src/props.ts b/src/components/Form/src/props.ts
index 36237f407edcc40d5321a0c0bed163b400a68953..d93c640cd128d15be198ad9a6dc7bd3e71c7918b 100644
--- a/src/components/Form/src/props.ts
+++ b/src/components/Form/src/props.ts
@@ -1,10 +1,10 @@
-import type { FieldMapToTime, FormSchema } from './types/form';
-import type { CSSProperties, PropType } from 'vue';
-import type { ColEx } from './types';
-import type { TableActionType } from '/@/components/Table';
-import type { ButtonProps } from 'ant-design-vue/es/button/buttonTypes';
-import type { RowProps } from 'ant-design-vue/lib/grid/Row';
-import { propTypes } from '/@/utils/propTypes';
+import type { FieldMapToTime, FormSchema } from "./types/form";
+import type { CSSProperties, PropType } from "vue";
+import type { ColEx } from "./types";
+import type { TableActionType } from "/@/components/Table";
+import type { ButtonProps } from "ant-design-vue/es/button/buttonTypes";
+import type { RowProps } from "ant-design-vue/lib/grid/Row";
+import { propTypes } from "/@/utils/propTypes";
 
 export const basicProps = {
   model: {
@@ -40,7 +40,8 @@ export const basicProps = {
   // 在INPUT组件上单击回车时,是否自动提交
   autoSubmitOnEnter: propTypes.bool.def(false),
   submitOnReset: propTypes.bool,
-  size: propTypes.oneOf(['default', 'small', 'large']).def('default'),
+  submitOnChange: propTypes.bool,
+  size: propTypes.oneOf(["default", "small", "large"]).def("default"),
   // 禁用表单
   disabled: propTypes.bool,
   emptySpan: {
@@ -53,7 +54,7 @@ export const basicProps = {
   transformDateFunc: {
     type: Function as PropType<Fn>,
     default: (date: any) => {
-      return date._isAMomentObject ? date?.format('YYYY-MM-DD HH:mm:ss') : date;
+      return date?.format?.("YYYY-MM-DD HH:mm:ss") ?? date;
     },
   },
   rulesMessageJoinLabel: propTypes.bool.def(true),
@@ -87,7 +88,7 @@ export const basicProps = {
 
   labelCol: Object as PropType<Partial<ColEx>>,
 
-  layout: propTypes.oneOf(['horizontal', 'vertical', 'inline']).def('horizontal'),
+  layout: propTypes.oneOf(["horizontal", "vertical", "inline"]).def("horizontal"),
   tableAction: {
     type: Object as PropType<TableActionType>,
   },
diff --git a/src/components/Form/src/types/form.ts b/src/components/Form/src/types/form.ts
index ac85a74f2287050b9924e25b0f0d20e4aacc900f..4a77a45d12603c45abcf2c4e47eeda29e14966bf 100644
--- a/src/components/Form/src/types/form.ts
+++ b/src/components/Form/src/types/form.ts
@@ -1,16 +1,16 @@
-import type { NamePath, RuleObject } from 'ant-design-vue/lib/form/interface';
-import type { VNode } from 'vue';
-import type { ButtonProps as AntdButtonProps } from '/@/components/Button';
-import type { FormItem } from './formItem';
-import type { ColEx, ComponentType } from './index';
-import type { TableActionType } from '/@/components/Table/src/types/table';
-import type { CSSProperties } from 'vue';
-import type { RowProps } from 'ant-design-vue/lib/grid/Row';
+import type { NamePath, RuleObject } from "ant-design-vue/lib/form/interface";
+import type { VNode } from "vue";
+import type { ButtonProps as AntdButtonProps } from "/@/components/Button";
+import type { FormItem } from "./formItem";
+import type { ColEx, ComponentType } from "./index";
+import type { TableActionType } from "/@/components/Table/src/types/table";
+import type { CSSProperties } from "vue";
+import type { RowProps } from "ant-design-vue/lib/grid/Row";
 
 export type FieldMapToTime = [string, [string, string], string?][];
 
 export type Rule = RuleObject & {
-  trigger?: 'blur' | 'change' | ['change', 'blur'];
+  trigger?: "blur" | "change" | ["change", "blur"];
 };
 
 export interface RenderCallbackParams {
@@ -49,17 +49,20 @@ export type RegisterFn = (formInstance: FormActionType) => void;
 export type UseFormReturnType = [RegisterFn, FormActionType];
 
 export interface FormProps {
-  layout?: 'vertical' | 'inline' | 'horizontal';
+  name?: string;
+  layout?: "vertical" | "inline" | "horizontal";
   // Form value
   model?: Recordable;
   // The width of all items in the entire form
   labelWidth?: number | string;
-  //alignment
-  labelAlign?: 'left' | 'right';
-  //Row configuration for the entire form
+  // alignment
+  labelAlign?: "left" | "right";
+  // Row configuration for the entire form
   rowProps?: RowProps;
   // Submit form on reset
   submitOnReset?: boolean;
+  // Submit form on form changing
+  submitOnChange?: boolean;
   // Col configuration for the entire form
   labelCol?: Partial<ColEx>;
   // Col configuration for the entire form
@@ -80,7 +83,7 @@ export interface FormProps {
   // Blank line span
   emptySpan?: number | Partial<ColEx>;
   // Internal component size of the form
-  size?: 'default' | 'small' | 'large';
+  size?: "default" | "small" | "large";
   // Whether to disable
   disabled?: boolean;
   // Time interval fields are mapped into multiple
diff --git a/src/components/Form/src/types/formItem.ts b/src/components/Form/src/types/formItem.ts
index 77b238ac8f5f9ed8766318f22769479dac29f02a..d0e4de69d915cad42cfbd965b39d51f5ca5d509f 100644
--- a/src/components/Form/src/types/formItem.ts
+++ b/src/components/Form/src/types/formItem.ts
@@ -1,6 +1,6 @@
-import type { NamePath } from 'ant-design-vue/lib/form/interface';
-import type { ColProps } from 'ant-design-vue/lib/grid/Col';
-import type { HTMLAttributes, VNodeChild } from 'vue';
+import type { NamePath } from "ant-design-vue/lib/form/interface";
+import type { ColProps } from "ant-design-vue/lib/grid/Col";
+import type { HTMLAttributes, VNodeChild } from "vue";
 
 export interface FormItem {
   /**
@@ -52,7 +52,7 @@ export interface FormItem {
    * The validation status. If not provided, it will be generated by validation rule. options: 'success' 'warning' 'error' 'validating'
    * @type string
    */
-  validateStatus?: '' | 'success' | 'warning' | 'error' | 'validating';
+  validateStatus?: "" | "success" | "warning" | "error" | "validating";
 
   /**
    * The layout for input controls, same as labelCol
@@ -66,7 +66,7 @@ export interface FormItem {
   /**
    * text align of label
    */
-  labelAlign?: 'left' | 'right';
+  labelAlign?: "left" | "right";
   /**
    * a key of model. In the setting of validate and resetFields method, the attribute is required
    */
diff --git a/src/components/Form/src/types/index.ts b/src/components/Form/src/types/index.ts
index a3e968e86e39f5c4cbf7e3278526a73876e08ee6..4200ee2f2d1832ba2ebc103691e8e25af36f686d 100644
--- a/src/components/Form/src/types/index.ts
+++ b/src/components/Form/src/types/index.ts
@@ -81,35 +81,37 @@ export interface ColEx {
 }
 
 export type ComponentType =
-  | 'Input'
-  | 'InputGroup'
-  | 'InputPassword'
-  | 'InputSearch'
-  | 'InputTextArea'
-  | 'InputNumber'
-  | 'InputCountDown'
-  | 'Select'
-  | 'ApiSelect'
-  | 'TreeSelect'
-  | 'ApiTreeSelect'
-  | 'ApiRadioGroup'
-  | 'RadioButtonGroup'
-  | 'RadioGroup'
-  | 'Checkbox'
-  | 'CheckboxGroup'
-  | 'AutoComplete'
-  | 'ApiCascader'
-  | 'Cascader'
-  | 'DatePicker'
-  | 'MonthPicker'
-  | 'RangePicker'
-  | 'WeekPicker'
-  | 'TimePicker'
-  | 'Switch'
-  | 'StrengthMeter'
-  | 'Upload'
-  | 'IconPicker'
-  | 'Render'
-  | 'Slider'
-  | 'Rate'
-  | 'Divider';
+  | "Input"
+  | "InputGroup"
+  | "InputPassword"
+  | "InputSearch"
+  | "InputTextArea"
+  | "InputNumber"
+  | "InputCountDown"
+  | "Select"
+  | "ApiSelect"
+  | "TreeSelect"
+  | "ApiTree"
+  | "ApiTreeSelect"
+  | "ApiRadioGroup"
+  | "RadioButtonGroup"
+  | "RadioGroup"
+  | "Checkbox"
+  | "CheckboxGroup"
+  | "AutoComplete"
+  | "ApiCascader"
+  | "Cascader"
+  | "DatePicker"
+  | "MonthPicker"
+  | "RangePicker"
+  | "WeekPicker"
+  | "TimePicker"
+  | "Switch"
+  | "StrengthMeter"
+  | "Upload"
+  | "IconPicker"
+  | "Render"
+  | "Slider"
+  | "Rate"
+  | "Divider"
+  | "ApiTransfer";
diff --git a/src/components/Icon/data/icons.data.ts b/src/components/Icon/data/icons.data.ts
index e5fe3e2667909ec907035b921ef9345c0bc9724e..b23c8174a95521a7f9411d9efc24dda1efdad75d 100644
--- a/src/components/Icon/data/icons.data.ts
+++ b/src/components/Icon/data/icons.data.ts
@@ -1,793 +1,793 @@
 export default {
-  prefix: 'ant-design',
+  prefix: "ant-design",
   icons: [
-    'account-book-filled',
-    'account-book-outlined',
-    'account-book-twotone',
-    'aim-outlined',
-    'alert-filled',
-    'alert-outlined',
-    'alert-twotone',
-    'alibaba-outlined',
-    'align-center-outlined',
-    'align-left-outlined',
-    'align-right-outlined',
-    'alipay-circle-filled',
-    'alipay-circle-outlined',
-    'alipay-outlined',
-    'alipay-square-filled',
-    'aliwangwang-filled',
-    'aliwangwang-outlined',
-    'aliyun-outlined',
-    'amazon-circle-filled',
-    'amazon-outlined',
-    'amazon-square-filled',
-    'android-filled',
-    'android-outlined',
-    'ant-cloud-outlined',
-    'ant-design-outlined',
-    'apartment-outlined',
-    'api-filled',
-    'api-outlined',
-    'api-twotone',
-    'apple-filled',
-    'apple-outlined',
-    'appstore-add-outlined',
-    'appstore-filled',
-    'appstore-outlined',
-    'appstore-twotone',
-    'area-chart-outlined',
-    'arrow-down-outlined',
-    'arrow-left-outlined',
-    'arrow-right-outlined',
-    'arrow-up-outlined',
-    'arrows-alt-outlined',
-    'audio-filled',
-    'audio-muted-outlined',
-    'audio-outlined',
-    'audio-twotone',
-    'audit-outlined',
-    'backward-filled',
-    'backward-outlined',
-    'bank-filled',
-    'bank-outlined',
-    'bank-twotone',
-    'bar-chart-outlined',
-    'barcode-outlined',
-    'bars-outlined',
-    'behance-circle-filled',
-    'behance-outlined',
-    'behance-square-filled',
-    'behance-square-outlined',
-    'bell-filled',
-    'bell-outlined',
-    'bell-twotone',
-    'bg-colors-outlined',
-    'block-outlined',
-    'bold-outlined',
-    'book-filled',
-    'book-outlined',
-    'book-twotone',
-    'border-bottom-outlined',
-    'border-horizontal-outlined',
-    'border-inner-outlined',
-    'border-left-outlined',
-    'border-outer-outlined',
-    'border-outlined',
-    'border-right-outlined',
-    'border-top-outlined',
-    'border-verticle-outlined',
-    'borderless-table-outlined',
-    'box-plot-filled',
-    'box-plot-outlined',
-    'box-plot-twotone',
-    'branches-outlined',
-    'bug-filled',
-    'bug-outlined',
-    'bug-twotone',
-    'build-filled',
-    'build-outlined',
-    'build-twotone',
-    'bulb-filled',
-    'bulb-outlined',
-    'bulb-twotone',
-    'calculator-filled',
-    'calculator-outlined',
-    'calculator-twotone',
-    'calendar-filled',
-    'calendar-outlined',
-    'calendar-twotone',
-    'camera-filled',
-    'camera-outlined',
-    'camera-twotone',
-    'car-filled',
-    'car-outlined',
-    'car-twotone',
-    'caret-down-filled',
-    'caret-down-outlined',
-    'caret-left-filled',
-    'caret-left-outlined',
-    'caret-right-filled',
-    'caret-right-outlined',
-    'caret-up-filled',
-    'caret-up-outlined',
-    'carry-out-filled',
-    'carry-out-outlined',
-    'carry-out-twotone',
-    'check-circle-filled',
-    'check-circle-outlined',
-    'check-circle-twotone',
-    'check-outlined',
-    'check-square-filled',
-    'check-square-outlined',
-    'check-square-twotone',
-    'chrome-filled',
-    'chrome-outlined',
-    'ci-circle-filled',
-    'ci-circle-outlined',
-    'ci-circle-twotone',
-    'ci-outlined',
-    'ci-twotone',
-    'clear-outlined',
-    'clock-circle-filled',
-    'clock-circle-outlined',
-    'clock-circle-twotone',
-    'close-circle-filled',
-    'close-circle-outlined',
-    'close-circle-twotone',
-    'close-outlined',
-    'close-square-filled',
-    'close-square-outlined',
-    'close-square-twotone',
-    'cloud-download-outlined',
-    'cloud-filled',
-    'cloud-outlined',
-    'cloud-server-outlined',
-    'cloud-sync-outlined',
-    'cloud-twotone',
-    'cloud-upload-outlined',
-    'cluster-outlined',
-    'code-filled',
-    'code-outlined',
-    'code-sandbox-circle-filled',
-    'code-sandbox-outlined',
-    'code-sandbox-square-filled',
-    'code-twotone',
-    'codepen-circle-filled',
-    'codepen-circle-outlined',
-    'codepen-outlined',
-    'codepen-square-filled',
-    'coffee-outlined',
-    'column-height-outlined',
-    'column-width-outlined',
-    'comment-outlined',
-    'compass-filled',
-    'compass-outlined',
-    'compass-twotone',
-    'compress-outlined',
-    'console-sql-outlined',
-    'contacts-filled',
-    'contacts-outlined',
-    'contacts-twotone',
-    'container-filled',
-    'container-outlined',
-    'container-twotone',
-    'control-filled',
-    'control-outlined',
-    'control-twotone',
-    'copy-filled',
-    'copy-outlined',
-    'copy-twotone',
-    'copyright-circle-filled',
-    'copyright-circle-outlined',
-    'copyright-circle-twotone',
-    'copyright-outlined',
-    'copyright-twotone',
-    'credit-card-filled',
-    'credit-card-outlined',
-    'credit-card-twotone',
-    'crown-filled',
-    'crown-outlined',
-    'crown-twotone',
-    'customer-service-filled',
-    'customer-service-outlined',
-    'customer-service-twotone',
-    'dash-outlined',
-    'dashboard-filled',
-    'dashboard-outlined',
-    'dashboard-twotone',
-    'database-filled',
-    'database-outlined',
-    'database-twotone',
-    'delete-column-outlined',
-    'delete-filled',
-    'delete-outlined',
-    'delete-row-outlined',
-    'delete-twotone',
-    'delivered-procedure-outlined',
-    'deployment-unit-outlined',
-    'desktop-outlined',
-    'diff-filled',
-    'diff-outlined',
-    'diff-twotone',
-    'dingding-outlined',
-    'dingtalk-circle-filled',
-    'dingtalk-outlined',
-    'dingtalk-square-filled',
-    'disconnect-outlined',
-    'dislike-filled',
-    'dislike-outlined',
-    'dislike-twotone',
-    'dollar-circle-filled',
-    'dollar-circle-outlined',
-    'dollar-circle-twotone',
-    'dollar-outlined',
-    'dollar-twotone',
-    'dot-chart-outlined',
-    'double-left-outlined',
-    'double-right-outlined',
-    'down-circle-filled',
-    'down-circle-outlined',
-    'down-circle-twotone',
-    'down-outlined',
-    'down-square-filled',
-    'down-square-outlined',
-    'down-square-twotone',
-    'download-outlined',
-    'drag-outlined',
-    'dribbble-circle-filled',
-    'dribbble-outlined',
-    'dribbble-square-filled',
-    'dribbble-square-outlined',
-    'dropbox-circle-filled',
-    'dropbox-outlined',
-    'dropbox-square-filled',
-    'edit-filled',
-    'edit-outlined',
-    'edit-twotone',
-    'ellipsis-outlined',
-    'enter-outlined',
-    'environment-filled',
-    'environment-outlined',
-    'environment-twotone',
-    'euro-circle-filled',
-    'euro-circle-outlined',
-    'euro-circle-twotone',
-    'euro-outlined',
-    'euro-twotone',
-    'exception-outlined',
-    'exclamation-circle-filled',
-    'exclamation-circle-outlined',
-    'exclamation-circle-twotone',
-    'exclamation-outlined',
-    'expand-alt-outlined',
-    'expand-outlined',
-    'experiment-filled',
-    'experiment-outlined',
-    'experiment-twotone',
-    'export-outlined',
-    'eye-filled',
-    'eye-invisible-filled',
-    'eye-invisible-outlined',
-    'eye-invisible-twotone',
-    'eye-outlined',
-    'eye-twotone',
-    'facebook-filled',
-    'facebook-outlined',
-    'fall-outlined',
-    'fast-backward-filled',
-    'fast-backward-outlined',
-    'fast-forward-filled',
-    'fast-forward-outlined',
-    'field-binary-outlined',
-    'field-number-outlined',
-    'field-string-outlined',
-    'field-time-outlined',
-    'file-add-filled',
-    'file-add-outlined',
-    'file-add-twotone',
-    'file-done-outlined',
-    'file-excel-filled',
-    'file-excel-outlined',
-    'file-excel-twotone',
-    'file-exclamation-filled',
-    'file-exclamation-outlined',
-    'file-exclamation-twotone',
-    'file-filled',
-    'file-gif-outlined',
-    'file-image-filled',
-    'file-image-outlined',
-    'file-image-twotone',
-    'file-jpg-outlined',
-    'file-markdown-filled',
-    'file-markdown-outlined',
-    'file-markdown-twotone',
-    'file-outlined',
-    'file-pdf-filled',
-    'file-pdf-outlined',
-    'file-pdf-twotone',
-    'file-ppt-filled',
-    'file-ppt-outlined',
-    'file-ppt-twotone',
-    'file-protect-outlined',
-    'file-search-outlined',
-    'file-sync-outlined',
-    'file-text-filled',
-    'file-text-outlined',
-    'file-text-twotone',
-    'file-twotone',
-    'file-unknown-filled',
-    'file-unknown-outlined',
-    'file-unknown-twotone',
-    'file-word-filled',
-    'file-word-outlined',
-    'file-word-twotone',
-    'file-zip-filled',
-    'file-zip-outlined',
-    'file-zip-twotone',
-    'filter-filled',
-    'filter-outlined',
-    'filter-twotone',
-    'fire-filled',
-    'fire-outlined',
-    'fire-twotone',
-    'flag-filled',
-    'flag-outlined',
-    'flag-twotone',
-    'folder-add-filled',
-    'folder-add-outlined',
-    'folder-add-twotone',
-    'folder-filled',
-    'folder-open-filled',
-    'folder-open-outlined',
-    'folder-open-twotone',
-    'folder-outlined',
-    'folder-twotone',
-    'folder-view-outlined',
-    'font-colors-outlined',
-    'font-size-outlined',
-    'fork-outlined',
-    'form-outlined',
-    'format-painter-filled',
-    'format-painter-outlined',
-    'forward-filled',
-    'forward-outlined',
-    'frown-filled',
-    'frown-outlined',
-    'frown-twotone',
-    'fullscreen-exit-outlined',
-    'fullscreen-outlined',
-    'function-outlined',
-    'fund-filled',
-    'fund-outlined',
-    'fund-projection-screen-outlined',
-    'fund-twotone',
-    'fund-view-outlined',
-    'funnel-plot-filled',
-    'funnel-plot-outlined',
-    'funnel-plot-twotone',
-    'gateway-outlined',
-    'gif-outlined',
-    'gift-filled',
-    'gift-outlined',
-    'gift-twotone',
-    'github-filled',
-    'github-outlined',
-    'gitlab-filled',
-    'gitlab-outlined',
-    'global-outlined',
-    'gold-filled',
-    'gold-outlined',
-    'gold-twotone',
-    'golden-filled',
-    'google-circle-filled',
-    'google-outlined',
-    'google-plus-circle-filled',
-    'google-plus-outlined',
-    'google-plus-square-filled',
-    'google-square-filled',
-    'group-outlined',
-    'hdd-filled',
-    'hdd-outlined',
-    'hdd-twotone',
-    'heart-filled',
-    'heart-outlined',
-    'heart-twotone',
-    'heat-map-outlined',
-    'highlight-filled',
-    'highlight-outlined',
-    'highlight-twotone',
-    'history-outlined',
-    'home-filled',
-    'home-outlined',
-    'home-twotone',
-    'hourglass-filled',
-    'hourglass-outlined',
-    'hourglass-twotone',
-    'html5-filled',
-    'html5-outlined',
-    'html5-twotone',
-    'idcard-filled',
-    'idcard-outlined',
-    'idcard-twotone',
-    'ie-circle-filled',
-    'ie-outlined',
-    'ie-square-filled',
-    'import-outlined',
-    'inbox-outlined',
-    'info-circle-filled',
-    'info-circle-outlined',
-    'info-circle-twotone',
-    'info-outlined',
-    'insert-row-above-outlined',
-    'insert-row-below-outlined',
-    'insert-row-left-outlined',
-    'insert-row-right-outlined',
-    'instagram-filled',
-    'instagram-outlined',
-    'insurance-filled',
-    'insurance-outlined',
-    'insurance-twotone',
-    'interaction-filled',
-    'interaction-outlined',
-    'interaction-twotone',
-    'issues-close-outlined',
-    'italic-outlined',
-    'key-outlined',
-    'laptop-outlined',
-    'layout-filled',
-    'layout-outlined',
-    'layout-twotone',
-    'left-circle-filled',
-    'left-circle-outlined',
-    'left-circle-twotone',
-    'left-outlined',
-    'left-square-filled',
-    'left-square-outlined',
-    'left-square-twotone',
-    'like-filled',
-    'like-outlined',
-    'like-twotone',
-    'line-chart-outlined',
-    'line-height-outlined',
-    'line-outlined',
-    'link-outlined',
-    'linkedin-filled',
-    'linkedin-outlined',
-    'loading-3-quarters-outlined',
-    'loading-outlined',
-    'lock-filled',
-    'lock-outlined',
-    'lock-twotone',
-    'login-outlined',
-    'logout-outlined',
-    'mac-command-filled',
-    'mac-command-outlined',
-    'mail-filled',
-    'mail-outlined',
-    'mail-twotone',
-    'man-outlined',
-    'medicine-box-filled',
-    'medicine-box-outlined',
-    'medicine-box-twotone',
-    'medium-circle-filled',
-    'medium-outlined',
-    'medium-square-filled',
-    'medium-workmark-outlined',
-    'meh-filled',
-    'meh-outlined',
-    'meh-twotone',
-    'menu-fold-outlined',
-    'menu-outlined',
-    'menu-unfold-outlined',
-    'merge-cells-outlined',
-    'message-filled',
-    'message-outlined',
-    'message-twotone',
-    'minus-circle-filled',
-    'minus-circle-outlined',
-    'minus-circle-twotone',
-    'minus-outlined',
-    'minus-square-filled',
-    'minus-square-outlined',
-    'minus-square-twotone',
-    'mobile-filled',
-    'mobile-outlined',
-    'mobile-twotone',
-    'money-collect-filled',
-    'money-collect-outlined',
-    'money-collect-twotone',
-    'monitor-outlined',
-    'more-outlined',
-    'node-collapse-outlined',
-    'node-expand-outlined',
-    'node-index-outlined',
-    'notification-filled',
-    'notification-outlined',
-    'notification-twotone',
-    'number-outlined',
-    'one-to-one-outlined',
-    'ordered-list-outlined',
-    'paper-clip-outlined',
-    'partition-outlined',
-    'pause-circle-filled',
-    'pause-circle-outlined',
-    'pause-circle-twotone',
-    'pause-outlined',
-    'pay-circle-filled',
-    'pay-circle-outlined',
-    'percentage-outlined',
-    'phone-filled',
-    'phone-outlined',
-    'phone-twotone',
-    'pic-center-outlined',
-    'pic-left-outlined',
-    'pic-right-outlined',
-    'picture-filled',
-    'picture-outlined',
-    'picture-twotone',
-    'pie-chart-filled',
-    'pie-chart-outlined',
-    'pie-chart-twotone',
-    'play-circle-filled',
-    'play-circle-outlined',
-    'play-circle-twotone',
-    'play-square-filled',
-    'play-square-outlined',
-    'play-square-twotone',
-    'plus-circle-filled',
-    'plus-circle-outlined',
-    'plus-circle-twotone',
-    'plus-outlined',
-    'plus-square-filled',
-    'plus-square-outlined',
-    'plus-square-twotone',
-    'pound-circle-filled',
-    'pound-circle-outlined',
-    'pound-circle-twotone',
-    'pound-outlined',
-    'poweroff-outlined',
-    'printer-filled',
-    'printer-outlined',
-    'printer-twotone',
-    'profile-filled',
-    'profile-outlined',
-    'profile-twotone',
-    'project-filled',
-    'project-outlined',
-    'project-twotone',
-    'property-safety-filled',
-    'property-safety-outlined',
-    'property-safety-twotone',
-    'pull-request-outlined',
-    'pushpin-filled',
-    'pushpin-outlined',
-    'pushpin-twotone',
-    'qq-circle-filled',
-    'qq-outlined',
-    'qq-square-filled',
-    'qrcode-outlined',
-    'question-circle-filled',
-    'question-circle-outlined',
-    'question-circle-twotone',
-    'question-outlined',
-    'radar-chart-outlined',
-    'radius-bottomleft-outlined',
-    'radius-bottomright-outlined',
-    'radius-setting-outlined',
-    'radius-upleft-outlined',
-    'radius-upright-outlined',
-    'read-filled',
-    'read-outlined',
-    'reconciliation-filled',
-    'reconciliation-outlined',
-    'reconciliation-twotone',
-    'red-envelope-filled',
-    'red-envelope-outlined',
-    'red-envelope-twotone',
-    'reddit-circle-filled',
-    'reddit-outlined',
-    'reddit-square-filled',
-    'redo-outlined',
-    'reload-outlined',
-    'rest-filled',
-    'rest-outlined',
-    'rest-twotone',
-    'retweet-outlined',
-    'right-circle-filled',
-    'right-circle-outlined',
-    'right-circle-twotone',
-    'right-outlined',
-    'right-square-filled',
-    'right-square-outlined',
-    'right-square-twotone',
-    'rise-outlined',
-    'robot-filled',
-    'robot-outlined',
-    'rocket-filled',
-    'rocket-outlined',
-    'rocket-twotone',
-    'rollback-outlined',
-    'rotate-left-outlined',
-    'rotate-right-outlined',
-    'safety-certificate-filled',
-    'safety-certificate-outlined',
-    'safety-certificate-twotone',
-    'safety-outlined',
-    'save-filled',
-    'save-outlined',
-    'save-twotone',
-    'scan-outlined',
-    'schedule-filled',
-    'schedule-outlined',
-    'schedule-twotone',
-    'scissor-outlined',
-    'search-outlined',
-    'security-scan-filled',
-    'security-scan-outlined',
-    'security-scan-twotone',
-    'select-outlined',
-    'send-outlined',
-    'setting-filled',
-    'setting-outlined',
-    'setting-twotone',
-    'shake-outlined',
-    'share-alt-outlined',
-    'shop-filled',
-    'shop-outlined',
-    'shop-twotone',
-    'shopping-cart-outlined',
-    'shopping-filled',
-    'shopping-outlined',
-    'shopping-twotone',
-    'shrink-outlined',
-    'signal-filled',
-    'sisternode-outlined',
-    'sketch-circle-filled',
-    'sketch-outlined',
-    'sketch-square-filled',
-    'skin-filled',
-    'skin-outlined',
-    'skin-twotone',
-    'skype-filled',
-    'skype-outlined',
-    'slack-circle-filled',
-    'slack-outlined',
-    'slack-square-filled',
-    'slack-square-outlined',
-    'sliders-filled',
-    'sliders-outlined',
-    'sliders-twotone',
-    'small-dash-outlined',
-    'smile-filled',
-    'smile-outlined',
-    'smile-twotone',
-    'snippets-filled',
-    'snippets-outlined',
-    'snippets-twotone',
-    'solution-outlined',
-    'sort-ascending-outlined',
-    'sort-descending-outlined',
-    'sound-filled',
-    'sound-outlined',
-    'sound-twotone',
-    'split-cells-outlined',
-    'star-filled',
-    'star-outlined',
-    'star-twotone',
-    'step-backward-filled',
-    'step-backward-outlined',
-    'step-forward-filled',
-    'step-forward-outlined',
-    'stock-outlined',
-    'stop-filled',
-    'stop-outlined',
-    'stop-twotone',
-    'strikethrough-outlined',
-    'subnode-outlined',
-    'swap-left-outlined',
-    'swap-outlined',
-    'swap-right-outlined',
-    'switcher-filled',
-    'switcher-outlined',
-    'switcher-twotone',
-    'sync-outlined',
-    'table-outlined',
-    'tablet-filled',
-    'tablet-outlined',
-    'tablet-twotone',
-    'tag-filled',
-    'tag-outlined',
-    'tag-twotone',
-    'tags-filled',
-    'tags-outlined',
-    'tags-twotone',
-    'taobao-circle-filled',
-    'taobao-circle-outlined',
-    'taobao-outlined',
-    'taobao-square-filled',
-    'team-outlined',
-    'thunderbolt-filled',
-    'thunderbolt-outlined',
-    'thunderbolt-twotone',
-    'to-top-outlined',
-    'tool-filled',
-    'tool-outlined',
-    'tool-twotone',
-    'trademark-circle-filled',
-    'trademark-circle-outlined',
-    'trademark-circle-twotone',
-    'trademark-outlined',
-    'transaction-outlined',
-    'translation-outlined',
-    'trophy-filled',
-    'trophy-outlined',
-    'trophy-twotone',
-    'twitter-circle-filled',
-    'twitter-outlined',
-    'twitter-square-filled',
-    'underline-outlined',
-    'undo-outlined',
-    'ungroup-outlined',
-    'unlock-filled',
-    'unlock-outlined',
-    'unlock-twotone',
-    'unordered-list-outlined',
-    'up-circle-filled',
-    'up-circle-outlined',
-    'up-circle-twotone',
-    'up-outlined',
-    'up-square-filled',
-    'up-square-outlined',
-    'up-square-twotone',
-    'upload-outlined',
-    'usb-filled',
-    'usb-outlined',
-    'usb-twotone',
-    'user-add-outlined',
-    'user-delete-outlined',
-    'user-outlined',
-    'user-switch-outlined',
-    'usergroup-add-outlined',
-    'usergroup-delete-outlined',
-    'verified-outlined',
-    'vertical-align-bottom-outlined',
-    'vertical-align-middle-outlined',
-    'vertical-align-top-outlined',
-    'vertical-left-outlined',
-    'vertical-right-outlined',
-    'video-camera-add-outlined',
-    'video-camera-filled',
-    'video-camera-outlined',
-    'video-camera-twotone',
-    'wallet-filled',
-    'wallet-outlined',
-    'wallet-twotone',
-    'warning-filled',
-    'warning-outlined',
-    'warning-twotone',
-    'wechat-filled',
-    'wechat-outlined',
-    'weibo-circle-filled',
-    'weibo-circle-outlined',
-    'weibo-outlined',
-    'weibo-square-filled',
-    'weibo-square-outlined',
-    'whats-app-outlined',
-    'wifi-outlined',
-    'windows-filled',
-    'windows-outlined',
-    'woman-outlined',
-    'yahoo-filled',
-    'yahoo-outlined',
-    'youtube-filled',
-    'youtube-outlined',
-    'yuque-filled',
-    'yuque-outlined',
-    'zhihu-circle-filled',
-    'zhihu-outlined',
-    'zhihu-square-filled',
-    'zoom-in-outlined',
-    'zoom-out-outlined',
+    "account-book-filled",
+    "account-book-outlined",
+    "account-book-twotone",
+    "aim-outlined",
+    "alert-filled",
+    "alert-outlined",
+    "alert-twotone",
+    "alibaba-outlined",
+    "align-center-outlined",
+    "align-left-outlined",
+    "align-right-outlined",
+    "alipay-circle-filled",
+    "alipay-circle-outlined",
+    "alipay-outlined",
+    "alipay-square-filled",
+    "aliwangwang-filled",
+    "aliwangwang-outlined",
+    "aliyun-outlined",
+    "amazon-circle-filled",
+    "amazon-outlined",
+    "amazon-square-filled",
+    "android-filled",
+    "android-outlined",
+    "ant-cloud-outlined",
+    "ant-design-outlined",
+    "apartment-outlined",
+    "api-filled",
+    "api-outlined",
+    "api-twotone",
+    "apple-filled",
+    "apple-outlined",
+    "appstore-add-outlined",
+    "appstore-filled",
+    "appstore-outlined",
+    "appstore-twotone",
+    "area-chart-outlined",
+    "arrow-down-outlined",
+    "arrow-left-outlined",
+    "arrow-right-outlined",
+    "arrow-up-outlined",
+    "arrows-alt-outlined",
+    "audio-filled",
+    "audio-muted-outlined",
+    "audio-outlined",
+    "audio-twotone",
+    "audit-outlined",
+    "backward-filled",
+    "backward-outlined",
+    "bank-filled",
+    "bank-outlined",
+    "bank-twotone",
+    "bar-chart-outlined",
+    "barcode-outlined",
+    "bars-outlined",
+    "behance-circle-filled",
+    "behance-outlined",
+    "behance-square-filled",
+    "behance-square-outlined",
+    "bell-filled",
+    "bell-outlined",
+    "bell-twotone",
+    "bg-colors-outlined",
+    "block-outlined",
+    "bold-outlined",
+    "book-filled",
+    "book-outlined",
+    "book-twotone",
+    "border-bottom-outlined",
+    "border-horizontal-outlined",
+    "border-inner-outlined",
+    "border-left-outlined",
+    "border-outer-outlined",
+    "border-outlined",
+    "border-right-outlined",
+    "border-top-outlined",
+    "border-verticle-outlined",
+    "borderless-table-outlined",
+    "box-plot-filled",
+    "box-plot-outlined",
+    "box-plot-twotone",
+    "branches-outlined",
+    "bug-filled",
+    "bug-outlined",
+    "bug-twotone",
+    "build-filled",
+    "build-outlined",
+    "build-twotone",
+    "bulb-filled",
+    "bulb-outlined",
+    "bulb-twotone",
+    "calculator-filled",
+    "calculator-outlined",
+    "calculator-twotone",
+    "calendar-filled",
+    "calendar-outlined",
+    "calendar-twotone",
+    "camera-filled",
+    "camera-outlined",
+    "camera-twotone",
+    "car-filled",
+    "car-outlined",
+    "car-twotone",
+    "caret-down-filled",
+    "caret-down-outlined",
+    "caret-left-filled",
+    "caret-left-outlined",
+    "caret-right-filled",
+    "caret-right-outlined",
+    "caret-up-filled",
+    "caret-up-outlined",
+    "carry-out-filled",
+    "carry-out-outlined",
+    "carry-out-twotone",
+    "check-circle-filled",
+    "check-circle-outlined",
+    "check-circle-twotone",
+    "check-outlined",
+    "check-square-filled",
+    "check-square-outlined",
+    "check-square-twotone",
+    "chrome-filled",
+    "chrome-outlined",
+    "ci-circle-filled",
+    "ci-circle-outlined",
+    "ci-circle-twotone",
+    "ci-outlined",
+    "ci-twotone",
+    "clear-outlined",
+    "clock-circle-filled",
+    "clock-circle-outlined",
+    "clock-circle-twotone",
+    "close-circle-filled",
+    "close-circle-outlined",
+    "close-circle-twotone",
+    "close-outlined",
+    "close-square-filled",
+    "close-square-outlined",
+    "close-square-twotone",
+    "cloud-download-outlined",
+    "cloud-filled",
+    "cloud-outlined",
+    "cloud-server-outlined",
+    "cloud-sync-outlined",
+    "cloud-twotone",
+    "cloud-upload-outlined",
+    "cluster-outlined",
+    "code-filled",
+    "code-outlined",
+    "code-sandbox-circle-filled",
+    "code-sandbox-outlined",
+    "code-sandbox-square-filled",
+    "code-twotone",
+    "codepen-circle-filled",
+    "codepen-circle-outlined",
+    "codepen-outlined",
+    "codepen-square-filled",
+    "coffee-outlined",
+    "column-height-outlined",
+    "column-width-outlined",
+    "comment-outlined",
+    "compass-filled",
+    "compass-outlined",
+    "compass-twotone",
+    "compress-outlined",
+    "console-sql-outlined",
+    "contacts-filled",
+    "contacts-outlined",
+    "contacts-twotone",
+    "container-filled",
+    "container-outlined",
+    "container-twotone",
+    "control-filled",
+    "control-outlined",
+    "control-twotone",
+    "copy-filled",
+    "copy-outlined",
+    "copy-twotone",
+    "copyright-circle-filled",
+    "copyright-circle-outlined",
+    "copyright-circle-twotone",
+    "copyright-outlined",
+    "copyright-twotone",
+    "credit-card-filled",
+    "credit-card-outlined",
+    "credit-card-twotone",
+    "crown-filled",
+    "crown-outlined",
+    "crown-twotone",
+    "customer-service-filled",
+    "customer-service-outlined",
+    "customer-service-twotone",
+    "dash-outlined",
+    "dashboard-filled",
+    "dashboard-outlined",
+    "dashboard-twotone",
+    "database-filled",
+    "database-outlined",
+    "database-twotone",
+    "delete-column-outlined",
+    "delete-filled",
+    "delete-outlined",
+    "delete-row-outlined",
+    "delete-twotone",
+    "delivered-procedure-outlined",
+    "deployment-unit-outlined",
+    "desktop-outlined",
+    "diff-filled",
+    "diff-outlined",
+    "diff-twotone",
+    "dingding-outlined",
+    "dingtalk-circle-filled",
+    "dingtalk-outlined",
+    "dingtalk-square-filled",
+    "disconnect-outlined",
+    "dislike-filled",
+    "dislike-outlined",
+    "dislike-twotone",
+    "dollar-circle-filled",
+    "dollar-circle-outlined",
+    "dollar-circle-twotone",
+    "dollar-outlined",
+    "dollar-twotone",
+    "dot-chart-outlined",
+    "double-left-outlined",
+    "double-right-outlined",
+    "down-circle-filled",
+    "down-circle-outlined",
+    "down-circle-twotone",
+    "down-outlined",
+    "down-square-filled",
+    "down-square-outlined",
+    "down-square-twotone",
+    "download-outlined",
+    "drag-outlined",
+    "dribbble-circle-filled",
+    "dribbble-outlined",
+    "dribbble-square-filled",
+    "dribbble-square-outlined",
+    "dropbox-circle-filled",
+    "dropbox-outlined",
+    "dropbox-square-filled",
+    "edit-filled",
+    "edit-outlined",
+    "edit-twotone",
+    "ellipsis-outlined",
+    "enter-outlined",
+    "environment-filled",
+    "environment-outlined",
+    "environment-twotone",
+    "euro-circle-filled",
+    "euro-circle-outlined",
+    "euro-circle-twotone",
+    "euro-outlined",
+    "euro-twotone",
+    "exception-outlined",
+    "exclamation-circle-filled",
+    "exclamation-circle-outlined",
+    "exclamation-circle-twotone",
+    "exclamation-outlined",
+    "expand-alt-outlined",
+    "expand-outlined",
+    "experiment-filled",
+    "experiment-outlined",
+    "experiment-twotone",
+    "export-outlined",
+    "eye-filled",
+    "eye-invisible-filled",
+    "eye-invisible-outlined",
+    "eye-invisible-twotone",
+    "eye-outlined",
+    "eye-twotone",
+    "facebook-filled",
+    "facebook-outlined",
+    "fall-outlined",
+    "fast-backward-filled",
+    "fast-backward-outlined",
+    "fast-forward-filled",
+    "fast-forward-outlined",
+    "field-binary-outlined",
+    "field-number-outlined",
+    "field-string-outlined",
+    "field-time-outlined",
+    "file-add-filled",
+    "file-add-outlined",
+    "file-add-twotone",
+    "file-done-outlined",
+    "file-excel-filled",
+    "file-excel-outlined",
+    "file-excel-twotone",
+    "file-exclamation-filled",
+    "file-exclamation-outlined",
+    "file-exclamation-twotone",
+    "file-filled",
+    "file-gif-outlined",
+    "file-image-filled",
+    "file-image-outlined",
+    "file-image-twotone",
+    "file-jpg-outlined",
+    "file-markdown-filled",
+    "file-markdown-outlined",
+    "file-markdown-twotone",
+    "file-outlined",
+    "file-pdf-filled",
+    "file-pdf-outlined",
+    "file-pdf-twotone",
+    "file-ppt-filled",
+    "file-ppt-outlined",
+    "file-ppt-twotone",
+    "file-protect-outlined",
+    "file-search-outlined",
+    "file-sync-outlined",
+    "file-text-filled",
+    "file-text-outlined",
+    "file-text-twotone",
+    "file-twotone",
+    "file-unknown-filled",
+    "file-unknown-outlined",
+    "file-unknown-twotone",
+    "file-word-filled",
+    "file-word-outlined",
+    "file-word-twotone",
+    "file-zip-filled",
+    "file-zip-outlined",
+    "file-zip-twotone",
+    "filter-filled",
+    "filter-outlined",
+    "filter-twotone",
+    "fire-filled",
+    "fire-outlined",
+    "fire-twotone",
+    "flag-filled",
+    "flag-outlined",
+    "flag-twotone",
+    "folder-add-filled",
+    "folder-add-outlined",
+    "folder-add-twotone",
+    "folder-filled",
+    "folder-open-filled",
+    "folder-open-outlined",
+    "folder-open-twotone",
+    "folder-outlined",
+    "folder-twotone",
+    "folder-view-outlined",
+    "font-colors-outlined",
+    "font-size-outlined",
+    "fork-outlined",
+    "form-outlined",
+    "format-painter-filled",
+    "format-painter-outlined",
+    "forward-filled",
+    "forward-outlined",
+    "frown-filled",
+    "frown-outlined",
+    "frown-twotone",
+    "fullscreen-exit-outlined",
+    "fullscreen-outlined",
+    "function-outlined",
+    "fund-filled",
+    "fund-outlined",
+    "fund-projection-screen-outlined",
+    "fund-twotone",
+    "fund-view-outlined",
+    "funnel-plot-filled",
+    "funnel-plot-outlined",
+    "funnel-plot-twotone",
+    "gateway-outlined",
+    "gif-outlined",
+    "gift-filled",
+    "gift-outlined",
+    "gift-twotone",
+    "github-filled",
+    "github-outlined",
+    "gitlab-filled",
+    "gitlab-outlined",
+    "global-outlined",
+    "gold-filled",
+    "gold-outlined",
+    "gold-twotone",
+    "golden-filled",
+    "google-circle-filled",
+    "google-outlined",
+    "google-plus-circle-filled",
+    "google-plus-outlined",
+    "google-plus-square-filled",
+    "google-square-filled",
+    "group-outlined",
+    "hdd-filled",
+    "hdd-outlined",
+    "hdd-twotone",
+    "heart-filled",
+    "heart-outlined",
+    "heart-twotone",
+    "heat-map-outlined",
+    "highlight-filled",
+    "highlight-outlined",
+    "highlight-twotone",
+    "history-outlined",
+    "home-filled",
+    "home-outlined",
+    "home-twotone",
+    "hourglass-filled",
+    "hourglass-outlined",
+    "hourglass-twotone",
+    "html5-filled",
+    "html5-outlined",
+    "html5-twotone",
+    "idcard-filled",
+    "idcard-outlined",
+    "idcard-twotone",
+    "ie-circle-filled",
+    "ie-outlined",
+    "ie-square-filled",
+    "import-outlined",
+    "inbox-outlined",
+    "info-circle-filled",
+    "info-circle-outlined",
+    "info-circle-twotone",
+    "info-outlined",
+    "insert-row-above-outlined",
+    "insert-row-below-outlined",
+    "insert-row-left-outlined",
+    "insert-row-right-outlined",
+    "instagram-filled",
+    "instagram-outlined",
+    "insurance-filled",
+    "insurance-outlined",
+    "insurance-twotone",
+    "interaction-filled",
+    "interaction-outlined",
+    "interaction-twotone",
+    "issues-close-outlined",
+    "italic-outlined",
+    "key-outlined",
+    "laptop-outlined",
+    "layout-filled",
+    "layout-outlined",
+    "layout-twotone",
+    "left-circle-filled",
+    "left-circle-outlined",
+    "left-circle-twotone",
+    "left-outlined",
+    "left-square-filled",
+    "left-square-outlined",
+    "left-square-twotone",
+    "like-filled",
+    "like-outlined",
+    "like-twotone",
+    "line-chart-outlined",
+    "line-height-outlined",
+    "line-outlined",
+    "link-outlined",
+    "linkedin-filled",
+    "linkedin-outlined",
+    "loading-3-quarters-outlined",
+    "loading-outlined",
+    "lock-filled",
+    "lock-outlined",
+    "lock-twotone",
+    "login-outlined",
+    "logout-outlined",
+    "mac-command-filled",
+    "mac-command-outlined",
+    "mail-filled",
+    "mail-outlined",
+    "mail-twotone",
+    "man-outlined",
+    "medicine-box-filled",
+    "medicine-box-outlined",
+    "medicine-box-twotone",
+    "medium-circle-filled",
+    "medium-outlined",
+    "medium-square-filled",
+    "medium-workmark-outlined",
+    "meh-filled",
+    "meh-outlined",
+    "meh-twotone",
+    "menu-fold-outlined",
+    "menu-outlined",
+    "menu-unfold-outlined",
+    "merge-cells-outlined",
+    "message-filled",
+    "message-outlined",
+    "message-twotone",
+    "minus-circle-filled",
+    "minus-circle-outlined",
+    "minus-circle-twotone",
+    "minus-outlined",
+    "minus-square-filled",
+    "minus-square-outlined",
+    "minus-square-twotone",
+    "mobile-filled",
+    "mobile-outlined",
+    "mobile-twotone",
+    "money-collect-filled",
+    "money-collect-outlined",
+    "money-collect-twotone",
+    "monitor-outlined",
+    "more-outlined",
+    "node-collapse-outlined",
+    "node-expand-outlined",
+    "node-index-outlined",
+    "notification-filled",
+    "notification-outlined",
+    "notification-twotone",
+    "number-outlined",
+    "one-to-one-outlined",
+    "ordered-list-outlined",
+    "paper-clip-outlined",
+    "partition-outlined",
+    "pause-circle-filled",
+    "pause-circle-outlined",
+    "pause-circle-twotone",
+    "pause-outlined",
+    "pay-circle-filled",
+    "pay-circle-outlined",
+    "percentage-outlined",
+    "phone-filled",
+    "phone-outlined",
+    "phone-twotone",
+    "pic-center-outlined",
+    "pic-left-outlined",
+    "pic-right-outlined",
+    "picture-filled",
+    "picture-outlined",
+    "picture-twotone",
+    "pie-chart-filled",
+    "pie-chart-outlined",
+    "pie-chart-twotone",
+    "play-circle-filled",
+    "play-circle-outlined",
+    "play-circle-twotone",
+    "play-square-filled",
+    "play-square-outlined",
+    "play-square-twotone",
+    "plus-circle-filled",
+    "plus-circle-outlined",
+    "plus-circle-twotone",
+    "plus-outlined",
+    "plus-square-filled",
+    "plus-square-outlined",
+    "plus-square-twotone",
+    "pound-circle-filled",
+    "pound-circle-outlined",
+    "pound-circle-twotone",
+    "pound-outlined",
+    "poweroff-outlined",
+    "printer-filled",
+    "printer-outlined",
+    "printer-twotone",
+    "profile-filled",
+    "profile-outlined",
+    "profile-twotone",
+    "project-filled",
+    "project-outlined",
+    "project-twotone",
+    "property-safety-filled",
+    "property-safety-outlined",
+    "property-safety-twotone",
+    "pull-request-outlined",
+    "pushpin-filled",
+    "pushpin-outlined",
+    "pushpin-twotone",
+    "qq-circle-filled",
+    "qq-outlined",
+    "qq-square-filled",
+    "qrcode-outlined",
+    "question-circle-filled",
+    "question-circle-outlined",
+    "question-circle-twotone",
+    "question-outlined",
+    "radar-chart-outlined",
+    "radius-bottomleft-outlined",
+    "radius-bottomright-outlined",
+    "radius-setting-outlined",
+    "radius-upleft-outlined",
+    "radius-upright-outlined",
+    "read-filled",
+    "read-outlined",
+    "reconciliation-filled",
+    "reconciliation-outlined",
+    "reconciliation-twotone",
+    "red-envelope-filled",
+    "red-envelope-outlined",
+    "red-envelope-twotone",
+    "reddit-circle-filled",
+    "reddit-outlined",
+    "reddit-square-filled",
+    "redo-outlined",
+    "reload-outlined",
+    "rest-filled",
+    "rest-outlined",
+    "rest-twotone",
+    "retweet-outlined",
+    "right-circle-filled",
+    "right-circle-outlined",
+    "right-circle-twotone",
+    "right-outlined",
+    "right-square-filled",
+    "right-square-outlined",
+    "right-square-twotone",
+    "rise-outlined",
+    "robot-filled",
+    "robot-outlined",
+    "rocket-filled",
+    "rocket-outlined",
+    "rocket-twotone",
+    "rollback-outlined",
+    "rotate-left-outlined",
+    "rotate-right-outlined",
+    "safety-certificate-filled",
+    "safety-certificate-outlined",
+    "safety-certificate-twotone",
+    "safety-outlined",
+    "save-filled",
+    "save-outlined",
+    "save-twotone",
+    "scan-outlined",
+    "schedule-filled",
+    "schedule-outlined",
+    "schedule-twotone",
+    "scissor-outlined",
+    "search-outlined",
+    "security-scan-filled",
+    "security-scan-outlined",
+    "security-scan-twotone",
+    "select-outlined",
+    "send-outlined",
+    "setting-filled",
+    "setting-outlined",
+    "setting-twotone",
+    "shake-outlined",
+    "share-alt-outlined",
+    "shop-filled",
+    "shop-outlined",
+    "shop-twotone",
+    "shopping-cart-outlined",
+    "shopping-filled",
+    "shopping-outlined",
+    "shopping-twotone",
+    "shrink-outlined",
+    "signal-filled",
+    "sisternode-outlined",
+    "sketch-circle-filled",
+    "sketch-outlined",
+    "sketch-square-filled",
+    "skin-filled",
+    "skin-outlined",
+    "skin-twotone",
+    "skype-filled",
+    "skype-outlined",
+    "slack-circle-filled",
+    "slack-outlined",
+    "slack-square-filled",
+    "slack-square-outlined",
+    "sliders-filled",
+    "sliders-outlined",
+    "sliders-twotone",
+    "small-dash-outlined",
+    "smile-filled",
+    "smile-outlined",
+    "smile-twotone",
+    "snippets-filled",
+    "snippets-outlined",
+    "snippets-twotone",
+    "solution-outlined",
+    "sort-ascending-outlined",
+    "sort-descending-outlined",
+    "sound-filled",
+    "sound-outlined",
+    "sound-twotone",
+    "split-cells-outlined",
+    "star-filled",
+    "star-outlined",
+    "star-twotone",
+    "step-backward-filled",
+    "step-backward-outlined",
+    "step-forward-filled",
+    "step-forward-outlined",
+    "stock-outlined",
+    "stop-filled",
+    "stop-outlined",
+    "stop-twotone",
+    "strikethrough-outlined",
+    "subnode-outlined",
+    "swap-left-outlined",
+    "swap-outlined",
+    "swap-right-outlined",
+    "switcher-filled",
+    "switcher-outlined",
+    "switcher-twotone",
+    "sync-outlined",
+    "table-outlined",
+    "tablet-filled",
+    "tablet-outlined",
+    "tablet-twotone",
+    "tag-filled",
+    "tag-outlined",
+    "tag-twotone",
+    "tags-filled",
+    "tags-outlined",
+    "tags-twotone",
+    "taobao-circle-filled",
+    "taobao-circle-outlined",
+    "taobao-outlined",
+    "taobao-square-filled",
+    "team-outlined",
+    "thunderbolt-filled",
+    "thunderbolt-outlined",
+    "thunderbolt-twotone",
+    "to-top-outlined",
+    "tool-filled",
+    "tool-outlined",
+    "tool-twotone",
+    "trademark-circle-filled",
+    "trademark-circle-outlined",
+    "trademark-circle-twotone",
+    "trademark-outlined",
+    "transaction-outlined",
+    "translation-outlined",
+    "trophy-filled",
+    "trophy-outlined",
+    "trophy-twotone",
+    "twitter-circle-filled",
+    "twitter-outlined",
+    "twitter-square-filled",
+    "underline-outlined",
+    "undo-outlined",
+    "ungroup-outlined",
+    "unlock-filled",
+    "unlock-outlined",
+    "unlock-twotone",
+    "unordered-list-outlined",
+    "up-circle-filled",
+    "up-circle-outlined",
+    "up-circle-twotone",
+    "up-outlined",
+    "up-square-filled",
+    "up-square-outlined",
+    "up-square-twotone",
+    "upload-outlined",
+    "usb-filled",
+    "usb-outlined",
+    "usb-twotone",
+    "user-add-outlined",
+    "user-delete-outlined",
+    "user-outlined",
+    "user-switch-outlined",
+    "usergroup-add-outlined",
+    "usergroup-delete-outlined",
+    "verified-outlined",
+    "vertical-align-bottom-outlined",
+    "vertical-align-middle-outlined",
+    "vertical-align-top-outlined",
+    "vertical-left-outlined",
+    "vertical-right-outlined",
+    "video-camera-add-outlined",
+    "video-camera-filled",
+    "video-camera-outlined",
+    "video-camera-twotone",
+    "wallet-filled",
+    "wallet-outlined",
+    "wallet-twotone",
+    "warning-filled",
+    "warning-outlined",
+    "warning-twotone",
+    "wechat-filled",
+    "wechat-outlined",
+    "weibo-circle-filled",
+    "weibo-circle-outlined",
+    "weibo-outlined",
+    "weibo-square-filled",
+    "weibo-square-outlined",
+    "whats-app-outlined",
+    "wifi-outlined",
+    "windows-filled",
+    "windows-outlined",
+    "woman-outlined",
+    "yahoo-filled",
+    "yahoo-outlined",
+    "youtube-filled",
+    "youtube-outlined",
+    "yuque-filled",
+    "yuque-outlined",
+    "zhihu-circle-filled",
+    "zhihu-outlined",
+    "zhihu-square-filled",
+    "zoom-in-outlined",
+    "zoom-out-outlined",
   ],
 };
diff --git a/src/components/Icon/index.ts b/src/components/Icon/index.ts
index 01e7d2361c39fe04c7c564ef8a7ce4b5ac74875f..bac2d66e0c44348b43836d42c1049a06c4976a65 100644
--- a/src/components/Icon/index.ts
+++ b/src/components/Icon/index.ts
@@ -1,6 +1,6 @@
-import Icon from './src/Icon.vue';
-import SvgIcon from './src/SvgIcon.vue';
-import IconPicker from './src/IconPicker.vue';
+import Icon from "./src/Icon.vue";
+import SvgIcon from "./src/SvgIcon.vue";
+import IconPicker from "./src/IconPicker.vue";
 
 export { Icon, IconPicker, SvgIcon };
 
diff --git a/src/components/Icon/src/Icon.vue b/src/components/Icon/src/Icon.vue
index 4956cf073a2b280fc2aff7c83606127b80528738..54bba52cbefd37f95e9bfc6726ba5b7899953273 100644
--- a/src/components/Icon/src/Icon.vue
+++ b/src/components/Icon/src/Icon.vue
@@ -14,7 +14,7 @@
   ></span>
 </template>
 <script lang="ts">
-  import type { PropType } from 'vue';
+  import type { PropType } from "vue";
   import {
     defineComponent,
     ref,
@@ -24,15 +24,15 @@
     unref,
     computed,
     CSSProperties,
-  } from 'vue';
-  import SvgIcon from './SvgIcon.vue';
-  import Iconify from '@purge-icons/generated';
-  import { isString } from '/@/utils/is';
-  import { propTypes } from '/@/utils/propTypes';
+  } from "vue";
+  import SvgIcon from "./SvgIcon.vue";
+  import Iconify from "@purge-icons/generated";
+  import { isString } from "/@/utils/is";
+  import { propTypes } from "/@/utils/propTypes";
 
-  const SVG_END_WITH_FLAG = '|svg';
+  const SVG_END_WITH_FLAG = "|svg";
   export default defineComponent({
-    name: 'Icon',
+    name: "Icon",
     components: { SvgIcon },
     props: {
       // icon name
@@ -45,14 +45,14 @@
         default: 16,
       },
       spin: propTypes.bool.def(false),
-      prefix: propTypes.string.def(''),
+      prefix: propTypes.string.def(""),
     },
     setup(props) {
       const elRef = ref<ElRef>(null);
 
       const isSvgIcon = computed(() => props.icon?.endsWith(SVG_END_WITH_FLAG));
-      const getSvgIcon = computed(() => props.icon.replace(SVG_END_WITH_FLAG, ''));
-      const getIconRef = computed(() => `${props.prefix ? props.prefix + ':' : ''}${props.icon}`);
+      const getSvgIcon = computed(() => props.icon.replace(SVG_END_WITH_FLAG, ""));
+      const getIconRef = computed(() => `${props.prefix ? props.prefix + ":" : ""}${props.icon}`);
 
       const update = async () => {
         if (unref(isSvgIcon)) return;
@@ -66,13 +66,13 @@
 
         const svg = Iconify.renderSVG(icon, {});
         if (svg) {
-          el.textContent = '';
+          el.textContent = "";
           el.appendChild(svg);
         } else {
-          const span = document.createElement('span');
-          span.className = 'iconify';
+          const span = document.createElement("span");
+          span.className = "iconify";
           span.dataset.icon = icon;
-          el.textContent = '';
+          el.textContent = "";
           el.appendChild(span);
         }
       };
@@ -87,11 +87,11 @@
         return {
           fontSize: `${fs}px`,
           color: color,
-          display: 'inline-flex',
+          display: "inline-flex",
         };
       });
 
-      watch(() => props.icon, update, { flush: 'post' });
+      watch(() => props.icon, update, { flush: "post" });
 
       onMounted(update);
 
diff --git a/src/components/Icon/src/IconPicker.vue b/src/components/Icon/src/IconPicker.vue
index e939c226044cfbec06e55c266030a06218fb44fb..ec7b8c8ae35a968e77dd55f1c3561a13115582a4 100644
--- a/src/components/Icon/src/IconPicker.vue
+++ b/src/components/Icon/src/IconPicker.vue
@@ -31,18 +31,7 @@
                   v-for="icon in getPaginationList"
                   :key="icon"
                   :class="currentSelect === icon ? 'border border-primary' : ''"
-                  class="
-                    p-2
-                    w-1/8
-                    cursor-pointer
-                    mr-1
-                    mt-1
-                    flex
-                    justify-center
-                    items-center
-                    border border-solid
-                    hover:border-primary
-                  "
+                  class="p-2 w-1/8 cursor-pointer mr-1 mt-1 flex justify-center items-center border border-solid hover:border-primary"
                   @click="handleClick(icon)"
                   :title="icon"
                 >
@@ -76,21 +65,21 @@
   </a-input>
 </template>
 <script lang="ts" setup>
-  import { ref, watchEffect, watch, unref } from 'vue';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { ScrollContainer } from '/@/components/Container';
-  import { Input, Popover, Pagination, Empty } from 'ant-design-vue';
-  import Icon from './Icon.vue';
-  import SvgIcon from './SvgIcon.vue';
-
-  import iconsData from '../data/icons.data';
-  import { propTypes } from '/@/utils/propTypes';
-  import { usePagination } from '/@/hooks/web/usePagination';
-  import { useDebounceFn } from '@vueuse/core';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { useCopyToClipboard } from '/@/hooks/web/useCopyToClipboard';
-  import { useMessage } from '/@/hooks/web/useMessage';
-  import svgIcons from 'virtual:svg-icons-names';
+  import { ref, watchEffect, watch, unref } from "vue";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { ScrollContainer } from "/@/components/Container";
+  import { Input, Popover, Pagination, Empty } from "ant-design-vue";
+  import Icon from "./Icon.vue";
+  import SvgIcon from "./SvgIcon.vue";
+
+  import iconsData from "../data/icons.data";
+  import { propTypes } from "/@/utils/propTypes";
+  import { usePagination } from "/@/hooks/web/usePagination";
+  import { useDebounceFn } from "@vueuse/core";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { useCopyToClipboard } from "/@/hooks/web/useCopyToClipboard";
+  import { useMessage } from "/@/hooks/web/useMessage";
+  import svgIcons from "virtual:svg-icons-names";
 
   // 没有使用别名引入,是因为WebStorm当前版本还不能正确识别,会报unused警告
   const AInput = Input;
@@ -100,7 +89,7 @@
 
   function getIcons() {
     const data = iconsData as any;
-    const prefix: string = data?.prefix ?? '';
+    const prefix: string = data?.prefix ?? "";
     let result: string[] = [];
     if (prefix) {
       result = (data?.icons ?? []).map((item) => `${prefix}:${item}`);
@@ -111,28 +100,28 @@
   }
 
   function getSvgIcons() {
-    return svgIcons.map((icon) => icon.replace('icon-', ''));
+    return svgIcons.map((icon) => icon.replace("icon-", ""));
   }
 
   const props = defineProps({
     value: propTypes.string,
-    width: propTypes.string.def('100%'),
+    width: propTypes.string.def("100%"),
     pageSize: propTypes.number.def(140),
     copy: propTypes.bool.def(false),
-    mode: propTypes.oneOf<('svg' | 'iconify')[]>(['svg', 'iconify']).def('iconify'),
+    mode: propTypes.oneOf<("svg" | "iconify")[]>(["svg", "iconify"]).def("iconify"),
   });
 
-  const emit = defineEmits(['change', 'update:value']);
+  const emit = defineEmits(["change", "update:value"]);
 
-  const isSvgMode = props.mode === 'svg';
+  const isSvgMode = props.mode === "svg";
   const icons = isSvgMode ? getSvgIcons() : getIcons();
 
-  const currentSelect = ref('');
+  const currentSelect = ref("");
   const visible = ref(false);
   const currentList = ref(icons);
 
   const { t } = useI18n();
-  const { prefixCls } = useDesign('icon-picker');
+  const { prefixCls } = useDesign("icon-picker");
 
   const debounceHandleSearchChange = useDebounceFn(handleSearchChange, 100);
   const { clipboardRef, isSuccessRef } = useCopyToClipboard(props.value);
@@ -150,8 +139,8 @@
   watch(
     () => currentSelect.value,
     (v) => {
-      emit('update:value', v);
-      return emit('change', v);
+      emit("update:value", v);
+      return emit("change", v);
     },
   );
 
@@ -164,7 +153,7 @@
     if (props.copy) {
       clipboardRef.value = icon;
       if (unref(isSuccessRef)) {
-        createMessage.success(t('component.icon.copy'));
+        createMessage.success(t("component.icon.copy"));
       }
     }
   }
@@ -180,7 +169,7 @@
   }
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-icon-picker';
+  @prefix-cls: ~"@{namespace}-icon-picker";
 
   .@{prefix-cls} {
     .ant-input-group-addon {
diff --git a/src/components/Icon/src/SvgIcon.vue b/src/components/Icon/src/SvgIcon.vue
index 2afa4de16ca9b198d2fc5ede6aca51d314fe85a3..10f5c0821be0a562854bbf15086d76e090e68065 100644
--- a/src/components/Icon/src/SvgIcon.vue
+++ b/src/components/Icon/src/SvgIcon.vue
@@ -8,16 +8,16 @@
   </svg>
 </template>
 <script lang="ts">
-  import type { CSSProperties } from 'vue';
-  import { defineComponent, computed } from 'vue';
-  import { useDesign } from '/@/hooks/web/useDesign';
+  import type { CSSProperties } from "vue";
+  import { defineComponent, computed } from "vue";
+  import { useDesign } from "/@/hooks/web/useDesign";
 
   export default defineComponent({
-    name: 'SvgIcon',
+    name: "SvgIcon",
     props: {
       prefix: {
         type: String,
-        default: 'icon',
+        default: "icon",
       },
       name: {
         type: String,
@@ -33,13 +33,13 @@
       },
     },
     setup(props) {
-      const { prefixCls } = useDesign('svg-icon');
+      const { prefixCls } = useDesign("svg-icon");
       const symbolId = computed(() => `#${props.prefix}-${props.name}`);
 
       const getStyle = computed((): CSSProperties => {
         const { size } = props;
         let s = `${size}`;
-        s = `${s.replace('px', '')}px`;
+        s = `${s.replace("px", "")}px`;
         return {
           width: s,
           height: s,
@@ -50,7 +50,7 @@
   });
 </script>
 <style lang="less" scoped>
-  @prefix-cls: ~'@{namespace}-svg-icon';
+  @prefix-cls: ~"@{namespace}-svg-icon";
 
   .@{prefix-cls} {
     display: inline-block;
diff --git a/src/components/Loading/index.ts b/src/components/Loading/index.ts
index 3673a44dc66c7abcb8206d71301005ddbf051f8a..889fa67c6744a0f89e88d5bab3d80151ee79384d 100644
--- a/src/components/Loading/index.ts
+++ b/src/components/Loading/index.ts
@@ -1,5 +1,5 @@
-import Loading from './src/Loading.vue';
+import Loading from "./src/Loading.vue";
 
 export { Loading };
-export { useLoading } from './src/useLoading';
-export { createLoading } from './src/createLoading';
+export { useLoading } from "./src/useLoading";
+export { createLoading } from "./src/createLoading";
diff --git a/src/components/Loading/src/Loading.vue b/src/components/Loading/src/Loading.vue
index 0f52b289396e841f76c75170bace3947f8a95c63..060cbf4b887268bd80002157d401a8bd2cf16089 100644
--- a/src/components/Loading/src/Loading.vue
+++ b/src/components/Loading/src/Loading.vue
@@ -9,18 +9,18 @@
   </section>
 </template>
 <script lang="ts">
-  import { PropType } from 'vue';
-  import { defineComponent } from 'vue';
-  import { Spin } from 'ant-design-vue';
-  import { SizeEnum } from '/@/enums/sizeEnum';
+  import { PropType } from "vue";
+  import { defineComponent } from "vue";
+  import { Spin } from "ant-design-vue";
+  import { SizeEnum } from "/@/enums/sizeEnum";
 
   export default defineComponent({
-    name: 'Loading',
+    name: "Loading",
     components: { Spin },
     props: {
       tip: {
         type: String as PropType<string>,
-        default: '',
+        default: "",
       },
       size: {
         type: String as PropType<SizeEnum>,
@@ -41,7 +41,7 @@
         type: String as PropType<string>,
       },
       theme: {
-        type: String as PropType<'dark' | 'light'>,
+        type: String as PropType<"dark" | "light">,
       },
     },
   });
@@ -67,7 +67,7 @@
     }
   }
 
-  html[data-theme='dark'] {
+  html[data-theme="dark"] {
     .full-loading:not(.light) {
       background-color: @modal-mask-bg;
     }
diff --git a/src/components/Loading/src/createLoading.ts b/src/components/Loading/src/createLoading.ts
index 966ca53bf98948f1bc9f06caa822c264dd175c1f..64772675546491234ca19b9e764668bf668a53a4 100644
--- a/src/components/Loading/src/createLoading.ts
+++ b/src/components/Loading/src/createLoading.ts
@@ -1,13 +1,13 @@
-import { VNode, defineComponent } from 'vue';
-import type { LoadingProps } from './typing';
+import { VNode, defineComponent } from "vue";
+import type { LoadingProps } from "./typing";
 
-import { createVNode, render, reactive, h } from 'vue';
-import Loading from './Loading.vue';
+import { createVNode, render, reactive, h } from "vue";
+import Loading from "./Loading.vue";
 
 export function createLoading(props?: Partial<LoadingProps>, target?: HTMLElement, wait = false) {
   let vm: Nullable<VNode> = null;
   const data = reactive({
-    tip: '',
+    tip: "",
     loading: true,
     ...props,
   });
@@ -23,10 +23,10 @@ export function createLoading(props?: Partial<LoadingProps>, target?: HTMLElemen
   if (wait) {
     // TODO fix https://github.com/anncwb/vue-vben-admin/issues/438
     setTimeout(() => {
-      render(vm, document.createElement('div'));
+      render(vm, document.createElement("div"));
     }, 0);
   } else {
-    render(vm, document.createElement('div'));
+    render(vm, document.createElement("div"));
   }
 
   function close() {
diff --git a/src/components/Loading/src/typing.ts b/src/components/Loading/src/typing.ts
index 9af60e612a4d9f09bc8c5c9c43270c4b8710855d..0f30ee8900cfcb34ca16c2b5b3ffdb9312cffdcc 100644
--- a/src/components/Loading/src/typing.ts
+++ b/src/components/Loading/src/typing.ts
@@ -1,4 +1,4 @@
-import { SizeEnum } from '/@/enums/sizeEnum';
+import { SizeEnum } from "/@/enums/sizeEnum";
 
 export interface LoadingProps {
   tip: string;
@@ -6,5 +6,5 @@ export interface LoadingProps {
   absolute: boolean;
   loading: boolean;
   background: string;
-  theme: 'dark' | 'light';
+  theme: "dark" | "light";
 }
diff --git a/src/components/Loading/src/useLoading.ts b/src/components/Loading/src/useLoading.ts
index 356df7de8a3cd524a91f58425596d97223ecaf63..e1a6ad7ee89104fa03a8f8e5006083eeeee94af0 100644
--- a/src/components/Loading/src/useLoading.ts
+++ b/src/components/Loading/src/useLoading.ts
@@ -1,7 +1,7 @@
-import { unref } from 'vue';
-import { createLoading } from './createLoading';
-import type { LoadingProps } from './typing';
-import type { Ref } from 'vue';
+import { unref } from "vue";
+import { createLoading } from "./createLoading";
+import type { LoadingProps } from "./typing";
+import type { Ref } from "vue";
 
 export interface UseLoadingOptions {
   target?: any;
@@ -21,7 +21,7 @@ export function useLoading(
   let props: Partial<LoadingProps>;
   let target: HTMLElement | Ref<ElRef> = document.body;
 
-  if (Reflect.has(opt, 'target') || Reflect.has(opt, 'props')) {
+  if (Reflect.has(opt, "target") || Reflect.has(opt, "props")) {
     const options = opt as Partial<UseLoadingOptions>;
     props = options.props || {};
     target = options.target || document.body;
diff --git a/src/components/Markdown/index.ts b/src/components/Markdown/index.ts
index d337681ff7f3337320a2930b68c7fb6cbb78a9eb..d13cfdc3ba260b831c491c788283c7402291263e 100644
--- a/src/components/Markdown/index.ts
+++ b/src/components/Markdown/index.ts
@@ -1,7 +1,7 @@
-import { withInstall } from '/@/utils';
-import markDown from './src/Markdown.vue';
-import markDownViewer from './src/MarkdownViewer.vue';
+import { withInstall } from "/@/utils";
+import markDown from "./src/Markdown.vue";
+import markDownViewer from "./src/MarkdownViewer.vue";
 
 export const MarkDown = withInstall(markDown);
 export const MarkdownViewer = withInstall(markDownViewer);
-export * from './src/typing';
+export * from "./src/typing";
diff --git a/src/components/Markdown/src/Markdown.vue b/src/components/Markdown/src/Markdown.vue
index d8117631cbddca7c0f10459ff464c067ff9b3838..71ff4ab723cc6bc4831affdea2320fc8747a060a 100644
--- a/src/components/Markdown/src/Markdown.vue
+++ b/src/components/Markdown/src/Markdown.vue
@@ -2,7 +2,7 @@
   <div ref="wrapRef"></div>
 </template>
 <script lang="ts">
-  import type { Ref } from 'vue';
+  import type { Ref } from "vue";
   import {
     defineComponent,
     ref,
@@ -12,23 +12,24 @@
     watch,
     onBeforeUnmount,
     onDeactivated,
-  } from 'vue';
-  import Vditor from 'vditor';
-  import 'vditor/dist/index.css';
-  import { useLocale } from '/@/locales/useLocale';
-  import { useModalContext } from '../../Modal';
-  import { useRootSetting } from '/@/hooks/setting/useRootSetting';
-  import { onMountedOrActivated } from '/@/hooks/core/onMountedOrActivated';
+  } from "vue";
+  import Vditor from "vditor";
+  import "vditor/dist/index.css";
+  import { useLocale } from "/@/locales/useLocale";
+  import { useModalContext } from "../../Modal";
+  import { useRootSetting } from "/@/hooks/setting/useRootSetting";
+  import { onMountedOrActivated } from "/@/hooks/core/onMountedOrActivated";
+  import { getTheme } from "./getTheme";
 
-  type Lang = 'zh_CN' | 'en_US' | 'ja_JP' | 'ko_KR' | undefined;
+  type Lang = "zh_CN" | "en_US" | "ja_JP" | "ko_KR" | undefined;
 
   export default defineComponent({
     inheritAttrs: false,
     props: {
       height: { type: Number, default: 360 },
-      value: { type: String, default: '' },
+      value: { type: String, default: "" },
     },
-    emits: ['change', 'get', 'update:value'],
+    emits: ["change", "get", "update:value"],
     setup(props, { attrs, emit }) {
       const wrapRef = ref<ElRef>(null);
       const vditorRef = ref(null) as Ref<Nullable<Vditor>>;
@@ -38,7 +39,7 @@
 
       const { getLocale } = useLocale();
       const { getDarkMode } = useRootSetting();
-      const valueRef = ref(props.value || '');
+      const valueRef = ref(props.value || "");
 
       watch(
         [() => getDarkMode.value, () => initedRef.value],
@@ -46,12 +47,13 @@
           if (!inited) {
             return;
           }
-          const theme = val === 'dark' ? 'dark' : 'classic';
-          instance.getVditor()?.setTheme(theme);
+          instance
+            .getVditor()
+            ?.setTheme(getTheme(val) as any, getTheme(val, "content"), getTheme(val, "code"));
         },
         {
           immediate: true,
-          flush: 'post',
+          flush: "post",
         },
       );
 
@@ -65,20 +67,20 @@
         },
       );
 
-      const getCurrentLang = computed((): 'zh_CN' | 'en_US' | 'ja_JP' | 'ko_KR' => {
+      const getCurrentLang = computed((): "zh_CN" | "en_US" | "ja_JP" | "ko_KR" => {
         let lang: Lang;
         switch (unref(getLocale)) {
-          case 'en':
-            lang = 'en_US';
+          case "en":
+            lang = "en_US";
             break;
-          case 'ja':
-            lang = 'ja_JP';
+          case "ja":
+            lang = "ja_JP";
             break;
-          case 'ko':
-            lang = 'ko_KR';
+          case "ko":
+            lang = "ko_KR";
             break;
           default:
-            lang = 'zh_CN';
+            lang = "zh_CN";
         }
         return lang;
       });
@@ -87,19 +89,28 @@
         if (!wrapEl) return;
         const bindValue = { ...attrs, ...props };
         const insEditor = new Vditor(wrapEl, {
-          theme: getDarkMode.value === 'dark' ? 'dark' : 'classic',
+          // 设置外观主题
+          theme: getTheme(getDarkMode.value) as any,
           lang: unref(getCurrentLang),
-          mode: 'sv',
+          mode: "sv",
           fullscreen: {
             index: 520,
           },
           preview: {
+            theme: {
+              // 设置内容主题
+              current: getTheme(getDarkMode.value, "content"),
+            },
+            hljs: {
+              // 设置代码块主题
+              style: getTheme(getDarkMode.value, "code"),
+            },
             actions: [],
           },
           input: (v) => {
             valueRef.value = v;
-            emit('update:value', v);
-            emit('change', v);
+            emit("update:value", v);
+            emit("change", v);
           },
           after: () => {
             nextTick(() => {
@@ -107,7 +118,7 @@
               insEditor.setValue(valueRef.value);
               vditorRef.value = insEditor;
               initedRef.value = true;
-              emit('get', instance);
+              emit("get", instance);
             });
           },
           blur: () => {
diff --git a/src/components/Markdown/src/MarkdownViewer.vue b/src/components/Markdown/src/MarkdownViewer.vue
index 0091a90949fa0a321e2e7cfd4ef440e0664d253b..d62a946509257ad8b0d8b967ae6999eb8e95427c 100644
--- a/src/components/Markdown/src/MarkdownViewer.vue
+++ b/src/components/Markdown/src/MarkdownViewer.vue
@@ -1,23 +1,62 @@
 <template>
-  <!-- eslint-disable vue/no-v-html -->
-  <div v-html="getHtmlData" :class="$props.class" class="markdown-viewer"></div>
+  <div ref="viewerRef" id="markdownViewer" :class="$props.class"></div>
 </template>
 
 <script lang="ts" setup>
-  import { computed } from 'vue';
-  import showdown from 'showdown';
-
-  const converter = new showdown.Converter();
-  converter.setOption('tables', true);
+  import { defineProps, onBeforeUnmount, onDeactivated, Ref, ref, unref, watch } from "vue";
+  import VditorPreview from "vditor/dist/method.min";
+  import { onMountedOrActivated } from "/@/hooks/core/onMountedOrActivated";
+  import { useRootSetting } from "/@/hooks/setting/useRootSetting";
+  import { getTheme } from "./getTheme";
   const props = defineProps({
     value: { type: String },
     class: { type: String },
   });
-  const getHtmlData = computed(() => converter.makeHtml(props.value || ''));
-</script>
+  const viewerRef = ref<ElRef>(null);
+  const vditorPreviewRef = ref(null) as Ref<Nullable<VditorPreview>>;
+  const { getDarkMode } = useRootSetting();
+
+  function init() {
+    const viewerEl = unref(viewerRef) as HTMLElement;
+    vditorPreviewRef.value = VditorPreview.preview(viewerEl, props.value, {
+      mode: getTheme(getDarkMode.value, "content"),
+      theme: {
+        // 设置内容主题
+        current: getTheme(getDarkMode.value, "content"),
+      },
+      hljs: {
+        // 设置代码块主题
+        style: getTheme(getDarkMode.value, "code"),
+      },
+    });
+  }
+  watch(
+    () => getDarkMode.value,
+    (val) => {
+      VditorPreview.setContentTheme(getTheme(val, "content"));
+      VditorPreview.setCodeTheme(getTheme(val, "code"));
+      init();
+    },
+  );
 
-<style scoped>
-  .markdown-viewer {
-    width: 100%;
+  watch(
+    () => props.value,
+    (v, oldValue) => {
+      v !== oldValue && init();
+    },
+  );
+
+  function destroy() {
+    const vditorInstance = unref(vditorPreviewRef);
+    if (!vditorInstance) return;
+    try {
+      vditorInstance?.destroy?.();
+    } catch (error) {}
+    vditorPreviewRef.value = null;
   }
-</style>
+
+  onMountedOrActivated(init);
+
+  onBeforeUnmount(destroy);
+  onDeactivated(destroy);
+</script>
diff --git a/src/components/Markdown/src/getTheme.ts b/src/components/Markdown/src/getTheme.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a1774f0f12714127e113cc1c1d56c5a67bc199de
--- /dev/null
+++ b/src/components/Markdown/src/getTheme.ts
@@ -0,0 +1,19 @@
+/**
+ * 获取主题类型 深色浅色模式 对应的值
+ * @param darkModeVal 深色模式值
+ * @param themeMode 主题类型——外观(默认), 内容, 代码块
+ */
+export const getTheme = (
+  darkModeVal: "light" | "dark" | string,
+  themeMode: "default" | "content" | "code" = "default",
+) => {
+  const isDark = darkModeVal === "dark";
+  switch (themeMode) {
+    case "default":
+      return isDark ? "dark" : "classic";
+    case "content":
+      return isDark ? "dark" : "light";
+    case "code":
+      return isDark ? "dracula" : "github";
+  }
+};
diff --git a/src/components/Markdown/src/typing.ts b/src/components/Markdown/src/typing.ts
index b4bb465822d723aff7b7c61b7fba0947a17a3d16..e9735698f6f445fc6a9fa02f78580dd32c8212fe 100644
--- a/src/components/Markdown/src/typing.ts
+++ b/src/components/Markdown/src/typing.ts
@@ -1,4 +1,4 @@
-import Vditor from 'vditor';
+import Vditor from "vditor";
 export interface MarkDownActionType {
   getVditor: () => Vditor;
 }
diff --git a/src/components/Menu/index.ts b/src/components/Menu/index.ts
index 4a592259e04095a9dc2b066be55950a2917ed73f..83fd8fa794d763123ef23118876d9ec0b4c993d8 100644
--- a/src/components/Menu/index.ts
+++ b/src/components/Menu/index.ts
@@ -1,3 +1,3 @@
-import BasicMenu from './src/BasicMenu.vue';
+import BasicMenu from "./src/BasicMenu.vue";
 
 export { BasicMenu };
diff --git a/src/components/Menu/src/BasicMenu.vue b/src/components/Menu/src/BasicMenu.vue
index 0d0e20fbc09544b675077da1ca87076357092fc1..10c18d650393a6a46fa766f96dc891742cdc94fb 100644
--- a/src/components/Menu/src/BasicMenu.vue
+++ b/src/components/Menu/src/BasicMenu.vue
@@ -6,7 +6,7 @@
     :openKeys="getOpenKeys"
     :inlineIndent="inlineIndent"
     :theme="theme"
-    @openChange="handleOpenChange"
+    @open-change="handleOpenChange"
     :class="getMenuClass"
     @click="handleMenuClick"
     :subMenuOpenDelay="0.2"
@@ -18,33 +18,33 @@
   </Menu>
 </template>
 <script lang="ts">
-  import type { MenuState } from './types';
-  import { computed, defineComponent, unref, reactive, watch, toRefs, ref } from 'vue';
-  import { Menu } from 'ant-design-vue';
-  import BasicSubMenuItem from './components/BasicSubMenuItem.vue';
-  import { MenuModeEnum, MenuTypeEnum } from '/@/enums/menuEnum';
-  import { useOpenKeys } from './useOpenKeys';
-  import { RouteLocationNormalizedLoaded, useRouter } from 'vue-router';
-  import { isFunction } from '/@/utils/is';
-  import { basicProps } from './props';
-  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
-  import { REDIRECT_NAME } from '/@/router/constant';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { getCurrentParentPath } from '/@/router/menus';
-  import { listenerRouteChange } from '/@/logics/mitt/routeChange';
-  import { getAllParentPath } from '/@/router/helper/menuHelper';
+  import type { MenuState } from "./types";
+  import { computed, defineComponent, unref, reactive, watch, toRefs, ref } from "vue";
+  import { Menu } from "ant-design-vue";
+  import BasicSubMenuItem from "./components/BasicSubMenuItem.vue";
+  import { MenuModeEnum, MenuTypeEnum } from "/@/enums/menuEnum";
+  import { useOpenKeys } from "./useOpenKeys";
+  import { RouteLocationNormalizedLoaded, useRouter } from "vue-router";
+  import { isFunction } from "/@/utils/is";
+  import { basicProps } from "./props";
+  import { useMenuSetting } from "/@/hooks/setting/useMenuSetting";
+  import { REDIRECT_NAME } from "/@/router/constant";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { getCurrentParentPath } from "/@/router/menus";
+  import { listenerRouteChange } from "/@/logics/mitt/routeChange";
+  import { getAllParentPath } from "/@/router/helper/menuHelper";
 
   export default defineComponent({
-    name: 'BasicMenu',
+    name: "BasicMenu",
     components: {
       Menu,
       BasicSubMenuItem,
     },
     props: basicProps,
-    emits: ['menuClick'],
+    emits: ["menuClick"],
     setup(props, { emit }) {
       const isClickGo = ref(false);
-      const currentActiveMenu = ref('');
+      const currentActiveMenu = ref("");
 
       const menuState = reactive<MenuState>({
         defaultSelectedKeys: [],
@@ -53,7 +53,7 @@
         collapsedOpenKeys: [],
       });
 
-      const { prefixCls } = useDesign('basic-menu');
+      const { prefixCls } = useDesign("basic-menu");
       const { items, mode, accordion } = toRefs(props);
 
       const { getCollapsed, getTopMenuAlign, getSplit } = useMenuSetting();
@@ -77,7 +77,7 @@
       });
 
       const getMenuClass = computed(() => {
-        const align = props.isHorizontal && unref(getSplit) ? 'start' : unref(getTopMenuAlign);
+        const align = props.isHorizontal && unref(getSplit) ? "start" : unref(getTopMenuAlign);
         return [
           prefixCls,
           `justify-${align}`,
@@ -123,7 +123,7 @@
           const flag = await beforeClickFn(key);
           if (!flag) return;
         }
-        emit('menuClick', key);
+        emit("menuClick", key);
 
         isClickGo.value = true;
         menuState.selectedKeys = [key];
@@ -160,5 +160,5 @@
   });
 </script>
 <style lang="less">
-  @import './index.less';
+  @import "./index.less";
 </style>
diff --git a/src/components/Menu/src/components/BasicMenuItem.vue b/src/components/Menu/src/components/BasicMenuItem.vue
index 2a5656278dcf9ae7de45a8e5285eee600d0e0556..79ed4492adf53640ed0aa4e42dad2d74b338617c 100644
--- a/src/components/Menu/src/components/BasicMenuItem.vue
+++ b/src/components/Menu/src/components/BasicMenuItem.vue
@@ -4,13 +4,13 @@
   </MenuItem>
 </template>
 <script lang="ts">
-  import { defineComponent } from 'vue';
-  import { Menu } from 'ant-design-vue';
-  import { itemProps } from '../props';
+  import { defineComponent } from "vue";
+  import { Menu } from "ant-design-vue";
+  import { itemProps } from "../props";
 
-  import MenuItemContent from './MenuItemContent.vue';
+  import MenuItemContent from "./MenuItemContent.vue";
   export default defineComponent({
-    name: 'BasicMenuItem',
+    name: "BasicMenuItem",
     components: { MenuItem: Menu.Item, MenuItemContent },
     props: itemProps,
     setup() {
diff --git a/src/components/Menu/src/components/BasicSubMenuItem.vue b/src/components/Menu/src/components/BasicSubMenuItem.vue
index d5139fce38b993788b1aa645de7ff1afedcaab09..451a36e04fd3a1c7c5e0633f3c9a126b2c364cfa 100644
--- a/src/components/Menu/src/components/BasicSubMenuItem.vue
+++ b/src/components/Menu/src/components/BasicSubMenuItem.vue
@@ -16,16 +16,16 @@
   </SubMenu>
 </template>
 <script lang="ts">
-  import type { Menu as MenuType } from '/@/router/types';
-  import { defineComponent, computed } from 'vue';
-  import { Menu } from 'ant-design-vue';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { itemProps } from '../props';
-  import BasicMenuItem from './BasicMenuItem.vue';
-  import MenuItemContent from './MenuItemContent.vue';
+  import type { Menu as MenuType } from "/@/router/types";
+  import { defineComponent, computed } from "vue";
+  import { Menu } from "ant-design-vue";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { itemProps } from "../props";
+  import BasicMenuItem from "./BasicMenuItem.vue";
+  import MenuItemContent from "./MenuItemContent.vue";
 
   export default defineComponent({
-    name: 'BasicSubMenuItem',
+    name: "BasicSubMenuItem",
     isSubMenu: true,
     components: {
       BasicMenuItem,
@@ -34,13 +34,13 @@
     },
     props: itemProps,
     setup(props) {
-      const { prefixCls } = useDesign('basic-menu-item');
+      const { prefixCls } = useDesign("basic-menu-item");
 
       const getShowMenu = computed(() => !props.item.meta?.hideMenu);
       function menuHasChildren(menuTreeItem: MenuType): boolean {
         return (
           !menuTreeItem.meta?.hideChildrenInMenu &&
-          Reflect.has(menuTreeItem, 'children') &&
+          Reflect.has(menuTreeItem, "children") &&
           !!menuTreeItem.children &&
           menuTreeItem.children.length > 0
         );
diff --git a/src/components/Menu/src/components/MenuItemContent.vue b/src/components/Menu/src/components/MenuItemContent.vue
index 3044fbc0781d06bb6e3e0b8047fb9deb1950f203..bd471becb696dd055de8a34745443c1542858ba8 100644
--- a/src/components/Menu/src/components/MenuItemContent.vue
+++ b/src/components/Menu/src/components/MenuItemContent.vue
@@ -5,22 +5,22 @@
   </span>
 </template>
 <script lang="ts">
-  import { computed, defineComponent } from 'vue';
+  import { computed, defineComponent } from "vue";
 
-  import Icon from '/@/components/Icon/index';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { contentProps } from '../props';
+  import Icon from "/@/components/Icon/index";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { contentProps } from "../props";
   const { t } = useI18n();
 
   export default defineComponent({
-    name: 'MenuItemContent',
+    name: "MenuItemContent",
     components: {
       Icon,
     },
     props: contentProps,
     setup(props) {
-      const { prefixCls } = useDesign('basic-menu-item-content');
+      const { prefixCls } = useDesign("basic-menu-item-content");
       const getI18nName = computed(() => t(props.item?.name));
       const getIcon = computed(() => props.item?.icon);
 
diff --git a/src/components/Menu/src/index.less b/src/components/Menu/src/index.less
index 8bfbb0dfa2a228fefe2dc3f84c93b719776be602..6907bffb6c8c1c69e481d31d38f2439e6cccea89 100644
--- a/src/components/Menu/src/index.less
+++ b/src/components/Menu/src/index.less
@@ -1,4 +1,4 @@
-@basic-menu-prefix-cls: ~'@{namespace}-basic-menu';
+@basic-menu-prefix-cls: ~"@{namespace}-basic-menu";
 
 .app-top-menu-popup {
   min-width: 150px;
diff --git a/src/components/Menu/src/props.ts b/src/components/Menu/src/props.ts
index ed3f010d56b2ebba939385fdb69cb2d0feb7031d..ccfe44896b5e520717482bfbe10f1d5fc9880632 100644
--- a/src/components/Menu/src/props.ts
+++ b/src/components/Menu/src/props.ts
@@ -1,11 +1,11 @@
-import type { Menu } from '/@/router/types';
-import type { PropType } from 'vue';
+import type { Menu } from "/@/router/types";
+import type { PropType } from "vue";
 
-import { MenuModeEnum, MenuTypeEnum } from '/@/enums/menuEnum';
-import { ThemeEnum } from '/@/enums/appEnum';
-import { propTypes } from '/@/utils/propTypes';
-import type { MenuTheme } from 'ant-design-vue';
-import type { MenuMode } from 'ant-design-vue/lib/menu/src/interface';
+import { MenuModeEnum, MenuTypeEnum } from "/@/enums/menuEnum";
+import { ThemeEnum } from "/@/enums/appEnum";
+import { propTypes } from "/@/utils/propTypes";
+import type { MenuTheme } from "ant-design-vue";
+import type { MenuMode } from "ant-design-vue/lib/menu/src/interface";
 export const basicProps = {
   items: {
     type: Array as PropType<Menu[]>,
@@ -44,7 +44,7 @@ export const itemProps = {
     default: {},
   },
   level: propTypes.number,
-  theme: propTypes.oneOf(['dark', 'light']),
+  theme: propTypes.oneOf(["dark", "light"]),
   showTitle: propTypes.bool,
   isHorizontal: propTypes.bool,
 };
diff --git a/src/components/Menu/src/useOpenKeys.ts b/src/components/Menu/src/useOpenKeys.ts
index 841dab51b43bb325b4ca469afd3406b644ca0a76..2b90e930af9d8bc93a375c549378b1c1f292eaf9 100644
--- a/src/components/Menu/src/useOpenKeys.ts
+++ b/src/components/Menu/src/useOpenKeys.ts
@@ -1,14 +1,14 @@
-import { MenuModeEnum } from '/@/enums/menuEnum';
-import type { Menu as MenuType } from '/@/router/types';
-import type { MenuState } from './types';
+import { MenuModeEnum } from "/@/enums/menuEnum";
+import type { Menu as MenuType } from "/@/router/types";
+import type { MenuState } from "./types";
 
-import { computed, Ref, toRaw } from 'vue';
+import { computed, Ref, toRaw } from "vue";
 
-import { unref } from 'vue';
-import { uniq } from 'lodash-es';
-import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
-import { getAllParentPath } from '/@/router/helper/menuHelper';
-import { useTimeoutFn } from '/@/hooks/core/useTimeout';
+import { unref } from "vue";
+import { uniq } from "lodash-es";
+import { useMenuSetting } from "/@/hooks/setting/useMenuSetting";
+import { getAllParentPath } from "/@/router/helper/menuHelper";
+import { useTimeoutFn } from "/@/hooks/core/useTimeout";
 
 export function useOpenKeys(
   menuState: MenuState,
diff --git a/src/components/Modal/index.ts b/src/components/Modal/index.ts
index 6188c5cb5e1d7da7436b7c01274c5f9cb1eb1bb0..76ac7d709fa0a0cd53d84c36e59c73b715ba9e5c 100644
--- a/src/components/Modal/index.ts
+++ b/src/components/Modal/index.ts
@@ -1,8 +1,8 @@
-import { withInstall } from '/@/utils';
-import './src/index.less';
-import basicModal from './src/BasicModal.vue';
+import { withInstall } from "/@/utils";
+import "./src/index.less";
+import basicModal from "./src/BasicModal.vue";
 
 export const BasicModal = withInstall(basicModal);
-export { useModalContext } from './src/hooks/useModalContext';
-export { useModal, useModalInner } from './src/hooks/useModal';
-export * from './src/typing';
+export { useModalContext } from "./src/hooks/useModalContext";
+export { useModal, useModalInner } from "./src/hooks/useModal";
+export * from "./src/typing";
diff --git a/src/components/Modal/src/BasicModal.vue b/src/components/Modal/src/BasicModal.vue
index 89bc8798c4ac54e68cd8fc8397313d9732f8daa7..d4e0a050a9ff78aee5f11298a54f9e6c10163d02 100644
--- a/src/components/Modal/src/BasicModal.vue
+++ b/src/components/Modal/src/BasicModal.vue
@@ -49,7 +49,7 @@
   </Modal>
 </template>
 <script lang="ts">
-  import type { ModalProps, ModalMethods } from './typing';
+  import type { ModalProps, ModalMethods } from "./typing";
 
   import {
     defineComponent,
@@ -61,30 +61,30 @@
     toRef,
     getCurrentInstance,
     nextTick,
-  } from 'vue';
-  import Modal from './components/Modal';
-  import ModalWrapper from './components/ModalWrapper.vue';
-  import ModalClose from './components/ModalClose.vue';
-  import ModalFooter from './components/ModalFooter.vue';
-  import ModalHeader from './components/ModalHeader.vue';
-  import { isFunction } from '/@/utils/is';
-  import { deepMerge } from '/@/utils';
-  import { basicProps } from './props';
-  import { useFullScreen } from './hooks/useModalFullScreen';
-  import { omit } from 'lodash-es';
-  import { useDesign } from '/@/hooks/web/useDesign';
+  } from "vue";
+  import Modal from "./components/Modal";
+  import ModalWrapper from "./components/ModalWrapper.vue";
+  import ModalClose from "./components/ModalClose.vue";
+  import ModalFooter from "./components/ModalFooter.vue";
+  import ModalHeader from "./components/ModalHeader.vue";
+  import { isFunction } from "/@/utils/is";
+  import { deepMerge } from "/@/utils";
+  import { basicProps } from "./props";
+  import { useFullScreen } from "./hooks/useModalFullScreen";
+  import { omit } from "lodash-es";
+  import { useDesign } from "/@/hooks/web/useDesign";
 
   export default defineComponent({
-    name: 'BasicModal',
+    name: "BasicModal",
     components: { Modal, ModalWrapper, ModalClose, ModalFooter, ModalHeader },
     inheritAttrs: false,
     props: basicProps,
-    emits: ['visible-change', 'height-change', 'cancel', 'ok', 'register', 'update:visible'],
+    emits: ["visible-change", "height-change", "cancel", "ok", "register", "update:visible"],
     setup(props, { emit, attrs }) {
       const visibleRef = ref(false);
       const propsRef = ref<Partial<ModalProps> | null>(null);
       const modalWrapperRef = ref<any>(null);
-      const { prefixCls } = useDesign('basic-modal');
+      const { prefixCls } = useDesign("basic-modal");
 
       // modal   Bottom and top height
       const extHeightRef = ref(0);
@@ -102,7 +102,7 @@
 
       const instance = getCurrentInstance();
       if (instance) {
-        emit('register', modalMethods, instance.uid);
+        emit("register", modalMethods, instance.uid);
       }
 
       // Custom title component: get title
@@ -116,7 +116,7 @@
       const { handleFullScreen, getWrapClassName, fullScreenRef } = useFullScreen({
         modalWrapperRef,
         extHeightRef,
-        wrapClassName: toRef(getMergeProps.value, 'wrapClassName'),
+        wrapClassName: toRef(getMergeProps.value, "wrapClassName"),
       });
 
       // modal component does not need title and origin buttons
@@ -142,9 +142,9 @@
           wrapClassName: unref(getWrapClassName),
         };
         if (unref(fullScreenRef)) {
-          return omit(attr, ['height', 'title']);
+          return omit(attr, ["height", "title"]);
         }
-        return omit(attr, 'title');
+        return omit(attr, "title");
       });
 
       const getWrapperHeight = computed(() => {
@@ -160,8 +160,8 @@
       watch(
         () => unref(visibleRef),
         (v) => {
-          emit('visible-change', v);
-          emit('update:visible', v);
+          emit("visible-change", v);
+          emit("update:visible", v);
           instance && modalMethods.emitVisible?.(v, instance.uid);
           nextTick(() => {
             if (props.scrollTop && v && unref(modalWrapperRef)) {
@@ -178,7 +178,7 @@
       async function handleCancel(e: Event) {
         e?.stopPropagation();
         // 过滤自定义关闭按钮的空白区域
-        if ((e.target as HTMLElement)?.classList?.contains(prefixCls + '-close--custom')) return;
+        if ((e.target as HTMLElement)?.classList?.contains(prefixCls + "-close--custom")) return;
         if (props.closeFunc && isFunction(props.closeFunc)) {
           const isClose: boolean = await props.closeFunc();
           visibleRef.value = !isClose;
@@ -186,7 +186,7 @@
         }
 
         visibleRef.value = false;
-        emit('cancel', e);
+        emit("cancel", e);
       }
 
       /**
@@ -195,20 +195,20 @@
       function setModalProps(props: Partial<ModalProps>): void {
         // Keep the last setModalProps
         propsRef.value = deepMerge(unref(propsRef) || ({} as any), props);
-        if (Reflect.has(props, 'visible')) {
+        if (Reflect.has(props, "visible")) {
           visibleRef.value = !!props.visible;
         }
-        if (Reflect.has(props, 'defaultFullscreen')) {
+        if (Reflect.has(props, "defaultFullscreen")) {
           fullScreenRef.value = !!props.defaultFullscreen;
         }
       }
 
       function handleOk(e: Event) {
-        emit('ok', e);
+        emit("ok", e);
       }
 
       function handleHeightChange(height: string) {
-        emit('height-change', height);
+        emit("height-change", height);
       }
 
       function handleExtHeight(height: number) {
diff --git a/src/components/Modal/src/components/Modal.tsx b/src/components/Modal/src/components/Modal.tsx
index f4b8bd72aafb73701bf6b36d16664b14d5935df9..3251c338d75dcdeb658bbf8b93fd3ceaf992efe0 100644
--- a/src/components/Modal/src/components/Modal.tsx
+++ b/src/components/Modal/src/components/Modal.tsx
@@ -1,16 +1,16 @@
-import { Modal } from 'ant-design-vue';
-import { defineComponent, toRefs, unref } from 'vue';
-import { basicProps } from '../props';
-import { useModalDragMove } from '../hooks/useModalDrag';
-import { useAttrs } from '/@/hooks/core/useAttrs';
-import { extendSlots } from '/@/utils/helper/tsxHelper';
+import { Modal } from "ant-design-vue";
+import { defineComponent, toRefs, unref } from "vue";
+import { basicProps } from "../props";
+import { useModalDragMove } from "../hooks/useModalDrag";
+import { useAttrs } from "/@/hooks/core/useAttrs";
+import { extendSlots } from "/@/utils/helper/tsxHelper";
 
 export default defineComponent({
-  name: 'Modal',
+  name: "Modal",
   inheritAttrs: false,
   props: basicProps,
-  emits: ['cancel'],
-  setup(props, { slots }) {
+  emits: ["cancel"],
+  setup(props, { slots, emit }) {
     const { visible, draggable, destroyOnClose } = toRefs(props);
     const attrs = useAttrs();
     useModalDragMove({
@@ -19,8 +19,12 @@ export default defineComponent({
       draggable,
     });
 
+    const onCancel = (e: Event) => {
+      emit("cancel", e);
+    };
+
     return () => {
-      const propsData = { ...unref(attrs), ...props } as Recordable;
+      const propsData = { ...unref(attrs), ...props, onCancel } as Recordable;
       return <Modal {...propsData}>{extendSlots(slots)}</Modal>;
     };
   },
diff --git a/src/components/Modal/src/components/ModalClose.vue b/src/components/Modal/src/components/ModalClose.vue
index a0d9612e4aa9c54e9a285e6f60c68df777a18e65..70b39639f1733cdc7a35cb69f2d1614ba383ec8d 100644
--- a/src/components/Modal/src/components/ModalClose.vue
+++ b/src/components/Modal/src/components/ModalClose.vue
@@ -14,22 +14,22 @@
   </div>
 </template>
 <script lang="ts">
-  import { defineComponent, computed } from 'vue';
-  import { FullscreenExitOutlined, FullscreenOutlined, CloseOutlined } from '@ant-design/icons-vue';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { Tooltip } from 'ant-design-vue';
-  import { useI18n } from '/@/hooks/web/useI18n';
+  import { defineComponent, computed } from "vue";
+  import { FullscreenExitOutlined, FullscreenOutlined, CloseOutlined } from "@ant-design/icons-vue";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { Tooltip } from "ant-design-vue";
+  import { useI18n } from "/@/hooks/web/useI18n";
 
   export default defineComponent({
-    name: 'ModalClose',
+    name: "ModalClose",
     components: { Tooltip, FullscreenExitOutlined, FullscreenOutlined, CloseOutlined },
     props: {
       canFullscreen: { type: Boolean, default: true },
       fullScreen: { type: Boolean },
     },
-    emits: ['cancel', 'fullscreen'],
+    emits: ["cancel", "fullscreen"],
     setup(props, { emit }) {
-      const { prefixCls } = useDesign('basic-modal-close');
+      const { prefixCls } = useDesign("basic-modal-close");
       const { t } = useI18n();
 
       const getClass = computed(() => {
@@ -43,13 +43,13 @@
       });
 
       function handleCancel(e: Event) {
-        emit('cancel', e);
+        emit("cancel", e);
       }
 
       function handleFullScreen(e: Event) {
         e?.stopPropagation();
         e?.preventDefault();
-        emit('fullscreen');
+        emit("fullscreen");
       }
 
       return {
@@ -63,7 +63,7 @@
   });
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-basic-modal-close';
+  @prefix-cls: ~"@{namespace}-basic-modal-close";
   .@{prefix-cls} {
     display: flex;
     height: 95%;
diff --git a/src/components/Modal/src/components/ModalFooter.vue b/src/components/Modal/src/components/ModalFooter.vue
index d8cefdb1a826a3ac01751ae291006923a2eb09e7..6b96cc0b7e7b0ed417f14c028f10e87433bb160a 100644
--- a/src/components/Modal/src/components/ModalFooter.vue
+++ b/src/components/Modal/src/components/ModalFooter.vue
@@ -18,20 +18,20 @@
   </div>
 </template>
 <script lang="ts">
-  import { defineComponent } from 'vue';
+  import { defineComponent } from "vue";
 
-  import { basicProps } from '../props';
+  import { basicProps } from "../props";
   export default defineComponent({
-    name: 'BasicModalFooter',
+    name: "BasicModalFooter",
     props: basicProps,
-    emits: ['ok', 'cancel'],
+    emits: ["ok", "cancel"],
     setup(_, { emit }) {
       function handleOk(e: Event) {
-        emit('ok', e);
+        emit("ok", e);
       }
 
       function handleCancel(e: Event) {
-        emit('cancel', e);
+        emit("cancel", e);
       }
 
       return { handleOk, handleCancel };
diff --git a/src/components/Modal/src/components/ModalHeader.vue b/src/components/Modal/src/components/ModalHeader.vue
index 2f4577832bb44d9624fd5489f107975e76ec5608..c376d3544e6986ba36cd659f2c86ffa8f0a829c9 100644
--- a/src/components/Modal/src/components/ModalHeader.vue
+++ b/src/components/Modal/src/components/ModalHeader.vue
@@ -4,12 +4,12 @@
   </BasicTitle>
 </template>
 <script lang="ts">
-  import type { PropType } from 'vue';
-  import { defineComponent } from 'vue';
-  import { BasicTitle } from '/@/components/Basic';
+  import type { PropType } from "vue";
+  import { defineComponent } from "vue";
+  import { BasicTitle } from "/@/components/Basic";
 
   export default defineComponent({
-    name: 'BasicModalHeader',
+    name: "BasicModalHeader",
     components: { BasicTitle },
     props: {
       helpMessage: {
@@ -17,6 +17,6 @@
       },
       title: { type: String },
     },
-    emits: ['dblclick'],
+    emits: ["dblclick"],
   });
 </script>
diff --git a/src/components/Modal/src/components/ModalWrapper.vue b/src/components/Modal/src/components/ModalWrapper.vue
index 699bf9cbc8ef2fec801077a12a8c46a259712911..e28dd62dc2761ac4a13a6f90c42dd1a2978c3428 100644
--- a/src/components/Modal/src/components/ModalWrapper.vue
+++ b/src/components/Modal/src/components/ModalWrapper.vue
@@ -6,7 +6,7 @@
   </ScrollContainer>
 </template>
 <script lang="ts">
-  import type { CSSProperties } from 'vue';
+  import type { CSSProperties } from "vue";
   import {
     defineComponent,
     computed,
@@ -17,11 +17,11 @@
     onMounted,
     nextTick,
     onUnmounted,
-  } from 'vue';
-  import { useWindowSizeFn } from '/@/hooks/event/useWindowSizeFn';
-  import { ScrollContainer } from '/@/components/Container';
-  import { createModalContext } from '../hooks/useModalContext';
-  import { useMutationObserver } from '@vueuse/core';
+  } from "vue";
+  import { useWindowSizeFn } from "/@/hooks/event/useWindowSizeFn";
+  import { ScrollContainer } from "/@/components/Container";
+  import { createModalContext } from "../hooks/useModalContext";
+  import { useMutationObserver } from "@vueuse/core";
 
   const props = {
     loading: { type: Boolean },
@@ -37,11 +37,11 @@
   };
 
   export default defineComponent({
-    name: 'ModalWrapper',
+    name: "ModalWrapper",
     components: { ScrollContainer },
     inheritAttrs: false,
     props,
-    emits: ['height-change', 'ext-height'],
+    emits: ["height-change", "ext-height"],
     setup(props, { emit }) {
       const wrapperRef = ref<ComponentRef>(null);
       const spinRef = ref<ElRef>(null);
@@ -72,7 +72,7 @@
       const spinStyle = computed((): CSSProperties => {
         return {
           minHeight: `${props.minHeight}px`,
-          [props.fullScreen ? 'height' : 'maxHeight']: `${unref(realHeightRef)}px`,
+          [props.fullScreen ? "height" : "maxHeight"]: `${unref(realHeightRef)}px`,
         };
       });
 
@@ -94,7 +94,7 @@
 
       onMounted(() => {
         const { modalHeaderHeight, modalFooterHeight } = props;
-        emit('ext-height', modalHeaderHeight + modalFooterHeight);
+        emit("ext-height", modalHeaderHeight + modalFooterHeight);
       });
 
       onUnmounted(() => {
@@ -118,7 +118,7 @@
 
         const bodyDom = wrapperRefDom.$el.parentElement;
         if (!bodyDom) return;
-        bodyDom.style.padding = '0';
+        bodyDom.style.padding = "0";
         await nextTick();
 
         try {
@@ -157,7 +157,7 @@
               ? maxHeight
               : realHeight;
           }
-          emit('height-change', unref(realHeightRef));
+          emit("height-change", unref(realHeightRef));
         } catch (error) {
           console.log(error);
         }
diff --git a/src/components/Modal/src/hooks/useModal.ts b/src/components/Modal/src/hooks/useModal.ts
index fac82b77c59ea17f12ff4da215a393e41963845a..f461df158ba1f6fde61a494667d481cd40e0703c 100644
--- a/src/components/Modal/src/hooks/useModal.ts
+++ b/src/components/Modal/src/hooks/useModal.ts
@@ -4,7 +4,7 @@ import type {
   ModalProps,
   ReturnMethods,
   UseModalInnerReturnType,
-} from '../typing';
+} from "../typing";
 import {
   ref,
   onUnmounted,
@@ -14,13 +14,13 @@ import {
   watchEffect,
   nextTick,
   toRaw,
-} from 'vue';
-import { isProdMode } from '/@/utils/env';
-import { isFunction } from '/@/utils/is';
-import { isEqual } from 'lodash-es';
-import { tryOnUnmounted } from '@vueuse/core';
-import { error } from '/@/utils/log';
-import { computed } from 'vue';
+} from "vue";
+import { isProdMode } from "/@/utils/env";
+import { isFunction } from "/@/utils/is";
+import { isEqual } from "lodash-es";
+import { tryOnUnmounted } from "@vueuse/core";
+import { error } from "/@/utils/log";
+import { computed } from "vue";
 
 const dataTransfer = reactive<any>({});
 
@@ -32,11 +32,11 @@ const visibleData = reactive<{ [key: number]: boolean }>({});
 export function useModal(): UseModalReturnType {
   const modal = ref<Nullable<ModalMethods>>(null);
   const loaded = ref<Nullable<boolean>>(false);
-  const uid = ref<string>('');
+  const uid = ref<string>("");
 
   function register(modalMethod: ModalMethods, uuid: string) {
     if (!getCurrentInstance()) {
-      throw new Error('useModal() can only be used inside setup() or functional components!');
+      throw new Error("useModal() can only be used inside setup() or functional components!");
     }
     uid.value = uuid;
     isProdMode() &&
@@ -57,7 +57,7 @@ export function useModal(): UseModalReturnType {
   const getInstance = () => {
     const instance = unref(modal);
     if (!instance) {
-      error('useModal instance is undefined!');
+      error("useModal instance is undefined!");
     }
     return instance;
   };
@@ -103,12 +103,12 @@ export function useModal(): UseModalReturnType {
 export const useModalInner = (callbackFn?: Fn): UseModalInnerReturnType => {
   const modalInstanceRef = ref<Nullable<ModalMethods>>(null);
   const currentInstance = getCurrentInstance();
-  const uidRef = ref<string>('');
+  const uidRef = ref<string>("");
 
   const getInstance = () => {
     const instance = unref(modalInstanceRef);
     if (!instance) {
-      error('useModalInner instance is undefined!');
+      error("useModalInner instance is undefined!");
     }
     return instance;
   };
@@ -120,7 +120,7 @@ export const useModalInner = (callbackFn?: Fn): UseModalInnerReturnType => {
       });
     uidRef.value = uuid;
     modalInstanceRef.value = modalInstance;
-    currentInstance?.emit('register', modalInstance, uuid);
+    currentInstance?.emit("register", modalInstance, uuid);
   };
 
   watchEffect(() => {
diff --git a/src/components/Modal/src/hooks/useModalContext.ts b/src/components/Modal/src/hooks/useModalContext.ts
index 94d4c4ee88f1d341e0d800cc383035bcbb940391..eafce29d5e9c1a4fc18edee7d0dbc7c6f46e407d 100644
--- a/src/components/Modal/src/hooks/useModalContext.ts
+++ b/src/components/Modal/src/hooks/useModalContext.ts
@@ -1,5 +1,5 @@
-import { InjectionKey } from 'vue';
-import { createContext, useContext } from '/@/hooks/core/useContext';
+import { InjectionKey } from "vue";
+import { createContext, useContext } from "/@/hooks/core/useContext";
 
 export interface ModalContextProps {
   redoModalHeight: () => void;
diff --git a/src/components/Modal/src/hooks/useModalDrag.ts b/src/components/Modal/src/hooks/useModalDrag.ts
index ff05b7b13a66162210cf17dcfb5228cd2d42a1ab..c6674f24a5108281a1dddb61064edb13a95677ef 100644
--- a/src/components/Modal/src/hooks/useModalDrag.ts
+++ b/src/components/Modal/src/hooks/useModalDrag.ts
@@ -1,5 +1,5 @@
-import { Ref, unref, watchEffect } from 'vue';
-import { useTimeoutFn } from '/@/hooks/core/useTimeout';
+import { Ref, unref, watchEffect } from "vue";
+import { useTimeoutFn } from "/@/hooks/core/useTimeout";
 
 export interface UseModalDragMoveContext {
   draggable: Ref<boolean>;
@@ -13,13 +13,13 @@ export function useModalDragMove(context: UseModalDragMoveContext) {
   };
   const drag = (wrap: any) => {
     if (!wrap) return;
-    wrap.setAttribute('data-drag', unref(context.draggable));
-    const dialogHeaderEl = wrap.querySelector('.ant-modal-header');
-    const dragDom = wrap.querySelector('.ant-modal');
+    wrap.setAttribute("data-drag", unref(context.draggable));
+    const dialogHeaderEl = wrap.querySelector(".ant-modal-header");
+    const dragDom = wrap.querySelector(".ant-modal");
 
     if (!dialogHeaderEl || !dragDom || !unref(context.draggable)) return;
 
-    dialogHeaderEl.style.cursor = 'move';
+    dialogHeaderEl.style.cursor = "move";
 
     dialogHeaderEl.onmousedown = (e: any) => {
       if (!e) return;
@@ -38,18 +38,18 @@ export function useModalDragMove(context: UseModalDragMoveContext) {
       const minDragDomTop = dragDom.offsetTop;
       const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomheight;
       // 获取到的值带px 正则匹配替换
-      const domLeft = getStyle(dragDom, 'left');
-      const domTop = getStyle(dragDom, 'top');
+      const domLeft = getStyle(dragDom, "left");
+      const domTop = getStyle(dragDom, "top");
       let styL = +domLeft;
       let styT = +domTop;
 
       // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px
-      if (domLeft.includes('%')) {
-        styL = +document.body.clientWidth * (+domLeft.replace(/%/g, '') / 100);
-        styT = +document.body.clientHeight * (+domTop.replace(/%/g, '') / 100);
+      if (domLeft.includes("%")) {
+        styL = +document.body.clientWidth * (+domLeft.replace(/%/g, "") / 100);
+        styT = +document.body.clientHeight * (+domTop.replace(/%/g, "") / 100);
       } else {
-        styL = +domLeft.replace(/px/g, '');
-        styT = +domTop.replace(/px/g, '');
+        styL = +domLeft.replace(/px/g, "");
+        styT = +domTop.replace(/px/g, "");
       }
 
       document.onmousemove = function (e) {
@@ -82,12 +82,12 @@ export function useModalDragMove(context: UseModalDragMoveContext) {
   };
 
   const handleDrag = () => {
-    const dragWraps = document.querySelectorAll('.ant-modal-wrap');
+    const dragWraps = document.querySelectorAll(".ant-modal-wrap");
     for (const wrap of Array.from(dragWraps)) {
       if (!wrap) continue;
-      const display = getStyle(wrap, 'display');
-      const draggable = wrap.getAttribute('data-drag');
-      if (display !== 'none') {
+      const display = getStyle(wrap, "display");
+      const draggable = wrap.getAttribute("data-drag");
+      if (display !== "none") {
         // 拖拽位置
         if (draggable === null || unref(context.destroyOnClose)) {
           drag(wrap);
diff --git a/src/components/Modal/src/hooks/useModalFullScreen.ts b/src/components/Modal/src/hooks/useModalFullScreen.ts
index b53563a3130f17f690b47910267772f7645614c3..8286aa63fc4b314100e5c1c3c828d60c8bcf37ef 100644
--- a/src/components/Modal/src/hooks/useModalFullScreen.ts
+++ b/src/components/Modal/src/hooks/useModalFullScreen.ts
@@ -1,4 +1,4 @@
-import { computed, Ref, ref, unref } from 'vue';
+import { computed, Ref, ref, unref } from "vue";
 
 export interface UseFullScreenContext {
   wrapClassName: Ref<string | undefined>;
@@ -11,7 +11,7 @@ export function useFullScreen(context: UseFullScreenContext) {
   const fullScreenRef = ref(false);
 
   const getWrapClassName = computed(() => {
-    const clsName = unref(context.wrapClassName) || '';
+    const clsName = unref(context.wrapClassName) || "";
     return unref(fullScreenRef) ? `fullscreen-modal ${clsName} ` : unref(clsName);
   });
 
diff --git a/src/components/Modal/src/index.less b/src/components/Modal/src/index.less
index 5bd86a25ec0d134817fd52c4ce99cd98364b575f..88df410154c5f41a38244cb8de247352266210e8 100644
--- a/src/components/Modal/src/index.less
+++ b/src/components/Modal/src/index.less
@@ -26,7 +26,6 @@
   &-title {
     font-size: 16px;
     font-weight: bold;
-    line-height: 16px;
 
     .base-title {
       cursor: move !important;
@@ -111,16 +110,19 @@
 .ant-modal-confirm .ant-modal-body {
   padding: 24px !important;
 }
+
 @media screen and (max-height: 600px) {
   .ant-modal {
     top: 60px;
   }
 }
+
 @media screen and (max-height: 540px) {
   .ant-modal {
     top: 30px;
   }
 }
+
 @media screen and (max-height: 480px) {
   .ant-modal {
     top: 10px;
diff --git a/src/components/Modal/src/props.ts b/src/components/Modal/src/props.ts
index c3c70c6c1072dca968098026afe1e3f99805504d..6c9c473fffe3127520ab39416a73e03943a13b8a 100644
--- a/src/components/Modal/src/props.ts
+++ b/src/components/Modal/src/props.ts
@@ -1,7 +1,7 @@
-import type { PropType, CSSProperties } from 'vue';
-import type { ModalWrapperProps } from './typing';
-import { ButtonProps } from 'ant-design-vue/es/button/buttonTypes';
-import { useI18n } from '/@/hooks/web/useI18n';
+import type { PropType, CSSProperties } from "vue";
+import type { ModalWrapperProps } from "./typing";
+import { ButtonProps } from "ant-design-vue/es/button/buttonTypes";
+import { useI18n } from "/@/hooks/web/useI18n";
 
 const { t } = useI18n();
 
@@ -13,8 +13,8 @@ export const modalProps = {
   // open drag
   draggable: { type: Boolean, default: true },
   centered: { type: Boolean },
-  cancelText: { type: String, default: t('common.cancelText') },
-  okText: { type: String, default: t('common.okText') },
+  cancelText: { type: String, default: t("common.cancelText") },
+  okText: { type: String, default: t("common.okText") },
 
   closeFunc: Function as PropType<() => Promise<boolean>>,
 };
@@ -65,7 +65,7 @@ export const basicProps = Object.assign({}, modalProps, {
 
   maskStyle: Object as PropType<CSSProperties>,
 
-  okType: { type: String, default: 'primary' },
+  okType: { type: String, default: "primary" },
 
   okButtonProps: Object as PropType<ButtonProps>,
 
diff --git a/src/components/Modal/src/typing.ts b/src/components/Modal/src/typing.ts
index 36a7e7cdcbcdb712d6c636d46d15470de0b25598..0d73955d5cfe16746f4ffe79cdfb90d89c0a662e 100644
--- a/src/components/Modal/src/typing.ts
+++ b/src/components/Modal/src/typing.ts
@@ -1,5 +1,5 @@
-import type { ButtonProps } from 'ant-design-vue/lib/button/buttonTypes';
-import type { CSSProperties, VNodeChild, ComputedRef } from 'vue';
+import type { ButtonProps } from "ant-design-vue/lib/button/buttonTypes";
+import type { CSSProperties, VNodeChild, ComputedRef } from "vue";
 /**
  * @description: 弹窗对外暴露的方法
  */
@@ -50,7 +50,7 @@ export interface ModalProps {
   loading: boolean;
   loadingTip?: string;
 
-  wrapperProps: Omit<ModalWrapperProps, 'loading'>;
+  wrapperProps: Omit<ModalWrapperProps, "loading">;
 
   showOkBtn: boolean;
   showCancelBtn: boolean;
@@ -155,7 +155,7 @@ export interface ModalProps {
    * @default 'primary'
    * @type string
    */
-  okType?: 'primary' | 'danger' | 'dashed' | 'ghost' | 'default';
+  okType?: "primary" | "danger" | "dashed" | "ghost" | "default";
 
   /**
    * The ok button props, follow jsx rules
diff --git a/src/components/Page/index.ts b/src/components/Page/index.ts
index 2d3f6dd7c24e9fb8e6162e570a5ae5db6f2ba867..8d9ec4320885b111b2782a06cac2c8d42a562fca 100644
--- a/src/components/Page/index.ts
+++ b/src/components/Page/index.ts
@@ -1,9 +1,9 @@
-import { withInstall } from '/@/utils';
+import { withInstall } from "/@/utils";
 
-import pageFooter from './src/PageFooter.vue';
-import pageWrapper from './src/PageWrapper.vue';
+import pageFooter from "./src/PageFooter.vue";
+import pageWrapper from "./src/PageWrapper.vue";
 
 export const PageFooter = withInstall(pageFooter);
 export const PageWrapper = withInstall(pageWrapper);
 
-export const PageWrapperFixedHeightKey = 'PageWrapperFixedHeight';
+export const PageWrapperFixedHeightKey = "PageWrapperFixedHeight";
diff --git a/src/components/Page/src/PageFooter.vue b/src/components/Page/src/PageFooter.vue
index e89a6ce979ea41e465a6c372be13cdb234b370c3..6adcd9bb013a0c0f76d177583979e70085a367d2 100644
--- a/src/components/Page/src/PageFooter.vue
+++ b/src/components/Page/src/PageFooter.vue
@@ -10,22 +10,22 @@
   </div>
 </template>
 <script lang="ts">
-  import { defineComponent } from 'vue';
-  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
-  import { useDesign } from '/@/hooks/web/useDesign';
+  import { defineComponent } from "vue";
+  import { useMenuSetting } from "/@/hooks/setting/useMenuSetting";
+  import { useDesign } from "/@/hooks/web/useDesign";
 
   export default defineComponent({
-    name: 'PageFooter',
+    name: "PageFooter",
     inheritAttrs: false,
     setup() {
-      const { prefixCls } = useDesign('page-footer');
+      const { prefixCls } = useDesign("page-footer");
       const { getCalcContentWidth } = useMenuSetting();
       return { prefixCls, getCalcContentWidth };
     },
   });
 </script>
 <style lang="less" scoped>
-  @prefix-cls: ~'@{namespace}-page-footer';
+  @prefix-cls: ~"@{namespace}-page-footer";
 
   .@{prefix-cls} {
     position: fixed;
diff --git a/src/components/Page/src/PageWrapper.vue b/src/components/Page/src/PageWrapper.vue
index 8f6f0d5d32db17eae04aac340fd6e521e2df16ac..ce94b2de3062a724496842940c1d6571a46d040d 100644
--- a/src/components/Page/src/PageWrapper.vue
+++ b/src/components/Page/src/PageWrapper.vue
@@ -5,7 +5,7 @@
       :title="title"
       v-bind="omit($attrs, 'class')"
       ref="headerRef"
-      v-if="content || $slots.headerContent || title || getHeaderSlots.length"
+      v-if="getShowHeader"
     >
       <template #default>
         <template v-if="content">
@@ -33,20 +33,20 @@
   </div>
 </template>
 <script lang="ts">
-  import { CSSProperties, PropType, provide } from 'vue';
+  import { CSSProperties, PropType, provide } from "vue";
 
-  import { defineComponent, computed, watch, ref, unref } from 'vue';
-  import PageFooter from './PageFooter.vue';
+  import { defineComponent, computed, watch, ref, unref } from "vue";
+  import PageFooter from "./PageFooter.vue";
 
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { propTypes } from '/@/utils/propTypes';
-  import { omit } from 'lodash-es';
-  import { PageHeader } from 'ant-design-vue';
-  import { useContentHeight } from '/@/hooks/web/useContentHeight';
-  import { PageWrapperFixedHeightKey } from '..';
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { propTypes } from "/@/utils/propTypes";
+  import { omit } from "lodash-es";
+  import { PageHeader } from "ant-design-vue";
+  import { useContentHeight } from "/@/hooks/web/useContentHeight";
+  import { PageWrapperFixedHeightKey } from "..";
 
   export default defineComponent({
-    name: 'PageWrapper',
+    name: "PageWrapper",
     components: { PageFooter, PageHeader },
     inheritAttrs: false,
     props: {
@@ -68,7 +68,7 @@
       const headerRef = ref(null);
       const contentRef = ref(null);
       const footerRef = ref(null);
-      const { prefixCls } = useDesign('page-wrapper');
+      const { prefixCls } = useDesign("page-wrapper");
 
       provide(
         PageWrapperFixedHeightKey,
@@ -99,10 +99,14 @@
         ];
       });
 
+      const getShowHeader = computed(
+        () => props.content || slots?.headerContent || props.title || getHeaderSlots.value.length,
+      );
+
       const getShowFooter = computed(() => slots?.leftFooter || slots?.rightFooter);
 
       const getHeaderSlots = computed(() => {
-        return Object.keys(omit(slots, 'default', 'leftFooter', 'rightFooter', 'headerContent'));
+        return Object.keys(omit(slots, "default", "leftFooter", "rightFooter", "headerContent"));
       });
 
       const getContentStyle = computed((): CSSProperties => {
@@ -136,7 +140,7 @@
           redoHeight();
         },
         {
-          flush: 'post',
+          flush: "post",
           immediate: true,
         },
       );
@@ -150,6 +154,7 @@
         getClass,
         getHeaderSlots,
         prefixCls,
+        getShowHeader,
         getShowFooter,
         omit,
         getContentClass,
@@ -158,7 +163,7 @@
   });
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-page-wrapper';
+  @prefix-cls: ~"@{namespace}-page-wrapper";
 
   .@{prefix-cls} {
     position: relative;
diff --git a/src/components/Preview/index.ts b/src/components/Preview/index.ts
index c0b4685ea9eabb0321d502d1f95f0deb807fcc1e..fcb64421e8cf1dac4f04349d5e5ac36b3324a403 100644
--- a/src/components/Preview/index.ts
+++ b/src/components/Preview/index.ts
@@ -1,2 +1,2 @@
-export { default as ImagePreview } from './src/Preview.vue';
-export { createImgPreview } from './src/functional';
+export { default as ImagePreview } from "./src/Preview.vue";
+export { createImgPreview } from "./src/functional";
diff --git a/src/components/Preview/src/Functional.vue b/src/components/Preview/src/Functional.vue
index 1c91929786fcd32c121d4ba0244e65a3577193f9..1048d81c8434f84707bf64f4235dd97a06b7e702 100644
--- a/src/components/Preview/src/Functional.vue
+++ b/src/components/Preview/src/Functional.vue
@@ -1,11 +1,11 @@
 <script lang="tsx">
-  import { defineComponent, ref, unref, computed, reactive, watchEffect } from 'vue';
-  import { CloseOutlined, LeftOutlined, RightOutlined } from '@ant-design/icons-vue';
-  import resumeSvg from '/@/assets/svg/preview/resume.svg';
-  import rotateSvg from '/@/assets/svg/preview/p-rotate.svg';
-  import scaleSvg from '/@/assets/svg/preview/scale.svg';
-  import unScaleSvg from '/@/assets/svg/preview/unscale.svg';
-  import unRotateSvg from '/@/assets/svg/preview/unrotate.svg';
+  import { defineComponent, ref, unref, computed, reactive, watchEffect } from "vue";
+  import { CloseOutlined, LeftOutlined, RightOutlined } from "@ant-design/icons-vue";
+  import resumeSvg from "/@/assets/svg/preview/resume.svg";
+  import rotateSvg from "/@/assets/svg/preview/p-rotate.svg";
+  import scaleSvg from "/@/assets/svg/preview/scale.svg";
+  import unScaleSvg from "/@/assets/svg/preview/unscale.svg";
+  import unRotateSvg from "/@/assets/svg/preview/unrotate.svg";
 
   enum StatueEnum {
     LOADING,
@@ -51,11 +51,11 @@
     },
   };
 
-  const prefixCls = 'img-preview';
+  const prefixCls = "img-preview";
   export default defineComponent({
-    name: 'ImagePreview',
+    name: "ImagePreview",
     props,
-    emits: ['img-load', 'img-error'],
+    emits: ["img-load", "img-error"],
     setup(props, { expose, emit }) {
       interface stateInfo {
         scale: number;
@@ -65,7 +65,7 @@
       }
       const stateMap = new Map<string, stateInfo>();
       const imgState = reactive<ImgState>({
-        currentUrl: '',
+        currentUrl: "",
         imgScale: 1,
         imgRotate: 0,
         imgTop: 0,
@@ -86,7 +86,7 @@
         const { index, imageList } = props;
 
         if (!imageList || !imageList.length) {
-          throw new Error('imageList is undefined');
+          throw new Error("imageList is undefined");
         }
         imgState.currentIndex = index;
         handleIChangeImage(imageList[index]);
@@ -108,7 +108,7 @@
         }
         (wrapEl as any).onmousewheel = scrollFunc;
         // 火狐浏览器没有onmousewheel事件,用DOMMouseScroll代替
-        document.body.addEventListener('DOMMouseScroll', scrollFunc);
+        document.body.addEventListener("DOMMouseScroll", scrollFunc);
         // 禁止火狐浏览器下拖拽图片的默认事件
         document.ondragstart = function () {
           return false;
@@ -193,7 +193,7 @@
             }
 
             ele &&
-              emit('img-load', {
+              emit("img-load", {
                 index: imgState.currentIndex,
                 dom: ele[0] as HTMLImageElement,
                 url,
@@ -205,7 +205,7 @@
         img.onerror = (e: Event) => {
           const ele: EventTarget[] = e.composedPath();
           ele &&
-            emit('img-error', {
+            emit("img-error", {
               index: imgState.currentIndex,
               dom: ele[0] as HTMLImageElement,
               url,
@@ -223,7 +223,7 @@
       function close() {
         imgState.show = false;
         // 移除火狐浏览器下的鼠标滚动事件
-        document.body.removeEventListener('DOMMouseScroll', scrollFunc);
+        document.body.removeEventListener("DOMMouseScroll", scrollFunc);
         // 恢复火狐及Safari浏览器下的图片拖拽
         document.ondragstart = null;
       }
@@ -236,8 +236,8 @@
       expose({
         resume,
         close,
-        prev: handleChange.bind(null, 'left'),
-        next: handleChange.bind(null, 'right'),
+        prev: handleChange.bind(null, "left"),
+        next: handleChange.bind(null, "right"),
         setScale: (scale: number) => {
           if (scale > 0 && scale <= 10) imgState.imgScale = scale;
         },
@@ -247,16 +247,16 @@
       });
 
       // 上一页下一页
-      function handleChange(direction: 'left' | 'right') {
+      function handleChange(direction: "left" | "right") {
         const { currentIndex } = imgState;
         const { imageList } = props;
-        if (direction === 'left') {
+        if (direction === "left") {
           imgState.currentIndex--;
           if (currentIndex <= 0) {
             imgState.currentIndex = imageList.length - 1;
           }
         }
-        if (direction === 'right') {
+        if (direction === "right") {
           imgState.currentIndex++;
           if (currentIndex >= imageList.length - 1) {
             imgState.currentIndex = 0;
@@ -293,7 +293,7 @@
           transform: `scale(${imgScale}) rotate(${imgRotate}deg)`,
           marginTop: `${imgTop}px`,
           marginLeft: `${imgLeft}px`,
-          maxWidth: props.defaultWidth ? 'unset' : '100%',
+          maxWidth: props.defaultWidth ? "unset" : "100%",
         };
       });
 
@@ -370,13 +370,13 @@
         );
       };
 
-      const renderArrow = (direction: 'left' | 'right') => {
+      const renderArrow = (direction: "left" | "right") => {
         if (!unref(getIsMultipleImage)) {
           return null;
         }
         return (
           <div class={[`${prefixCls}__arrow`, direction]} onClick={() => handleChange(direction)}>
-            {direction === 'left' ? <LeftOutlined /> : <RightOutlined />}
+            {direction === "left" ? <LeftOutlined /> : <RightOutlined />}
           </div>
         );
       };
@@ -405,7 +405,7 @@
                   style={unref(getImageStyle)}
                   class={[
                     `${prefixCls}-image`,
-                    imgState.status === StatueEnum.DONE ? '' : 'hidden',
+                    imgState.status === StatueEnum.DONE ? "" : "hidden",
                   ]}
                   ref={imgElRef}
                   src={imgState.currentUrl}
@@ -414,8 +414,8 @@
                 {renderClose()}
                 {renderIndex()}
                 {renderController()}
-                {renderArrow('left')}
-                {renderArrow('right')}
+                {renderArrow("left")}
+                {renderArrow("right")}
               </div>
             </div>
           )
diff --git a/src/components/Preview/src/Preview.vue b/src/components/Preview/src/Preview.vue
index 9996d0b7bd4d2d9a6a43c9bbc1ee9dc2ab6279de..ed7cd23ec0b86daf9bc9161f9356d64872c57c71 100644
--- a/src/components/Preview/src/Preview.vue
+++ b/src/components/Preview/src/Preview.vue
@@ -15,13 +15,13 @@
   </div>
 </template>
 <script lang="ts">
-  import type { PropType } from 'vue';
-  import { defineComponent, computed } from 'vue';
+  import type { PropType } from "vue";
+  import { defineComponent, computed } from "vue";
 
-  import { Image } from 'ant-design-vue';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { propTypes } from '/@/utils/propTypes';
-  import { isString } from '/@/utils/is';
+  import { Image } from "ant-design-vue";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { propTypes } from "/@/utils/propTypes";
+  import { isString } from "/@/utils/is";
 
   interface ImageProps {
     alt?: string;
@@ -42,7 +42,7 @@
   type ImageItem = string | ImageProps;
 
   export default defineComponent({
-    name: 'ImagePreview',
+    name: "ImagePreview",
     components: {
       Image,
       PreviewGroup: Image.PreviewGroup,
@@ -54,7 +54,7 @@
       },
     },
     setup(props) {
-      const { prefixCls } = useDesign('image-preview');
+      const { prefixCls } = useDesign("image-preview");
 
       const getImageList = computed((): any[] => {
         const { imageList } = props;
@@ -80,7 +80,7 @@
   });
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-image-preview';
+  @prefix-cls: ~"@{namespace}-image-preview";
 
   .@{prefix-cls} {
     .ant-image {
diff --git a/src/components/Preview/src/functional.ts b/src/components/Preview/src/functional.ts
index 74073a20efbef8f0111ac253edaad677e8436ab6..f086672e60de86d8cc6f1812b1adb8a1ec2e3137 100644
--- a/src/components/Preview/src/functional.ts
+++ b/src/components/Preview/src/functional.ts
@@ -1,13 +1,13 @@
-import type { Options, Props } from './typing';
-import ImgPreview from './Functional.vue';
-import { isClient } from '/@/utils/is';
-import { createVNode, render } from 'vue';
+import type { Options, Props } from "./typing";
+import ImgPreview from "./Functional.vue";
+import { isClient } from "/@/utils/is";
+import { createVNode, render } from "vue";
 
 let instance: ReturnType<typeof createVNode> | null = null;
 export function createImgPreview(options: Options) {
   if (!isClient) return;
   const propsData: Partial<Props> = {};
-  const container = document.createElement('div');
+  const container = document.createElement("div");
   Object.assign(propsData, { show: true, index: 0, scaleStep: 100 }, options);
 
   instance = createVNode(ImgPreview, propsData);
diff --git a/src/components/Qrcode/index.ts b/src/components/Qrcode/index.ts
index 16a2f4087ed90bb4e1e7ab5cec0ee09f4a225f7f..8eeb167d084a7e48764ee3c5a5002945ed1330e4 100644
--- a/src/components/Qrcode/index.ts
+++ b/src/components/Qrcode/index.ts
@@ -1,5 +1,5 @@
-import { withInstall } from '/@/utils';
-import qrCode from './src/Qrcode.vue';
+import { withInstall } from "/@/utils";
+import qrCode from "./src/Qrcode.vue";
 
 export const QrCode = withInstall(qrCode);
-export * from './src/typing';
+export * from "./src/typing";
diff --git a/src/components/Qrcode/src/Qrcode.vue b/src/components/Qrcode/src/Qrcode.vue
index 81194e141f8e7c2495d18901609b9c803f9ae556..52e5482a40394a9b793ceb32e3b2115ab3307ee4 100644
--- a/src/components/Qrcode/src/Qrcode.vue
+++ b/src/components/Qrcode/src/Qrcode.vue
@@ -4,14 +4,14 @@
   </div>
 </template>
 <script lang="ts">
-  import { defineComponent, watch, PropType, ref, unref, onMounted } from 'vue';
-  import { toCanvas, QRCodeRenderersOptions, LogoType } from './qrcodePlus';
-  import { toDataURL } from 'qrcode';
-  import { downloadByUrl } from '/@/utils/file/download';
-  import { QrcodeDoneEventParams } from './typing';
+  import { defineComponent, watch, PropType, ref, unref, onMounted } from "vue";
+  import { toCanvas, QRCodeRenderersOptions, LogoType } from "./qrcodePlus";
+  import { toDataURL } from "qrcode";
+  import { downloadByUrl } from "/@/utils/file/download";
+  import { QrcodeDoneEventParams } from "./typing";
 
   export default defineComponent({
-    name: 'QrCode',
+    name: "QrCode",
     props: {
       value: {
         type: [String, Array] as PropType<string | any[]>,
@@ -30,13 +30,13 @@
       // 中间logo图标
       logo: {
         type: [String, Object] as PropType<Partial<LogoType> | string>,
-        default: '',
+        default: "",
       },
       // img 不支持内嵌logo
       tag: {
-        type: String as PropType<'canvas' | 'img'>,
-        default: 'canvas',
-        validator: (v: string) => ['canvas', 'img'].includes(v),
+        type: String as PropType<"canvas" | "img">,
+        default: "canvas",
+        validator: (v: string) => ["canvas", "img"].includes(v),
       },
     },
     emits: { done: (data: QrcodeDoneEventParams) => !!data, error: (error: any) => !!error },
@@ -50,7 +50,7 @@
 
           if (!wrapEl) return;
 
-          if (tag === 'canvas') {
+          if (tag === "canvas") {
             const url: string = await toCanvas({
               canvas: wrapEl,
               width,
@@ -58,28 +58,28 @@
               content: renderValue,
               options: options || {},
             });
-            emit('done', { url, ctx: (wrapEl as HTMLCanvasElement).getContext('2d') });
+            emit("done", { url, ctx: (wrapEl as HTMLCanvasElement).getContext("2d") });
             return;
           }
 
-          if (tag === 'img') {
+          if (tag === "img") {
             const url = await toDataURL(renderValue, {
-              errorCorrectionLevel: 'H',
+              errorCorrectionLevel: "H",
               width,
               ...options,
             });
             (unref(wrapRef) as HTMLImageElement).src = url;
-            emit('done', { url });
+            emit("done", { url });
           }
         } catch (error) {
-          emit('error', error);
+          emit("error", error);
         }
       }
       /**
        * file download
        */
       function download(fileName?: string) {
-        let url = '';
+        let url = "";
         const wrapEl = unref(wrapRef);
         if (wrapEl instanceof HTMLCanvasElement) {
           url = wrapEl.toDataURL();
diff --git a/src/components/Qrcode/src/drawCanvas.ts b/src/components/Qrcode/src/drawCanvas.ts
index 53198e887b1a05b388edfcde54189088ea337650..411ccdea6b13bceda180d0925c71b55db64120a8 100644
--- a/src/components/Qrcode/src/drawCanvas.ts
+++ b/src/components/Qrcode/src/drawCanvas.ts
@@ -1,7 +1,7 @@
-import { toCanvas } from 'qrcode';
-import type { QRCodeRenderersOptions } from 'qrcode';
-import { RenderQrCodeParams, ContentType } from './typing';
-import { cloneDeep } from 'lodash-es';
+import { toCanvas } from "qrcode";
+import type { QRCodeRenderersOptions } from "qrcode";
+import { RenderQrCodeParams, ContentType } from "./typing";
+import { cloneDeep } from "lodash-es";
 
 export const renderQrCode = ({
   canvas,
@@ -21,17 +21,17 @@ export const renderQrCode = ({
 
 // 得到原QrCode的大小,以便缩放得到正确的QrCode大小
 function getOriginWidth(content: ContentType, options: QRCodeRenderersOptions) {
-  const _canvas = document.createElement('canvas');
+  const _canvas = document.createElement("canvas");
   return toCanvas(_canvas, content, options).then(() => _canvas.width);
 }
 
 // 对于内容少的QrCode,增大容错率
 function getErrorCorrectionLevel(content: ContentType) {
   if (content.length > 36) {
-    return 'M';
+    return "M";
   } else if (content.length > 16) {
-    return 'Q';
+    return "Q";
   } else {
-    return 'H';
+    return "H";
   }
 }
diff --git a/src/components/Qrcode/src/drawLogo.ts b/src/components/Qrcode/src/drawLogo.ts
index 85a160f20e637d22c5b324778f2380387f1e486d..646839a56131817c063f8539dea5f7664c876176 100644
--- a/src/components/Qrcode/src/drawLogo.ts
+++ b/src/components/Qrcode/src/drawLogo.ts
@@ -1,5 +1,5 @@
-import { isString } from '/@/utils/is';
-import { RenderQrCodeParams, LogoType } from './typing';
+import { isString } from "/@/utils/is";
+import { RenderQrCodeParams, LogoType } from "./typing";
 export const drawLogo = ({ canvas, logo }: RenderQrCodeParams) => {
   if (!logo) {
     return new Promise((resolve) => {
@@ -9,7 +9,7 @@ export const drawLogo = ({ canvas, logo }: RenderQrCodeParams) => {
   const canvasWidth = (canvas as HTMLCanvasElement).width;
   const {
     logoSize = 0.15,
-    bgColor = '#ffffff',
+    bgColor = "#ffffff",
     borderSize = 0.05,
     crossOrigin,
     borderRadius = 8,
@@ -22,7 +22,7 @@ export const drawLogo = ({ canvas, logo }: RenderQrCodeParams) => {
   const logoBgWidth = canvasWidth * (logoSize + borderSize);
   const logoBgXY = (canvasWidth * (1 - logoSize - borderSize)) / 2;
 
-  const ctx = canvas.getContext('2d');
+  const ctx = canvas.getContext("2d");
   if (!ctx) return;
 
   // logo 底色
@@ -33,7 +33,7 @@ export const drawLogo = ({ canvas, logo }: RenderQrCodeParams) => {
   // logo
   const image = new Image();
   if (crossOrigin || logoRadius) {
-    image.setAttribute('crossOrigin', crossOrigin || 'anonymous');
+    image.setAttribute("crossOrigin", crossOrigin || "anonymous");
   }
   image.src = logoSrc;
 
@@ -44,16 +44,16 @@ export const drawLogo = ({ canvas, logo }: RenderQrCodeParams) => {
 
   // 使用canvas绘制以获得更多的功能
   const drawLogoWithCanvas = (image: HTMLImageElement) => {
-    const canvasImage = document.createElement('canvas');
+    const canvasImage = document.createElement("canvas");
     canvasImage.width = logoXY + logoWidth;
     canvasImage.height = logoXY + logoWidth;
-    const imageCanvas = canvasImage.getContext('2d');
+    const imageCanvas = canvasImage.getContext("2d");
     if (!imageCanvas || !ctx) return;
     imageCanvas.drawImage(image, logoXY, logoXY, logoWidth, logoWidth);
 
     canvasRoundRect(ctx)(logoXY, logoXY, logoWidth, logoWidth, logoRadius);
     if (!ctx) return;
-    const fillStyle = ctx.createPattern(canvasImage, 'no-repeat');
+    const fillStyle = ctx.createPattern(canvasImage, "no-repeat");
     if (fillStyle) {
       ctx.fillStyle = fillStyle;
       ctx.fill();
diff --git a/src/components/Qrcode/src/qrcodePlus.ts b/src/components/Qrcode/src/qrcodePlus.ts
index 64398617951ae622a942986696dbbc104b99dc01..40b99d1d3ad190d7439e1f000387db46b62c2a50 100644
--- a/src/components/Qrcode/src/qrcodePlus.ts
+++ b/src/components/Qrcode/src/qrcodePlus.ts
@@ -1,4 +1,4 @@
 // 参考 qr-code-with-logo 进行ts版本修改
-import { toCanvas } from './toCanvas';
-export * from './typing';
+import { toCanvas } from "./toCanvas";
+export * from "./typing";
 export { toCanvas };
diff --git a/src/components/Qrcode/src/toCanvas.ts b/src/components/Qrcode/src/toCanvas.ts
index f74d59682de6344bef8d130ac6f2bcd241432942..990c988b6e5d4740457838024e16b652c6d2b684 100644
--- a/src/components/Qrcode/src/toCanvas.ts
+++ b/src/components/Qrcode/src/toCanvas.ts
@@ -1,6 +1,6 @@
-import { renderQrCode } from './drawCanvas';
-import { drawLogo } from './drawLogo';
-import { RenderQrCodeParams } from './typing';
+import { renderQrCode } from "./drawCanvas";
+import { drawLogo } from "./drawLogo";
+import { RenderQrCodeParams } from "./typing";
 export const toCanvas = (options: RenderQrCodeParams) => {
   return renderQrCode(options)
     .then(() => {
diff --git a/src/components/Qrcode/src/typing.ts b/src/components/Qrcode/src/typing.ts
index 3a037e9db133661c85e45f028d8bc56057b28306..bf9699fc15a7c18e99d59ed3a136a59d327d35e1 100644
--- a/src/components/Qrcode/src/typing.ts
+++ b/src/components/Qrcode/src/typing.ts
@@ -1,4 +1,4 @@
-import type { QRCodeSegment, QRCodeRenderersOptions } from 'qrcode';
+import type { QRCodeSegment, QRCodeRenderersOptions } from "qrcode";
 
 export type ContentType = string | QRCodeSegment[];
 
diff --git a/src/components/Scrollbar/index.ts b/src/components/Scrollbar/index.ts
index e5b2cb245c7e5a4be56ec4d7b484d74272a5601f..2180ea18269bde3d87783e7c6861c1ef47ce919f 100644
--- a/src/components/Scrollbar/index.ts
+++ b/src/components/Scrollbar/index.ts
@@ -2,7 +2,7 @@
  * copy from element-ui
  */
 
-import Scrollbar from './src/Scrollbar.vue';
+import Scrollbar from "./src/Scrollbar.vue";
 
 export { Scrollbar };
-export type { ScrollbarType } from './src/types';
+export type { ScrollbarType } from "./src/types";
diff --git a/src/components/Scrollbar/src/Scrollbar.vue b/src/components/Scrollbar/src/Scrollbar.vue
index ed08026a21cf12bb43f37d82201f4b9ecfbaaf2c..c6ee363b8f999190c5be7d029b0be392cd81d01a 100644
--- a/src/components/Scrollbar/src/Scrollbar.vue
+++ b/src/components/Scrollbar/src/Scrollbar.vue
@@ -17,10 +17,10 @@
   </div>
 </template>
 <script lang="ts">
-  import { addResizeListener, removeResizeListener } from '/@/utils/event';
-  import componentSetting from '/@/settings/componentSetting';
+  import { addResizeListener, removeResizeListener } from "/@/utils/event";
+  import componentSetting from "/@/settings/componentSetting";
   const { scrollbar } = componentSetting;
-  import { toObject } from './util';
+  import { toObject } from "./util";
   import {
     defineComponent,
     ref,
@@ -30,11 +30,11 @@
     provide,
     computed,
     unref,
-  } from 'vue';
-  import Bar from './bar';
+  } from "vue";
+  import Bar from "./bar";
 
   export default defineComponent({
-    name: 'Scrollbar',
+    name: "Scrollbar",
     // inheritAttrs: false,
     components: { Bar },
     props: {
@@ -44,35 +44,35 @@
       },
       wrapStyle: {
         type: [String, Array],
-        default: '',
+        default: "",
       },
       wrapClass: {
         type: [String, Array],
-        default: '',
+        default: "",
       },
       viewClass: {
         type: [String, Array],
-        default: '',
+        default: "",
       },
       viewStyle: {
         type: [String, Array],
-        default: '',
+        default: "",
       },
       noresize: Boolean, // 如果 container 尺寸不会发生变化,最好设置它可以优化性能
       tag: {
         type: String,
-        default: 'div',
+        default: "div",
       },
     },
     setup(props) {
-      const sizeWidth = ref('0');
-      const sizeHeight = ref('0');
+      const sizeWidth = ref("0");
+      const sizeHeight = ref("0");
       const moveX = ref(0);
       const moveY = ref(0);
       const wrap = ref();
       const resize = ref();
 
-      provide('scroll-bar-wrap', wrap);
+      provide("scroll-bar-wrap", wrap);
 
       const style = computed(() => {
         if (Array.isArray(props.wrapStyle)) {
@@ -94,8 +94,8 @@
         const heightPercentage = (unref(wrap).clientHeight * 100) / unref(wrap).scrollHeight;
         const widthPercentage = (unref(wrap).clientWidth * 100) / unref(wrap).scrollWidth;
 
-        sizeHeight.value = heightPercentage < 100 ? heightPercentage + '%' : '';
-        sizeWidth.value = widthPercentage < 100 ? widthPercentage + '%' : '';
+        sizeHeight.value = heightPercentage < 100 ? heightPercentage + "%" : "";
+        sizeWidth.value = widthPercentage < 100 ? widthPercentage + "%" : "";
       };
 
       onMounted(() => {
@@ -104,7 +104,7 @@
         if (!props.noresize) {
           addResizeListener(unref(resize), update);
           addResizeListener(unref(wrap), update);
-          addEventListener('resize', update);
+          addEventListener("resize", update);
         }
       });
 
@@ -113,7 +113,7 @@
         if (!props.noresize) {
           removeResizeListener(unref(resize), update);
           removeResizeListener(unref(wrap), update);
-          removeEventListener('resize', update);
+          removeEventListener("resize", update);
         }
       });
 
diff --git a/src/components/Scrollbar/src/bar.ts b/src/components/Scrollbar/src/bar.ts
index 64bd28962d7e911105b799e75775321f6c76248e..b992d29f518f2ece945300f9cbffe3fa3834d1bc 100644
--- a/src/components/Scrollbar/src/bar.ts
+++ b/src/components/Scrollbar/src/bar.ts
@@ -7,13 +7,13 @@ import {
   onUnmounted,
   inject,
   Ref,
-} from 'vue';
-import { on, off } from '/@/utils/domUtils';
+} from "vue";
+import { on, off } from "/@/utils/domUtils";
 
-import { renderThumbStyle, BAR_MAP } from './util';
+import { renderThumbStyle, BAR_MAP } from "./util";
 
 export default defineComponent({
-  name: 'Bar',
+  name: "Bar",
 
   props: {
     vertical: Boolean,
@@ -24,9 +24,9 @@ export default defineComponent({
   setup(props) {
     const instance = getCurrentInstance();
     const thumb = ref();
-    const wrap = inject('scroll-bar-wrap', {} as Ref<Nullable<HTMLElement>>) as any;
+    const wrap = inject("scroll-bar-wrap", {} as Ref<Nullable<HTMLElement>>) as any;
     const bar = computed(() => {
-      return BAR_MAP[props.vertical ? 'vertical' : 'horizontal'];
+      return BAR_MAP[props.vertical ? "vertical" : "horizontal"];
     });
     const barStore = ref<Recordable>({});
     const cursorDown = ref();
@@ -56,8 +56,8 @@ export default defineComponent({
     const startDrag = (e: any) => {
       e.stopImmediatePropagation();
       cursorDown.value = true;
-      on(document, 'mousemove', mouseMoveDocumentHandler);
-      on(document, 'mouseup', mouseUpDocumentHandler);
+      on(document, "mousemove", mouseMoveDocumentHandler);
+      on(document, "mouseup", mouseUpDocumentHandler);
       document.onselectstart = () => false;
     };
 
@@ -80,24 +80,24 @@ export default defineComponent({
     function mouseUpDocumentHandler() {
       cursorDown.value = false;
       barStore.value[bar.value.axis] = 0;
-      off(document, 'mousemove', mouseMoveDocumentHandler);
+      off(document, "mousemove", mouseMoveDocumentHandler);
       document.onselectstart = null;
     }
 
     onUnmounted(() => {
-      off(document, 'mouseup', mouseUpDocumentHandler);
+      off(document, "mouseup", mouseUpDocumentHandler);
     });
 
     return () =>
       h(
-        'div',
+        "div",
         {
-          class: ['scrollbar__bar', 'is-' + bar.value.key],
+          class: ["scrollbar__bar", "is-" + bar.value.key],
           onMousedown: clickTrackHandler,
         },
-        h('div', {
+        h("div", {
           ref: thumb,
-          class: 'scrollbar__thumb',
+          class: "scrollbar__thumb",
           onMousedown: clickThumbHandler,
           style: renderThumbStyle({
             size: props.size,
diff --git a/src/components/Scrollbar/src/util.ts b/src/components/Scrollbar/src/util.ts
index b7c4845c3dc21fcd3a59e21e27824543b2b40b00..59454f61262e57c078df4eb431ef592e94d8b662 100644
--- a/src/components/Scrollbar/src/util.ts
+++ b/src/components/Scrollbar/src/util.ts
@@ -1,24 +1,24 @@
-import type { BarMap } from './types';
+import type { BarMap } from "./types";
 export const BAR_MAP: BarMap = {
   vertical: {
-    offset: 'offsetHeight',
-    scroll: 'scrollTop',
-    scrollSize: 'scrollHeight',
-    size: 'height',
-    key: 'vertical',
-    axis: 'Y',
-    client: 'clientY',
-    direction: 'top',
+    offset: "offsetHeight",
+    scroll: "scrollTop",
+    scrollSize: "scrollHeight",
+    size: "height",
+    key: "vertical",
+    axis: "Y",
+    client: "clientY",
+    direction: "top",
   },
   horizontal: {
-    offset: 'offsetWidth',
-    scroll: 'scrollLeft',
-    scrollSize: 'scrollWidth',
-    size: 'width',
-    key: 'horizontal',
-    axis: 'X',
-    client: 'clientX',
-    direction: 'left',
+    offset: "offsetWidth",
+    scroll: "scrollLeft",
+    scrollSize: "scrollWidth",
+    size: "width",
+    key: "horizontal",
+    axis: "X",
+    client: "clientX",
+    direction: "left",
   },
 };
 
diff --git a/src/components/SimpleMenu/index.ts b/src/components/SimpleMenu/index.ts
index 0dfd248551eeefeb6a816609bcfdb1329a23e759..6d91307ecf35b0e665fbdbe3ddc27785905c286b 100644
--- a/src/components/SimpleMenu/index.ts
+++ b/src/components/SimpleMenu/index.ts
@@ -1,2 +1,2 @@
-export { default as SimpleMenu } from './src/SimpleMenu.vue';
-export { default as SimpleMenuTag } from './src/SimpleMenuTag.vue';
+export { default as SimpleMenu } from "./src/SimpleMenu.vue";
+export { default as SimpleMenuTag } from "./src/SimpleMenuTag.vue";
diff --git a/src/components/SimpleMenu/src/SimpleMenu.vue b/src/components/SimpleMenu/src/SimpleMenu.vue
index 45015be6c41bec7233c831abb66e0fe6e28a274b..87979cea22dd9c12ffeda50fdee9307d9068bbab 100644
--- a/src/components/SimpleMenu/src/SimpleMenu.vue
+++ b/src/components/SimpleMenu/src/SimpleMenu.vue
@@ -18,23 +18,23 @@
   </Menu>
 </template>
 <script lang="ts">
-  import type { MenuState } from './types';
-  import type { Menu as MenuType } from '/@/router/types';
-  import type { RouteLocationNormalizedLoaded } from 'vue-router';
-  import { defineComponent, computed, ref, unref, reactive, toRefs, watch } from 'vue';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import Menu from './components/Menu.vue';
-  import SimpleSubMenu from './SimpleSubMenu.vue';
-  import { listenerRouteChange } from '/@/logics/mitt/routeChange';
-  import { propTypes } from '/@/utils/propTypes';
-  import { REDIRECT_NAME } from '/@/router/constant';
-  import { useRouter } from 'vue-router';
-  import { isFunction, isUrl } from '/@/utils/is';
-  import { openWindow } from '/@/utils';
-
-  import { useOpenKeys } from './useOpenKeys';
+  import type { MenuState } from "./types";
+  import type { Menu as MenuType } from "/@/router/types";
+  import type { RouteLocationNormalizedLoaded } from "vue-router";
+  import { defineComponent, computed, ref, unref, reactive, toRefs, watch } from "vue";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import Menu from "./components/Menu.vue";
+  import SimpleSubMenu from "./SimpleSubMenu.vue";
+  import { listenerRouteChange } from "/@/logics/mitt/routeChange";
+  import { propTypes } from "/@/utils/propTypes";
+  import { REDIRECT_NAME } from "/@/router/constant";
+  import { useRouter } from "vue-router";
+  import { isFunction, isUrl } from "/@/utils/is";
+  import { openWindow } from "/@/utils";
+
+  import { useOpenKeys } from "./useOpenKeys";
   export default defineComponent({
-    name: 'SimpleMenu',
+    name: "SimpleMenu",
     components: {
       Menu,
       SimpleSubMenu,
@@ -55,19 +55,19 @@
       },
       isSplitMenu: propTypes.bool,
     },
-    emits: ['menuClick'],
+    emits: ["menuClick"],
     setup(props, { attrs, emit }) {
-      const currentActiveMenu = ref('');
+      const currentActiveMenu = ref("");
       const isClickGo = ref(false);
 
       const menuState = reactive<MenuState>({
-        activeName: '',
+        activeName: "",
         openNames: [],
         activeSubMenuNames: [],
       });
 
       const { currentRoute } = useRouter();
-      const { prefixCls } = useDesign('simple-menu');
+      const { prefixCls } = useDesign("simple-menu");
       const { items, accordion, mixSider, collapse } = toRefs(props);
 
       const { setOpenKeys, getOpenKeys } = useOpenKeys(
@@ -100,7 +100,7 @@
           }
           setOpenKeys(currentRoute.value.path);
         },
-        { flush: 'post' },
+        { flush: "post" },
       );
 
       listenerRouteChange((route) => {
@@ -138,7 +138,7 @@
           if (!flag) return;
         }
 
-        emit('menuClick', key);
+        emit("menuClick", key);
 
         isClickGo.value = true;
         setOpenKeys(key);
@@ -156,5 +156,5 @@
   });
 </script>
 <style lang="less">
-  @import './index.less';
+  @import "./index.less";
 </style>
diff --git a/src/components/SimpleMenu/src/SimpleMenuTag.vue b/src/components/SimpleMenu/src/SimpleMenuTag.vue
index b7d3cb3661f8bff91ed0808c5a9fdb02dbed610e..12e2fa456a55e1bca916c34de06547c3f8bbfcd0 100644
--- a/src/components/SimpleMenu/src/SimpleMenuTag.vue
+++ b/src/components/SimpleMenu/src/SimpleMenuTag.vue
@@ -2,15 +2,15 @@
   <span :class="getTagClass" v-if="getShowTag">{{ getContent }}</span>
 </template>
 <script lang="ts">
-  import type { Menu } from '/@/router/types';
+  import type { Menu } from "/@/router/types";
 
-  import { defineComponent, computed } from 'vue';
+  import { defineComponent, computed } from "vue";
 
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { propTypes } from '/@/utils/propTypes';
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { propTypes } from "/@/utils/propTypes";
 
   export default defineComponent({
-    name: 'SimpleMenuTag',
+    name: "SimpleMenuTag",
     props: {
       item: {
         type: Object as PropType<Menu>,
@@ -20,7 +20,7 @@
       collapseParent: propTypes.bool,
     },
     setup(props) {
-      const { prefixCls } = useDesign('simple-menu');
+      const { prefixCls } = useDesign("simple-menu");
 
       const getShowTag = computed(() => {
         const { item } = props;
@@ -36,17 +36,17 @@
       });
 
       const getContent = computed(() => {
-        if (!getShowTag.value) return '';
+        if (!getShowTag.value) return "";
         const { item, collapseParent } = props;
         const { tag } = item;
         const { dot, content } = tag!;
-        return dot || collapseParent ? '' : content;
+        return dot || collapseParent ? "" : content;
       });
 
       const getTagClass = computed(() => {
         const { item, collapseParent } = props;
         const { tag = {} } = item || {};
-        const { dot, type = 'error' } = tag;
+        const { dot, type = "error" } = tag;
         const tagCls = `${prefixCls}-tag`;
         return [
           tagCls,
diff --git a/src/components/SimpleMenu/src/SimpleSubMenu.vue b/src/components/SimpleMenu/src/SimpleSubMenu.vue
index bb4e77851714b630876727d587754538a8451111..11ac1ffb1f0eb7d80dfa9b36fa3891b07cbb7443 100644
--- a/src/components/SimpleMenu/src/SimpleSubMenu.vue
+++ b/src/components/SimpleMenu/src/SimpleSubMenu.vue
@@ -34,31 +34,34 @@
       </span>
       <SimpleMenuTag :item="item" :collapseParent="!!collapse && !!parent" />
     </template>
-    <template v-for="childrenItem in item.children || []" :key="childrenItem.path">
+    <template
+      v-for="childrenItem in item.children || []"
+      :key="childrenItem.paramPath || childrenItem.path"
+    >
       <SimpleSubMenu v-bind="$props" :item="childrenItem" :parent="false" />
     </template>
   </SubMenu>
 </template>
 <script lang="ts">
-  import type { PropType } from 'vue';
-  import type { Menu } from '/@/router/types';
+  import type { PropType } from "vue";
+  import type { Menu } from "/@/router/types";
 
-  import { defineComponent, computed } from 'vue';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import Icon from '/@/components/Icon/index';
+  import { defineComponent, computed } from "vue";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import Icon from "/@/components/Icon/index";
 
-  import MenuItem from './components/MenuItem.vue';
-  import SubMenu from './components/SubMenuItem.vue';
-  import { propTypes } from '/@/utils/propTypes';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
+  import MenuItem from "./components/MenuItem.vue";
+  import SubMenu from "./components/SubMenuItem.vue";
+  import { propTypes } from "/@/utils/propTypes";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { createAsyncComponent } from "/@/utils/factory/createAsyncComponent";
 
   export default defineComponent({
-    name: 'SimpleSubMenu',
+    name: "SimpleSubMenu",
     components: {
       SubMenu,
       MenuItem,
-      SimpleMenuTag: createAsyncComponent(() => import('./SimpleMenuTag.vue')),
+      SimpleMenuTag: createAsyncComponent(() => import("./SimpleMenuTag.vue")),
       Icon,
     },
     props: {
@@ -69,11 +72,11 @@
       parent: propTypes.bool,
       collapsedShowTitle: propTypes.bool,
       collapse: propTypes.bool,
-      theme: propTypes.oneOf(['dark', 'light']),
+      theme: propTypes.oneOf(["dark", "light"]),
     },
     setup(props) {
       const { t } = useI18n();
-      const { prefixCls } = useDesign('simple-menu');
+      const { prefixCls } = useDesign("simple-menu");
 
       const getShowMenu = computed(() => !props.item?.meta?.hideMenu);
       const getIcon = computed(() => props.item?.icon);
@@ -92,7 +95,7 @@
       function menuHasChildren(menuTreeItem: Menu): boolean {
         return (
           !menuTreeItem.meta?.hideChildrenInMenu &&
-          Reflect.has(menuTreeItem, 'children') &&
+          Reflect.has(menuTreeItem, "children") &&
           !!menuTreeItem.children &&
           menuTreeItem.children.length > 0
         );
diff --git a/src/components/SimpleMenu/src/components/Menu.vue b/src/components/SimpleMenu/src/components/Menu.vue
index 28f78fbe057d431e2498cf1a97f068c8bff5df5d..76027e8d7b6bf47fa476f6fdff5f32101f1d7501 100644
--- a/src/components/SimpleMenu/src/components/Menu.vue
+++ b/src/components/SimpleMenu/src/components/Menu.vue
@@ -5,8 +5,8 @@
 </template>
 
 <script lang="ts">
-  import type { PropType } from 'vue';
-  import type { SubMenuProvider } from './types';
+  import type { PropType } from "vue";
+  import type { SubMenuProvider } from "./types";
   import {
     defineComponent,
     ref,
@@ -17,24 +17,24 @@
     nextTick,
     getCurrentInstance,
     provide,
-  } from 'vue';
+  } from "vue";
 
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { propTypes } from '/@/utils/propTypes';
-  import { createSimpleRootMenuContext } from './useSimpleMenuContext';
-  import mitt from '/@/utils/mitt';
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { propTypes } from "/@/utils/propTypes";
+  import { createSimpleRootMenuContext } from "./useSimpleMenuContext";
+  import mitt from "/@/utils/mitt";
   export default defineComponent({
-    name: 'Menu',
+    name: "Menu",
     props: {
-      theme: propTypes.oneOf(['light', 'dark']).def('light'),
+      theme: propTypes.oneOf(["light", "dark"]).def("light"),
       activeName: propTypes.oneOfType([propTypes.string, propTypes.number]),
       openNames: {
         type: Array as PropType<string[]>,
         default: () => [],
       },
       accordion: propTypes.bool.def(true),
-      width: propTypes.string.def('100%'),
-      collapsedWidth: propTypes.string.def('48px'),
+      width: propTypes.string.def("100%"),
+      collapsedWidth: propTypes.string.def("48px"),
       indentSize: propTypes.number.def(16),
       collapse: propTypes.bool.def(true),
       activeSubMenuNames: {
@@ -42,15 +42,15 @@
         default: () => [],
       },
     },
-    emits: ['select', 'open-change'],
+    emits: ["select", "open-change"],
     setup(props, { emit }) {
       const rootMenuEmitter = mitt();
       const instance = getCurrentInstance();
 
-      const currentActiveName = ref<string | number>('');
+      const currentActiveName = ref<string | number>("");
       const openedNames = ref<string[]>([]);
 
-      const { prefixCls } = useDesign('menu');
+      const { prefixCls } = useDesign("menu");
 
       const isRemoveAllPopup = ref(false);
 
@@ -91,7 +91,7 @@
       );
 
       function updateOpened() {
-        rootMenuEmitter.emit('on-update-opened', openedNames.value);
+        rootMenuEmitter.emit("on-update-opened", openedNames.value);
       }
 
       function addSubMenu(name: string) {
@@ -130,16 +130,16 @@
       onMounted(() => {
         openedNames.value = !props.collapse ? [...props.openNames] : [];
         updateOpened();
-        rootMenuEmitter.on('on-menu-item-select', (name: string) => {
+        rootMenuEmitter.on("on-menu-item-select", (name: string) => {
           currentActiveName.value = name;
 
           nextTick(() => {
             props.collapse && removeAll();
           });
-          emit('select', name);
+          emit("select", name);
         });
 
-        rootMenuEmitter.on('open-name-change', ({ name, opened }) => {
+        rootMenuEmitter.on("open-name-change", ({ name, opened }) => {
           if (opened && !openedNames.value.includes(name)) {
             openedNames.value.push(name);
           } else if (!opened) {
@@ -154,5 +154,5 @@
   });
 </script>
 <style lang="less">
-  @import './menu.less';
+  @import "./menu.less";
 </style>
diff --git a/src/components/SimpleMenu/src/components/MenuCollapseTransition.vue b/src/components/SimpleMenu/src/components/MenuCollapseTransition.vue
index 5295439a7a41297da4cc94487623d49c95e9dae3..c2d67000d14f0f4f1ab701a3db84ba82d0a1406e 100644
--- a/src/components/SimpleMenu/src/components/MenuCollapseTransition.vue
+++ b/src/components/SimpleMenu/src/components/MenuCollapseTransition.vue
@@ -4,22 +4,22 @@
   </transition>
 </template>
 <script lang="ts">
-  import { defineComponent } from 'vue';
-  import { addClass, removeClass } from '/@/utils/domUtils';
+  import { defineComponent } from "vue";
+  import { addClass, removeClass } from "/@/utils/domUtils";
 
   export default defineComponent({
-    name: 'MenuCollapseTransition',
+    name: "MenuCollapseTransition",
     setup() {
       return {
         on: {
           beforeEnter(el) {
-            addClass(el, 'collapse-transition');
+            addClass(el, "collapse-transition");
             if (!el.dataset) el.dataset = {};
 
             el.dataset.oldPaddingTop = el.style.paddingTop;
             el.dataset.oldPaddingBottom = el.style.paddingBottom;
 
-            el.style.height = '0';
+            el.style.height = "0";
             el.style.paddingTop = 0;
             el.style.paddingBottom = 0;
           },
@@ -27,21 +27,21 @@
           enter(el) {
             el.dataset.oldOverflow = el.style.overflow;
             if (el.scrollHeight !== 0) {
-              el.style.height = el.scrollHeight + 'px';
+              el.style.height = el.scrollHeight + "px";
               el.style.paddingTop = el.dataset.oldPaddingTop;
               el.style.paddingBottom = el.dataset.oldPaddingBottom;
             } else {
-              el.style.height = '';
+              el.style.height = "";
               el.style.paddingTop = el.dataset.oldPaddingTop;
               el.style.paddingBottom = el.dataset.oldPaddingBottom;
             }
 
-            el.style.overflow = 'hidden';
+            el.style.overflow = "hidden";
           },
 
           afterEnter(el) {
-            removeClass(el, 'collapse-transition');
-            el.style.height = '';
+            removeClass(el, "collapse-transition");
+            el.style.height = "";
             el.style.overflow = el.dataset.oldOverflow;
           },
 
@@ -51,13 +51,13 @@
             el.dataset.oldPaddingBottom = el.style.paddingBottom;
             el.dataset.oldOverflow = el.style.overflow;
 
-            el.style.height = el.scrollHeight + 'px';
-            el.style.overflow = 'hidden';
+            el.style.height = el.scrollHeight + "px";
+            el.style.overflow = "hidden";
           },
 
           leave(el) {
             if (el.scrollHeight !== 0) {
-              addClass(el, 'collapse-transition');
+              addClass(el, "collapse-transition");
               el.style.height = 0;
               el.style.paddingTop = 0;
               el.style.paddingBottom = 0;
@@ -65,8 +65,8 @@
           },
 
           afterLeave(el) {
-            removeClass(el, 'collapse-transition');
-            el.style.height = '';
+            removeClass(el, "collapse-transition");
+            el.style.height = "";
             el.style.overflow = el.dataset.oldOverflow;
             el.style.paddingTop = el.dataset.oldPaddingTop;
             el.style.paddingBottom = el.dataset.oldPaddingBottom;
diff --git a/src/components/SimpleMenu/src/components/MenuItem.vue b/src/components/SimpleMenu/src/components/MenuItem.vue
index c4976dec9606c5cc2db5090b8e7a970e3bd1a309..d47479f2f2d43a8a0a36b97ebcc6c69a701ef5cb 100644
--- a/src/components/SimpleMenu/src/components/MenuItem.vue
+++ b/src/components/SimpleMenu/src/components/MenuItem.vue
@@ -17,15 +17,15 @@
 </template>
 
 <script lang="ts">
-  import { PropType } from 'vue';
-  import { defineComponent, ref, computed, unref, getCurrentInstance, watch } from 'vue';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { propTypes } from '/@/utils/propTypes';
-  import { useMenuItem } from './useMenu';
-  import { Tooltip } from 'ant-design-vue';
-  import { useSimpleRootMenuContext } from './useSimpleMenuContext';
+  import { PropType } from "vue";
+  import { defineComponent, ref, computed, unref, getCurrentInstance, watch } from "vue";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { propTypes } from "/@/utils/propTypes";
+  import { useMenuItem } from "./useMenu";
+  import { Tooltip } from "ant-design-vue";
+  import { useSimpleRootMenuContext } from "./useSimpleMenuContext";
   export default defineComponent({
-    name: 'MenuItem',
+    name: "MenuItem",
     components: { Tooltip },
     props: {
       name: {
@@ -42,7 +42,7 @@
       const { getItemStyle, getParentList, getParentMenu, getParentRootMenu } =
         useMenuItem(instance);
 
-      const { prefixCls } = useDesign('menu');
+      const { prefixCls } = useDesign("menu");
 
       const { rootMenuEmitter, activeName } = useSimpleRootMenuContext();
 
@@ -60,7 +60,7 @@
       const getCollapse = computed(() => unref(getParentRootMenu)?.props.collapse);
 
       const showTooptip = computed(() => {
-        return unref(getParentMenu)?.type.name === 'Menu' && unref(getCollapse) && slots.title;
+        return unref(getParentMenu)?.type.name === "Menu" && unref(getCollapse) && slots.title;
       });
 
       function handleClickItem() {
@@ -69,13 +69,13 @@
           return;
         }
 
-        rootMenuEmitter.emit('on-menu-item-select', props.name);
+        rootMenuEmitter.emit("on-menu-item-select", props.name);
         if (unref(getCollapse)) {
           return;
         }
         const { uidList } = getParentList();
 
-        rootMenuEmitter.emit('on-update-opened', {
+        rootMenuEmitter.emit("on-update-opened", {
           opend: false,
           parent: instance?.parent,
           uidList: uidList,
@@ -93,7 +93,7 @@
               }
             });
 
-            rootMenuEmitter.emit('on-update-active-name:submenu', uidList);
+            rootMenuEmitter.emit("on-update-active-name:submenu", uidList);
           } else {
             active.value = false;
           }
diff --git a/src/components/SimpleMenu/src/components/SubMenuItem.vue b/src/components/SimpleMenu/src/components/SubMenuItem.vue
index d5cf7e3cdd3665fc0ddc28a3af7e14d8442b8538..4216ca64d56038837ae325dfad8da81a97364dbc 100644
--- a/src/components/SimpleMenu/src/components/SubMenuItem.vue
+++ b/src/components/SimpleMenu/src/components/SubMenuItem.vue
@@ -21,7 +21,7 @@
       :overlayClassName="`${prefixCls}-menu-popover`"
       v-else
       :visible="getIsOpend"
-      @visibleChange="handleVisibleChange"
+      @visible-change="handleVisibleChange"
       :overlayStyle="getOverlayStyle"
       :align="{ offset: [0, 0] }"
     >
@@ -56,8 +56,8 @@
 </template>
 
 <script lang="ts">
-  import type { CSSProperties, PropType } from 'vue';
-  import type { SubMenuProvider } from './types';
+  import type { CSSProperties, PropType } from "vue";
+  import type { SubMenuProvider } from "./types";
   import {
     defineComponent,
     computed,
@@ -68,20 +68,20 @@
     provide,
     onBeforeMount,
     inject,
-  } from 'vue';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { propTypes } from '/@/utils/propTypes';
-  import { useMenuItem } from './useMenu';
-  import { useSimpleRootMenuContext } from './useSimpleMenuContext';
-  import { CollapseTransition } from '/@/components/Transition';
-  import Icon from '/@/components/Icon';
-  import { Popover } from 'ant-design-vue';
-  import { isBoolean, isObject } from '/@/utils/is';
-  import mitt from '/@/utils/mitt';
+  } from "vue";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { propTypes } from "/@/utils/propTypes";
+  import { useMenuItem } from "./useMenu";
+  import { useSimpleRootMenuContext } from "./useSimpleMenuContext";
+  import { CollapseTransition } from "/@/components/Transition";
+  import Icon from "/@/components/Icon";
+  import { Popover } from "ant-design-vue";
+  import { isBoolean, isObject } from "/@/utils/is";
+  import mitt from "/@/utils/mitt";
 
   const DELAY = 200;
   export default defineComponent({
-    name: 'SubMenu',
+    name: "SubMenu",
     components: {
       Icon,
       CollapseTransition,
@@ -112,7 +112,7 @@
       const { getParentSubMenu, getItemStyle, getParentMenu, getParentList } =
         useMenuItem(instance);
 
-      const { prefixCls } = useDesign('menu');
+      const { prefixCls } = useDesign("menu");
 
       const subMenuEmitter = mitt();
 
@@ -149,7 +149,7 @@
 
       const getOverlayStyle = computed((): CSSProperties => {
         return {
-          minWidth: '200px',
+          minWidth: "200px",
         };
       });
 
@@ -190,13 +190,13 @@
 
         if (unref(getAccordion)) {
           const { uidList } = getParentList();
-          rootMenuEmitter.emit('on-update-opened', {
+          rootMenuEmitter.emit("on-update-opened", {
             opend: false,
             parent: instance?.parent,
             uidList: uidList,
           });
         } else {
-          rootMenuEmitter.emit('open-name-change', {
+          rootMenuEmitter.emit("open-name-change", {
             name: props.name,
             opened: !opened,
           });
@@ -208,7 +208,7 @@
         const disabled = props.disabled;
         if (disabled) return;
 
-        subMenuEmitter.emit('submenu:mouse-enter-child');
+        subMenuEmitter.emit("submenu:mouse-enter-child");
 
         const index = parentGetOpenNames().findIndex((item) => item === props.name);
 
@@ -235,7 +235,7 @@
           data.isChild = false;
         }
 
-        subMenuEmitter.emit('submenu:mouse-leave-child');
+        subMenuEmitter.emit("submenu:mouse-leave-child");
         if (data.timeout) {
           clearTimeout(data.timeout!);
           data.timeout = setTimeout(() => {
@@ -254,19 +254,19 @@
       }
 
       onBeforeMount(() => {
-        subMenuEmitter.on('submenu:mouse-enter-child', () => {
+        subMenuEmitter.on("submenu:mouse-enter-child", () => {
           data.mouseInChild = true;
           isRemoveAllPopup.value = false;
           clearTimeout(data.timeout!);
         });
-        subMenuEmitter.on('submenu:mouse-leave-child', () => {
+        subMenuEmitter.on("submenu:mouse-leave-child", () => {
           if (data.isChild) return;
           data.mouseInChild = false;
           clearTimeout(data.timeout!);
         });
 
         rootMenuEmitter.on(
-          'on-update-opened',
+          "on-update-opened",
           (data: boolean | (string | number)[] | Recordable) => {
             if (unref(getCollapse)) return;
             if (isBoolean(data)) {
@@ -289,7 +289,7 @@
           },
         );
 
-        rootMenuEmitter.on('on-update-active-name:submenu', (data: number[]) => {
+        rootMenuEmitter.on("on-update-active-name:submenu", (data: number[]) => {
           if (instance?.uid) {
             state.active = data.includes(instance?.uid);
           }
diff --git a/src/components/SimpleMenu/src/components/menu.less b/src/components/SimpleMenu/src/components/menu.less
index b9ef388ede4260d2ffcb09c5322aef0e8434f9ef..0600adec9332dade05f59f564992b74f9dc5ec5d 100644
--- a/src/components/SimpleMenu/src/components/menu.less
+++ b/src/components/SimpleMenu/src/components/menu.less
@@ -1,6 +1,6 @@
-@menu-prefix-cls: ~'@{namespace}-menu';
-@menu-popup-prefix-cls: ~'@{namespace}-menu-popup';
-@submenu-popup-prefix-cls: ~'@{namespace}-menu-submenu-popup';
+@menu-prefix-cls: ~"@{namespace}-menu";
+@menu-popup-prefix-cls: ~"@{namespace}-menu-popup";
+@submenu-popup-prefix-cls: ~"@{namespace}-menu-submenu-popup";
 
 @transition-time: 0.2s;
 @menu-dark-subsidiary-color: rgba(255, 255, 255, 0.7);
@@ -13,8 +13,8 @@
     bottom: 0;
     display: block;
     width: 2px;
+    content: "";
     background-color: @primary-color;
-    content: '';
   }
 }
 
@@ -45,8 +45,8 @@
         position: absolute;
         top: 50%;
         right: 18px;
-        transform: translateY(-50%) rotate(-90deg);
         transition: transform @transition-time @ease-in-out;
+        transform: translateY(-50%) rotate(-90deg);
       }
     }
 
@@ -128,12 +128,12 @@
       position: relative;
       z-index: 1;
       display: flex;
+      align-items: center;
       font-size: @font-size-base;
       color: inherit;
       list-style: none;
       cursor: pointer;
       outline: none;
-      align-items: center;
 
       &:hover,
       &:active {
@@ -178,8 +178,8 @@
     &-vertical &-submenu-collapse {
       .@{submenu-popup-prefix-cls} {
         display: flex;
-        justify-content: center;
         align-items: center;
+        justify-content: center;
       }
       .@{menu-prefix-cls}-submenu-collapsed-show-tit {
         flex-direction: column;
@@ -244,8 +244,8 @@
           left: 0;
           width: 3px;
           height: 100%;
+          content: "";
           background-color: @primary-color;
-          content: '';
         }
       }
     }
@@ -276,8 +276,8 @@
           left: 0;
           width: 3px;
           height: 100%;
+          content: "";
           background-color: @primary-color;
-          content: '';
         }
 
         .@{menu-prefix-cls}-submenu-collapse {
diff --git a/src/components/SimpleMenu/src/components/types.ts b/src/components/SimpleMenu/src/components/types.ts
index d828e89a694f26482ae469a22eabb0e53e74dde9..5230120a5adb4c4ff76a1cb2c82265b2cda74294 100644
--- a/src/components/SimpleMenu/src/components/types.ts
+++ b/src/components/SimpleMenu/src/components/types.ts
@@ -1,4 +1,4 @@
-import { Ref } from 'vue';
+import { Ref } from "vue";
 
 export interface Props {
   theme: string;
diff --git a/src/components/SimpleMenu/src/components/useMenu.ts b/src/components/SimpleMenu/src/components/useMenu.ts
index 8830559d32589c061cbbbcb7a7a0eb6307969777..521ca30cadbc8b6749578039ba7cfa71b0069cc9 100644
--- a/src/components/SimpleMenu/src/components/useMenu.ts
+++ b/src/components/SimpleMenu/src/components/useMenu.ts
@@ -1,17 +1,17 @@
-import { computed, ComponentInternalInstance, unref } from 'vue';
-import type { CSSProperties } from 'vue';
+import { computed, ComponentInternalInstance, unref } from "vue";
+import type { CSSProperties } from "vue";
 
 export function useMenuItem(instance: ComponentInternalInstance | null) {
   const getParentMenu = computed(() => {
-    return findParentMenu(['Menu', 'SubMenu']);
+    return findParentMenu(["Menu", "SubMenu"]);
   });
 
   const getParentRootMenu = computed(() => {
-    return findParentMenu(['Menu']);
+    return findParentMenu(["Menu"]);
   });
 
   const getParentSubMenu = computed(() => {
-    return findParentMenu(['SubMenu']);
+    return findParentMenu(["SubMenu"]);
   });
 
   const getItemStyle = computed((): CSSProperties => {
@@ -23,14 +23,14 @@ export function useMenuItem(instance: ComponentInternalInstance | null) {
     if (unref(getParentRootMenu)?.props.collapse) {
       padding = indentSize;
     } else {
-      while (parent && parent.type.name !== 'Menu') {
-        if (parent.type.name === 'SubMenu') {
+      while (parent && parent.type.name !== "Menu") {
+        if (parent.type.name === "SubMenu") {
           padding += indentSize;
         }
         parent = parent.parent;
       }
     }
-    return { paddingLeft: padding + 'px' };
+    return { paddingLeft: padding + "px" };
   });
 
   function findParentMenu(name: string[]) {
@@ -50,8 +50,8 @@ export function useMenuItem(instance: ComponentInternalInstance | null) {
         list: [],
       };
     const ret: any[] = [];
-    while (parent && parent.type.name !== 'Menu') {
-      if (parent.type.name === 'SubMenu') {
+    while (parent && parent.type.name !== "Menu") {
+      if (parent.type.name === "SubMenu") {
         ret.push(parent);
       }
       parent = parent.parent;
@@ -62,7 +62,7 @@ export function useMenuItem(instance: ComponentInternalInstance | null) {
     };
   }
 
-  function getParentInstance(instance: ComponentInternalInstance, name = 'SubMenu') {
+  function getParentInstance(instance: ComponentInternalInstance, name = "SubMenu") {
     let parent = instance.parent;
     while (parent) {
       if (parent.type.name !== name) {
diff --git a/src/components/SimpleMenu/src/components/useSimpleMenuContext.ts b/src/components/SimpleMenu/src/components/useSimpleMenuContext.ts
index f3d810032d5d060367c30664d16a13b2eea2cc15..7cecb76c5c6dda56738d1c26a0f2f29421679946 100644
--- a/src/components/SimpleMenu/src/components/useSimpleMenuContext.ts
+++ b/src/components/SimpleMenu/src/components/useSimpleMenuContext.ts
@@ -1,6 +1,6 @@
-import type { InjectionKey, Ref } from 'vue';
-import type { Emitter } from '/@/utils/mitt';
-import { createContext, useContext } from '/@/hooks/core/useContext';
+import type { InjectionKey, Ref } from "vue";
+import type { Emitter } from "/@/utils/mitt";
+import { createContext, useContext } from "/@/hooks/core/useContext";
 
 export interface SimpleRootMenuContextProps {
   rootMenuEmitter: Emitter;
diff --git a/src/components/SimpleMenu/src/index.less b/src/components/SimpleMenu/src/index.less
index 4f9c9ce17f834496860de5df9ace97c5e1ee712f..efb17a0e8f9fdc684335dc0ce0635d94d45219ed 100644
--- a/src/components/SimpleMenu/src/index.less
+++ b/src/components/SimpleMenu/src/index.less
@@ -1,5 +1,5 @@
-@simple-prefix-cls: ~'@{namespace}-simple-menu';
-@prefix-cls: ~'@{namespace}-menu';
+@simple-prefix-cls: ~"@{namespace}-simple-menu";
+@prefix-cls: ~"@{namespace}-menu";
 
 .@{prefix-cls} {
   &-dark&-vertical .@{simple-prefix-cls}__parent {
diff --git a/src/components/SimpleMenu/src/useOpenKeys.ts b/src/components/SimpleMenu/src/useOpenKeys.ts
index 1b3cf7b1707898014d968151b5ad8e4712472452..743e3a2b4560bec42d0efb40b331a2dd781a85cf 100644
--- a/src/components/SimpleMenu/src/useOpenKeys.ts
+++ b/src/components/SimpleMenu/src/useOpenKeys.ts
@@ -1,14 +1,14 @@
-import type { Menu as MenuType } from '/@/router/types';
-import type { MenuState } from './types';
+import type { Menu as MenuType } from "/@/router/types";
+import type { MenuState } from "./types";
 
-import { computed, Ref, toRaw } from 'vue';
+import { computed, Ref, toRaw } from "vue";
 
-import { unref } from 'vue';
-import { uniq } from 'lodash-es';
-import { getAllParentPath } from '/@/router/helper/menuHelper';
+import { unref } from "vue";
+import { uniq } from "lodash-es";
+import { getAllParentPath } from "/@/router/helper/menuHelper";
 
-import { useTimeoutFn } from '/@/hooks/core/useTimeout';
-import { useDebounceFn } from '@vueuse/core';
+import { useTimeoutFn } from "/@/hooks/core/useTimeout";
+import { useDebounceFn } from "@vueuse/core";
 
 export function useOpenKeys(
   menuState: MenuState,
diff --git a/src/components/StrengthMeter/index.ts b/src/components/StrengthMeter/index.ts
index 9763afab242eb7de3ecf5298704a3d516fbd26ef..efd1f259ae8c476172c141e36c7ed0ebee46a6ff 100644
--- a/src/components/StrengthMeter/index.ts
+++ b/src/components/StrengthMeter/index.ts
@@ -1,4 +1,4 @@
-import { withInstall } from '/@/utils';
-import strengthMeter from './src/StrengthMeter.vue';
+import { withInstall } from "/@/utils";
+import strengthMeter from "./src/StrengthMeter.vue";
 
 export const StrengthMeter = withInstall(strengthMeter);
diff --git a/src/components/StrengthMeter/src/StrengthMeter.vue b/src/components/StrengthMeter/src/StrengthMeter.vue
index e0fc33174e36cbcaffe5bad3f0fc4200d2a0b1ce..c5b2c9608ac4cae19fa91c893b335b312245c40d 100644
--- a/src/components/StrengthMeter/src/StrengthMeter.vue
+++ b/src/components/StrengthMeter/src/StrengthMeter.vue
@@ -19,31 +19,31 @@
 </template>
 
 <script lang="ts">
-  import { defineComponent, computed, ref, watch, unref, watchEffect } from 'vue';
-  import { Input } from 'ant-design-vue';
-  import { zxcvbn } from '@zxcvbn-ts/core';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { propTypes } from '/@/utils/propTypes';
+  import { defineComponent, computed, ref, watch, unref, watchEffect } from "vue";
+  import { Input } from "ant-design-vue";
+  import { zxcvbn } from "@zxcvbn-ts/core";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { propTypes } from "/@/utils/propTypes";
 
   export default defineComponent({
-    name: 'StrengthMeter',
+    name: "StrengthMeter",
     components: { InputPassword: Input.Password },
     props: {
       value: propTypes.string,
       showInput: propTypes.bool.def(true),
       disabled: propTypes.bool,
     },
-    emits: ['score-change', 'change'],
+    emits: ["score-change", "change"],
     setup(props, { emit }) {
-      const innerValueRef = ref('');
-      const { prefixCls } = useDesign('strength-meter');
+      const innerValueRef = ref("");
+      const { prefixCls } = useDesign("strength-meter");
 
       const getPasswordStrength = computed(() => {
         const { disabled } = props;
         if (disabled) return -1;
         const innerValue = unref(innerValueRef);
         const score = innerValue ? zxcvbn(unref(innerValueRef)).score : -1;
-        emit('score-change', score);
+        emit("score-change", score);
         return score;
       });
 
@@ -52,13 +52,13 @@
       }
 
       watchEffect(() => {
-        innerValueRef.value = props.value || '';
+        innerValueRef.value = props.value || "";
       });
 
       watch(
         () => unref(innerValueRef),
         (val) => {
-          emit('change', val);
+          emit("change", val);
         },
       );
 
@@ -72,7 +72,7 @@
   });
 </script>
 <style lang="less" scoped>
-  @prefix-cls: ~'@{namespace}-strength-meter';
+  @prefix-cls: ~"@{namespace}-strength-meter";
 
   .@{prefix-cls} {
     &-bar {
@@ -93,7 +93,7 @@
         border-color: @white;
         border-style: solid;
         border-width: 0 5px;
-        content: '';
+        content: "";
       }
 
       &::before {
@@ -112,27 +112,27 @@
         border-radius: inherit;
         transition: width 0.5s ease-in-out, background 0.25s;
 
-        &[data-score='0'] {
+        &[data-score="0"] {
           width: 20%;
           background-color: darken(@error-color, 10%);
         }
 
-        &[data-score='1'] {
+        &[data-score="1"] {
           width: 40%;
           background-color: @error-color;
         }
 
-        &[data-score='2'] {
+        &[data-score="2"] {
           width: 60%;
           background-color: @warning-color;
         }
 
-        &[data-score='3'] {
+        &[data-score="3"] {
           width: 80%;
           background-color: fade(@success-color, 50%);
         }
 
-        &[data-score='4'] {
+        &[data-score="4"] {
           width: 100%;
           background-color: @success-color;
         }
diff --git a/src/components/Table/index.ts b/src/components/Table/index.ts
index 7fe08c9de4fb161ece6275c4c5c4b7640c442f8d..6971405bf229d51ffcfd50188669908051da680c 100644
--- a/src/components/Table/index.ts
+++ b/src/components/Table/index.ts
@@ -1,10 +1,11 @@
-export { default as BasicTable } from './src/BasicTable.vue';
-export { default as TableAction } from './src/components/TableAction.vue';
-export { default as EditTableHeaderIcon } from './src/components/EditTableHeaderIcon.vue';
-export { default as TableImg } from './src/components/TableImg.vue';
-export * from './src/types/table';
-export * from './src/types/pagination';
-export * from './src/types/tableAction';
-export { useTable } from './src/hooks/useTable';
-export type { FormSchema, FormProps } from '/@/components/Form/src/types/form';
-export type { EditRecordRow } from './src/components/editable';
+export { default as BasicTable } from "./src/BasicTable.vue";
+export { default as TableAction } from "./src/components/TableAction.vue";
+export { default as EditTableHeaderIcon } from "./src/components/EditTableHeaderIcon.vue";
+export { default as TableImg } from "./src/components/TableImg.vue";
+
+export * from "./src/types/table";
+export * from "./src/types/pagination";
+export * from "./src/types/tableAction";
+export { useTable } from "./src/hooks/useTable";
+export type { FormSchema, FormProps } from "/@/components/Form/src/types/form";
+export type { EditRecordRow } from "./src/components/editable";
diff --git a/src/components/Table/src/BasicTable.vue b/src/components/Table/src/BasicTable.vue
index 7fb1071d5c0e2bda893f7908e4eaf8450b609672..8e0d0c04c8169c4158ba77e1e84675838ecf4309 100644
--- a/src/components/Table/src/BasicTable.vue
+++ b/src/components/Table/src/BasicTable.vue
@@ -1,6 +1,7 @@
 <template>
   <div ref="wrapRef" :class="getWrapperClass">
     <BasicForm
+      ref="formRef"
       submitOnReset
       v-bind="getFormProps"
       v-if="getBindValues.useSearchForm"
@@ -24,10 +25,16 @@
       <template #[item]="data" v-for="item in Object.keys($slots)" :key="item">
         <slot :name="item" v-bind="data || {}"></slot>
       </template>
-
-      <template #[`header-${column.dataIndex}`] v-for="column in columns" :key="column.dataIndex">
+      <template #headerCell="{ column }">
         <HeaderCell :column="column" />
       </template>
+      <!-- 增加对antdv3.x兼容 -->
+      <template #bodyCell="data">
+        <slot name="bodyCell" v-bind="data || {}"></slot>
+      </template>
+      <!--      <template #[`header-${column.dataIndex}`] v-for="(column, index) in columns" :key="index">-->
+      <!--        <HeaderCell :column="column" />-->
+      <!--      </template>-->
     </Table>
   </div>
 </template>
@@ -37,35 +44,35 @@
     TableActionType,
     SizeType,
     ColumnChangeParam,
-  } from './types/table';
-
-  import { defineComponent, ref, computed, unref, toRaw, inject, watchEffect } from 'vue';
-  import { Table } from 'ant-design-vue';
-  import { BasicForm, useForm } from '/@/components/Form/index';
-  import { PageWrapperFixedHeightKey } from '/@/components/Page';
-  import expandIcon from './components/ExpandIcon';
-  import HeaderCell from './components/HeaderCell.vue';
-  import { InnerHandlers } from './types/table';
-
-  import { usePagination } from './hooks/usePagination';
-  import { useColumns } from './hooks/useColumns';
-  import { useDataSource } from './hooks/useDataSource';
-  import { useLoading } from './hooks/useLoading';
-  import { useRowSelection } from './hooks/useRowSelection';
-  import { useTableScroll } from './hooks/useTableScroll';
-  import { useCustomRow } from './hooks/useCustomRow';
-  import { useTableStyle } from './hooks/useTableStyle';
-  import { useTableHeader } from './hooks/useTableHeader';
-  import { useTableExpand } from './hooks/useTableExpand';
-  import { createTableContext } from './hooks/useTableContext';
-  import { useTableFooter } from './hooks/useTableFooter';
-  import { useTableForm } from './hooks/useTableForm';
-  import { useDesign } from '/@/hooks/web/useDesign';
-
-  import { omit } from 'lodash-es';
-  import { basicProps } from './props';
-  import { isFunction } from '/@/utils/is';
-  import { warn } from '/@/utils/log';
+  } from "./types/table";
+
+  import { defineComponent, ref, computed, unref, toRaw, inject, watchEffect } from "vue";
+  import { Table } from "ant-design-vue";
+  import { BasicForm, useForm } from "/@/components/Form/index";
+  import { PageWrapperFixedHeightKey } from "/@/components/Page";
+  import HeaderCell from "./components/HeaderCell.vue";
+  import { InnerHandlers } from "./types/table";
+
+  import { usePagination } from "./hooks/usePagination";
+  import { useColumns } from "./hooks/useColumns";
+  import { useDataSource } from "./hooks/useDataSource";
+  import { useLoading } from "./hooks/useLoading";
+  import { useRowSelection } from "./hooks/useRowSelection";
+  import { useTableScroll } from "./hooks/useTableScroll";
+  import { useTableScrollTo } from "./hooks/useScrollTo";
+  import { useCustomRow } from "./hooks/useCustomRow";
+  import { useTableStyle } from "./hooks/useTableStyle";
+  import { useTableHeader } from "./hooks/useTableHeader";
+  import { useTableExpand } from "./hooks/useTableExpand";
+  import { createTableContext } from "./hooks/useTableContext";
+  import { useTableFooter } from "./hooks/useTableFooter";
+  import { useTableForm } from "./hooks/useTableForm";
+  import { useDesign } from "/@/hooks/web/useDesign";
+
+  import { omit } from "lodash-es";
+  import { basicProps } from "./props";
+  import { isFunction } from "/@/utils/is";
+  import { warn } from "/@/utils/log";
 
   export default defineComponent({
     components: {
@@ -75,31 +82,32 @@
     },
     props: basicProps,
     emits: [
-      'fetch-success',
-      'fetch-error',
-      'selection-change',
-      'register',
-      'row-click',
-      'row-dbClick',
-      'row-contextmenu',
-      'row-mouseenter',
-      'row-mouseleave',
-      'edit-end',
-      'edit-cancel',
-      'edit-row-end',
-      'edit-change',
-      'expanded-rows-change',
-      'change',
-      'columns-change',
+      "fetch-success",
+      "fetch-error",
+      "selection-change",
+      "register",
+      "row-click",
+      "row-dbClick",
+      "row-contextmenu",
+      "row-mouseenter",
+      "row-mouseleave",
+      "edit-end",
+      "edit-cancel",
+      "edit-row-end",
+      "edit-change",
+      "expanded-rows-change",
+      "change",
+      "columns-change",
     ],
     setup(props, { attrs, emit, slots, expose }) {
       const tableElRef = ref(null);
       const tableData = ref<Recordable[]>([]);
 
       const wrapRef = ref(null);
+      const formRef = ref(null);
       const innerPropsRef = ref<Partial<BasicTableProps>>();
 
-      const { prefixCls } = useDesign('basic-table');
+      const { prefixCls } = useDesign("basic-table");
       const [registerForm, formActions] = useForm();
 
       const getProps = computed(() => {
@@ -164,7 +172,7 @@
 
       function handleTableChange(...args) {
         onTableChange.call(undefined, ...args);
-        emit('change', ...args);
+        emit("change", ...args);
         // 解决通过useTable注册onChange时不起作用的问题
         const { onChange } = unref(getProps);
         onChange && isFunction(onChange) && onChange.call(undefined, ...args);
@@ -185,8 +193,12 @@
         getColumnsRef,
         getRowSelectionRef,
         getDataSourceRef,
+        wrapRef,
+        formRef,
       );
 
+      const { scrollTo } = useTableScrollTo(tableElRef, getDataSourceRef);
+
       const { customRow } = useCustomRow(getProps, {
         setSelectedRowKeys,
         getSelectRowKeys,
@@ -197,11 +209,15 @@
 
       const { getRowClassName } = useTableStyle(getProps, prefixCls);
 
-      const { getExpandOption, expandAll, collapseAll } = useTableExpand(getProps, tableData, emit);
+      const { getExpandOption, expandAll, expandRows, collapseAll } = useTableExpand(
+        getProps,
+        tableData,
+        emit,
+      );
 
       const handlers: InnerHandlers = {
         onColumnsChange: (data: ColumnChangeParam[]) => {
-          emit('columns-change', data);
+          emit("columns-change", data);
           // support useTable
           unref(getProps).onColumnsChange?.(data);
         },
@@ -222,15 +238,13 @@
       const getBindValues = computed(() => {
         const dataSource = unref(getDataSourceRef);
         let propsData: Recordable = {
-          // ...(dataSource.length === 0 ? { getPopupContainer: () => document.body } : {}),
           ...attrs,
           customRow,
-          expandIcon: slots.expandIcon ? null : expandIcon(),
           ...unref(getProps),
           ...unref(getHeaderProps),
           scroll: unref(getScrollRef),
           loading: unref(getLoading),
-          tableLayout: 'fixed',
+          tableLayout: "fixed",
           rowSelection: unref(getRowSelectionRef),
           rowKey: unref(getRowKey),
           columns: toRaw(unref(getViewColumns)),
@@ -239,11 +253,11 @@
           footer: unref(getFooterProps),
           ...unref(getExpandOption),
         };
-        if (slots.expandedRowRender) {
-          propsData = omit(propsData, 'scroll');
-        }
+        // if (slots.expandedRowRender) {
+        //   propsData = omit(propsData, 'scroll');
+        // }
 
-        propsData = omit(propsData, ['class', 'onChange']);
+        propsData = omit(propsData, ["class", "onChange"]);
         return propsData;
       });
 
@@ -300,7 +314,9 @@
         getShowPagination,
         setCacheColumnsByField,
         expandAll,
+        expandRows,
         collapseAll,
+        scrollTo,
         getSize: () => {
           return unref(getBindValues).size as SizeType;
         },
@@ -309,9 +325,10 @@
 
       expose(tableAction);
 
-      emit('register', tableAction, formActions);
+      emit("register", tableAction, formActions);
 
       return {
+        formRef,
         tableElRef,
         getBindValues,
         getLoading,
@@ -335,9 +352,9 @@
 <style lang="less">
   @border-color: #cecece4d;
 
-  @prefix-cls: ~'@{namespace}-basic-table';
+  @prefix-cls: ~"@{namespace}-basic-table";
 
-  [data-theme='dark'] {
+  [data-theme="dark"] {
     .ant-table-tbody > tr:hover.ant-table-row-selected > td,
     .ant-table-tbody > tr.ant-table-row-selected td {
       background-color: #262626;
@@ -346,6 +363,7 @@
 
   .@{prefix-cls} {
     max-width: 100%;
+    height: 100%;
 
     &-row__striped {
       td {
diff --git a/src/components/Table/src/componentMap.ts b/src/components/Table/src/componentMap.ts
index 265b7c7ff01ddc6ae2f9fca81a3d798346d46903..25f20cd249284bcec2a88d49b3cfc3ea50562164 100644
--- a/src/components/Table/src/componentMap.ts
+++ b/src/components/Table/src/componentMap.ts
@@ -1,4 +1,4 @@
-import type { Component } from 'vue';
+import type { Component } from "vue";
 import {
   Input,
   Select,
@@ -7,21 +7,23 @@ import {
   Switch,
   DatePicker,
   TimePicker,
-} from 'ant-design-vue';
-import type { ComponentType } from './types/componentType';
-import { ApiSelect, ApiTreeSelect } from '/@/components/Form';
+  AutoComplete,
+} from "ant-design-vue";
+import type { ComponentType } from "./types/componentType";
+import { ApiSelect, ApiTreeSelect } from "/@/components/Form";
 
 const componentMap = new Map<ComponentType, Component>();
 
-componentMap.set('Input', Input);
-componentMap.set('InputNumber', InputNumber);
-componentMap.set('Select', Select);
-componentMap.set('ApiSelect', ApiSelect);
-componentMap.set('ApiTreeSelect', ApiTreeSelect);
-componentMap.set('Switch', Switch);
-componentMap.set('Checkbox', Checkbox);
-componentMap.set('DatePicker', DatePicker);
-componentMap.set('TimePicker', TimePicker);
+componentMap.set("Input", Input);
+componentMap.set("InputNumber", InputNumber);
+componentMap.set("Select", Select);
+componentMap.set("ApiSelect", ApiSelect);
+componentMap.set("AutoComplete", AutoComplete);
+componentMap.set("ApiTreeSelect", ApiTreeSelect);
+componentMap.set("Switch", Switch);
+componentMap.set("Checkbox", Checkbox);
+componentMap.set("DatePicker", DatePicker);
+componentMap.set("TimePicker", TimePicker);
 
 export function add(compName: ComponentType, component: Component) {
   componentMap.set(compName, component);
diff --git a/src/components/Table/src/components/EditTableHeaderIcon.vue b/src/components/Table/src/components/EditTableHeaderIcon.vue
index 369820e7ac5985abf33f9bb93f715ace321b4426..7baa894fab2d5eefea8be8aa35bd69baa2c1616f 100644
--- a/src/components/Table/src/components/EditTableHeaderIcon.vue
+++ b/src/components/Table/src/components/EditTableHeaderIcon.vue
@@ -6,11 +6,11 @@
   </span>
 </template>
 <script lang="ts">
-  import { defineComponent } from 'vue';
-  import { FormOutlined } from '@ant-design/icons-vue';
+  import { defineComponent } from "vue";
+  import { FormOutlined } from "@ant-design/icons-vue";
   export default defineComponent({
-    name: 'EditTableHeaderIcon',
+    name: "EditTableHeaderIcon",
     components: { FormOutlined },
-    props: { title: { type: String, default: '' } },
+    props: { title: { type: String, default: "" } },
   });
 </script>
diff --git a/src/components/Table/src/components/ExpandIcon.tsx b/src/components/Table/src/components/ExpandIcon.tsx
deleted file mode 100644
index 3d1d98d96cd76b903a0b02f0b6d60a5c4e110fec..0000000000000000000000000000000000000000
--- a/src/components/Table/src/components/ExpandIcon.tsx
+++ /dev/null
@@ -1,23 +0,0 @@
-import { BasicArrow } from '/@/components/Basic';
-
-export default () => {
-  return (props: Recordable) => {
-    if (!props.expandable) {
-      if (props.needIndentSpaced) {
-        return <span class="ant-table-row-expand-icon ant-table-row-spaced" />;
-      } else {
-        return <span />;
-      }
-    }
-    return (
-      <BasicArrow
-        style="margin-right: 8px"
-        iconStyle="margin-top: -2px;"
-        onClick={(e: Event) => {
-          props.onExpand(props.record, e);
-        }}
-        expand={props.expanded}
-      />
-    );
-  };
-};
diff --git a/src/components/Table/src/components/HeaderCell.vue b/src/components/Table/src/components/HeaderCell.vue
index 91c63737490706d25171592d11a485ba286060f8..198e4bee28961402f4556c37454f104d1591f104 100644
--- a/src/components/Table/src/components/HeaderCell.vue
+++ b/src/components/Table/src/components/HeaderCell.vue
@@ -6,15 +6,15 @@
   <BasicHelp v-if="getHelpMessage" :text="getHelpMessage" :class="`${prefixCls}__help`" />
 </template>
 <script lang="ts">
-  import type { PropType } from 'vue';
-  import type { BasicColumn } from '../types/table';
-  import { defineComponent, computed } from 'vue';
-  import BasicHelp from '/@/components/Basic/src/BasicHelp.vue';
-  import EditTableHeaderCell from './EditTableHeaderIcon.vue';
-  import { useDesign } from '/@/hooks/web/useDesign';
+  import type { PropType } from "vue";
+  import type { BasicColumn } from "../types/table";
+  import { defineComponent, computed } from "vue";
+  import BasicHelp from "/@/components/Basic/src/BasicHelp.vue";
+  import EditTableHeaderCell from "./EditTableHeaderIcon.vue";
+  import { useDesign } from "/@/hooks/web/useDesign";
 
   export default defineComponent({
-    name: 'TableHeaderCell',
+    name: "TableHeaderCell",
     components: {
       EditTableHeaderCell,
       BasicHelp,
@@ -26,10 +26,10 @@
       },
     },
     setup(props) {
-      const { prefixCls } = useDesign('basic-table-header-cell');
+      const { prefixCls } = useDesign("basic-table-header-cell");
 
       const getIsEdit = computed(() => !!props.column?.edit);
-      const getTitle = computed(() => props.column?.customTitle);
+      const getTitle = computed(() => props.column?.customTitle || props.column?.title);
       const getHelpMessage = computed(() => props.column?.helpMessage);
 
       return { prefixCls, getIsEdit, getTitle, getHelpMessage };
@@ -37,7 +37,7 @@
   });
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-basic-table-header-cell';
+  @prefix-cls: ~"@{namespace}-basic-table-header-cell";
 
   .@{prefix-cls} {
     &__help {
diff --git a/src/components/Table/src/components/TableAction.vue b/src/components/Table/src/components/TableAction.vue
index 0c882a1f1fa9539064036a964c2d37baa7111838..d5af87860ddf26b55118a97ef61602780aed8864 100644
--- a/src/components/Table/src/components/TableAction.vue
+++ b/src/components/Table/src/components/TableAction.vue
@@ -31,22 +31,22 @@
   </div>
 </template>
 <script lang="ts">
-  import { defineComponent, PropType, computed, toRaw, unref } from 'vue';
-  import { MoreOutlined } from '@ant-design/icons-vue';
-  import { Divider, Tooltip, TooltipProps } from 'ant-design-vue';
-  import Icon from '/@/components/Icon/index';
-  import { ActionItem, TableActionType } from '/@/components/Table';
-  import { PopConfirmButton } from '/@/components/Button';
-  import { Dropdown } from '/@/components/Dropdown';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useTableContext } from '../hooks/useTableContext';
-  import { usePermission } from '/@/hooks/web/usePermission';
-  import { isBoolean, isFunction, isString } from '/@/utils/is';
-  import { propTypes } from '/@/utils/propTypes';
-  import { ACTION_COLUMN_FLAG } from '../const';
+  import { defineComponent, PropType, computed, toRaw, unref } from "vue";
+  import { MoreOutlined } from "@ant-design/icons-vue";
+  import { Divider, Tooltip, TooltipProps } from "ant-design-vue";
+  import Icon from "/@/components/Icon/index";
+  import { ActionItem, TableActionType } from "/@/components/Table";
+  import { PopConfirmButton } from "/@/components/Button";
+  import { Dropdown } from "/@/components/Dropdown";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useTableContext } from "../hooks/useTableContext";
+  import { usePermission } from "/@/hooks/web/usePermission";
+  import { isBoolean, isFunction, isString } from "/@/utils/is";
+  import { propTypes } from "/@/utils/propTypes";
+  import { ACTION_COLUMN_FLAG } from "../const";
 
   export default defineComponent({
-    name: 'TableAction',
+    name: "TableAction",
     components: { Icon, PopConfirmButton, Divider, Dropdown, MoreOutlined, Tooltip },
     props: {
       actions: {
@@ -62,7 +62,7 @@
       stopButtonPropagation: propTypes.bool.def(false),
     },
     setup(props) {
-      const { prefixCls } = useDesign('basic-table-action');
+      const { prefixCls } = useDesign("basic-table-action");
       let table: Partial<TableActionType> = {};
       if (!props.outside) {
         table = useTableContext();
@@ -92,8 +92,8 @@
             const { popConfirm } = action;
             return {
               getPopupContainer: () => unref((table as any)?.wrapRef.value) ?? document.body,
-              type: 'link',
-              size: 'small',
+              type: "link",
+              size: "small",
               ...action,
               ...(popConfirm || {}),
               onConfirm: popConfirm?.confirm,
@@ -104,33 +104,32 @@
       });
 
       const getDropdownList = computed((): any[] => {
-        return (toRaw(props.dropDownActions) || [])
-          .filter((action) => {
-            return hasPermission(action.auth) && isIfShow(action);
-          })
-          .map((action, index) => {
-            const { label, popConfirm } = action;
-            return {
-              ...action,
-              ...popConfirm,
-              onConfirm: popConfirm?.confirm,
-              onCancel: popConfirm?.cancel,
-              text: label,
-              divider: index < props.dropDownActions.length - 1 ? props.divider : false,
-            };
-          });
+        const list = (toRaw(props.dropDownActions) || []).filter((action) => {
+          return hasPermission(action.auth) && isIfShow(action);
+        });
+        return list.map((action, index) => {
+          const { label, popConfirm } = action;
+          return {
+            ...action,
+            ...popConfirm,
+            onConfirm: popConfirm?.confirm,
+            onCancel: popConfirm?.cancel,
+            text: label,
+            divider: index < list.length - 1 ? props.divider : false,
+          };
+        });
       });
 
       const getAlign = computed(() => {
         const columns = (table as TableActionType)?.getColumns?.() || [];
         const actionColumn = columns.find((item) => item.flag === ACTION_COLUMN_FLAG);
-        return actionColumn?.align ?? 'left';
+        return actionColumn?.align ?? "left";
       });
 
       function getTooltip(data: string | TooltipProps): TooltipProps {
         return {
           getPopupContainer: () => unref((table as any)?.wrapRef.value) ?? document.body,
-          placement: 'bottom',
+          placement: "bottom",
           ...(isString(data) ? { title: data } : data),
         };
       }
@@ -139,7 +138,7 @@
         if (!props.stopButtonPropagation) return;
         const path = e.composedPath() as HTMLElement[];
         const isInButton = path.find((ele) => {
-          return ele.tagName?.toUpperCase() === 'BUTTON';
+          return ele.tagName?.toUpperCase() === "BUTTON";
         });
         isInButton && e.stopPropagation();
       }
@@ -149,7 +148,7 @@
   });
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-basic-table-action';
+  @prefix-cls: ~"@{namespace}-basic-table-action";
 
   .@{prefix-cls} {
     display: flex;
diff --git a/src/components/Table/src/components/TableFooter.vue b/src/components/Table/src/components/TableFooter.vue
index 68e556b3cbac89f1b65212c3d345952f0835c2d2..8725e8e3578236a8cbcaf7867ce62a1f331b1d08 100644
--- a/src/components/Table/src/components/TableFooter.vue
+++ b/src/components/Table/src/components/TableFooter.vue
@@ -12,20 +12,20 @@
   />
 </template>
 <script lang="ts">
-  import type { PropType } from 'vue';
-  import { defineComponent, unref, computed, toRaw } from 'vue';
-  import { Table } from 'ant-design-vue';
-  import { cloneDeep } from 'lodash-es';
-  import { isFunction } from '/@/utils/is';
-  import type { BasicColumn } from '../types/table';
-  import { INDEX_COLUMN_FLAG } from '../const';
-  import { propTypes } from '/@/utils/propTypes';
-  import { useTableContext } from '../hooks/useTableContext';
+  import type { PropType } from "vue";
+  import { defineComponent, unref, computed, toRaw } from "vue";
+  import { Table } from "ant-design-vue";
+  import { cloneDeep } from "lodash-es";
+  import { isFunction } from "/@/utils/is";
+  import type { BasicColumn } from "../types/table";
+  import { INDEX_COLUMN_FLAG } from "../const";
+  import { propTypes } from "/@/utils/propTypes";
+  import { useTableContext } from "../hooks/useTableContext";
 
-  const SUMMARY_ROW_KEY = '_row';
-  const SUMMARY_INDEX_KEY = '_index';
+  const SUMMARY_ROW_KEY = "_row";
+  const SUMMARY_INDEX_KEY = "_index";
   export default defineComponent({
-    name: 'BasicTableFooter',
+    name: "BasicTableFooter",
     components: { Table },
     props: {
       summaryFunc: {
@@ -37,7 +37,7 @@
       scroll: {
         type: Object as PropType<Recordable>,
       },
-      rowKey: propTypes.string.def('key'),
+      rowKey: propTypes.string.def("key"),
     },
     setup(props) {
       const table = useTableContext();
@@ -71,18 +71,18 @@
             columns[index].customRender = ({ record }) => record[SUMMARY_INDEX_KEY];
             columns[index].ellipsis = false;
           } else {
-            Reflect.deleteProperty(columns[index], 'customRender');
+            Reflect.deleteProperty(columns[index], "customRender");
           }
         }
 
         if (table.getRowSelection() && hasRowSummary) {
-          const isFixed = columns.some((col) => col.fixed === 'left');
+          const isFixed = columns.some((col) => col.fixed === "left");
           columns.unshift({
             width: 60,
-            title: 'selection',
-            key: 'selectionKey',
-            align: 'center',
-            ...(isFixed ? { fixed: 'left' } : {}),
+            title: "selection",
+            key: "selectionKey",
+            align: "center",
+            ...(isFixed ? { fixed: "left" } : {}),
             customRender: ({ record }) => record[SUMMARY_ROW_KEY],
           });
         }
diff --git a/src/components/Table/src/components/TableHeader.vue b/src/components/Table/src/components/TableHeader.vue
index 189e913d9c019c1d81c1ace4619e40eb97b7a24b..410fa3f168830415c7d4ae3161037e2ec7cbbb05 100644
--- a/src/components/Table/src/components/TableHeader.vue
+++ b/src/components/Table/src/components/TableHeader.vue
@@ -23,16 +23,16 @@
   </div>
 </template>
 <script lang="ts">
-  import type { TableSetting, ColumnChangeParam } from '../types/table';
-  import type { PropType } from 'vue';
-  import { defineComponent } from 'vue';
-  import { Divider } from 'ant-design-vue';
-  import TableSettingComponent from './settings/index.vue';
-  import TableTitle from './TableTitle.vue';
-  import { useDesign } from '/@/hooks/web/useDesign';
+  import type { TableSetting, ColumnChangeParam } from "../types/table";
+  import type { PropType } from "vue";
+  import { defineComponent } from "vue";
+  import { Divider } from "ant-design-vue";
+  import TableSettingComponent from "./settings/index.vue";
+  import TableTitle from "./TableTitle.vue";
+  import { useDesign } from "/@/hooks/web/useDesign";
 
   export default defineComponent({
-    name: 'BasicTableHeader',
+    name: "BasicTableHeader",
     components: {
       Divider,
       TableTitle,
@@ -50,21 +50,21 @@
       },
       titleHelpMessage: {
         type: [String, Array] as PropType<string | string[]>,
-        default: '',
+        default: "",
       },
     },
-    emits: ['columns-change'],
+    emits: ["columns-change"],
     setup(_, { emit }) {
-      const { prefixCls } = useDesign('basic-table-header');
+      const { prefixCls } = useDesign("basic-table-header");
       function handleColumnChange(data: ColumnChangeParam[]) {
-        emit('columns-change', data);
+        emit("columns-change", data);
       }
       return { prefixCls, handleColumnChange };
     },
   });
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-basic-table-header';
+  @prefix-cls: ~"@{namespace}-basic-table-header";
 
   .@{prefix-cls} {
     &__toolbar {
diff --git a/src/components/Table/src/components/TableImg.vue b/src/components/Table/src/components/TableImg.vue
index 6b533aa03b3b1bba5e5ce4dd388ae220a65251d6..fe1b92d49b5b3e7a701560c83d0c712c7f969138 100644
--- a/src/components/Table/src/components/TableImg.vue
+++ b/src/components/Table/src/components/TableImg.vue
@@ -32,14 +32,14 @@
   </div>
 </template>
 <script lang="ts">
-  import type { CSSProperties } from 'vue';
-  import { defineComponent, computed } from 'vue';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { Image, Badge } from 'ant-design-vue';
-  import { propTypes } from '/@/utils/propTypes';
+  import type { CSSProperties } from "vue";
+  import { defineComponent, computed } from "vue";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { Image, Badge } from "ant-design-vue";
+  import { propTypes } from "/@/utils/propTypes";
 
   export default defineComponent({
-    name: 'TableImage',
+    name: "TableImage",
     components: { Image, PreviewGroup: Image.PreviewGroup, Badge },
     props: {
       imgList: propTypes.arrayOf(propTypes.string),
@@ -51,7 +51,7 @@
       // 图片间距
       margin: propTypes.number.def(4),
       // src前缀,将会附加在imgList中每一项之前
-      srcPrefix: propTypes.string.def(''),
+      srcPrefix: propTypes.string.def(""),
     },
     setup(props) {
       const getWrapStyle = computed((): CSSProperties => {
@@ -60,13 +60,13 @@
         return { height: s, width: s };
       });
 
-      const { prefixCls } = useDesign('basic-table-img');
+      const { prefixCls } = useDesign("basic-table-img");
       return { prefixCls, getWrapStyle };
     },
   });
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-basic-table-img';
+  @prefix-cls: ~"@{namespace}-basic-table-img";
 
   .@{prefix-cls} {
     .ant-image {
diff --git a/src/components/Table/src/components/TableTitle.vue b/src/components/Table/src/components/TableTitle.vue
index 0b797e13c5d67a49d9869388341d321b3dc76b36..3be23b2adf5697503dd8b08f27f8c2144e4dbefe 100644
--- a/src/components/Table/src/components/TableTitle.vue
+++ b/src/components/Table/src/components/TableTitle.vue
@@ -4,13 +4,13 @@
   </BasicTitle>
 </template>
 <script lang="ts">
-  import { computed, defineComponent, PropType } from 'vue';
-  import { BasicTitle } from '/@/components/Basic/index';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { isFunction } from '/@/utils/is';
+  import { computed, defineComponent, PropType } from "vue";
+  import { BasicTitle } from "/@/components/Basic/index";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { isFunction } from "/@/utils/is";
 
   export default defineComponent({
-    name: 'BasicTableTitle',
+    name: "BasicTableTitle",
     components: { BasicTitle },
     props: {
       title: {
@@ -24,7 +24,7 @@
       },
     },
     setup(props) {
-      const { prefixCls } = useDesign('basic-table-title');
+      const { prefixCls } = useDesign("basic-table-title");
 
       const getTitle = computed(() => {
         const { title, getSelectRows = () => {} } = props;
@@ -43,7 +43,7 @@
   });
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-basic-table-title';
+  @prefix-cls: ~"@{namespace}-basic-table-title";
 
   .@{prefix-cls} {
     display: flex;
diff --git a/src/components/Table/src/components/editable/CellComponent.ts b/src/components/Table/src/components/editable/CellComponent.ts
index 3a16693823efad9afc66f6dab92fbeb4ff1320c8..3259b3f06d6490633d8c3b30ca5db6e07eb7d989 100644
--- a/src/components/Table/src/components/editable/CellComponent.ts
+++ b/src/components/Table/src/components/editable/CellComponent.ts
@@ -1,9 +1,9 @@
-import type { FunctionalComponent, defineComponent } from 'vue';
-import type { ComponentType } from '../../types/componentType';
-import { componentMap } from '/@/components/Table/src/componentMap';
+import type { FunctionalComponent, defineComponent } from "vue";
+import type { ComponentType } from "../../types/componentType";
+import { componentMap } from "/@/components/Table/src/componentMap";
 
-import { Popover } from 'ant-design-vue';
-import { h } from 'vue';
+import { Popover } from "ant-design-vue";
+import { h } from "vue";
 
 export interface ComponentProps {
   component: ComponentType;
@@ -15,7 +15,7 @@ export interface ComponentProps {
 
 export const CellComponent: FunctionalComponent = (
   {
-    component = 'Input',
+    component = "Input",
     rule = true,
     ruleMessage,
     popoverVisible,
@@ -32,7 +32,7 @@ export const CellComponent: FunctionalComponent = (
   return h(
     Popover,
     {
-      overlayClassName: 'edit-cell-rule-popover',
+      overlayClassName: "edit-cell-rule-popover",
       visible: !!popoverVisible,
       ...(getPopupContainer ? { getPopupContainer } : {}),
     },
diff --git a/src/components/Table/src/components/editable/EditableCell.vue b/src/components/Table/src/components/editable/EditableCell.vue
index 787d120d9858cbeb6525001c8a1f17611d22ca9e..050b8bac0654d00c46610ac677d0697d70f7ac66 100644
--- a/src/components/Table/src/components/editable/EditableCell.vue
+++ b/src/components/Table/src/components/editable/EditableCell.vue
@@ -1,69 +1,33 @@
-<template>
-  <div :class="prefixCls">
-    <div
-      v-show="!isEdit"
-      :class="{ [`${prefixCls}__normal`]: true, 'ellipsis-cell': column.ellipsis }"
-      @click="handleEdit"
-    >
-      <div class="cell-content" :title="column.ellipsis ? getValues ?? '' : ''">
-        {{ getValues ? getValues : '&nbsp;' }}
-      </div>
-      <FormOutlined :class="`${prefixCls}__normal-icon`" v-if="!column.editRow" />
-    </div>
-
-    <a-spin v-if="isEdit" :spinning="spinning">
-      <div :class="`${prefixCls}__wrapper`" v-click-outside="onClickOutside">
-        <CellComponent
-          v-bind="getComponentProps"
-          :component="getComponent"
-          :style="getWrapperStyle"
-          :popoverVisible="getRuleVisible"
-          :rule="getRule"
-          :ruleMessage="ruleMessage"
-          :class="getWrapperClass"
-          ref="elRef"
-          @change="handleChange"
-          @options-change="handleOptionsChange"
-          @pressEnter="handleEnter"
-        />
-        <div :class="`${prefixCls}__action`" v-if="!getRowEditable">
-          <CheckOutlined :class="[`${prefixCls}__icon`, 'mx-2']" @click="handleSubmitClick" />
-          <CloseOutlined :class="`${prefixCls}__icon `" @click="handleCancel" />
-        </div>
-      </div>
-    </a-spin>
-  </div>
-</template>
-<script lang="ts">
-  import type { CSSProperties, PropType } from 'vue';
-  import { computed, defineComponent, nextTick, ref, toRaw, unref, watchEffect } from 'vue';
-  import type { BasicColumn } from '../../types/table';
-  import type { EditRecordRow } from './index';
-  import { CheckOutlined, CloseOutlined, FormOutlined } from '@ant-design/icons-vue';
-  import { CellComponent } from './CellComponent';
-
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useTableContext } from '../../hooks/useTableContext';
-
-  import clickOutside from '/@/directives/clickOutside';
-
-  import { propTypes } from '/@/utils/propTypes';
-  import { isArray, isBoolean, isFunction, isNumber, isString } from '/@/utils/is';
-  import { createPlaceholderMessage } from './helper';
-  import { omit, pick, set } from 'lodash-es';
-  import { treeToList } from '/@/utils/helper/treeHelper';
-  import { Spin } from 'ant-design-vue';
+<script lang="tsx">
+  import type { CSSProperties, PropType } from "vue";
+  import { computed, defineComponent, nextTick, ref, toRaw, unref, watchEffect } from "vue";
+  import type { BasicColumn } from "../../types/table";
+  import type { EditRecordRow } from "./index";
+  import { CheckOutlined, CloseOutlined, FormOutlined } from "@ant-design/icons-vue";
+  import { CellComponent } from "./CellComponent";
+
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useTableContext } from "../../hooks/useTableContext";
+
+  import clickOutside from "/@/directives/clickOutside";
+
+  import { propTypes } from "/@/utils/propTypes";
+  import { isArray, isBoolean, isFunction, isNumber, isString } from "/@/utils/is";
+  import { createPlaceholderMessage } from "./helper";
+  import { omit, pick, set } from "lodash-es";
+  import { treeToList } from "/@/utils/helper/treeHelper";
+  import { Spin } from "ant-design-vue";
 
   export default defineComponent({
-    name: 'EditableCell',
-    components: { FormOutlined, CloseOutlined, CheckOutlined, CellComponent, ASpin: Spin },
+    name: "EditableCell",
+    components: { FormOutlined, CloseOutlined, CheckOutlined, CellComponent, Spin },
     directives: {
       clickOutside,
     },
     props: {
       value: {
         type: [String, Number, Boolean, Object] as PropType<string | number | boolean | Recordable>,
-        default: '',
+        default: "",
       },
       record: {
         type: Object as PropType<EditRecordRow>,
@@ -79,15 +43,15 @@
       const isEdit = ref(false);
       const elRef = ref();
       const ruleVisible = ref(false);
-      const ruleMessage = ref('');
+      const ruleMessage = ref("");
       const optionsRef = ref<LabelValueOptions>([]);
       const currentValueRef = ref<any>(props.value);
       const defaultValueRef = ref<any>(props.value);
       const spinning = ref<boolean>(false);
 
-      const { prefixCls } = useDesign('editable-cell');
+      const { prefixCls } = useDesign("editable-cell");
 
-      const getComponent = computed(() => props.column?.editComponent || 'Input');
+      const getComponent = computed(() => props.column?.editComponent || "Input");
       const getRule = computed(() => props.column?.editRule);
 
       const getRuleVisible = computed(() => {
@@ -96,37 +60,60 @@
 
       const getIsCheckComp = computed(() => {
         const component = unref(getComponent);
-        return ['Checkbox', 'Switch'].includes(component);
+        return ["Checkbox", "Switch"].includes(component);
       });
 
       const getComponentProps = computed(() => {
-        const compProps = props.column?.editComponentProps ?? {};
-        const component = unref(getComponent);
-        const apiSelectProps: Recordable = {};
-        if (component === 'ApiSelect') {
-          apiSelectProps.cache = true;
-        }
-
         const isCheckValue = unref(getIsCheckComp);
 
-        const valueField = isCheckValue ? 'checked' : 'value';
+        const valueField = isCheckValue ? "checked" : "value";
         const val = unref(currentValueRef);
 
         const value = isCheckValue ? (isNumber(val) && isBoolean(val) ? val : !!val) : val;
 
+        let compProps = props.column?.editComponentProps ?? {};
+        const { record, column, index } = props;
+
+        if (isFunction(compProps)) {
+          compProps = compProps({ text: val, record, column, index }) ?? {};
+        }
+        const component = unref(getComponent);
+        const apiSelectProps: Recordable = {};
+        if (component === "ApiSelect") {
+          apiSelectProps.cache = true;
+        }
+        upEditDynamicDisabled(record, column, value);
         return {
-          size: 'small',
+          size: "small",
           getPopupContainer: () => unref(table?.wrapRef.value) ?? document.body,
-          getCalendarContainer: () => unref(table?.wrapRef.value) ?? document.body,
           placeholder: createPlaceholderMessage(unref(getComponent)),
           ...apiSelectProps,
-          ...omit(compProps, 'onChange'),
+          ...compProps,
           [valueField]: value,
-        };
+          disabled: unref(getDisable),
+        } as any;
+      });
+      function upEditDynamicDisabled(record, column, value) {
+        if (!record) return false;
+        const { key, dataIndex } = column;
+        if (!key && !dataIndex) return;
+        const dataKey = (dataIndex || key) as string;
+        set(record, dataKey, value);
+      }
+      const getDisable = computed(() => {
+        const { editDynamicDisabled } = props.column;
+        let disabled = false;
+        if (isBoolean(editDynamicDisabled)) {
+          disabled = editDynamicDisabled;
+        }
+        if (isFunction(editDynamicDisabled)) {
+          const { record } = props;
+          disabled = editDynamicDisabled({ record });
+        }
+        return disabled;
       });
-
       const getValues = computed(() => {
-        const { editComponentProps, editValueMap } = props.column;
+        const { editValueMap } = props.column;
 
         const value = unref(currentValueRef);
 
@@ -135,11 +122,12 @@
         }
 
         const component = unref(getComponent);
-        if (!component.includes('Select')) {
+        if (!component.includes("Select")) {
           return value;
         }
 
-        const options: LabelValueOptions = editComponentProps?.options ?? (unref(optionsRef) || []);
+        const options: LabelValueOptions =
+          unref(getComponentProps)?.options ?? (unref(optionsRef) || []);
         const option = options.find((item) => `${item.value}` === `${value}`);
 
         return option?.label ?? value;
@@ -150,12 +138,12 @@
           return {};
         }
         return {
-          width: 'calc(100% - 48px)',
+          width: "calc(100% - 48px)",
         };
       });
 
       const getWrapperClass = computed(() => {
-        const { align = 'center' } = props.column;
+        const { align = "center" } = props.column;
         return `edit-cell-align-${align}`;
       });
 
@@ -178,7 +166,7 @@
 
       function handleEdit() {
         if (unref(getRowEditable) || unref(props.column?.editRow)) return;
-        ruleMessage.value = '';
+        ruleMessage.value = "";
         isEdit.value = true;
         nextTick(() => {
           const el = unref(elRef);
@@ -190,17 +178,19 @@
         const component = unref(getComponent);
         if (!e) {
           currentValueRef.value = e;
-        } else if (e?.target && Reflect.has(e.target, 'value')) {
-          currentValueRef.value = (e as ChangeEvent).target.value;
-        } else if (component === 'Checkbox') {
+        } else if (component === "Checkbox") {
           currentValueRef.value = (e as ChangeEvent).target.checked;
-        } else if (isString(e) || isBoolean(e) || isNumber(e)) {
+        } else if (component === "Switch") {
+          currentValueRef.value = e;
+        } else if (e?.target && Reflect.has(e.target, "value")) {
+          currentValueRef.value = (e as ChangeEvent).target.value;
+        } else if (isString(e) || isBoolean(e) || isNumber(e) || isArray(e)) {
           currentValueRef.value = e;
         }
-        const onChange = props.column?.editComponentProps?.onChange;
+        const onChange = unref(getComponentProps)?.onChange;
         if (onChange && isFunction(onChange)) onChange(...arguments);
 
-        table.emit?.('edit-change', {
+        table.emit?.("edit-change", {
           column: props.column,
           value: unref(currentValueRef),
           record: toRaw(props.record),
@@ -227,12 +217,12 @@
               ruleVisible.value = true;
               return false;
             } else {
-              ruleMessage.value = '';
+              ruleMessage.value = "";
               return true;
             }
           }
         }
-        ruleMessage.value = '';
+        ruleMessage.value = "";
         return true;
       }
 
@@ -265,7 +255,7 @@
               result = await beforeEditSubmit({
                 record: pick(record, keys),
                 index,
-                key: key as string,
+                key: dataKey as string,
                 value,
               });
             } catch (e) {
@@ -281,7 +271,7 @@
 
         set(record, dataKey, value);
         //const record = await table.updateTableData(index, dataKey, value);
-        needEmit && table.emit?.('edit-end', { record, index, key, value });
+        needEmit && table.emit?.("edit-end", { record, index, key: dataKey, value });
         isEdit.value = false;
       }
 
@@ -301,7 +291,7 @@
         currentValueRef.value = defaultValueRef.value;
         const { column, index, record } = props;
         const { key, dataIndex } = column;
-        table.emit?.('edit-cancel', {
+        table.emit?.("edit-cancel", {
           record,
           index,
           key: dataIndex || key,
@@ -315,17 +305,17 @@
         }
         const component = unref(getComponent);
 
-        if (component.includes('Input')) {
+        if (component.includes("Input")) {
           handleCancel();
         }
       }
 
       // only ApiSelect or TreeSelect
       function handleOptionsChange(options: LabelValueOptions) {
-        const { replaceFields } = props.column?.editComponentProps ?? {};
+        const { replaceFields } = unref(getComponentProps);
         const component = unref(getComponent);
-        if (component === 'ApiTreeSelect') {
-          const { title = 'title', value = 'value', children = 'children' } = replaceFields || {};
+        if (component === "ApiTreeSelect") {
+          const { title = "title", value = "value", children = "children" } = replaceFields || {};
           let listOptions: Recordable[] = treeToList(options, { children });
           listOptions = listOptions.map((item) => {
             return {
@@ -339,7 +329,7 @@
         }
       }
 
-      function initCbs(cbs: 'submitCbs' | 'validCbs' | 'cancelCbs', handle: Fn) {
+      function initCbs(cbs: "submitCbs" | "validCbs" | "cancelCbs", handle: Fn) {
         if (props.record) {
           /* eslint-disable  */
           isArray(props.record[cbs])
@@ -349,13 +339,13 @@
       }
 
       if (props.record) {
-        initCbs('submitCbs', handleSubmit);
-        initCbs('validCbs', handleSubmiRule);
-        initCbs('cancelCbs', handleCancel);
+        initCbs("submitCbs", handleSubmit);
+        initCbs("validCbs", handleSubmiRule);
+        initCbs("cancelCbs", handleCancel);
 
         if (props.column.dataIndex) {
           if (!props.record.editValueRefs) props.record.editValueRefs = {};
-          props.record.editValueRefs[props.column.dataIndex] = currentValueRef;
+          props.record.editValueRefs[props.column.dataIndex as any] = currentValueRef;
         }
         /* eslint-disable  */
         props.record.onCancelEdit = () => {
@@ -367,7 +357,7 @@
             if (!props.record?.onValid?.()) return;
             const submitFns = props.record?.submitCbs || [];
             submitFns.forEach((fn) => fn(false, false));
-            table.emit?.('edit-row-end');
+            table.emit?.("edit-row-end");
             return true;
           }
         };
@@ -398,10 +388,63 @@
         spinning,
       };
     },
+    render() {
+      return (
+        <div class={this.prefixCls}>
+          <div
+            v-show={!this.isEdit}
+            class={{ [`${this.prefixCls}__normal`]: true, "ellipsis-cell": this.column.ellipsis }}
+            onClick={this.handleEdit}
+          >
+            <div class="cell-content" title={this.column.ellipsis ? this.getValues ?? "" : ""}>
+              {this.column.editRender
+                ? this.column.editRender({
+                    text: this.value,
+                    record: this.record as Recordable,
+                    column: this.column,
+                    index: this.index,
+                  })
+                : this.getValues
+                ? this.getValues
+                : "\u00A0"}
+            </div>
+            {!this.column.editRow && <FormOutlined class={`${this.prefixCls}__normal-icon`} />}
+          </div>
+          {this.isEdit && (
+            <Spin spinning={this.spinning}>
+              <div class={`${this.prefixCls}__wrapper`} v-click-outside={this.onClickOutside}>
+                <CellComponent
+                  {...this.getComponentProps}
+                  component={this.getComponent}
+                  style={this.getWrapperStyle}
+                  popoverVisible={this.getRuleVisible}
+                  rule={this.getRule}
+                  ruleMessage={this.ruleMessage}
+                  class={this.getWrapperClass}
+                  ref="elRef"
+                  onChange={this.handleChange}
+                  onOptionsChange={this.handleOptionsChange}
+                  onPressEnter={this.handleEnter}
+                />
+                {!this.getRowEditable && (
+                  <div class={`${this.prefixCls}__action`}>
+                    <CheckOutlined
+                      class={[`${this.prefixCls}__icon`, "mx-2"]}
+                      onClick={this.handleSubmitClick}
+                    />
+                    <CloseOutlined class={`${this.prefixCls}__icon `} onClick={this.handleCancel} />
+                  </div>
+                )}
+              </div>
+            </Spin>
+          )}
+        </div>
+      );
+    },
   });
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-editable-cell';
+  @prefix-cls: ~"@{namespace}-editable-cell";
 
   .edit-cell-align-left {
     text-align: left;
diff --git a/src/components/Table/src/components/editable/helper.ts b/src/components/Table/src/components/editable/helper.ts
index d901729c58733cd651c291a0c9d980dfcb052f1b..29dd79bfe3c295e3088373ce30d17d4d930c73af 100644
--- a/src/components/Table/src/components/editable/helper.ts
+++ b/src/components/Table/src/components/editable/helper.ts
@@ -1,5 +1,5 @@
-import { ComponentType } from '../../types/componentType';
-import { useI18n } from '/@/hooks/web/useI18n';
+import { ComponentType } from "../../types/componentType";
+import { useI18n } from "/@/hooks/web/useI18n";
 
 const { t } = useI18n();
 
@@ -7,22 +7,22 @@ const { t } = useI18n();
  * @description: 生成placeholder
  */
 export function createPlaceholderMessage(component: ComponentType) {
-  if (component.includes('Input')) {
-    return t('common.inputText');
+  if (component.includes("Input") || component.includes("AutoComplete")) {
+    return t("common.inputText");
   }
-  if (component.includes('Picker')) {
-    return t('common.chooseText');
+  if (component.includes("Picker")) {
+    return t("common.chooseText");
   }
 
   if (
-    component.includes('Select') ||
-    component.includes('Checkbox') ||
-    component.includes('Radio') ||
-    component.includes('Switch') ||
-    component.includes('DatePicker') ||
-    component.includes('TimePicker')
+    component.includes("Select") ||
+    component.includes("Checkbox") ||
+    component.includes("Radio") ||
+    component.includes("Switch") ||
+    component.includes("DatePicker") ||
+    component.includes("TimePicker")
   ) {
-    return t('common.chooseText');
+    return t("common.chooseText");
   }
-  return '';
+  return "";
 }
diff --git a/src/components/Table/src/components/editable/index.ts b/src/components/Table/src/components/editable/index.ts
index 4f7d4dac214fa8cb3aa6b97481ee6baa1d23c632..428bef142a7b4da052ba61764c7c1ca8f668899e 100644
--- a/src/components/Table/src/components/editable/index.ts
+++ b/src/components/Table/src/components/editable/index.ts
@@ -1,9 +1,9 @@
-import type { BasicColumn } from '/@/components/Table/src/types/table';
+import type { BasicColumn } from "/@/components/Table/src/types/table";
 
-import { h, Ref } from 'vue';
+import { h, Ref } from "vue";
 
-import EditableCell from './EditableCell.vue';
-import { isArray } from '/@/utils/is';
+import EditableCell from "./EditableCell.vue";
+import { isArray } from "/@/utils/is";
 
 interface Params {
   text: string;
diff --git a/src/components/Table/src/components/settings/ColumnSetting.vue b/src/components/Table/src/components/settings/ColumnSetting.vue
index 24e42d4dd6115db609432d24aa52024c9806f860..5b36cf11d33cf028874ea7e0aed765b0bf33a137 100644
--- a/src/components/Table/src/components/settings/ColumnSetting.vue
+++ b/src/components/Table/src/components/settings/ColumnSetting.vue
@@ -1,12 +1,12 @@
 <template>
   <Tooltip placement="top">
     <template #title>
-      <span>{{ t('component.table.settingColumn') }}</span>
+      <span>{{ t("component.table.settingColumn") }}</span>
     </template>
     <Popover
       placement="bottomLeft"
       trigger="click"
-      @visibleChange="handleVisibleChange"
+      @visible-change="handleVisibleChange"
       :overlayClassName="`${prefixCls}__cloumn-list`"
       :getPopupContainer="getPopupContainer"
     >
@@ -17,11 +17,11 @@
             v-model:checked="checkAll"
             @change="onCheckAllChange"
           >
-            {{ t('component.table.settingColumnShow') }}
+            {{ t("component.table.settingColumnShow") }}
           </Checkbox>
 
           <Checkbox v-model:checked="checkIndex" @change="handleIndexCheckChange">
-            {{ t('component.table.settingIndexColumnShow') }}
+            {{ t("component.table.settingIndexColumnShow") }}
           </Checkbox>
 
           <Checkbox
@@ -29,11 +29,11 @@
             @change="handleSelectCheckChange"
             :disabled="!defaultRowSelection"
           >
-            {{ t('component.table.settingSelectColumnShow') }}
+            {{ t("component.table.settingSelectColumnShow") }}
           </Checkbox>
 
           <a-button size="small" type="link" @click="reset">
-            {{ t('common.resetText') }}
+            {{ t("common.resetText") }}
           </a-button>
         </div>
       </template>
@@ -43,7 +43,7 @@
           <CheckboxGroup v-model:value="checkedList" @change="onChange" ref="columnListRef">
             <template v-for="item in plainOptions" :key="item.value">
               <div :class="`${prefixCls}__check-item`" v-if="!('ifShow' in item && !item.ifShow)">
-                <DragOutlined class="table-coulmn-drag-icon" />
+                <DragOutlined class="table-column-drag-icon" />
                 <Checkbox :value="item.value">
                   {{ item.label }}
                 </Checkbox>
@@ -54,7 +54,7 @@
                   :getPopupContainer="getPopupContainer"
                 >
                   <template #title>
-                    {{ t('component.table.settingFixedLeft') }}
+                    {{ t("component.table.settingFixedLeft") }}
                   </template>
                   <Icon
                     icon="line-md:arrow-align-left"
@@ -75,7 +75,7 @@
                   :getPopupContainer="getPopupContainer"
                 >
                   <template #title>
-                    {{ t('component.table.settingFixedRight') }}
+                    {{ t("component.table.settingFixedRight") }}
                   </template>
                   <Icon
                     icon="line-md:arrow-align-left"
@@ -99,7 +99,7 @@
   </Tooltip>
 </template>
 <script lang="ts">
-  import type { BasicColumn, ColumnChangeParam } from '../../types/table';
+  import type { BasicColumn, ColumnChangeParam } from "../../types/table";
   import {
     defineComponent,
     ref,
@@ -109,21 +109,25 @@
     nextTick,
     unref,
     computed,
-  } from 'vue';
-  import { Tooltip, Popover, Checkbox, Divider } from 'ant-design-vue';
-  import { SettingOutlined, DragOutlined } from '@ant-design/icons-vue';
-  import { Icon } from '/@/components/Icon';
-  import { ScrollContainer } from '/@/components/Container';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { useTableContext } from '../../hooks/useTableContext';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useSortable } from '/@/hooks/web/useSortable';
-  import { isFunction, isNullAndUnDef } from '/@/utils/is';
-  import { getPopupContainer as getParentContainer } from '/@/utils';
-  import { omit } from 'lodash-es';
+  } from "vue";
+  import { Tooltip, Popover, Checkbox, Divider } from "ant-design-vue";
+  import type { CheckboxChangeEvent } from "ant-design-vue/lib/checkbox/interface";
+  import { SettingOutlined, DragOutlined } from "@ant-design/icons-vue";
+  import { Icon } from "/@/components/Icon";
+  import { ScrollContainer } from "/@/components/Container";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { useTableContext } from "../../hooks/useTableContext";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  // import { useSortable } from '/@/hooks/web/useSortable';
+  import { isFunction, isNullAndUnDef } from "/@/utils/is";
+  import { getPopupContainer as getParentContainer } from "/@/utils";
+  import { cloneDeep, omit } from "lodash-es";
+  import Sortablejs from "sortablejs";
+  import type Sortable from "sortablejs";
 
   interface State {
     checkAll: boolean;
+    isInit?: boolean;
     checkedList: string[];
     defaultCheckList: string[];
   }
@@ -131,11 +135,11 @@
   interface Options {
     label: string;
     value: string;
-    fixed?: boolean | 'left' | 'right';
+    fixed?: boolean | "left" | "right";
   }
 
   export default defineComponent({
-    name: 'ColumnSetting',
+    name: "ColumnSetting",
     components: {
       SettingOutlined,
       Popover,
@@ -147,17 +151,17 @@
       Divider,
       Icon,
     },
-    emits: ['columns-change'],
+    emits: ["columns-change"],
 
     setup(_, { emit, attrs }) {
       const { t } = useI18n();
       const table = useTableContext();
 
-      const defaultRowSelection = omit(table.getRowSelection(), 'selectedRowKeys');
+      const defaultRowSelection = omit(table.getRowSelection(), "selectedRowKeys");
       let inited = false;
 
       const cachePlainOptions = ref<Options[]>([]);
-      const plainOptions = ref<Options[]>([]);
+      const plainOptions = ref<Options[] | any>([]);
 
       const plainSortOptions = ref<Options[]>([]);
 
@@ -172,17 +176,19 @@
       const checkIndex = ref(false);
       const checkSelect = ref(false);
 
-      const { prefixCls } = useDesign('basic-column-setting');
+      const { prefixCls } = useDesign("basic-column-setting");
 
       const getValues = computed(() => {
         return unref(table?.getBindValues) || {};
       });
 
       watchEffect(() => {
-        const columns = table.getColumns();
-        if (columns.length) {
-          init();
-        }
+        setTimeout(() => {
+          const columns = table.getColumns();
+          if (columns.length && !state.isInit) {
+            init();
+          }
+        }, 0);
       });
 
       watchEffect(() => {
@@ -210,7 +216,7 @@
           .getColumns({ ignoreAction: true })
           .map((item) => {
             if (item.defaultHidden) {
-              return '';
+              return "";
             }
             return item.dataIndex || item.title;
           })
@@ -233,11 +239,12 @@
             }
           });
         }
+        state.isInit = true;
         state.checkedList = checkList;
       }
 
       // checkAll change
-      function onCheckAllChange(e: ChangeEvent) {
+      function onCheckAllChange(e: CheckboxChangeEvent) {
         const checkList = plainOptions.value.map((item) => item.value);
         if (e.target.checked) {
           state.checkedList = checkList;
@@ -250,16 +257,15 @@
 
       const indeterminate = computed(() => {
         const len = plainOptions.value.length;
-        let checkdedLen = state.checkedList.length;
-        unref(checkIndex) && checkdedLen--;
-        return checkdedLen > 0 && checkdedLen < len;
+        let checkedLen = state.checkedList.length;
+        unref(checkIndex) && checkedLen--;
+        return checkedLen > 0 && checkedLen < len;
       });
 
       // Trigger when check/uncheck a column
       function onChange(checkedList: string[]) {
-        const len = plainOptions.value.length;
+        const len = plainSortOptions.value.length;
         state.checkAll = checkedList.length === len;
-
         const sortList = unref(plainSortOptions).map((item) => item.value);
         checkedList.sort((prev, next) => {
           return sortList.indexOf(prev) - sortList.indexOf(next);
@@ -267,6 +273,8 @@
         setColumns(checkedList);
       }
 
+      let sortable: Sortable;
+      let sortableOrder: string[] = [];
       // reset columns
       function reset() {
         state.checkedList = [...state.defaultCheckList];
@@ -274,6 +282,7 @@
         plainOptions.value = unref(cachePlainOptions);
         plainSortOptions.value = unref(cachePlainOptions);
         setColumns(table.getCacheColumns());
+        sortable.sort(sortableOrder);
       }
 
       // Open the pop-up window for drag and drop initialization
@@ -285,15 +294,18 @@
           const el = columnListEl.$el as any;
           if (!el) return;
           // Drag and drop sort
-          const { initSortable } = useSortable(el, {
-            handle: '.table-coulmn-drag-icon ',
+          sortable = Sortablejs.create(unref(el), {
+            animation: 500,
+            delay: 400,
+            delayOnTouchOnly: true,
+            handle: ".table-column-drag-icon ",
             onEnd: (evt) => {
               const { oldIndex, newIndex } = evt;
               if (isNullAndUnDef(oldIndex) || isNullAndUnDef(newIndex) || oldIndex === newIndex) {
                 return;
               }
               // Sort column
-              const columns = getColumns();
+              const columns = cloneDeep(plainSortOptions.value);
 
               if (oldIndex > newIndex) {
                 columns.splice(newIndex, 0, columns[oldIndex]);
@@ -304,30 +316,35 @@
               }
 
               plainSortOptions.value = columns;
-              plainOptions.value = columns;
-              setColumns(columns);
+
+              setColumns(
+                columns
+                  .map((col: Options) => col.value)
+                  .filter((value: string) => state.checkedList.includes(value)),
+              );
             },
           });
-          initSortable();
+          // 记录原始order 序列
+          sortableOrder = sortable.toArray();
           inited = true;
         });
       }
 
       // Control whether the serial number column is displayed
-      function handleIndexCheckChange(e: ChangeEvent) {
+      function handleIndexCheckChange(e: CheckboxChangeEvent) {
         table.setProps({
           showIndexColumn: e.target.checked,
         });
       }
 
       // Control whether the check box is displayed
-      function handleSelectCheckChange(e: ChangeEvent) {
+      function handleSelectCheckChange(e: CheckboxChangeEvent) {
         table.setProps({
           rowSelection: e.target.checked ? defaultRowSelection : undefined,
         });
       }
 
-      function handleColumnFixed(item: BasicColumn, fixed?: 'left' | 'right') {
+      function handleColumnFixed(item: BasicColumn, fixed?: "left" | "right") {
         if (!state.checkedList.includes(item.dataIndex as string)) return;
 
         const columns = getColumns() as BasicColumn[];
@@ -341,22 +358,22 @@
         if (isFixed && !item.width) {
           item.width = 100;
         }
-        table.setCacheColumnsByField?.(item.dataIndex, { fixed: isFixed });
+        table.setCacheColumnsByField?.(item.dataIndex as string, { fixed: isFixed });
         setColumns(columns);
       }
 
       function setColumns(columns: BasicColumn[] | string[]) {
         table.setColumns(columns);
-        const data: ColumnChangeParam[] = unref(plainOptions).map((col) => {
+        const data: ColumnChangeParam[] = unref(plainSortOptions).map((col) => {
           const visible =
             columns.findIndex(
               (c: BasicColumn | string) =>
-                c === col.value || (typeof c !== 'string' && c.dataIndex === col.value),
+                c === col.value || (typeof c !== "string" && c.dataIndex === col.value),
             ) !== -1;
           return { dataIndex: col.value, fixed: col.fixed, visible };
         });
 
-        emit('columns-change', data);
+        emit("columns-change", data);
       }
 
       function getPopupContainer() {
@@ -388,9 +405,9 @@
   });
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-basic-column-setting';
+  @prefix-cls: ~"@{namespace}-basic-column-setting";
 
-  .table-coulmn-drag-icon {
+  .table-column-drag-icon {
     margin: 0 5px;
     cursor: move;
   }
diff --git a/src/components/Table/src/components/settings/FullScreenSetting.vue b/src/components/Table/src/components/settings/FullScreenSetting.vue
index af07f84cbde657c6d8e129248ab1818024f0020c..88887388edaa7f85ef8e4a878f6a661874489160 100644
--- a/src/components/Table/src/components/settings/FullScreenSetting.vue
+++ b/src/components/Table/src/components/settings/FullScreenSetting.vue
@@ -1,22 +1,22 @@
 <template>
   <Tooltip placement="top">
     <template #title>
-      <span>{{ t('component.table.settingFullScreen') }}</span>
+      <span>{{ t("component.table.settingFullScreen") }}</span>
     </template>
     <FullscreenOutlined @click="toggle" v-if="!isFullscreen" />
     <FullscreenExitOutlined @click="toggle" v-else />
   </Tooltip>
 </template>
 <script lang="ts">
-  import { defineComponent } from 'vue';
-  import { Tooltip } from 'ant-design-vue';
-  import { FullscreenOutlined, FullscreenExitOutlined } from '@ant-design/icons-vue';
-  import { useFullscreen } from '@vueuse/core';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { useTableContext } from '../../hooks/useTableContext';
+  import { defineComponent } from "vue";
+  import { Tooltip } from "ant-design-vue";
+  import { FullscreenOutlined, FullscreenExitOutlined } from "@ant-design/icons-vue";
+  import { useFullscreen } from "@vueuse/core";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { useTableContext } from "../../hooks/useTableContext";
 
   export default defineComponent({
-    name: 'FullScreenSetting',
+    name: "FullScreenSetting",
     components: {
       FullscreenExitOutlined,
       FullscreenOutlined,
diff --git a/src/components/Table/src/components/settings/RedoSetting.vue b/src/components/Table/src/components/settings/RedoSetting.vue
index 81829a17d59cb5c095e4302e4f4b5b5f75eb9fcb..d4702a40e7dade0518c1f28099574015f8a120e8 100644
--- a/src/components/Table/src/components/settings/RedoSetting.vue
+++ b/src/components/Table/src/components/settings/RedoSetting.vue
@@ -1,20 +1,20 @@
 <template>
   <Tooltip placement="top">
     <template #title>
-      <span>{{ t('common.redo') }}</span>
+      <span>{{ t("common.redo") }}</span>
     </template>
     <RedoOutlined @click="redo" />
   </Tooltip>
 </template>
 <script lang="ts">
-  import { defineComponent } from 'vue';
-  import { Tooltip } from 'ant-design-vue';
-  import { RedoOutlined } from '@ant-design/icons-vue';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { useTableContext } from '../../hooks/useTableContext';
+  import { defineComponent } from "vue";
+  import { Tooltip } from "ant-design-vue";
+  import { RedoOutlined } from "@ant-design/icons-vue";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { useTableContext } from "../../hooks/useTableContext";
 
   export default defineComponent({
-    name: 'RedoSetting',
+    name: "RedoSetting",
     components: {
       RedoOutlined,
       Tooltip,
diff --git a/src/components/Table/src/components/settings/SizeSetting.vue b/src/components/Table/src/components/settings/SizeSetting.vue
index 190340a5fe5c5b2a4668a32dc46cd7e1eaca004f..6c503591fbb847e7e6eec7b2196cae374b26709d 100644
--- a/src/components/Table/src/components/settings/SizeSetting.vue
+++ b/src/components/Table/src/components/settings/SizeSetting.vue
@@ -1,21 +1,21 @@
 <template>
   <Tooltip placement="top">
     <template #title>
-      <span>{{ t('component.table.settingDens') }}</span>
+      <span>{{ t("component.table.settingDens") }}</span>
     </template>
 
-    <Dropdown placement="bottomCenter" :trigger="['click']" :getPopupContainer="getPopupContainer">
+    <Dropdown placement="bottom" :trigger="['click']" :getPopupContainer="getPopupContainer">
       <ColumnHeightOutlined />
       <template #overlay>
         <Menu @click="handleTitleClick" selectable v-model:selectedKeys="selectedKeysRef">
           <MenuItem key="default">
-            <span>{{ t('component.table.settingDensDefault') }}</span>
+            <span>{{ t("component.table.settingDensDefault") }}</span>
           </MenuItem>
           <MenuItem key="middle">
-            <span>{{ t('component.table.settingDensMiddle') }}</span>
+            <span>{{ t("component.table.settingDensMiddle") }}</span>
           </MenuItem>
           <MenuItem key="small">
-            <span>{{ t('component.table.settingDensSmall') }}</span>
+            <span>{{ t("component.table.settingDensSmall") }}</span>
           </MenuItem>
         </Menu>
       </template>
@@ -23,16 +23,16 @@
   </Tooltip>
 </template>
 <script lang="ts">
-  import type { SizeType } from '../../types/table';
-  import { defineComponent, ref } from 'vue';
-  import { Tooltip, Dropdown, Menu } from 'ant-design-vue';
-  import { ColumnHeightOutlined } from '@ant-design/icons-vue';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { useTableContext } from '../../hooks/useTableContext';
-  import { getPopupContainer } from '/@/utils';
+  import type { SizeType } from "../../types/table";
+  import { defineComponent, ref } from "vue";
+  import { Tooltip, Dropdown, Menu } from "ant-design-vue";
+  import { ColumnHeightOutlined } from "@ant-design/icons-vue";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { useTableContext } from "../../hooks/useTableContext";
+  import { getPopupContainer } from "/@/utils";
 
   export default defineComponent({
-    name: 'SizeSetting',
+    name: "SizeSetting",
     components: {
       ColumnHeightOutlined,
       Tooltip,
diff --git a/src/components/Table/src/components/settings/index.vue b/src/components/Table/src/components/settings/index.vue
index ab03cb22b8f8395971fba66c3078d7134f46308d..dc3aef194178eb99e32c3c2ee471a104755f848e 100644
--- a/src/components/Table/src/components/settings/index.vue
+++ b/src/components/Table/src/components/settings/index.vue
@@ -11,18 +11,18 @@
   </div>
 </template>
 <script lang="ts">
-  import type { PropType } from 'vue';
-  import type { TableSetting, ColumnChangeParam } from '../../types/table';
-  import { defineComponent, computed, unref } from 'vue';
-  import ColumnSetting from './ColumnSetting.vue';
-  import SizeSetting from './SizeSetting.vue';
-  import RedoSetting from './RedoSetting.vue';
-  import FullScreenSetting from './FullScreenSetting.vue';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { useTableContext } from '../../hooks/useTableContext';
+  import type { PropType } from "vue";
+  import type { TableSetting, ColumnChangeParam } from "../../types/table";
+  import { defineComponent, computed, unref } from "vue";
+  import ColumnSetting from "./ColumnSetting.vue";
+  import SizeSetting from "./SizeSetting.vue";
+  import RedoSetting from "./RedoSetting.vue";
+  import FullScreenSetting from "./FullScreenSetting.vue";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { useTableContext } from "../../hooks/useTableContext";
 
   export default defineComponent({
-    name: 'TableSetting',
+    name: "TableSetting",
     components: {
       ColumnSetting,
       SizeSetting,
@@ -35,7 +35,7 @@
         default: () => ({}),
       },
     },
-    emits: ['columns-change'],
+    emits: ["columns-change"],
     setup(props, { emit }) {
       const { t } = useI18n();
       const table = useTableContext();
@@ -51,7 +51,7 @@
       });
 
       function handleColumnChange(data: ColumnChangeParam[]) {
-        emit('columns-change', data);
+        emit("columns-change", data);
       }
 
       function getTableContainer() {
diff --git a/src/components/Table/src/const.ts b/src/components/Table/src/const.ts
index 2a45fac7aac59121a6c86f210c36c8faef6c3a03..5bd8c2e3d8f5bf97aeefc659454b85a0e7d311ff 100644
--- a/src/components/Table/src/const.ts
+++ b/src/components/Table/src/const.ts
@@ -1,4 +1,4 @@
-import componentSetting from '/@/settings/componentSetting';
+import componentSetting from "/@/settings/componentSetting";
 
 const { table } = componentSetting;
 
@@ -11,7 +11,7 @@ const {
   defaultFilterFn,
 } = table;
 
-export const ROW_KEY = 'key';
+export const ROW_KEY = "key";
 
 // Optional display number per page;
 export const PAGE_SIZE_OPTIONS = pageSizeOptions;
@@ -31,8 +31,8 @@ export const DEFAULT_SORT_FN = defaultSortFn;
 export const DEFAULT_FILTER_FN = defaultFilterFn;
 
 //  Default layout of table cells
-export const DEFAULT_ALIGN = 'center';
+export const DEFAULT_ALIGN = "center";
 
-export const INDEX_COLUMN_FLAG = 'INDEX';
+export const INDEX_COLUMN_FLAG = "INDEX";
 
-export const ACTION_COLUMN_FLAG = 'ACTION';
+export const ACTION_COLUMN_FLAG = "ACTION";
diff --git a/src/components/Table/src/hooks/useColumns.ts b/src/components/Table/src/hooks/useColumns.ts
index 42e0c8a431b05ae6ae7bd59cb7e8d9fad393464e..2a36cbb6f0c9fc7523650a822b54e2e5807c1fd6 100644
--- a/src/components/Table/src/hooks/useColumns.ts
+++ b/src/components/Table/src/hooks/useColumns.ts
@@ -1,14 +1,14 @@
-import type { BasicColumn, BasicTableProps, CellFormat, GetColumnsParams } from '../types/table';
-import type { PaginationProps } from '../types/pagination';
-import type { ComputedRef } from 'vue';
-import { computed, Ref, ref, toRaw, unref, watch } from 'vue';
-import { renderEditCell } from '../components/editable';
-import { usePermission } from '/@/hooks/web/usePermission';
-import { useI18n } from '/@/hooks/web/useI18n';
-import { isArray, isBoolean, isFunction, isMap, isString } from '/@/utils/is';
-import { cloneDeep, isEqual } from 'lodash-es';
-import { formatToDate } from '/@/utils/dateUtil';
-import { ACTION_COLUMN_FLAG, DEFAULT_ALIGN, INDEX_COLUMN_FLAG, PAGE_SIZE } from '../const';
+import type { BasicColumn, BasicTableProps, CellFormat, GetColumnsParams } from "../types/table";
+import type { PaginationProps } from "../types/pagination";
+import type { ComputedRef } from "vue";
+import { computed, Ref, ref, reactive, toRaw, unref, watch } from "vue";
+import { renderEditCell } from "../components/editable";
+import { usePermission } from "/@/hooks/web/usePermission";
+import { useI18n } from "/@/hooks/web/useI18n";
+import { isArray, isBoolean, isFunction, isMap, isString } from "/@/utils/is";
+import { cloneDeep, isEqual } from "lodash-es";
+import { formatToDate } from "/@/utils/dateUtil";
+import { ACTION_COLUMN_FLAG, DEFAULT_ALIGN, INDEX_COLUMN_FLAG, PAGE_SIZE } from "../const";
 
 function handleItem(item: BasicColumn, ellipsis: boolean) {
   const { key, dataIndex, children } = item;
@@ -61,13 +61,13 @@ function handleIndexColumn(
 
   if (!pushIndexColumns) return;
 
-  const isFixedLeft = columns.some((item) => item.fixed === 'left');
+  const isFixedLeft = columns.some((item) => item.fixed === "left");
 
   columns.unshift({
     flag: INDEX_COLUMN_FLAG,
     width: 50,
-    title: t('component.table.index'),
-    align: 'center',
+    title: t("component.table.index"),
+    align: "center",
     customRender: ({ index }) => {
       const getPagination = unref(getPaginationRef);
       if (isBoolean(getPagination)) {
@@ -78,7 +78,7 @@ function handleIndexColumn(
     },
     ...(isFixedLeft
       ? {
-          fixed: 'left',
+          fixed: "left",
         }
       : {}),
     ...indexColumnProps,
@@ -93,7 +93,7 @@ function handleActionColumn(propsRef: ComputedRef<BasicTableProps>, columns: Bas
   if (hasIndex === -1) {
     columns.push({
       ...columns[hasIndex],
-      fixed: 'right',
+      fixed: "right",
       ...actionColumn,
       flag: ACTION_COLUMN_FLAG,
     });
@@ -122,7 +122,7 @@ export function useColumns(
 
       handleItem(
         item,
-        Reflect.has(item, 'ellipsis') ? !!item.ellipsis : !!ellipsis && !customRender && !slots,
+        Reflect.has(item, "ellipsis") ? !!item.ellipsis : !!ellipsis && !customRender && !slots,
       );
     });
     return columns;
@@ -152,12 +152,12 @@ export function useColumns(
         return hasPermission(column.auth) && isIfShow(column);
       })
       .map((column) => {
-        const { slots, dataIndex, customRender, format, edit, editRow, flag } = column;
+        const { slots, customRender, format, edit, editRow, flag } = column;
 
         if (!slots || !slots?.title) {
-          column.slots = { title: `header-${dataIndex}`, ...(slots || {}) };
+          // column.slots = { title: `header-${dataIndex}`, ...(slots || {}) };
           column.customTitle = column.title;
-          Reflect.deleteProperty(column, 'title');
+          Reflect.deleteProperty(column, "title");
         }
         const isDefaultAction = [INDEX_COLUMN_FLAG, ACTION_COLUMN_FLAG].includes(flag!);
         if (!customRender && format && !edit && !isDefaultAction) {
@@ -170,7 +170,7 @@ export function useColumns(
         if ((edit || editRow) && !isDefaultAction) {
           column.customRender = renderEditCell(column);
         }
-        return column;
+        return reactive(column);
       });
   });
 
@@ -197,7 +197,7 @@ export function useColumns(
    * set columns
    * @param columnList key|column
    */
-  function setColumns(columnList: Partial<BasicColumn>[] | string[]) {
+  function setColumns(columnList: Partial<BasicColumn>[] | (string | string[])[]) {
     const columns = cloneDeep(columnList);
     if (!isArray(columns)) return;
 
@@ -210,31 +210,23 @@ export function useColumns(
 
     const cacheKeys = cacheColumns.map((item) => item.dataIndex);
 
-    if (!isString(firstColumn)) {
+    if (!isString(firstColumn) && !isArray(firstColumn)) {
       columnsRef.value = columns as BasicColumn[];
     } else {
-      const columnKeys = columns as string[];
+      const columnKeys = (columns as (string | string[])[]).map((m) => m.toString());
       const newColumns: BasicColumn[] = [];
       cacheColumns.forEach((item) => {
-        if (columnKeys.includes(item.dataIndex! || (item.key as string))) {
-          newColumns.push({
-            ...item,
-            defaultHidden: false,
-          });
-        } else {
-          newColumns.push({
-            ...item,
-            defaultHidden: true,
-          });
-        }
+        newColumns.push({
+          ...item,
+          defaultHidden: !columnKeys.includes(item.dataIndex?.toString() || (item.key as string)),
+        });
       });
-
       // Sort according to another array
       if (!isEqual(cacheKeys, columns)) {
         newColumns.sort((prev, next) => {
           return (
-            cacheKeys.indexOf(prev.dataIndex as string) -
-            cacheKeys.indexOf(next.dataIndex as string)
+            columnKeys.indexOf(prev.dataIndex?.toString() as string) -
+            columnKeys.indexOf(next.dataIndex?.toString() as string)
           );
         });
       }
@@ -277,11 +269,11 @@ function sortFixedColumn(columns: BasicColumn[]) {
   const fixedRightColumns: BasicColumn[] = [];
   const defColumns: BasicColumn[] = [];
   for (const column of columns) {
-    if (column.fixed === 'left') {
+    if (column.fixed === "left") {
       fixedLeftColumns.push(column);
       continue;
     }
-    if (column.fixed === 'right') {
+    if (column.fixed === "right") {
       fixedRightColumns.push(column);
       continue;
     }
@@ -305,9 +297,9 @@ export function formatCell(text: string, format: CellFormat, record: Recordable,
 
   try {
     // date type
-    const DATE_FORMAT_PREFIX = 'date|';
-    if (isString(format) && format.startsWith(DATE_FORMAT_PREFIX)) {
-      const dateFormat = format.replace(DATE_FORMAT_PREFIX, '');
+    const DATE_FORMAT_PREFIX = "date|";
+    if (isString(format) && format.startsWith(DATE_FORMAT_PREFIX) && text) {
+      const dateFormat = format.replace(DATE_FORMAT_PREFIX, "");
 
       if (!dateFormat) {
         return text;
diff --git a/src/components/Table/src/hooks/useCustomRow.ts b/src/components/Table/src/hooks/useCustomRow.ts
index 56187208e8329c40131ea5d765bb3ddb3b97d139..f091863d2f37dce843d0df764615a8bee4cf3acf 100644
--- a/src/components/Table/src/hooks/useCustomRow.ts
+++ b/src/components/Table/src/hooks/useCustomRow.ts
@@ -1,8 +1,8 @@
-import type { ComputedRef } from 'vue';
-import type { BasicTableProps } from '../types/table';
-import { unref } from 'vue';
-import { ROW_KEY } from '../const';
-import { isString, isFunction } from '/@/utils/is';
+import type { ComputedRef } from "vue";
+import type { BasicTableProps } from "../types/table";
+import { unref } from "vue";
+import { ROW_KEY } from "../const";
+import { isString, isFunction } from "/@/utils/is";
 
 interface Options {
   setSelectedRowKeys: (keys: string[]) => void;
@@ -44,16 +44,16 @@ export function useCustomRow(
           const key = getKey(record, rowKey, unref(getAutoCreateKey));
           if (!key) return;
 
-          const isCheckbox = rowSelection.type === 'checkbox';
+          const isCheckbox = rowSelection.type === "checkbox";
           if (isCheckbox) {
             // 找到tr
             const tr: HTMLElement = (e as MouseEvent)
               .composedPath?.()
-              .find((dom: HTMLElement) => dom.tagName === 'TR') as HTMLElement;
+              .find((dom: HTMLElement) => dom.tagName === "TR") as HTMLElement;
             if (!tr) return;
             // 找到Checkbox,检查是否为disabled
-            const checkBox = tr.querySelector('input[type=checkbox]');
-            if (!checkBox || checkBox.hasAttribute('disabled')) return;
+            const checkBox = tr.querySelector("input[type=checkbox]");
+            if (!checkBox || checkBox.hasAttribute("disabled")) return;
             if (!keys.includes(key)) {
               setSelectedRowKeys([...keys, key]);
               return;
@@ -64,7 +64,7 @@ export function useCustomRow(
             return;
           }
 
-          const isRadio = rowSelection.type === 'radio';
+          const isRadio = rowSelection.type === "radio";
           if (isRadio) {
             if (!keys.includes(key)) {
               if (keys.length) {
@@ -77,19 +77,19 @@ export function useCustomRow(
           }
         }
         handleClick();
-        emit('row-click', record, index, e);
+        emit("row-click", record, index, e);
       },
       onDblclick: (event: Event) => {
-        emit('row-dbClick', record, index, event);
+        emit("row-dbClick", record, index, event);
       },
       onContextmenu: (event: Event) => {
-        emit('row-contextmenu', record, index, event);
+        emit("row-contextmenu", record, index, event);
       },
       onMouseenter: (event: Event) => {
-        emit('row-mouseenter', record, index, event);
+        emit("row-mouseenter", record, index, event);
       },
       onMouseleave: (event: Event) => {
-        emit('row-mouseleave', record, index, event);
+        emit("row-mouseleave", record, index, event);
       },
     };
   };
diff --git a/src/components/Table/src/hooks/useDataSource.ts b/src/components/Table/src/hooks/useDataSource.ts
index 76cba22aa741b8bdf73e6883378be50ee9d37b8b..2a99612b397299dc13a9867c18175b1c5a94fee3 100644
--- a/src/components/Table/src/hooks/useDataSource.ts
+++ b/src/components/Table/src/hooks/useDataSource.ts
@@ -1,5 +1,5 @@
-import type { BasicTableProps, FetchParams, SorterResult } from '../types/table';
-import type { PaginationProps } from '../types/pagination';
+import type { BasicTableProps, FetchParams, SorterResult } from "../types/table";
+import type { PaginationProps } from "../types/pagination";
 import {
   ref,
   unref,
@@ -10,12 +10,12 @@ import {
   reactive,
   Ref,
   watchEffect,
-} from 'vue';
-import { useTimeoutFn } from '/@/hooks/core/useTimeout';
-import { buildUUID } from '/@/utils/uuid';
-import { isFunction, isBoolean } from '/@/utils/is';
-import { get, cloneDeep } from 'lodash-es';
-import { FETCH_SETTING, ROW_KEY, PAGE_SIZE } from '../const';
+} from "vue";
+import { useTimeoutFn } from "/@/hooks/core/useTimeout";
+import { buildUUID } from "/@/utils/uuid";
+import { isFunction, isBoolean } from "/@/utils/is";
+import { get, cloneDeep, merge } from "lodash-es";
+import { FETCH_SETTING, ROW_KEY, PAGE_SIZE } from "../const";
 
 interface ActionType {
   getPaginationInfo: ComputedRef<boolean | PaginationProps>;
@@ -168,7 +168,7 @@ export function useDataSource(
     for (const key of rowKeys) {
       let index: number | undefined = dataSourceRef.value.findIndex((row) => {
         let targetKeyName: string;
-        if (typeof rowKeyName === 'function') {
+        if (typeof rowKeyName === "function") {
           targetKeyName = rowKeyName(row);
         } else {
           targetKeyName = rowKeyName as string;
@@ -180,14 +180,14 @@ export function useDataSource(
       }
       index = unref(propsRef).dataSource?.findIndex((row) => {
         let targetKeyName: string;
-        if (typeof rowKeyName === 'function') {
+        if (typeof rowKeyName === "function") {
           targetKeyName = rowKeyName(row);
         } else {
           targetKeyName = rowKeyName as string;
         }
         return row[targetKeyName] === key;
       });
-      if (typeof index !== 'undefined' && index !== -1)
+      if (typeof index !== "undefined" && index !== -1)
         unref(propsRef).dataSource?.splice(index, 1);
     }
     setPagination({
@@ -196,11 +196,10 @@ export function useDataSource(
   }
 
   function insertTableDataRecord(record: Recordable, index: number): Recordable | undefined {
-    if (!dataSourceRef.value || dataSourceRef.value.length == 0) return;
+    // if (!dataSourceRef.value || dataSourceRef.value.length == 0) return;
     index = index ?? dataSourceRef.value?.length;
     unref(dataSourceRef).splice(index, 0, record);
-    unref(propsRef).dataSource?.splice(index, 0, record);
-    return unref(propsRef).dataSource;
+    return unref(dataSourceRef);
   }
 
   function findTableDataRecord(rowKey: string | number) {
@@ -209,12 +208,12 @@ export function useDataSource(
     const rowKeyName = unref(getRowKey);
     if (!rowKeyName) return;
 
-    const { childrenColumnName = 'children' } = unref(propsRef);
+    const { childrenColumnName = "children" } = unref(propsRef);
 
     const findRow = (array: any[]) => {
       let ret;
       array.some(function iter(r) {
-        if (typeof rowKeyName === 'function') {
+        if (typeof rowKeyName === "function") {
           if ((rowKeyName(r) as string) === rowKey) {
             ret = r;
             return true;
@@ -272,17 +271,17 @@ export function useDataSource(
 
       const { sortInfo = {}, filterInfo } = searchState;
 
-      let params: Recordable = {
-        ...pageParams,
-        ...(useSearchForm ? getFieldsValue() : {}),
-        ...searchInfo,
-        ...(opt?.searchInfo ?? {}),
-        ...defSort,
-        ...sortInfo,
-        ...filterInfo,
-        ...(opt?.sortInfo ?? {}),
-        ...(opt?.filterInfo ?? {}),
-      };
+      let params: Recordable = merge(
+        pageParams,
+        useSearchForm ? getFieldsValue() : {},
+        searchInfo,
+        opt?.searchInfo ?? {},
+        defSort,
+        sortInfo,
+        filterInfo,
+        opt?.sortInfo ?? {},
+        opt?.filterInfo ?? {},
+      );
       if (beforeFetch && isFunction(beforeFetch)) {
         params = (await beforeFetch(params)) || params;
       }
@@ -293,7 +292,7 @@ export function useDataSource(
       const isArrayResult = Array.isArray(res);
 
       let resultItems: Recordable[] = isArrayResult ? res : get(res, listField);
-      const resultTotal: number = isArrayResult ? 0 : get(res, totalField);
+      const resultTotal: number = isArrayResult ? res.length : get(res, totalField);
 
       // 假如数据变少,导致总页数变少并小于当前选中页码,通过getPaginationRef获取到的页码是不正确的,需获取正确的页码再次执行
       if (resultTotal) {
@@ -318,13 +317,13 @@ export function useDataSource(
           current: opt.page || 1,
         });
       }
-      emit('fetch-success', {
+      emit("fetch-success", {
         items: unref(resultItems),
         total: resultTotal,
       });
       return resultItems;
     } catch (error) {
-      emit('fetch-error', error);
+      emit("fetch-error", error);
       dataSourceRef.value = [];
       setPagination({
         total: 0,
diff --git a/src/components/Table/src/hooks/useLoading.ts b/src/components/Table/src/hooks/useLoading.ts
index fe8a0f1648f130ae2e29bbd8b14dcba7e13ae814..bfb5463d58af0ee42e4df4c563017b68849a1995 100644
--- a/src/components/Table/src/hooks/useLoading.ts
+++ b/src/components/Table/src/hooks/useLoading.ts
@@ -1,5 +1,5 @@
-import { ref, ComputedRef, unref, computed, watch } from 'vue';
-import type { BasicTableProps } from '../types/table';
+import { ref, ComputedRef, unref, computed, watch } from "vue";
+import type { BasicTableProps } from "../types/table";
 
 export function useLoading(props: ComputedRef<BasicTableProps>) {
   const loadingRef = ref(unref(props).loading);
diff --git a/src/components/Table/src/hooks/usePagination.tsx b/src/components/Table/src/hooks/usePagination.tsx
index ba310bd14ca778dcb3e816a8f1a439a8a6eca9d7..3dbc11010a28824c6ad43c34b614eddf17c4e6ee 100644
--- a/src/components/Table/src/hooks/usePagination.tsx
+++ b/src/components/Table/src/hooks/usePagination.tsx
@@ -1,21 +1,21 @@
-import type { PaginationProps } from '../types/pagination';
-import type { BasicTableProps } from '../types/table';
-import { computed, unref, ref, ComputedRef, watch } from 'vue';
-import { LeftOutlined, RightOutlined } from '@ant-design/icons-vue';
-import { isBoolean } from '/@/utils/is';
-import { PAGE_SIZE, PAGE_SIZE_OPTIONS } from '../const';
-import { useI18n } from '/@/hooks/web/useI18n';
+import type { PaginationProps } from "../types/pagination";
+import type { BasicTableProps } from "../types/table";
+import { computed, unref, ref, ComputedRef, watch } from "vue";
+import { LeftOutlined, RightOutlined } from "@ant-design/icons-vue";
+import { isBoolean } from "/@/utils/is";
+import { PAGE_SIZE, PAGE_SIZE_OPTIONS } from "../const";
+import { useI18n } from "/@/hooks/web/useI18n";
 
 interface ItemRender {
   page: number;
-  type: 'page' | 'prev' | 'next';
+  type: "page" | "prev" | "next";
   originalElement: any;
 }
 
 function itemRender({ page, type, originalElement }: ItemRender) {
-  if (type === 'prev') {
+  if (type === "prev") {
     return page === 0 ? null : <LeftOutlined />;
-  } else if (type === 'next') {
+  } else if (type === "next") {
     return page === 1 ? null : <RightOutlined />;
   }
   return originalElement;
@@ -49,9 +49,9 @@ export function usePagination(refProps: ComputedRef<BasicTableProps>) {
     return {
       current: 1,
       pageSize: PAGE_SIZE,
-      size: 'small',
+      size: "small",
       defaultPageSize: PAGE_SIZE,
-      showTotal: (total) => t('component.table.total', { total }),
+      showTotal: (total) => t("component.table.total", { total }),
       showSizeChanger: true,
       pageSizeOptions: PAGE_SIZE_OPTIONS,
       itemRender: itemRender,
diff --git a/src/components/Table/src/hooks/useRowSelection.ts b/src/components/Table/src/hooks/useRowSelection.ts
index ffae9b528c9398761bf6ab325055cca75a3437f4..3fbbee59f6a7cbc6be7de75776fdd137124d08af 100644
--- a/src/components/Table/src/hooks/useRowSelection.ts
+++ b/src/components/Table/src/hooks/useRowSelection.ts
@@ -1,9 +1,9 @@
-import { isFunction } from '/@/utils/is';
-import type { BasicTableProps, TableRowSelection } from '../types/table';
-import { computed, ComputedRef, nextTick, Ref, ref, toRaw, unref, watch } from 'vue';
-import { ROW_KEY } from '../const';
-import { omit } from 'lodash-es';
-import { findNodeAll } from '/@/utils/helper/treeHelper';
+import { isFunction } from "/@/utils/is";
+import type { BasicTableProps, TableRowSelection } from "../types/table";
+import { computed, ComputedRef, nextTick, Ref, ref, toRaw, unref, watch } from "vue";
+import { ROW_KEY } from "../const";
+import { omit } from "lodash-es";
+import { findNodeAll } from "/@/utils/helper/treeHelper";
 
 export function useRowSelection(
   propsRef: ComputedRef<BasicTableProps>,
@@ -21,13 +21,10 @@ export function useRowSelection(
 
     return {
       selectedRowKeys: unref(selectedRowKeysRef),
-      hideDefaultSelections: false,
       onChange: (selectedRowKeys: string[]) => {
         setSelectedRowKeys(selectedRowKeys);
-        // selectedRowKeysRef.value = selectedRowKeys;
-        // selectedRowRef.value = selectedRows;
       },
-      ...omit(rowSelection, ['onChange']),
+      ...omit(rowSelection, ["onChange"]),
     };
   });
 
@@ -47,7 +44,7 @@ export function useRowSelection(
           const { onChange } = rowSelection;
           if (onChange && isFunction(onChange)) onChange(getSelectRowKeys(), getSelectRows());
         }
-        emit('selection-change', {
+        emit("selection-change", {
           keys: getSelectRowKeys(),
           rows: getSelectRows(),
         });
@@ -71,7 +68,7 @@ export function useRowSelection(
       toRaw(unref(tableData)).concat(toRaw(unref(selectedRowRef))),
       (item) => rowKeys.includes(item[unref(getRowKey) as string]),
       {
-        children: propsRef.value.childrenColumnName ?? 'children',
+        children: propsRef.value.childrenColumnName ?? "children",
       },
     );
     const trueSelectedRows: any[] = [];
diff --git a/src/components/Table/src/hooks/useScrollTo.ts b/src/components/Table/src/hooks/useScrollTo.ts
new file mode 100644
index 0000000000000000000000000000000000000000..506bc5d1107c6cce97c66a425f30aed50f734c98
--- /dev/null
+++ b/src/components/Table/src/hooks/useScrollTo.ts
@@ -0,0 +1,55 @@
+import type { ComputedRef, Ref } from "vue";
+import { nextTick, unref } from "vue";
+import { warn } from "/@/utils/log";
+
+export function useTableScrollTo(
+  tableElRef: Ref<ComponentRef>,
+  getDataSourceRef: ComputedRef<Recordable[]>,
+) {
+  let bodyEl: HTMLElement | null;
+
+  async function findTargetRowToScroll(targetRowData: Recordable) {
+    const { id } = targetRowData;
+    const targetRowEl: HTMLElement | null | undefined = bodyEl?.querySelector(
+      `[data-row-key="${id}"]`,
+    );
+    //Add a delay to get new dataSource
+    await nextTick();
+    bodyEl?.scrollTo({
+      top: targetRowEl?.offsetTop ?? 0,
+      behavior: "smooth",
+    });
+  }
+
+  function scrollTo(pos: string): void {
+    const table = unref(tableElRef);
+    if (!table) return;
+
+    const tableEl: Element = table.$el;
+    if (!tableEl) return;
+
+    if (!bodyEl) {
+      bodyEl = tableEl.querySelector(".ant-table-body");
+      if (!bodyEl) return;
+    }
+
+    const dataSource = unref(getDataSourceRef);
+    if (!dataSource) return;
+
+    // judge pos type
+    if (pos === "top") {
+      findTargetRowToScroll(dataSource[0]);
+    } else if (pos === "bottom") {
+      findTargetRowToScroll(dataSource[dataSource.length - 1]);
+    } else {
+      const targetRowData = dataSource.find((data) => data.id === pos);
+      if (targetRowData) {
+        findTargetRowToScroll(targetRowData);
+      } else {
+        warn(`id: ${pos} doesn't exist`);
+      }
+    }
+  }
+
+  return { scrollTo };
+}
diff --git a/src/components/Table/src/hooks/useTable.ts b/src/components/Table/src/hooks/useTable.ts
index d60589322674c22db7f47047b721aa0775132c92..8952150ad640cd319a420c8918eaf1b1e13d2b6a 100644
--- a/src/components/Table/src/hooks/useTable.ts
+++ b/src/components/Table/src/hooks/useTable.ts
@@ -1,12 +1,12 @@
-import type { BasicTableProps, TableActionType, FetchParams, BasicColumn } from '../types/table';
-import type { PaginationProps } from '../types/pagination';
-import type { DynamicProps } from '/#/utils';
-import type { FormActionType } from '/@/components/Form';
-import type { WatchStopHandle } from 'vue';
-import { getDynamicProps } from '/@/utils';
-import { ref, onUnmounted, unref, watch, toRaw } from 'vue';
-import { isProdMode } from '/@/utils/env';
-import { error } from '/@/utils/log';
+import type { BasicTableProps, TableActionType, FetchParams, BasicColumn } from "../types/table";
+import type { PaginationProps } from "../types/pagination";
+import type { DynamicProps } from "/#/utils";
+import type { FormActionType } from "/@/components/Form";
+import type { WatchStopHandle } from "vue";
+import { getDynamicProps } from "/@/utils";
+import { ref, onUnmounted, unref, watch, toRaw } from "vue";
+import { isProdMode } from "/@/utils/env";
+import { error } from "/@/utils/log";
 
 type Props = Partial<DynamicProps<BasicTableProps>>;
 
@@ -58,7 +58,7 @@ export function useTable(tableProps?: Props): [
     const table = unref(tableRef);
     if (!table) {
       error(
-        'The table instance has not been obtained yet, please make sure the table is presented when performing the table operation!',
+        "The table instance has not been obtained yet, please make sure the table is presented when performing the table operation!",
       );
     }
     return table as TableActionType;
@@ -152,9 +152,15 @@ export function useTable(tableProps?: Props): [
     expandAll: () => {
       getTableInstance().expandAll();
     },
+    expandRows: (keys: string[]) => {
+      getTableInstance().expandRows(keys);
+    },
     collapseAll: () => {
       getTableInstance().collapseAll();
     },
+    scrollTo: (pos: string) => {
+      getTableInstance().scrollTo(pos);
+    },
   };
 
   return [register, methods];
diff --git a/src/components/Table/src/hooks/useTableContext.ts b/src/components/Table/src/hooks/useTableContext.ts
index b657bb27e47f738b72a6d3162bf8af7911b750cf..db553442643dd96deb6ba2ead9287ac92b398e9f 100644
--- a/src/components/Table/src/hooks/useTableContext.ts
+++ b/src/components/Table/src/hooks/useTableContext.ts
@@ -1,15 +1,15 @@
-import type { Ref } from 'vue';
-import type { BasicTableProps, TableActionType } from '../types/table';
-import { provide, inject, ComputedRef } from 'vue';
+import type { Ref } from "vue";
+import type { BasicTableProps, TableActionType } from "../types/table";
+import { provide, inject, ComputedRef } from "vue";
 
-const key = Symbol('basic-table');
+const key = Symbol("basic-table");
 
 type Instance = TableActionType & {
   wrapRef: Ref<Nullable<HTMLElement>>;
   getBindValues: ComputedRef<Recordable>;
 };
 
-type RetInstance = Omit<Instance, 'getBindValues'> & {
+type RetInstance = Omit<Instance, "getBindValues"> & {
   getBindValues: ComputedRef<BasicTableProps>;
 };
 
diff --git a/src/components/Table/src/hooks/useTableExpand.ts b/src/components/Table/src/hooks/useTableExpand.ts
index c9f0eb1d22fd25957d2675730b81b2c3ad6087fd..77e65784d5aacb8b34579f6f98d7679c844495a4 100644
--- a/src/components/Table/src/hooks/useTableExpand.ts
+++ b/src/components/Table/src/hooks/useTableExpand.ts
@@ -1,7 +1,7 @@
-import type { ComputedRef, Ref } from 'vue';
-import type { BasicTableProps } from '../types/table';
-import { computed, unref, ref, toRaw } from 'vue';
-import { ROW_KEY } from '../const';
+import type { ComputedRef, Ref } from "vue";
+import type { BasicTableProps } from "../types/table";
+import { computed, unref, ref, toRaw } from "vue";
+import { ROW_KEY } from "../const";
 
 export function useTableExpand(
   propsRef: ComputedRef<BasicTableProps>,
@@ -27,7 +27,7 @@ export function useTableExpand(
       expandedRowKeys: unref(expandedRowKeys),
       onExpandedRowsChange: (keys: string[]) => {
         expandedRowKeys.value = keys;
-        emit('expanded-rows-change', keys);
+        emit("expanded-rows-change", keys);
       },
     };
   });
@@ -37,12 +37,19 @@ export function useTableExpand(
     expandedRowKeys.value = keys;
   }
 
+  function expandRows(keys: string[]) {
+    // use row ID expands the specified table row
+    const { isTreeTable } = unref(propsRef);
+    if (!isTreeTable) return;
+    expandedRowKeys.value = [...expandedRowKeys.value, ...keys];
+  }
+
   function getAllKeys(data?: Recordable[]) {
     const keys: string[] = [];
     const { childrenColumnName } = unref(propsRef);
     toRaw(data || unref(tableData)).forEach((item) => {
       keys.push(item[unref(getRowKey) as string]);
-      const children = item[childrenColumnName || 'children'];
+      const children = item[childrenColumnName || "children"];
       if (children?.length) {
         keys.push(...getAllKeys(children));
       }
@@ -54,5 +61,5 @@ export function useTableExpand(
     expandedRowKeys.value = [];
   }
 
-  return { getExpandOption, expandAll, collapseAll };
+  return { getExpandOption, expandAll, expandRows, collapseAll };
 }
diff --git a/src/components/Table/src/hooks/useTableFooter.ts b/src/components/Table/src/hooks/useTableFooter.ts
index df8393a02d4e05aad4e2e7f2c59ecd0a1136829d..2754072e5fed7ce90694a990f0410b1e1cdb96d3 100644
--- a/src/components/Table/src/hooks/useTableFooter.ts
+++ b/src/components/Table/src/hooks/useTableFooter.ts
@@ -1,14 +1,14 @@
-import type { ComputedRef, Ref } from 'vue';
-import type { BasicTableProps } from '../types/table';
-import { unref, computed, h, nextTick, watchEffect } from 'vue';
-import TableFooter from '../components/TableFooter.vue';
-import { useEventListener } from '/@/hooks/event/useEventListener';
+import type { ComputedRef, Ref } from "vue";
+import type { BasicTableProps } from "../types/table";
+import { unref, computed, h, nextTick, watchEffect } from "vue";
+import TableFooter from "../components/TableFooter.vue";
+import { useEventListener } from "/@/hooks/event/useEventListener";
 
 export function useTableFooter(
   propsRef: ComputedRef<BasicTableProps>,
   scrollRef: ComputedRef<{
     x: string | number | true;
-    y: Nullable<number>;
+    y: string | number | null;
     scrollToFirstRowOnChange: boolean;
   }>,
   tableElRef: Ref<ComponentRef>,
@@ -36,14 +36,13 @@ export function useTableFooter(
     nextTick(() => {
       const tableEl = unref(tableElRef);
       if (!tableEl) return;
-      const bodyDomList = tableEl.$el.querySelectorAll('.ant-table-body');
-      const bodyDom = bodyDomList[0];
+      const bodyDom = tableEl.$el.querySelector(".ant-table-content");
       useEventListener({
         el: bodyDom,
-        name: 'scroll',
+        name: "scroll",
         listener: () => {
           const footerBodyDom = tableEl.$el.querySelector(
-            '.ant-table-footer .ant-table-body',
+            ".ant-table-footer .ant-table-content",
           ) as HTMLDivElement;
           if (!footerBodyDom || !bodyDom) return;
           footerBodyDom.scrollLeft = bodyDom.scrollLeft;
diff --git a/src/components/Table/src/hooks/useTableForm.ts b/src/components/Table/src/hooks/useTableForm.ts
index bc09c7f6d14bd169faeea94e160a818624e2cff3..eda514ae645c346c82de46fd4fc31e2d43e73cdb 100644
--- a/src/components/Table/src/hooks/useTableForm.ts
+++ b/src/components/Table/src/hooks/useTableForm.ts
@@ -1,8 +1,8 @@
-import type { ComputedRef, Slots } from 'vue';
-import type { BasicTableProps, FetchParams } from '../types/table';
-import { unref, computed } from 'vue';
-import type { FormProps } from '/@/components/Form';
-import { isFunction } from '/@/utils/is';
+import type { ComputedRef, Slots } from "vue";
+import type { BasicTableProps, FetchParams } from "../types/table";
+import { unref, computed } from "vue";
+import type { FormProps } from "/@/components/Form";
+import { isFunction } from "/@/utils/is";
 
 export function useTableForm(
   propsRef: ComputedRef<BasicTableProps>,
@@ -24,13 +24,13 @@ export function useTableForm(
   const getFormSlotKeys: ComputedRef<string[]> = computed(() => {
     const keys = Object.keys(slots);
     return keys
-      .map((item) => (item.startsWith('form-') ? item : null))
+      .map((item) => (item.startsWith("form-") ? item : null))
       .filter((item) => !!item) as string[];
   });
 
   function replaceFormSlotKey(key: string) {
-    if (!key) return '';
-    return key?.replace?.(/form\-/, '') ?? '';
+    if (!key) return "";
+    return key?.replace?.(/form\-/, "") ?? "";
   }
 
   function handleSearchInfoChange(info: Recordable) {
diff --git a/src/components/Table/src/hooks/useTableHeader.ts b/src/components/Table/src/hooks/useTableHeader.ts
index e72820755d2b3574d60a75800033063c901e62b8..e85674835ee87e26c00d010420640952ff0d64a5 100644
--- a/src/components/Table/src/hooks/useTableHeader.ts
+++ b/src/components/Table/src/hooks/useTableHeader.ts
@@ -1,9 +1,9 @@
-import type { ComputedRef, Slots } from 'vue';
-import type { BasicTableProps, InnerHandlers } from '../types/table';
-import { unref, computed, h } from 'vue';
-import TableHeader from '../components/TableHeader.vue';
-import { isString } from '/@/utils/is';
-import { getSlot } from '/@/utils/helper/tsxHelper';
+import type { ComputedRef, Slots } from "vue";
+import type { BasicTableProps, InnerHandlers } from "../types/table";
+import { unref, computed, h } from "vue";
+import TableHeader from "../components/TableHeader.vue";
+import { isString } from "/@/utils/is";
+import { getSlot } from "/@/utils/helper/tsxHelper";
 
 export function useTableHeader(
   propsRef: ComputedRef<BasicTableProps>,
@@ -33,17 +33,17 @@ export function useTableHeader(
               {
                 ...(slots.toolbar
                   ? {
-                      toolbar: () => getSlot(slots, 'toolbar'),
+                      toolbar: () => getSlot(slots, "toolbar"),
                     }
                   : {}),
                 ...(slots.tableTitle
                   ? {
-                      tableTitle: () => getSlot(slots, 'tableTitle'),
+                      tableTitle: () => getSlot(slots, "tableTitle"),
                     }
                   : {}),
                 ...(slots.headerTop
                   ? {
-                      headerTop: () => getSlot(slots, 'headerTop'),
+                      headerTop: () => getSlot(slots, "headerTop"),
                     }
                   : {}),
               },
diff --git a/src/components/Table/src/hooks/useTableScroll.ts b/src/components/Table/src/hooks/useTableScroll.ts
index 340015123c3e4e87d7eebaa00ce973c86ea5d745..2958a0d44a558bfa18536249697fd550d3922d39 100644
--- a/src/components/Table/src/hooks/useTableScroll.ts
+++ b/src/components/Table/src/hooks/useTableScroll.ts
@@ -1,22 +1,23 @@
-import type { BasicTableProps, TableRowSelection, BasicColumn } from '../types/table';
-import type { Ref, ComputedRef } from 'vue';
-import { computed, unref, ref, nextTick, watch } from 'vue';
-import { getViewportOffset } from '/@/utils/domUtils';
-import { isBoolean } from '/@/utils/is';
-import { useWindowSizeFn } from '/@/hooks/event/useWindowSizeFn';
-import { useModalContext } from '/@/components/Modal';
-import { onMountedOrActivated } from '/@/hooks/core/onMountedOrActivated';
-import { useDebounceFn } from '@vueuse/core';
+import type { BasicTableProps, TableRowSelection, BasicColumn } from "../types/table";
+import { Ref, ComputedRef, ref } from "vue";
+import { computed, unref, nextTick, watch } from "vue";
+import { getViewportOffset } from "/@/utils/domUtils";
+import { isBoolean } from "/@/utils/is";
+import { useWindowSizeFn } from "/@/hooks/event/useWindowSizeFn";
+import { useModalContext } from "/@/components/Modal";
+import { onMountedOrActivated } from "/@/hooks/core/onMountedOrActivated";
+import { useDebounceFn } from "@vueuse/core";
 
 export function useTableScroll(
   propsRef: ComputedRef<BasicTableProps>,
   tableElRef: Ref<ComponentRef>,
   columnsRef: ComputedRef<BasicColumn[]>,
-  rowSelectionRef: ComputedRef<TableRowSelection<any> | null>,
+  rowSelectionRef: ComputedRef<TableRowSelection | null>,
   getDataSourceRef: ComputedRef<Recordable[]>,
+  wrapRef: Ref<HTMLElement | null>,
+  formRef: Ref<ComponentRef>,
 ) {
-  const tableHeightRef: Ref<Nullable<number>> = ref(null);
-
+  const tableHeightRef: Ref<Nullable<number | string>> = ref(167);
   const modalFn = useModalContext();
 
   // Greater than animation time 280
@@ -33,7 +34,7 @@ export function useTableScroll(
       debounceRedoHeight();
     },
     {
-      flush: 'post',
+      flush: "post",
     },
   );
 
@@ -43,8 +44,8 @@ export function useTableScroll(
     });
   }
 
-  function setHeight(heigh: number) {
-    tableHeightRef.value = heigh;
+  function setHeight(height: number) {
+    tableHeightRef.value = height;
     //  Solve the problem of modal adaptive height calculation when the form is placed in the modal
     modalFn?.redoModalHeight?.();
   }
@@ -55,7 +56,8 @@ export function useTableScroll(
   let bodyEl: HTMLElement | null;
 
   async function calcTableHeight() {
-    const { resizeHeightOffset, pagination, maxHeight } = unref(propsRef);
+    const { resizeHeightOffset, pagination, maxHeight, isCanResizeParent, useSearchForm } =
+      unref(propsRef);
     const tableData = unref(getDataSourceRef);
 
     const table = unref(tableElRef);
@@ -65,7 +67,7 @@ export function useTableScroll(
     if (!tableEl) return;
 
     if (!bodyEl) {
-      bodyEl = tableEl.querySelector('.ant-table-body');
+      bodyEl = tableEl.querySelector(".ant-table-body");
       if (!bodyEl) return;
     }
 
@@ -73,39 +75,36 @@ export function useTableScroll(
     const hasScrollBarX = bodyEl.scrollWidth > bodyEl.clientWidth;
 
     if (hasScrollBarY) {
-      tableEl.classList.contains('hide-scrollbar-y') &&
-        tableEl.classList.remove('hide-scrollbar-y');
+      tableEl.classList.contains("hide-scrollbar-y") &&
+        tableEl.classList.remove("hide-scrollbar-y");
     } else {
-      !tableEl.classList.contains('hide-scrollbar-y') && tableEl.classList.add('hide-scrollbar-y');
+      !tableEl.classList.contains("hide-scrollbar-y") && tableEl.classList.add("hide-scrollbar-y");
     }
 
     if (hasScrollBarX) {
-      tableEl.classList.contains('hide-scrollbar-x') &&
-        tableEl.classList.remove('hide-scrollbar-x');
+      tableEl.classList.contains("hide-scrollbar-x") &&
+        tableEl.classList.remove("hide-scrollbar-x");
     } else {
-      !tableEl.classList.contains('hide-scrollbar-x') && tableEl.classList.add('hide-scrollbar-x');
+      !tableEl.classList.contains("hide-scrollbar-x") && tableEl.classList.add("hide-scrollbar-x");
     }
 
-    bodyEl!.style.height = 'unset';
+    bodyEl!.style.height = "unset";
 
-    if (!unref(getCanResize) || tableData.length === 0) return;
+    if (!unref(getCanResize) || !unref(tableData) || tableData.length === 0) return;
 
     await nextTick();
-    //Add a delay to get the correct bottomIncludeBody paginationHeight footerHeight headerHeight
+    // Add a delay to get the correct bottomIncludeBody paginationHeight footerHeight headerHeight
 
-    const headEl = tableEl.querySelector('.ant-table-thead ');
+    const headEl = tableEl.querySelector(".ant-table-thead ");
 
     if (!headEl) return;
 
-    // Table height from bottom
-    const { bottomIncludeBody } = getViewportOffset(headEl);
     // Table height from bottom height-custom offset
-
-    const paddingHeight = 32;
+    let paddingHeight = 32;
     // Pager height
     let paginationHeight = 2;
     if (!isBoolean(pagination)) {
-      paginationEl = tableEl.querySelector('.ant-pagination') as HTMLElement;
+      paginationEl = tableEl.querySelector(".ant-pagination") as HTMLElement;
       if (paginationEl) {
         const offsetHeight = paginationEl.offsetHeight;
         paginationHeight += offsetHeight || 0;
@@ -120,7 +119,7 @@ export function useTableScroll(
     let footerHeight = 0;
     if (!isBoolean(pagination)) {
       if (!footerEl) {
-        footerEl = tableEl.querySelector('.ant-table-footer') as HTMLElement;
+        footerEl = tableEl.querySelector(".ant-table-footer") as HTMLElement;
       } else {
         const offsetHeight = footerEl.offsetHeight;
         footerHeight += offsetHeight || 0;
@@ -132,6 +131,35 @@ export function useTableScroll(
       headerHeight = (headEl as HTMLElement).offsetHeight;
     }
 
+    let bottomIncludeBody = 0;
+    if (unref(wrapRef) && isCanResizeParent) {
+      const tablePadding = 12;
+      const formMargin = 16;
+      let paginationMargin = 10;
+      const wrapHeight = unref(wrapRef)?.offsetHeight ?? 0;
+
+      let formHeight = unref(formRef)?.$el.offsetHeight ?? 0;
+      if (formHeight) {
+        formHeight += formMargin;
+      }
+      if (isBoolean(pagination) && !pagination) {
+        paginationMargin = 0;
+      }
+      if (isBoolean(useSearchForm) && !useSearchForm) {
+        paddingHeight = 0;
+      }
+
+      const headerCellHeight =
+        (tableEl.querySelector(".ant-table-title") as HTMLElement)?.offsetHeight ?? 0;
+
+      console.log(wrapHeight - formHeight - headerCellHeight - tablePadding - paginationMargin);
+      bottomIncludeBody =
+        wrapHeight - formHeight - headerCellHeight - tablePadding - paginationMargin;
+    } else {
+      // Table height from bottom
+      bottomIncludeBody = getViewportOffset(headEl).bottomIncludeBody;
+    }
+
     let height =
       bottomIncludeBody -
       (resizeHeightOffset || 0) -
@@ -139,7 +167,6 @@ export function useTableScroll(
       paginationHeight -
       footerHeight -
       headerHeight;
-
     height = (height > maxHeight! ? (maxHeight as number) : height) ?? height;
     setHeight(height);
 
@@ -164,9 +191,9 @@ export function useTableScroll(
 
     const columns = unref(columnsRef).filter((item) => !item.defaultHidden);
     columns.forEach((item) => {
-      width += Number.parseInt(item.width as string) || 0;
+      width += Number.parseFloat(item.width as string) || 0;
     });
-    const unsetWidthColumns = columns.filter((item) => !Reflect.has(item, 'width'));
+    const unsetWidthColumns = columns.filter((item) => !Reflect.has(item, "width"));
 
     const len = unsetWidthColumns.length;
     if (len !== 0) {
@@ -175,7 +202,7 @@ export function useTableScroll(
 
     const table = unref(tableElRef);
     const tableWidth = table?.$el?.offsetWidth ?? 0;
-    return tableWidth > width ? '100%' : width;
+    return tableWidth > width ? "100%" : width;
   });
 
   const getScrollRef = computed(() => {
diff --git a/src/components/Table/src/hooks/useTableStyle.ts b/src/components/Table/src/hooks/useTableStyle.ts
index 292187d888e6edfe7613a0a9bd8e6b5fe063f2ae..0beb62a789af606123cdf26561137bd674d4aee8 100644
--- a/src/components/Table/src/hooks/useTableStyle.ts
+++ b/src/components/Table/src/hooks/useTableStyle.ts
@@ -1,19 +1,19 @@
-import type { ComputedRef } from 'vue';
-import type { BasicTableProps, TableCustomRecord } from '../types/table';
-import { unref } from 'vue';
-import { isFunction } from '/@/utils/is';
+import type { ComputedRef } from "vue";
+import type { BasicTableProps, TableCustomRecord } from "../types/table";
+import { unref } from "vue";
+import { isFunction } from "/@/utils/is";
 
 export function useTableStyle(propsRef: ComputedRef<BasicTableProps>, prefixCls: string) {
   function getRowClassName(record: TableCustomRecord, index: number) {
     const { striped, rowClassName } = unref(propsRef);
     const classNames: string[] = [];
     if (striped) {
-      classNames.push((index || 0) % 2 === 1 ? `${prefixCls}-row__striped` : '');
+      classNames.push((index || 0) % 2 === 1 ? `${prefixCls}-row__striped` : "");
     }
     if (rowClassName && isFunction(rowClassName)) {
       classNames.push(rowClassName(record, index));
     }
-    return classNames.filter((cls) => !!cls).join(' ');
+    return classNames.filter((cls) => !!cls).join(" ");
   }
 
   return { getRowClassName };
diff --git a/src/components/Table/src/props.ts b/src/components/Table/src/props.ts
index 302bb3beabdf79db911c35a61ab5677aed8af54b..77f0e6967b1c9ef0f1d3e4e6259de1866565a0ea 100644
--- a/src/components/Table/src/props.ts
+++ b/src/components/Table/src/props.ts
@@ -1,5 +1,5 @@
-import type { PropType } from 'vue';
-import type { PaginationProps } from './types/pagination';
+import type { PropType } from "vue";
+import type { PaginationProps } from "./types/pagination";
 import type {
   BasicColumn,
   FetchSetting,
@@ -8,16 +8,17 @@ import type {
   TableCustomRecord,
   TableRowSelection,
   SizeType,
-} from './types/table';
-import type { FormProps } from '/@/components/Form';
-import { DEFAULT_FILTER_FN, DEFAULT_SORT_FN, FETCH_SETTING, DEFAULT_SIZE } from './const';
-import { propTypes } from '/@/utils/propTypes';
+} from "./types/table";
+import type { FormProps } from "/@/components/Form";
+
+import { DEFAULT_FILTER_FN, DEFAULT_SORT_FN, FETCH_SETTING, DEFAULT_SIZE } from "./const";
+import { propTypes } from "/@/utils/propTypes";
 
 export const basicProps = {
-  clickToRowSelect: propTypes.bool.def(true),
-  isTreeTable: propTypes.bool.def(false),
+  clickToRowSelect: { type: Boolean, default: true },
+  isTreeTable: Boolean,
   tableSetting: propTypes.shape<TableSetting>({}),
-  inset: propTypes.bool,
+  inset: Boolean,
   sortFn: {
     type: Function as PropType<(sortInfo: SorterResult) => any>,
     default: DEFAULT_SORT_FN,
@@ -26,10 +27,10 @@ export const basicProps = {
     type: Function as PropType<(data: Partial<Recordable<string[]>>) => any>,
     default: DEFAULT_FILTER_FN,
   },
-  showTableSetting: propTypes.bool,
-  autoCreateKey: propTypes.bool.def(true),
-  striped: propTypes.bool.def(true),
-  showSummary: propTypes.bool,
+  showTableSetting: Boolean,
+  autoCreateKey: { type: Boolean, default: true },
+  striped: { type: Boolean, default: true },
+  showSummary: Boolean,
   summaryFunc: {
     type: [Function, Array] as PropType<(...arg: any[]) => any[]>,
     default: null,
@@ -39,7 +40,7 @@ export const basicProps = {
     default: null,
   },
   indentSize: propTypes.number.def(24),
-  canColDrag: propTypes.bool.def(true),
+  canColDrag: { type: Boolean, default: true },
   api: {
     type: Function as PropType<(...arg: any[]) => Promise<any>>,
     default: null,
@@ -63,8 +64,8 @@ export const basicProps = {
     },
   },
   // 立即请求接口
-  immediate: propTypes.bool.def(true),
-  emptyDataIsShowTable: propTypes.bool.def(true),
+  immediate: { type: Boolean, default: true },
+  emptyDataIsShowTable: { type: Boolean, default: true },
   // 额外的请求参数
   searchInfo: {
     type: Object as PropType<Recordable>,
@@ -86,7 +87,7 @@ export const basicProps = {
     type: [Array] as PropType<BasicColumn[]>,
     default: () => [],
   },
-  showIndexColumn: propTypes.bool.def(true),
+  showIndexColumn: { type: Boolean, default: true },
   indexColumnProps: {
     type: Object as PropType<BasicColumn>,
     default: null,
@@ -95,8 +96,9 @@ export const basicProps = {
     type: Object as PropType<BasicColumn>,
     default: null,
   },
-  ellipsis: propTypes.bool.def(true),
-  canResize: propTypes.bool.def(true),
+  ellipsis: { type: Boolean, default: true },
+  isCanResizeParent: { type: Boolean, default: false },
+  canResize: { type: Boolean, default: true },
   clearSelectOnPageChange: propTypes.bool,
   resizeHeightOffset: propTypes.number.def(0),
   rowSelection: {
@@ -117,7 +119,7 @@ export const basicProps = {
   },
   rowKey: {
     type: [String, Function] as PropType<string | ((record: Recordable) => string)>,
-    default: '',
+    default: "",
   },
   bordered: propTypes.bool,
   pagination: {
diff --git a/src/components/Table/src/types/column.ts b/src/components/Table/src/types/column.ts
index 785e6dfbb3450eea7092475f2d71f2db276c0218..b8ab2efac2950d4fcb82dbaad3e9bf42394f9163 100644
--- a/src/components/Table/src/types/column.ts
+++ b/src/components/Table/src/types/column.ts
@@ -1,4 +1,4 @@
-import { VNodeChild } from 'vue';
+import { VNodeChild } from "vue";
 
 export interface ColumnFilterItem {
   text?: string;
@@ -6,7 +6,7 @@ export interface ColumnFilterItem {
   children?: any;
 }
 
-export declare type SortOrder = 'ascend' | 'descend';
+export declare type SortOrder = "ascend" | "descend";
 
 export interface RecordProps<T> {
   text: any;
@@ -33,7 +33,7 @@ export interface ColumnProps<T> {
    * @default 'left'
    * @type string
    */
-  align?: 'left' | 'right' | 'center';
+  align?: "left" | "right" | "center";
 
   /**
    * ellipsize cell content, not working with sorter and filters for now.
@@ -120,7 +120,7 @@ export interface ColumnProps<T> {
    * @default false
    * @type boolean | string
    */
-  fixed?: boolean | 'left' | 'right';
+  fixed?: boolean | "left" | "right";
 
   /**
    * Unique key of this column, you can ignore this prop if you've set a unique dataIndex
diff --git a/src/components/Table/src/types/componentType.ts b/src/components/Table/src/types/componentType.ts
index 48d5a7aacb5740f87574621ce62bb725884d7d78..fb6f7adc2d1670e686724926498e121fcd45e293 100644
--- a/src/components/Table/src/types/componentType.ts
+++ b/src/components/Table/src/types/componentType.ts
@@ -1,10 +1,11 @@
 export type ComponentType =
-  | 'Input'
-  | 'InputNumber'
-  | 'Select'
-  | 'ApiSelect'
-  | 'ApiTreeSelect'
-  | 'Checkbox'
-  | 'Switch'
-  | 'DatePicker'
-  | 'TimePicker';
+  | "Input"
+  | "InputNumber"
+  | "Select"
+  | "ApiSelect"
+  | "AutoComplete"
+  | "ApiTreeSelect"
+  | "Checkbox"
+  | "Switch"
+  | "DatePicker"
+  | "TimePicker";
diff --git a/src/components/Table/src/types/pagination.ts b/src/components/Table/src/types/pagination.ts
index fd2ecbe31f2e5345eee644065d493e06a5865fee..c30660f11fa22a1ccd870a0d6a7cc212d36ee2b3 100644
--- a/src/components/Table/src/types/pagination.ts
+++ b/src/components/Table/src/types/pagination.ts
@@ -1,15 +1,24 @@
-import Pagination from 'ant-design-vue/lib/pagination';
-import { VNodeChild } from 'vue';
+import Pagination from "ant-design-vue/lib/pagination";
+import { VNodeChild } from "vue";
 
 interface PaginationRenderProps {
   page: number;
-  type: 'page' | 'prev' | 'next';
+  type: "page" | "prev" | "next";
   originalElement: any;
 }
 
+type PaginationPositon =
+  | "topLeft"
+  | "topCenter"
+  | "topRight"
+  | "bottomLeft"
+  | "bottomCenter"
+  | "bottomRight";
+
 export declare class PaginationConfig extends Pagination {
-  position?: 'top' | 'bottom' | 'both';
+  position?: PaginationPositon[];
 }
+
 export interface PaginationProps {
   /**
    * total number of data items
@@ -96,4 +105,11 @@ export interface PaginationProps {
    * @type Function
    */
   itemRender?: (props: PaginationRenderProps) => VNodeChild | JSX.Element;
+
+  /**
+   * specify the position of Pagination
+   * @default ['bottomRight']
+   * @type string[]
+   */
+  position?: PaginationPositon[];
 }
diff --git a/src/components/Table/src/types/table.ts b/src/components/Table/src/types/table.ts
index 10f2c8cebd323cb6db3e541c29f9676c99b03447..fcedef59c9fbd1b7ae6ee368694b4f08ba4c653d 100644
--- a/src/components/Table/src/types/table.ts
+++ b/src/components/Table/src/types/table.ts
@@ -1,16 +1,14 @@
-import type { VNodeChild } from 'vue';
-import type { PaginationProps } from './pagination';
-import type { FormProps } from '/@/components/Form';
-import type {
-  ColumnProps,
-  TableRowSelection as ITableRowSelection,
-} from 'ant-design-vue/lib/table/interface';
+import type { VNodeChild } from "vue";
+import type { PaginationProps } from "./pagination";
+import type { FormProps } from "/@/components/Form";
+import type { TableRowSelection as ITableRowSelection } from "ant-design-vue/lib/table/interface";
+import type { ColumnProps } from "ant-design-vue/lib/table";
 
-import { ComponentType } from './componentType';
-import { VueNode } from '/@/utils/propTypes';
-import { RoleEnum } from '/@/enums/roleEnum';
+import { ComponentType } from "./componentType";
+import { VueNode } from "/@/utils/propTypes";
+import { RoleEnum } from "/@/enums/roleEnum";
 
-export declare type SortOrder = 'ascend' | 'descend';
+export declare type SortOrder = "ascend" | "descend";
 
 export interface TableCurrentDataSource<T = Recordable> {
   currentDataSource: T[];
@@ -82,14 +80,16 @@ export interface GetColumnsParams {
   sort?: boolean;
 }
 
-export type SizeType = 'default' | 'middle' | 'small' | 'large';
+export type SizeType = "default" | "middle" | "small" | "large";
 
 export interface TableActionType {
   reload: (opt?: FetchParams) => Promise<void>;
   getSelectRows: <T = Recordable>() => T[];
   clearSelectedRowKeys: () => void;
   expandAll: () => void;
+  expandRows: (keys: string[]) => void;
   collapseAll: () => void;
+  scrollTo: (pos: string) => void; // pos: id | "top" | "bottom"
   getSelectRowKeys: () => string[];
   deleteSelectRowByKey: (key: string) => void;
   setPagination: (info: Partial<PaginationProps>) => void;
@@ -191,6 +191,8 @@ export interface BasicTableProps<T = any> {
   actionColumn?: BasicColumn;
   // 文本超过宽度是否显示。。。
   ellipsis?: boolean;
+  // 是否继承父级高度(父级高度-表单高度-padding高度)
+  isCanResizeParent?: boolean;
   // 是否可以自适应高度
   canResize?: boolean;
   // 自适应高度偏移, 计算结果-偏移量
@@ -348,7 +350,7 @@ export interface BasicTableProps<T = any> {
    * @see https://developer.mozilla.org/en-US/docs/Web/CSS/table-layout
    * @version 1.5.0
    */
-  tableLayout?: 'auto' | 'fixed' | string;
+  tableLayout?: "auto" | "fixed" | string;
 
   /**
    * the render container of dropdowns in table
@@ -410,7 +412,7 @@ export type CellFormat =
   | Map<string | number, any>;
 
 // @ts-ignore
-export interface BasicColumn extends ColumnProps {
+export interface BasicColumn extends ColumnProps<Recordable> {
   children?: BasicColumn[];
   filters?: {
     text: string;
@@ -421,7 +423,7 @@ export interface BasicColumn extends ColumnProps {
   }[];
 
   //
-  flag?: 'INDEX' | 'DEFAULT' | 'CHECKBOX' | 'RADIO' | 'ACTION';
+  flag?: "INDEX" | "DEFAULT" | "CHECKBOX" | "RADIO" | "ACTION";
   customTitle?: VueNode;
 
   slots?: Recordable;
@@ -439,7 +441,14 @@ export interface BasicColumn extends ColumnProps {
   editRow?: boolean;
   editable?: boolean;
   editComponent?: ComponentType;
-  editComponentProps?: Recordable;
+  editComponentProps?:
+    | ((opt: {
+        text: string | number | boolean | Recordable;
+        record: Recordable;
+        column: BasicColumn;
+        index: number;
+      }) => Recordable)
+    | Recordable;
   editRule?: boolean | ((text: string, record: Recordable) => Promise<string>);
   editValueMap?: (value: any) => string;
   onEditRow?: () => void;
@@ -447,11 +456,20 @@ export interface BasicColumn extends ColumnProps {
   auth?: RoleEnum | RoleEnum[] | string | string[];
   // 业务控制是否显示
   ifShow?: boolean | ((column: BasicColumn) => boolean);
+  // 自定义修改后显示的内容
+  editRender?: (opt: {
+    text: string | number | boolean | Recordable;
+    record: Recordable;
+    column: BasicColumn;
+    index: number;
+  }) => VNodeChild | JSX.Element;
+  // 动态 Disabled
+  editDynamicDisabled?: boolean | ((record: Recordable) => boolean);
 }
 
 export type ColumnChangeParam = {
   dataIndex: string;
-  fixed: boolean | 'left' | 'right' | undefined;
+  fixed: boolean | "left" | "right" | undefined;
   visible: boolean;
 };
 
diff --git a/src/components/Table/src/types/tableAction.ts b/src/components/Table/src/types/tableAction.ts
index 3566d240a7814237a58bad35cfcd71b1e809543a..a3f0ca527281474c22c5da2506e5543fedd7beaa 100644
--- a/src/components/Table/src/types/tableAction.ts
+++ b/src/components/Table/src/types/tableAction.ts
@@ -1,10 +1,10 @@
-import { ButtonProps } from 'ant-design-vue/es/button/buttonTypes';
-import { TooltipProps } from 'ant-design-vue/es/tooltip/Tooltip';
-import { RoleEnum } from '/@/enums/roleEnum';
+import { ButtonProps } from "ant-design-vue/es/button/buttonTypes";
+import { TooltipProps } from "ant-design-vue/es/tooltip/Tooltip";
+import { RoleEnum } from "/@/enums/roleEnum";
 export interface ActionItem extends ButtonProps {
   onClick?: Fn;
   label?: string;
-  color?: 'success' | 'error' | 'warning';
+  color?: "success" | "error" | "warning";
   icon?: string;
   popConfirm?: PopConfirm;
   disabled?: boolean;
@@ -23,4 +23,17 @@ export interface PopConfirm {
   confirm: Fn;
   cancel?: Fn;
   icon?: string;
+  placement?:
+    | "top"
+    | "left"
+    | "right"
+    | "bottom"
+    | "topLeft"
+    | "topRight"
+    | "leftTop"
+    | "leftBottom"
+    | "rightTop"
+    | "rightBottom"
+    | "bottomLeft"
+    | "bottomRight";
 }
diff --git a/src/components/Time/index.ts b/src/components/Time/index.ts
index 7e2f4c02d6504a5f6585bada5fc70c9345133a49..f85e9ca8a0432689f8ce2a8d8fe62c60cc49aa06 100644
--- a/src/components/Time/index.ts
+++ b/src/components/Time/index.ts
@@ -1,4 +1,4 @@
-import { withInstall } from '/@/utils/index';
-import time from './src/Time.vue';
+import { withInstall } from "/@/utils/index";
+import time from "./src/Time.vue";
 
 export const Time = withInstall(time);
diff --git a/src/components/Time/src/Time.vue b/src/components/Time/src/Time.vue
index 2789368818a5b7f3d135ef24c72e9be6359fc614..c979743bdc93cf58acdbde639297250233a38cc3 100644
--- a/src/components/Time/src/Time.vue
+++ b/src/components/Time/src/Time.vue
@@ -2,12 +2,12 @@
   <span>{{ date }}</span>
 </template>
 <script lang="ts">
-  import { defineComponent, ref, watch } from 'vue';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { useIntervalFn } from '@vueuse/core';
-  import { formatToDateTime, formatToDate, dateUtil } from '/@/utils/dateUtil';
-  import { isNumber, isObject, isString } from '/@/utils/is';
-  import { propTypes } from '/@/utils/propTypes';
+  import { defineComponent, ref, watch } from "vue";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { useIntervalFn } from "@vueuse/core";
+  import { formatToDateTime, formatToDate, dateUtil } from "/@/utils/dateUtil";
+  import { isNumber, isObject, isString } from "/@/utils/is";
+  import { propTypes } from "/@/utils/propTypes";
 
   const ONE_SECONDS = 1000;
   const ONE_MINUTES = ONE_SECONDS * 60;
@@ -15,15 +15,15 @@
   const ONE_DAY = ONE_HOUR * 24;
 
   export default defineComponent({
-    name: 'Time',
+    name: "Time",
     props: {
       value: propTypes.oneOfType([propTypes.number, propTypes.instanceOf(Date), propTypes.string])
         .isRequired,
       step: propTypes.number.def(60),
-      mode: propTypes.oneOf(['date', 'datetime', 'relative']).def('relative'),
+      mode: propTypes.oneOf(["date", "datetime", "relative"]).def("relative"),
     },
     setup(props) {
-      const date = ref('');
+      const date = ref("");
 
       const { t } = useI18n();
 
@@ -54,12 +54,12 @@
       function setTime() {
         const { mode, value } = props;
         const time = getTime();
-        if (mode === 'relative') {
+        if (mode === "relative") {
           date.value = getRelativeTime(time);
         } else {
-          if (mode === 'datetime') {
+          if (mode === "datetime") {
             date.value = formatToDateTime(value);
-          } else if (mode === 'date') {
+          } else if (mode === "date") {
             date.value = formatToDate(value);
           }
         }
@@ -76,28 +76,28 @@
           diff = -diff;
         }
 
-        let resStr = '';
-        let dirStr = isBefore ? t('component.time.before') : t('component.time.after');
+        let resStr = "";
+        let dirStr = isBefore ? t("component.time.before") : t("component.time.after");
 
         if (diff < ONE_SECONDS) {
-          resStr = t('component.time.just');
+          resStr = t("component.time.just");
           // Less than or equal to 59 seconds
         } else if (diff < ONE_MINUTES) {
-          resStr = parseInt(diff / ONE_SECONDS) + t('component.time.seconds') + dirStr;
+          resStr = parseInt(diff / ONE_SECONDS) + t("component.time.seconds") + dirStr;
           // More than 59 seconds, less than or equal to 59 minutes and 59 seconds
         } else if (diff >= ONE_MINUTES && diff < ONE_HOUR) {
-          resStr = Math.floor(diff / ONE_MINUTES) + t('component.time.minutes') + dirStr;
+          resStr = Math.floor(diff / ONE_MINUTES) + t("component.time.minutes") + dirStr;
           // More than 59 minutes and 59 seconds, less than or equal to 23 hours, 59 minutes and 59 seconds
         } else if (diff >= ONE_HOUR && diff < ONE_DAY) {
-          resStr = Math.floor(diff / ONE_HOUR) + t('component.time.hours') + dirStr;
+          resStr = Math.floor(diff / ONE_HOUR) + t("component.time.hours") + dirStr;
           // More than 23 hours, 59 minutes and 59 seconds, less than or equal to 29 days, 59 minutes and 59 seconds
         } else if (diff >= ONE_DAY && diff < 2623860000) {
-          resStr = Math.floor(diff / ONE_DAY) + t('component.time.days') + dirStr;
+          resStr = Math.floor(diff / ONE_DAY) + t("component.time.days") + dirStr;
           // More than 29 days, 59 minutes, 59 seconds, less than 364 days, 23 hours, 59 minutes, 59 seconds, and the incoming timestamp is earlier than the current
         } else if (diff >= 2623860000 && diff <= 31567860000 && isBefore) {
-          resStr = dateUtil(timeStamp).format('MM-DD-HH-mm');
+          resStr = dateUtil(timeStamp).format("MM-DD-HH-mm");
         } else {
-          resStr = dateUtil(timeStamp).format('YYYY');
+          resStr = dateUtil(timeStamp).format("YYYY");
         }
         return resStr;
       }
diff --git a/src/components/Tinymce/index.ts b/src/components/Tinymce/index.ts
index ce07f95e3f74163e06c9210b0441bc0793b76da7..f0fe057fe3c079e2650bd559d5193fcd786deabb 100644
--- a/src/components/Tinymce/index.ts
+++ b/src/components/Tinymce/index.ts
@@ -1,4 +1,4 @@
-import { withInstall } from '/@/utils/index';
-import tinymce from './src/Editor.vue';
+import { withInstall } from "/@/utils/index";
+import tinymce from "./src/Editor.vue";
 
 export const Tinymce = withInstall(tinymce);
diff --git a/src/components/Tinymce/src/Editor.vue b/src/components/Tinymce/src/Editor.vue
index b84c5fbb68e1dc733d1b5cbe64a73de8a6be24b6..d02cccac39bad9988bb281df5ca2cc792c0c5911 100644
--- a/src/components/Tinymce/src/Editor.vue
+++ b/src/components/Tinymce/src/Editor.vue
@@ -19,39 +19,39 @@
 </template>
 
 <script lang="ts">
-  import type { Editor, RawEditorSettings } from 'tinymce';
-  import tinymce from 'tinymce/tinymce';
-  import 'tinymce/themes/silver';
-  import 'tinymce/icons/default/icons';
-  import 'tinymce/plugins/advlist';
-  import 'tinymce/plugins/anchor';
-  import 'tinymce/plugins/autolink';
-  import 'tinymce/plugins/autosave';
-  import 'tinymce/plugins/code';
-  import 'tinymce/plugins/codesample';
-  import 'tinymce/plugins/directionality';
-  import 'tinymce/plugins/fullscreen';
-  import 'tinymce/plugins/hr';
-  import 'tinymce/plugins/insertdatetime';
-  import 'tinymce/plugins/link';
-  import 'tinymce/plugins/lists';
-  import 'tinymce/plugins/media';
-  import 'tinymce/plugins/nonbreaking';
-  import 'tinymce/plugins/noneditable';
-  import 'tinymce/plugins/pagebreak';
-  import 'tinymce/plugins/paste';
-  import 'tinymce/plugins/preview';
-  import 'tinymce/plugins/print';
-  import 'tinymce/plugins/save';
-  import 'tinymce/plugins/searchreplace';
-  import 'tinymce/plugins/spellchecker';
-  import 'tinymce/plugins/tabfocus';
+  import type { Editor, RawEditorSettings } from "tinymce";
+  import tinymce from "tinymce/tinymce";
+  import "tinymce/themes/silver";
+  import "tinymce/icons/default/icons";
+  import "tinymce/plugins/advlist";
+  import "tinymce/plugins/anchor";
+  import "tinymce/plugins/autolink";
+  import "tinymce/plugins/autosave";
+  import "tinymce/plugins/code";
+  import "tinymce/plugins/codesample";
+  import "tinymce/plugins/directionality";
+  import "tinymce/plugins/fullscreen";
+  import "tinymce/plugins/hr";
+  import "tinymce/plugins/insertdatetime";
+  import "tinymce/plugins/link";
+  import "tinymce/plugins/lists";
+  import "tinymce/plugins/media";
+  import "tinymce/plugins/nonbreaking";
+  import "tinymce/plugins/noneditable";
+  import "tinymce/plugins/pagebreak";
+  import "tinymce/plugins/paste";
+  import "tinymce/plugins/preview";
+  import "tinymce/plugins/print";
+  import "tinymce/plugins/save";
+  import "tinymce/plugins/searchreplace";
+  import "tinymce/plugins/spellchecker";
+  import "tinymce/plugins/tabfocus";
   // import 'tinymce/plugins/table';
-  import 'tinymce/plugins/template';
-  import 'tinymce/plugins/textpattern';
-  import 'tinymce/plugins/visualblocks';
-  import 'tinymce/plugins/visualchars';
-  import 'tinymce/plugins/wordcount';
+  import "tinymce/plugins/template";
+  import "tinymce/plugins/textpattern";
+  import "tinymce/plugins/visualblocks";
+  import "tinymce/plugins/visualchars";
+  import "tinymce/plugins/wordcount";
 
   import {
     defineComponent,
@@ -62,16 +62,16 @@
     watch,
     onDeactivated,
     onBeforeUnmount,
-  } from 'vue';
-  import ImgUpload from './ImgUpload.vue';
-  import { toolbar, plugins } from './tinymce';
-  import { buildShortUUID } from '/@/utils/uuid';
-  import { bindHandlers } from './helper';
-  import { onMountedOrActivated } from '/@/hooks/core/onMountedOrActivated';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { isNumber } from '/@/utils/is';
-  import { useLocale } from '/@/locales/useLocale';
-  import { useAppStore } from '/@/store/modules/app';
+  } from "vue";
+  import ImgUpload from "./ImgUpload.vue";
+  import { toolbar, plugins } from "./tinymce";
+  import { buildShortUUID } from "/@/utils/uuid";
+  import { bindHandlers } from "./helper";
+  import { onMountedOrActivated } from "/@/hooks/core/onMountedOrActivated";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { isNumber } from "/@/utils/is";
+  import { useLocale } from "/@/locales/useLocale";
+  import { useAppStore } from "/@/store/modules/app";
 
   const tinymceProps = {
     options: {
@@ -101,7 +101,7 @@
     width: {
       type: [Number, String] as PropType<string | number>,
       required: false,
-      default: 'auto',
+      default: "auto",
     },
     showImageUpload: {
       type: Boolean,
@@ -110,18 +110,18 @@
   };
 
   export default defineComponent({
-    name: 'Tinymce',
+    name: "Tinymce",
     components: { ImgUpload },
     inheritAttrs: false,
     props: tinymceProps,
-    emits: ['change', 'update:modelValue', 'inited', 'init-error'],
+    emits: ["change", "update:modelValue", "inited", "init-error"],
     setup(props, { emit, attrs }) {
       const editorRef = ref<Nullable<Editor>>(null);
       const fullscreen = ref(false);
-      const tinymceId = ref<string>(buildShortUUID('tiny-vue'));
+      const tinymceId = ref<string>(buildShortUUID("tiny-vue"));
       const elRef = ref<Nullable<HTMLElement>>(null);
 
-      const { prefixCls } = useDesign('tinymce-container');
+      const { prefixCls } = useDesign("tinymce-container");
 
       const appStore = useAppStore();
 
@@ -136,48 +136,48 @@
       });
 
       const skinName = computed(() => {
-        return appStore.getDarkMode === 'light' ? 'oxide' : 'oxide-dark';
+        return appStore.getDarkMode === "light" ? "oxide" : "oxide-dark";
       });
 
       const langName = computed(() => {
         const lang = useLocale().getLocale.value;
-        return ['zh_CN', 'en'].includes(lang) ? lang : 'zh_CN';
+        return ["zh_CN", "en"].includes(lang) ? lang : "zh_CN";
       });
 
       const initOptions = computed((): RawEditorSettings => {
         const { height, options, toolbar, plugins } = props;
-        const publicPath = import.meta.env.VITE_PUBLIC_PATH || '/';
+        const publicPath = import.meta.env.VITE_PUBLIC_PATH || "/";
         return {
           selector: `#${unref(tinymceId)}`,
           height,
           toolbar,
-          menubar: 'file edit insert view format table',
+          menubar: "file edit insert view format table",
           plugins,
-          language_url: publicPath + 'resource/tinymce/langs/' + langName.value + '.js',
+          language_url: publicPath + "resource/tinymce/langs/" + langName.value + ".js",
           language: langName.value,
           branding: false,
-          default_link_target: '_blank',
+          default_link_target: "_blank",
           link_title: false,
           object_resizing: false,
           auto_focus: true,
           skin: skinName.value,
-          skin_url: publicPath + 'resource/tinymce/skins/ui/' + skinName.value,
+          skin_url: publicPath + "resource/tinymce/skins/ui/" + skinName.value,
           content_css:
-            publicPath + 'resource/tinymce/skins/ui/' + skinName.value + '/content.min.css',
+            publicPath + "resource/tinymce/skins/ui/" + skinName.value + "/content.min.css",
           ...options,
           setup: (editor: Editor) => {
             editorRef.value = editor;
-            editor.on('init', (e) => initSetup(e));
+            editor.on("init", (e) => initSetup(e));
           },
         };
       });
 
       const disabled = computed(() => {
         const { options } = props;
-        const getdDisabled = options && Reflect.get(options, 'readonly');
+        const getdDisabled = options && Reflect.get(options, "readonly");
         const editor = unref(editorRef);
         if (editor) {
-          editor.setMode(getdDisabled ? 'readonly' : 'design');
+          editor.setMode(getdDisabled ? "readonly" : "design");
         }
         return getdDisabled ?? false;
       });
@@ -189,13 +189,13 @@
           if (!editor) {
             return;
           }
-          editor.setMode(attrs.disabled ? 'readonly' : 'design');
+          editor.setMode(attrs.disabled ? "readonly" : "design");
         },
       );
 
       onMountedOrActivated(() => {
         if (!initOptions.value.inline) {
-          tinymceId.value = buildShortUUID('tiny-vue');
+          tinymceId.value = buildShortUUID("tiny-vue");
         }
         nextTick(() => {
           setTimeout(() => {
@@ -221,15 +221,15 @@
       function initEditor() {
         const el = unref(elRef);
         if (el) {
-          el.style.visibility = '';
+          el.style.visibility = "";
         }
         tinymce
           .init(unref(initOptions))
           .then((editor) => {
-            emit('inited', editor);
+            emit("inited", editor);
           })
           .catch((err) => {
-            emit('init-error', err);
+            emit("init-error", err);
           });
       }
 
@@ -238,7 +238,7 @@
         if (!editor) {
           return;
         }
-        const value = props.modelValue || '';
+        const value = props.modelValue || "";
 
         editor.setContent(value);
         bindModelHandlers(editor);
@@ -248,7 +248,7 @@
       function setValue(editor: Recordable, val: string, prevVal?: string) {
         if (
           editor &&
-          typeof val === 'string' &&
+          typeof val === "string" &&
           val !== prevVal &&
           val !== editor.getContent({ format: attrs.outputFormat })
         ) {
@@ -258,7 +258,7 @@
 
       function bindModelHandlers(editor: any) {
         const modelEvents = attrs.modelEvents ? attrs.modelEvents : null;
-        const normalizedEvents = Array.isArray(modelEvents) ? modelEvents.join(' ') : modelEvents;
+        const normalizedEvents = Array.isArray(modelEvents) ? modelEvents.join(" ") : modelEvents;
 
         watch(
           () => props.modelValue,
@@ -277,13 +277,13 @@
           },
         );
 
-        editor.on(normalizedEvents ? normalizedEvents : 'change keyup undo redo', () => {
+        editor.on(normalizedEvents ? normalizedEvents : "change keyup undo redo", () => {
           const content = editor.getContent({ format: attrs.outputFormat });
-          emit('update:modelValue', content);
-          emit('change', content);
+          emit("update:modelValue", content);
+          emit("change", content);
         });
 
-        editor.on('FullscreenStateChanged', (e) => {
+        editor.on("FullscreenStateChanged", (e) => {
           fullscreen.value = e.state;
         });
       }
@@ -293,8 +293,8 @@
         if (!editor) {
           return;
         }
-        editor.execCommand('mceInsertContent', false, getUploadingImgName(name));
-        const content = editor?.getContent() ?? '';
+        editor.execCommand("mceInsertContent", false, getUploadingImgName(name));
+        const content = editor?.getContent() ?? "";
         setValue(editor, content);
       }
 
@@ -303,8 +303,8 @@
         if (!editor) {
           return;
         }
-        const content = editor?.getContent() ?? '';
-        const val = content?.replace(getUploadingImgName(name), `<img src="${url}"/>`) ?? '';
+        const content = editor?.getContent() ?? "";
+        const val = content?.replace(getUploadingImgName(name), `<img src="${url}"/>`) ?? "";
         setValue(editor, val);
       }
 
@@ -332,7 +332,7 @@
 <style lang="less" scoped></style>
 
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-tinymce-container';
+  @prefix-cls: ~"@{namespace}-tinymce-container";
 
   .@{prefix-cls} {
     position: relative;
diff --git a/src/components/Tinymce/src/ImgUpload.vue b/src/components/Tinymce/src/ImgUpload.vue
index f878709dbaeeaff40d5d9eefccf8590ce5c66a5f..a56e96c23302ffad83bc44702f4402e04776d25b 100644
--- a/src/components/Tinymce/src/ImgUpload.vue
+++ b/src/components/Tinymce/src/ImgUpload.vue
@@ -9,21 +9,21 @@
       accept=".jpg,.jpeg,.gif,.png,.webp"
     >
       <a-button type="primary" v-bind="{ ...getButtonProps }">
-        {{ t('component.upload.imgUpload') }}
+        {{ t("component.upload.imgUpload") }}
       </a-button>
     </Upload>
   </div>
 </template>
 <script lang="ts">
-  import { defineComponent, computed } from 'vue';
+  import { defineComponent, computed } from "vue";
 
-  import { Upload } from 'ant-design-vue';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useGlobSetting } from '/@/hooks/setting';
-  import { useI18n } from '/@/hooks/web/useI18n';
+  import { Upload } from "ant-design-vue";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useGlobSetting } from "/@/hooks/setting";
+  import { useI18n } from "/@/hooks/web/useI18n";
 
   export default defineComponent({
-    name: 'TinymceImageUpload',
+    name: "TinymceImageUpload",
     components: { Upload },
     props: {
       fullscreen: {
@@ -34,13 +34,13 @@
         default: false,
       },
     },
-    emits: ['uploading', 'done', 'error'],
+    emits: ["uploading", "done", "error"],
     setup(props, { emit }) {
       let uploading = false;
 
       const { uploadUrl } = useGlobSetting();
       const { t } = useI18n();
-      const { prefixCls } = useDesign('tinymce-img-upload');
+      const { prefixCls } = useDesign("tinymce-img-upload");
 
       const getButtonProps = computed(() => {
         const { disabled } = props;
@@ -55,16 +55,16 @@
         const url = file?.response?.url;
         const name = file?.name;
 
-        if (status === 'uploading') {
+        if (status === "uploading") {
           if (!uploading) {
-            emit('uploading', name);
+            emit("uploading", name);
             uploading = true;
           }
-        } else if (status === 'done') {
-          emit('done', name, url);
+        } else if (status === "done") {
+          emit("done", name, url);
           uploading = false;
-        } else if (status === 'error') {
-          emit('error');
+        } else if (status === "error") {
+          emit("error");
           uploading = false;
         }
       }
@@ -80,7 +80,7 @@
   });
 </script>
 <style lang="less" scoped>
-  @prefix-cls: ~'@{namespace}-tinymce-img-upload';
+  @prefix-cls: ~"@{namespace}-tinymce-img-upload";
 
   .@{prefix-cls} {
     position: absolute;
diff --git a/src/components/Tinymce/src/helper.ts b/src/components/Tinymce/src/helper.ts
index 2526ae78ad5990dc05f1b97b3cbdaac36f9c12a1..318aea6c3fe7af8cc3d5276d51cdd81dd9f32468 100644
--- a/src/components/Tinymce/src/helper.ts
+++ b/src/components/Tinymce/src/helper.ts
@@ -1,66 +1,66 @@
 const validEvents = [
-  'onActivate',
-  'onAddUndo',
-  'onBeforeAddUndo',
-  'onBeforeExecCommand',
-  'onBeforeGetContent',
-  'onBeforeRenderUI',
-  'onBeforeSetContent',
-  'onBeforePaste',
-  'onBlur',
-  'onChange',
-  'onClearUndos',
-  'onClick',
-  'onContextMenu',
-  'onCopy',
-  'onCut',
-  'onDblclick',
-  'onDeactivate',
-  'onDirty',
-  'onDrag',
-  'onDragDrop',
-  'onDragEnd',
-  'onDragGesture',
-  'onDragOver',
-  'onDrop',
-  'onExecCommand',
-  'onFocus',
-  'onFocusIn',
-  'onFocusOut',
-  'onGetContent',
-  'onHide',
-  'onInit',
-  'onKeyDown',
-  'onKeyPress',
-  'onKeyUp',
-  'onLoadContent',
-  'onMouseDown',
-  'onMouseEnter',
-  'onMouseLeave',
-  'onMouseMove',
-  'onMouseOut',
-  'onMouseOver',
-  'onMouseUp',
-  'onNodeChange',
-  'onObjectResizeStart',
-  'onObjectResized',
-  'onObjectSelected',
-  'onPaste',
-  'onPostProcess',
-  'onPostRender',
-  'onPreProcess',
-  'onProgressState',
-  'onRedo',
-  'onRemove',
-  'onReset',
-  'onSaveContent',
-  'onSelectionChange',
-  'onSetAttrib',
-  'onSetContent',
-  'onShow',
-  'onSubmit',
-  'onUndo',
-  'onVisualAid',
+  "onActivate",
+  "onAddUndo",
+  "onBeforeAddUndo",
+  "onBeforeExecCommand",
+  "onBeforeGetContent",
+  "onBeforeRenderUI",
+  "onBeforeSetContent",
+  "onBeforePaste",
+  "onBlur",
+  "onChange",
+  "onClearUndos",
+  "onClick",
+  "onContextMenu",
+  "onCopy",
+  "onCut",
+  "onDblclick",
+  "onDeactivate",
+  "onDirty",
+  "onDrag",
+  "onDragDrop",
+  "onDragEnd",
+  "onDragGesture",
+  "onDragOver",
+  "onDrop",
+  "onExecCommand",
+  "onFocus",
+  "onFocusIn",
+  "onFocusOut",
+  "onGetContent",
+  "onHide",
+  "onInit",
+  "onKeyDown",
+  "onKeyPress",
+  "onKeyUp",
+  "onLoadContent",
+  "onMouseDown",
+  "onMouseEnter",
+  "onMouseLeave",
+  "onMouseMove",
+  "onMouseOut",
+  "onMouseOver",
+  "onMouseUp",
+  "onNodeChange",
+  "onObjectResizeStart",
+  "onObjectResized",
+  "onObjectSelected",
+  "onPaste",
+  "onPostProcess",
+  "onPostRender",
+  "onPreProcess",
+  "onProgressState",
+  "onRedo",
+  "onRemove",
+  "onReset",
+  "onSaveContent",
+  "onSelectionChange",
+  "onSetAttrib",
+  "onSetContent",
+  "onShow",
+  "onSubmit",
+  "onUndo",
+  "onVisualAid",
 ];
 
 const isValidKey = (key: string) => validEvents.indexOf(key) !== -1;
@@ -70,8 +70,8 @@ export const bindHandlers = (initEvent: Event, listeners: any, editor: any): voi
     .filter(isValidKey)
     .forEach((key: string) => {
       const handler = listeners[key];
-      if (typeof handler === 'function') {
-        if (key === 'onInit') {
+      if (typeof handler === "function") {
+        if (key === "onInit") {
           handler(initEvent, editor);
         } else {
           editor.on(key.substring(2), (e: any) => handler(e, editor));
diff --git a/src/components/Tinymce/src/tinymce.ts b/src/components/Tinymce/src/tinymce.ts
index 1374b4dab574f9deab3784198146ab09826ccf41..ba7d6ba8548a24b29c4b1cac0b2895de2cd9444e 100644
--- a/src/components/Tinymce/src/tinymce.ts
+++ b/src/components/Tinymce/src/tinymce.ts
@@ -4,10 +4,10 @@
 // colorpicker/contextmenu/textcolor plugin is now built in to the core editor, please remove it from your editor configuration
 
 export const plugins = [
-  'advlist anchor autolink autosave code codesample  directionality  fullscreen hr insertdatetime link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace spellchecker tabfocus  template  textpattern visualblocks visualchars wordcount',
+  "advlist anchor autolink autosave code codesample  directionality  fullscreen hr insertdatetime link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace spellchecker tabfocus  template  textpattern visualblocks visualchars wordcount",
 ];
 
 export const toolbar = [
-  'fontsizeselect lineheight searchreplace bold italic underline strikethrough alignleft aligncenter alignright outdent indent  blockquote undo redo removeformat subscript superscript code codesample',
-  'hr bullist numlist link  preview anchor pagebreak insertdatetime media  forecolor backcolor fullscreen',
+  "fontsizeselect lineheight searchreplace bold italic underline strikethrough alignleft aligncenter alignright outdent indent  blockquote undo redo removeformat subscript superscript code codesample",
+  "hr bullist numlist link  preview anchor pagebreak insertdatetime media  forecolor backcolor fullscreen",
 ];
diff --git a/src/components/Transition/index.ts b/src/components/Transition/index.ts
index 7eb79b53b747ff718b05616a015ea7061cdfde80..24f36c1212bc4ed84e2e51d60eac05bacb7dcddc 100644
--- a/src/components/Transition/index.ts
+++ b/src/components/Transition/index.ts
@@ -1,27 +1,27 @@
-import { createSimpleTransition, createJavascriptTransition } from './src/CreateTransition';
+import { createSimpleTransition, createJavascriptTransition } from "./src/CreateTransition";
 
-import ExpandTransitionGenerator from './src/ExpandTransition';
+import ExpandTransitionGenerator from "./src/ExpandTransition";
 
-export { default as CollapseTransition } from './src/CollapseTransition.vue';
+export { default as CollapseTransition } from "./src/CollapseTransition.vue";
 
-export const FadeTransition = createSimpleTransition('fade-transition');
-export const ScaleTransition = createSimpleTransition('scale-transition');
-export const SlideYTransition = createSimpleTransition('slide-y-transition');
-export const ScrollYTransition = createSimpleTransition('scroll-y-transition');
-export const SlideYReverseTransition = createSimpleTransition('slide-y-reverse-transition');
-export const ScrollYReverseTransition = createSimpleTransition('scroll-y-reverse-transition');
-export const SlideXTransition = createSimpleTransition('slide-x-transition');
-export const ScrollXTransition = createSimpleTransition('scroll-x-transition');
-export const SlideXReverseTransition = createSimpleTransition('slide-x-reverse-transition');
-export const ScrollXReverseTransition = createSimpleTransition('scroll-x-reverse-transition');
-export const ScaleRotateTransition = createSimpleTransition('scale-rotate-transition');
+export const FadeTransition = createSimpleTransition("fade-transition");
+export const ScaleTransition = createSimpleTransition("scale-transition");
+export const SlideYTransition = createSimpleTransition("slide-y-transition");
+export const ScrollYTransition = createSimpleTransition("scroll-y-transition");
+export const SlideYReverseTransition = createSimpleTransition("slide-y-reverse-transition");
+export const ScrollYReverseTransition = createSimpleTransition("scroll-y-reverse-transition");
+export const SlideXTransition = createSimpleTransition("slide-x-transition");
+export const ScrollXTransition = createSimpleTransition("scroll-x-transition");
+export const SlideXReverseTransition = createSimpleTransition("slide-x-reverse-transition");
+export const ScrollXReverseTransition = createSimpleTransition("scroll-x-reverse-transition");
+export const ScaleRotateTransition = createSimpleTransition("scale-rotate-transition");
 
 export const ExpandXTransition = createJavascriptTransition(
-  'expand-x-transition',
-  ExpandTransitionGenerator('', true),
+  "expand-x-transition",
+  ExpandTransitionGenerator("", true),
 );
 
 export const ExpandTransition = createJavascriptTransition(
-  'expand-transition',
-  ExpandTransitionGenerator(''),
+  "expand-transition",
+  ExpandTransitionGenerator(""),
 );
diff --git a/src/components/Transition/src/CollapseTransition.vue b/src/components/Transition/src/CollapseTransition.vue
index 6b50fa19801f5eb43de87336b685d47d90f3643d..1502ae1862f03ce3228e8bb13a8b3853f7ea46d1 100644
--- a/src/components/Transition/src/CollapseTransition.vue
+++ b/src/components/Transition/src/CollapseTransition.vue
@@ -4,22 +4,22 @@
   </transition>
 </template>
 <script lang="ts">
-  import { defineComponent } from 'vue';
-  import { addClass, removeClass } from '/@/utils/domUtils';
+  import { defineComponent } from "vue";
+  import { addClass, removeClass } from "/@/utils/domUtils";
 
   export default defineComponent({
-    name: 'CollapseTransition',
+    name: "CollapseTransition",
     setup() {
       return {
         on: {
           beforeEnter(el) {
-            addClass(el, 'collapse-transition');
+            addClass(el, "collapse-transition");
             if (!el.dataset) el.dataset = {};
 
             el.dataset.oldPaddingTop = el.style.paddingTop;
             el.dataset.oldPaddingBottom = el.style.paddingBottom;
 
-            el.style.height = '0';
+            el.style.height = "0";
             el.style.paddingTop = 0;
             el.style.paddingBottom = 0;
           },
@@ -27,21 +27,21 @@
           enter(el) {
             el.dataset.oldOverflow = el.style.overflow;
             if (el.scrollHeight !== 0) {
-              el.style.height = el.scrollHeight + 'px';
+              el.style.height = el.scrollHeight + "px";
               el.style.paddingTop = el.dataset.oldPaddingTop;
               el.style.paddingBottom = el.dataset.oldPaddingBottom;
             } else {
-              el.style.height = '';
+              el.style.height = "";
               el.style.paddingTop = el.dataset.oldPaddingTop;
               el.style.paddingBottom = el.dataset.oldPaddingBottom;
             }
 
-            el.style.overflow = 'hidden';
+            el.style.overflow = "hidden";
           },
 
           afterEnter(el) {
-            removeClass(el, 'collapse-transition');
-            el.style.height = '';
+            removeClass(el, "collapse-transition");
+            el.style.height = "";
             el.style.overflow = el.dataset.oldOverflow;
           },
 
@@ -51,13 +51,13 @@
             el.dataset.oldPaddingBottom = el.style.paddingBottom;
             el.dataset.oldOverflow = el.style.overflow;
 
-            el.style.height = el.scrollHeight + 'px';
-            el.style.overflow = 'hidden';
+            el.style.height = el.scrollHeight + "px";
+            el.style.overflow = "hidden";
           },
 
           leave(el) {
             if (el.scrollHeight !== 0) {
-              addClass(el, 'collapse-transition');
+              addClass(el, "collapse-transition");
               el.style.height = 0;
               el.style.paddingTop = 0;
               el.style.paddingBottom = 0;
@@ -65,8 +65,8 @@
           },
 
           afterLeave(el) {
-            removeClass(el, 'collapse-transition');
-            el.style.height = '';
+            removeClass(el, "collapse-transition");
+            el.style.height = "";
             el.style.overflow = el.dataset.oldOverflow;
             el.style.paddingTop = el.dataset.oldPaddingTop;
             el.style.paddingBottom = el.dataset.oldPaddingBottom;
diff --git a/src/components/Transition/src/CreateTransition.tsx b/src/components/Transition/src/CreateTransition.tsx
index d12518de8e54078d74e281e53a7976c9892ce7fd..9c8f3b90bff9e5d38baaf2f315d8a9c3b74b20dc 100644
--- a/src/components/Transition/src/CreateTransition.tsx
+++ b/src/components/Transition/src/CreateTransition.tsx
@@ -1,11 +1,11 @@
-import type { PropType } from 'vue';
+import type { PropType } from "vue";
 
-import { defineComponent, Transition, TransitionGroup } from 'vue';
-import { getSlot } from '/@/utils/helper/tsxHelper';
+import { defineComponent, Transition, TransitionGroup } from "vue";
+import { getSlot } from "/@/utils/helper/tsxHelper";
 
-type Mode = 'in-out' | 'out-in' | 'default' | undefined;
+type Mode = "in-out" | "out-in" | "default" | undefined;
 
-export function createSimpleTransition(name: string, origin = 'top center 0', mode?: Mode) {
+export function createSimpleTransition(name: string, origin = "top center 0", mode?: Mode) {
   return defineComponent({
     name,
     props: {
@@ -41,7 +41,7 @@ export function createSimpleTransition(name: string, origin = 'top center 0', mo
 export function createJavascriptTransition(
   name: string,
   functions: Recordable,
-  mode: Mode = 'in-out',
+  mode: Mode = "in-out",
 ) {
   return defineComponent({
     name,
diff --git a/src/components/Transition/src/ExpandTransition.ts b/src/components/Transition/src/ExpandTransition.ts
index 2aaef9a728da1e6e2652554741693fff1e1eef50..0774bc058647e8e278a87a4d3a35126b64369188 100644
--- a/src/components/Transition/src/ExpandTransition.ts
+++ b/src/components/Transition/src/ExpandTransition.ts
@@ -15,9 +15,9 @@ interface HTMLExpandElement extends HTMLElement {
   };
 }
 
-export default function (expandedParentClass = '', x = false) {
-  const sizeProperty = x ? 'width' : ('height' as 'width' | 'height');
-  const offsetProperty = `offset${upperFirst(sizeProperty)}` as 'offsetHeight' | 'offsetWidth';
+export default function (expandedParentClass = "", x = false) {
+  const sizeProperty = x ? "width" : ("height" as "width" | "height");
+  const offsetProperty = `offset${upperFirst(sizeProperty)}` as "offsetHeight" | "offsetWidth";
 
   return {
     beforeEnter(el: HTMLExpandElement) {
@@ -32,8 +32,8 @@ export default function (expandedParentClass = '', x = false) {
     enter(el: HTMLExpandElement) {
       const initialStyle = el._initialStyle;
 
-      el.style.setProperty('transition', 'none', 'important');
-      el.style.overflow = 'hidden';
+      el.style.setProperty("transition", "none", "important");
+      el.style.overflow = "hidden";
       // const offset = `${el[offsetProperty]}px`;
 
       // el.style[sizeProperty] = '0';
@@ -56,17 +56,17 @@ export default function (expandedParentClass = '', x = false) {
 
     leave(el: HTMLExpandElement) {
       el._initialStyle = {
-        transition: '',
+        transition: "",
         overflow: el.style.overflow,
         [sizeProperty]: el.style[sizeProperty],
       };
 
-      el.style.overflow = 'hidden';
+      el.style.overflow = "hidden";
       el.style[sizeProperty] = `${el[offsetProperty]}px`;
       /* eslint-disable-next-line */
       void el.offsetHeight; // force reflow
 
-      requestAnimationFrame(() => (el.style[sizeProperty] = '0'));
+      requestAnimationFrame(() => (el.style[sizeProperty] = "0"));
     },
 
     afterLeave,
@@ -84,6 +84,6 @@ export default function (expandedParentClass = '', x = false) {
     const size = el._initialStyle[sizeProperty];
     el.style.overflow = el._initialStyle.overflow!;
     if (size != null) el.style[sizeProperty] = size;
-    Reflect.deleteProperty(el, '_initialStyle');
+    Reflect.deleteProperty(el, "_initialStyle");
   }
 }
diff --git a/src/components/Tree/index.ts b/src/components/Tree/index.ts
index f47820d72171c6933a483cf04e6a4834264ea921..14cb947e42f4a16f29c4aecadb3d5e85f6da3111 100644
--- a/src/components/Tree/index.ts
+++ b/src/components/Tree/index.ts
@@ -1,5 +1,6 @@
-import BasicTree from './src/Tree.vue';
+import BasicTree from "./src/BasicTree.vue";
+import "./style";
 
 export { BasicTree };
-export type { ContextMenuItem } from '/@/hooks/web/useContextMenu';
-export * from './src/typing';
+export type { ContextMenuItem } from "/@/hooks/web/useContextMenu";
+export * from "./src/types/tree";
diff --git a/src/components/Tree/src/Tree.vue b/src/components/Tree/src/BasicTree.vue
similarity index 61%
rename from src/components/Tree/src/Tree.vue
rename to src/components/Tree/src/BasicTree.vue
index a8bd8c404f1dfcd2fd4f6eaaaffe830dc06617a5..9a60d496bdc1d0a481b7c5c619f986eb82f61baa 100644
--- a/src/components/Tree/src/Tree.vue
+++ b/src/components/Tree/src/BasicTree.vue
@@ -1,5 +1,13 @@
 <script lang="tsx">
-  import type { ReplaceFields, Keys, CheckKeys, TreeActionType, TreeItem } from './typing';
+  import type { CSSProperties } from "vue";
+  import type {
+    FieldNames,
+    TreeState,
+    TreeItem,
+    KeyType,
+    CheckKeys,
+    TreeActionType,
+  } from "./types/tree";
 
   import {
     defineComponent,
@@ -10,48 +18,31 @@
     watchEffect,
     toRaw,
     watch,
-    CSSProperties,
     onMounted,
-  } from 'vue';
-  import { Tree, Empty } from 'ant-design-vue';
-  import { TreeIcon } from './TreeIcon';
-  import TreeHeader from './TreeHeader.vue';
-  import { ScrollContainer } from '/@/components/Container';
-
-  import { omit, get, difference } from 'lodash-es';
-  import { isArray, isBoolean, isEmpty, isFunction } from '/@/utils/is';
-  import { extendSlots, getSlot } from '/@/utils/helper/tsxHelper';
-  import { filter, treeToList } from '/@/utils/helper/treeHelper';
-
-  import { useTree } from './useTree';
-  import { useContextMenu } from '/@/hooks/web/useContextMenu';
-  import { useDesign } from '/@/hooks/web/useDesign';
-
-  import { basicProps } from './props';
-  import { CreateContextOptions } from '/@/components/ContextMenu';
-
-  import { CheckEvent } from './typing';
-
-  interface State {
-    expandedKeys: Keys;
-    selectedKeys: Keys;
-    checkedKeys: CheckKeys;
-    checkStrictly: boolean;
-  }
+  } from "vue";
+  import TreeHeader from "./components/TreeHeader.vue";
+  import { Tree, Spin, Empty } from "ant-design-vue";
+  import { TreeIcon } from "./TreeIcon";
+  import { ScrollContainer } from "/@/components/Container";
+  import { omit, get, difference, cloneDeep } from "lodash-es";
+  import { isArray, isBoolean, isEmpty, isFunction } from "/@/utils/is";
+  import { extendSlots, getSlot } from "/@/utils/helper/tsxHelper";
+  import { filter, treeToList, eachTree } from "/@/utils/helper/treeHelper";
+  import { useTree } from "./hooks/useTree";
+  import { useContextMenu } from "/@/hooks/web/useContextMenu";
+  import { CreateContextOptions } from "/@/components/ContextMenu";
+  import { treeEmits, treeProps } from "./types/tree";
+  import { createBEM } from "/@/utils/bem";
+
   export default defineComponent({
-    name: 'BasicTree',
+    name: "BasicTree",
     inheritAttrs: false,
-    props: basicProps,
-    emits: [
-      'update:expandedKeys',
-      'update:selectedKeys',
-      'update:value',
-      'change',
-      'check',
-      'update:searchValue',
-    ],
+    props: treeProps,
+    emits: treeEmits,
     setup(props, { attrs, slots, emit, expose }) {
-      const state = reactive<State>({
+      const [bem] = createBEM("tree");
+
+      const state = reactive<TreeState>({
         checkStrictly: props.checkStrictly,
         expandedKeys: props.expandedKeys || [],
         selectedKeys: props.selectedKeys || [],
@@ -60,22 +51,21 @@
 
       const searchState = reactive({
         startSearch: false,
-        searchText: '',
+        searchText: "",
         searchData: [] as TreeItem[],
       });
 
       const treeDataRef = ref<TreeItem[]>([]);
 
       const [createContextMenu] = useContextMenu();
-      const { prefixCls } = useDesign('basic-tree');
 
-      const getReplaceFields = computed((): Required<ReplaceFields> => {
-        const { replaceFields } = props;
+      const getFieldNames = computed((): Required<FieldNames> => {
+        const { fieldNames } = props;
         return {
-          children: 'children',
-          title: 'title',
-          key: 'key',
-          ...replaceFields,
+          children: "children",
+          title: "title",
+          key: "key",
+          ...fieldNames,
         };
       });
 
@@ -88,19 +78,19 @@
           selectedKeys: state.selectedKeys,
           checkedKeys: state.checkedKeys,
           checkStrictly: state.checkStrictly,
-          replaceFields: unref(getReplaceFields),
-          'onUpdate:expandedKeys': (v: Keys) => {
+          fieldNames: unref(getFieldNames),
+          "onUpdate:expandedKeys": (v: KeyType[]) => {
             state.expandedKeys = v;
-            emit('update:expandedKeys', v);
+            emit("update:expandedKeys", v);
           },
-          'onUpdate:selectedKeys': (v: Keys) => {
+          "onUpdate:selectedKeys": (v: KeyType[]) => {
             state.selectedKeys = v;
-            emit('update:selectedKeys', v);
+            emit("update:selectedKeys", v);
           },
-          onCheck: (v: CheckKeys, e: CheckEvent) => {
-            let currentValue = toRaw(state.checkedKeys) as Keys;
+          onCheck: (v: CheckKeys, e) => {
+            let currentValue = toRaw(state.checkedKeys) as KeyType[];
             if (isArray(currentValue) && searchState.startSearch) {
-              const { key } = unref(getReplaceFields);
+              const { key } = unref(getFieldNames);
               currentValue = difference(currentValue, getChildrenKeys(e.node.$attrs.node[key]));
               if (e.checked) {
                 currentValue.push(e.node.$attrs.node[key]);
@@ -111,12 +101,12 @@
             }
 
             const rawVal = toRaw(state.checkedKeys);
-            emit('update:value', rawVal);
-            emit('check', rawVal, e);
+            emit("update:value", rawVal);
+            emit("check", rawVal, e);
           },
           onRightClick: handleRightClick,
         };
-        return omit(propsData, 'treeData', 'class');
+        return omit(propsData, "treeData", "class");
       });
 
       const getTreeData = computed((): TreeItem[] =>
@@ -136,7 +126,8 @@
         getAllKeys,
         getChildrenKeys,
         getEnabledKeys,
-      } = useTree(treeDataRef, getReplaceFields);
+        getSelectedNode,
+      } = useTree(treeDataRef, getFieldNames);
 
       function getIcon(params: Recordable, icon?: string) {
         if (!icon) {
@@ -162,17 +153,18 @@
           contextMenuOptions.items = menuList;
         }
         if (!contextMenuOptions.items?.length) return;
+        contextMenuOptions.items = contextMenuOptions.items.filter((item) => !item.hidden);
         createContextMenu(contextMenuOptions);
       }
 
-      function setExpandedKeys(keys: Keys) {
+      function setExpandedKeys(keys: KeyType[]) {
         state.expandedKeys = keys;
       }
 
       function getExpandedKeys() {
         return state.expandedKeys;
       }
-      function setSelectedKeys(keys: Keys) {
+      function setSelectedKeys(keys: KeyType[]) {
         state.selectedKeys = keys;
       }
 
@@ -189,11 +181,11 @@
       }
 
       function checkAll(checkAll: boolean) {
-        state.checkedKeys = checkAll ? getEnabledKeys() : ([] as Keys);
+        state.checkedKeys = checkAll ? getEnabledKeys() : ([] as KeyType[]);
       }
 
       function expandAll(expandAll: boolean) {
-        state.expandedKeys = expandAll ? getAllKeys() : ([] as Keys);
+        state.expandedKeys = expandAll ? getAllKeys() : ([] as KeyType[]);
       }
 
       function onStrictlyChange(strictly: boolean) {
@@ -223,7 +215,7 @@
 
       function handleSearch(searchValue: string) {
         if (searchValue !== searchState.searchText) searchState.searchText = searchValue;
-        emit('update:searchValue', searchValue);
+        emit("update:searchValue", searchValue);
         if (!searchValue) {
           searchState.startSearch = false;
           return;
@@ -231,21 +223,21 @@
         const { filterFn, checkable, expandOnSearch, checkOnSearch, selectedOnSearch } =
           unref(props);
         searchState.startSearch = true;
-        const { title: titleField, key: keyField } = unref(getReplaceFields);
+        const { title: titleField, key: keyField } = unref(getFieldNames);
 
         const matchedKeys: string[] = [];
         searchState.searchData = filter(
           unref(treeDataRef),
           (node) => {
             const result = filterFn
-              ? filterFn(searchValue, node, unref(getReplaceFields))
+              ? filterFn(searchValue, node, unref(getFieldNames))
               : node[titleField]?.includes(searchValue) ?? false;
             if (result) {
               matchedKeys.push(node[keyField]);
             }
             return result;
           },
-          unref(getReplaceFields),
+          unref(getFieldNames),
         );
 
         if (expandOnSearch) {
@@ -310,26 +302,18 @@
         () => {
           state.checkedKeys = toRaw(props.value || []);
         },
+        { immediate: true },
       );
 
       watch(
         () => state.checkedKeys,
         () => {
           const v = toRaw(state.checkedKeys);
-          emit('update:value', v);
-          emit('change', v);
+          emit("update:value", v);
+          emit("change", v);
         },
       );
 
-      // watchEffect(() => {
-      //   console.log('======================');
-      //   console.log(props.value);
-      //   console.log('======================');
-      //   if (props.value) {
-      //     state.checkedKeys = props.value;
-      //   }
-      // });
-
       watchEffect(() => {
         state.checkStrictly = props.checkStrictly;
       });
@@ -345,6 +329,7 @@
         insertNodesByKey,
         deleteNodeByKey,
         updateNodeByKey,
+        getSelectedNode,
         checkAll,
         expandAll,
         filterByLevel: (level: number) => {
@@ -358,8 +343,6 @@
         },
       };
 
-      expose(instance);
-
       function renderAction(node: TreeItem) {
         const { actionList } = props;
         if (!actionList || actionList.length === 0) return;
@@ -374,38 +357,34 @@
           if (!nodeShow) return null;
 
           return (
-            <span key={index} class={`${prefixCls}__action`}>
+            <span key={index} class={bem("action")}>
               {item.render(node)}
             </span>
           );
         });
       }
 
-      function renderTreeNode({ data, level }: { data: TreeItem[] | undefined; level: number }) {
-        if (!data) {
-          return null;
-        }
-        const searchText = searchState.searchText;
-        const { highlight } = unref(props);
-        return data.map((item) => {
+      const treeData = computed(() => {
+        const data = cloneDeep(getTreeData.value);
+        eachTree(data, (item, _parent) => {
+          const searchText = searchState.searchText;
+          const { highlight } = unref(props);
           const {
             title: titleField,
             key: keyField,
             children: childrenField,
-          } = unref(getReplaceFields);
+          } = unref(getFieldNames);
 
-          const propsData = omit(item, 'title');
-          const icon = getIcon({ ...item, level }, item.icon);
-          const children = get(item, childrenField) || [];
+          const icon = getIcon(item, item.icon);
           const title = get(item, titleField);
 
           const searchIdx = searchText ? title.indexOf(searchText) : -1;
           const isHighlight =
             searchState.startSearch && !isEmpty(searchText) && highlight && searchIdx !== -1;
-          const highlightStyle = `color: ${isBoolean(highlight) ? '#f50' : highlight}`;
+          const highlightStyle = `color: ${isBoolean(highlight) ? "#f50" : highlight}`;
 
           const titleDom = isHighlight ? (
-            <span class={unref(getBindValues)?.blockNode ? `${prefixCls}__content` : ''}>
+            <span class={unref(getBindValues)?.blockNode ? `${bem("content")}` : ""}>
               <span>{title.substr(0, searchIdx)}</span>
               <span style={highlightStyle}>{searchText}</span>
               <span>{title.substr(searchIdx + (searchText as string).length)}</span>
@@ -413,41 +392,35 @@
           ) : (
             title
           );
-
-          return (
-            <Tree.TreeNode {...propsData} node={toRaw(item)} key={get(item, keyField)}>
-              {{
-                title: () => (
-                  <span
-                    class={`${prefixCls}-title pl-2`}
-                    onClick={handleClickNode.bind(null, item[keyField], item[childrenField])}
-                  >
-                    {item.slots?.title ? (
-                      getSlot(slots, item.slots?.title, item)
-                    ) : (
-                      <>
-                        {icon && <TreeIcon icon={icon} />}
-                        {titleDom}
-                        {/*{get(item, titleField)}*/}
-                        <span class={`${prefixCls}__actions`}>
-                          {renderAction({ ...item, level })}
-                        </span>
-                      </>
-                    )}
-                  </span>
-                ),
-                default: () => renderTreeNode({ data: children, level: level + 1 }),
-              }}
-            </Tree.TreeNode>
+          item[titleField] = (
+            <span
+              class={`${bem("title")} pl-2`}
+              onClick={handleClickNode.bind(null, item[keyField], item[childrenField])}
+            >
+              {slots?.title ? (
+                getSlot(slots, "title", item)
+              ) : (
+                <>
+                  {icon && <TreeIcon icon={icon} />}
+                  {titleDom}
+                  <span class={bem("actions")}>{renderAction(item)}</span>
+                </>
+              )}
+            </span>
           );
+          return item;
         });
-      }
+        return data;
+      });
+
+      expose(instance);
+
       return () => {
         const { title, helpMessage, toolbar, search, checkable } = props;
         const showTitle = title || toolbar || search || slots.headerTitle;
-        const scrollStyle: CSSProperties = { height: 'calc(100% - 38px)' };
+        const scrollStyle: CSSProperties = { height: "calc(100% - 38px)" };
         return (
-          <div class={[prefixCls, 'h-full', attrs.class]}>
+          <div class={[bem(), "h-full", attrs.class]}>
             {showTitle && (
               <TreeHeader
                 checkable={checkable}
@@ -464,67 +437,19 @@
                 {extendSlots(slots)}
               </TreeHeader>
             )}
-            <ScrollContainer style={scrollStyle} v-show={!unref(getNotFound)}>
-              <Tree {...unref(getBindValues)} showIcon={false}>
-                {{
-                  // switcherIcon: () => <DownOutlined />,
-                  default: () => renderTreeNode({ data: unref(getTreeData), level: 1 }),
-                  ...extendSlots(slots),
-                }}
-              </Tree>
-            </ScrollContainer>
-
-            <Empty v-show={unref(getNotFound)} image={Empty.PRESENTED_IMAGE_SIMPLE} class="!mt-4" />
+            <Spin spinning={unref(props.loading)} tip="加载中...">
+              <ScrollContainer style={scrollStyle} v-show={!unref(getNotFound)}>
+                <Tree {...unref(getBindValues)} showIcon={false} treeData={treeData.value} />
+              </ScrollContainer>
+              <Empty
+                v-show={unref(getNotFound)}
+                image={Empty.PRESENTED_IMAGE_SIMPLE}
+                class="!mt-4"
+              />
+            </Spin>
           </div>
         );
       };
     },
   });
 </script>
-<style lang="less">
-  @prefix-cls: ~'@{namespace}-basic-tree';
-
-  .@{prefix-cls} {
-    background-color: @component-background;
-
-    .ant-tree-node-content-wrapper {
-      position: relative;
-
-      .ant-tree-title {
-        position: absolute;
-        left: 0;
-        width: 100%;
-      }
-    }
-
-    &-title {
-      position: relative;
-      display: flex;
-      align-items: center;
-      width: 100%;
-      padding-right: 10px;
-
-      &:hover {
-        .@{prefix-cls}__action {
-          visibility: visible;
-        }
-      }
-    }
-
-    &__content {
-      overflow: hidden;
-    }
-
-    &__actions {
-      position: absolute;
-      top: 2px;
-      right: 3px;
-      display: flex;
-    }
-
-    &__action {
-      margin-left: 4px;
-      visibility: hidden;
-    }
-  }
-</style>
diff --git a/src/components/Tree/src/TreeHeader.vue b/src/components/Tree/src/TreeHeader.vue
deleted file mode 100644
index 57739d50e6f95dae6faf437ef3cb599b454cfa97..0000000000000000000000000000000000000000
--- a/src/components/Tree/src/TreeHeader.vue
+++ /dev/null
@@ -1,183 +0,0 @@
-<template>
-  <div class="flex px-2 py-1.5 items-center basic-tree-header">
-    <slot name="headerTitle" v-if="$slots.headerTitle"></slot>
-    <BasicTitle :helpMessage="helpMessage" v-if="!$slots.headerTitle && title">
-      {{ title }}
-    </BasicTitle>
-
-    <div
-      class="flex flex-1 justify-self-stretch items-center cursor-pointer"
-      v-if="search || toolbar"
-    >
-      <div :class="getInputSearchCls" v-if="search">
-        <InputSearch
-          :placeholder="t('common.searchText')"
-          size="small"
-          allowClear
-          v-model:value="searchValue"
-        />
-      </div>
-      <Dropdown @click.prevent v-if="toolbar">
-        <Icon icon="ion:ellipsis-vertical" />
-        <template #overlay>
-          <Menu @click="handleMenuClick">
-            <template v-for="item in toolbarList" :key="item.value">
-              <MenuItem v-bind="{ key: item.value }">
-                {{ item.label }}
-              </MenuItem>
-              <MenuDivider v-if="item.divider" />
-            </template>
-          </Menu>
-        </template>
-      </Dropdown>
-    </div>
-  </div>
-</template>
-<script lang="ts">
-  import { PropType } from 'vue';
-  import { defineComponent, computed, ref, watch } from 'vue';
-
-  import { Dropdown, Menu, Input } from 'ant-design-vue';
-  import { Icon } from '/@/components/Icon';
-  import { BasicTitle } from '/@/components/Basic';
-
-  import { propTypes } from '/@/utils/propTypes';
-
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { useDebounceFn } from '@vueuse/core';
-
-  enum ToolbarEnum {
-    SELECT_ALL,
-    UN_SELECT_ALL,
-    EXPAND_ALL,
-    UN_EXPAND_ALL,
-    CHECK_STRICTLY,
-    CHECK_UN_STRICTLY,
-  }
-
-  interface MenuInfo {
-    key: ToolbarEnum;
-  }
-  export default defineComponent({
-    name: 'BasicTreeHeader',
-    components: {
-      BasicTitle,
-      Icon,
-      Dropdown,
-      Menu,
-      MenuItem: Menu.Item,
-      MenuDivider: Menu.Divider,
-      InputSearch: Input.Search,
-    },
-    props: {
-      helpMessage: {
-        type: [String, Array] as PropType<string | string[]>,
-        default: '',
-      },
-      title: propTypes.string,
-      toolbar: propTypes.bool,
-      checkable: propTypes.bool,
-      search: propTypes.bool,
-      checkAll: propTypes.func,
-      expandAll: propTypes.func,
-      searchText: propTypes.string,
-    },
-    emits: ['strictly-change', 'search'],
-    setup(props, { emit, slots }) {
-      const { t } = useI18n();
-      const searchValue = ref('');
-
-      const getInputSearchCls = computed(() => {
-        const titleExists = slots.headerTitle || props.title;
-        return [
-          'mr-1',
-          'w-full',
-          // titleExists ? 'w-2/3' : 'w-full',
-          {
-            ['ml-5']: titleExists,
-          },
-        ];
-      });
-
-      const toolbarList = computed(() => {
-        const { checkable } = props;
-        const defaultToolbarList = [
-          { label: t('component.tree.expandAll'), value: ToolbarEnum.EXPAND_ALL },
-          {
-            label: t('component.tree.unExpandAll'),
-            value: ToolbarEnum.UN_EXPAND_ALL,
-            divider: checkable,
-          },
-        ];
-
-        return checkable
-          ? [
-              { label: t('component.tree.selectAll'), value: ToolbarEnum.SELECT_ALL },
-              {
-                label: t('component.tree.unSelectAll'),
-                value: ToolbarEnum.UN_SELECT_ALL,
-                divider: checkable,
-              },
-              ...defaultToolbarList,
-              { label: t('component.tree.checkStrictly'), value: ToolbarEnum.CHECK_STRICTLY },
-              { label: t('component.tree.checkUnStrictly'), value: ToolbarEnum.CHECK_UN_STRICTLY },
-            ]
-          : defaultToolbarList;
-      });
-
-      function handleMenuClick(e: MenuInfo) {
-        const { key } = e;
-        switch (key) {
-          case ToolbarEnum.SELECT_ALL:
-            props.checkAll?.(true);
-            break;
-          case ToolbarEnum.UN_SELECT_ALL:
-            props.checkAll?.(false);
-            break;
-          case ToolbarEnum.EXPAND_ALL:
-            props.expandAll?.(true);
-            break;
-          case ToolbarEnum.UN_EXPAND_ALL:
-            props.expandAll?.(false);
-            break;
-          case ToolbarEnum.CHECK_STRICTLY:
-            emit('strictly-change', false);
-            break;
-          case ToolbarEnum.CHECK_UN_STRICTLY:
-            emit('strictly-change', true);
-            break;
-        }
-      }
-
-      function emitChange(value?: string): void {
-        emit('search', value);
-      }
-      const debounceEmitChange = useDebounceFn(emitChange, 200);
-
-      watch(
-        () => searchValue.value,
-        (v) => {
-          debounceEmitChange(v);
-        },
-      );
-      watch(
-        () => props.searchText,
-        (v) => {
-          if (v !== searchValue.value) {
-            searchValue.value = v;
-          }
-        },
-      );
-      // function handleSearch(e: ChangeEvent): void {
-      //   debounceEmitChange(e.target.value);
-      // }
-
-      return { t, toolbarList, handleMenuClick, searchValue, getInputSearchCls };
-    },
-  });
-</script>
-<style lang="less" scoped>
-  .basic-tree-header {
-    border-bottom: 1px solid @border-color-base;
-  }
-</style>
diff --git a/src/components/Tree/src/TreeIcon.ts b/src/components/Tree/src/TreeIcon.ts
index 69e7cd06685acd70916f460d5714cba49603224b..8b0ee07978d1c1c33ca81b94d0fad12e32c931f1 100644
--- a/src/components/Tree/src/TreeIcon.ts
+++ b/src/components/Tree/src/TreeIcon.ts
@@ -1,17 +1,13 @@
-import type { VNode, FunctionalComponent } from 'vue';
+import type { VNode, FunctionalComponent } from "vue";
 
-import { h } from 'vue';
-import { isString } from '/@/utils/is';
-import { Icon } from '/@/components/Icon';
+import { h } from "vue";
+import { isString } from "@vue/shared";
+import { Icon } from "/@/components/Icon";
 
-export interface ComponentProps {
-  icon: VNode | string;
-}
-
-export const TreeIcon: FunctionalComponent = ({ icon }: ComponentProps) => {
+export const TreeIcon: FunctionalComponent = ({ icon }: { icon: VNode | string }) => {
   if (!icon) return null;
   if (isString(icon)) {
-    return h(Icon, { icon, class: 'mr-1' });
+    return h(Icon, { icon, class: "mr-1" });
   }
   return Icon;
 };
diff --git a/src/components/Tree/src/components/TreeHeader.vue b/src/components/Tree/src/components/TreeHeader.vue
new file mode 100644
index 0000000000000000000000000000000000000000..a308af0714e46a80814c5faaf6071edb43652fee
--- /dev/null
+++ b/src/components/Tree/src/components/TreeHeader.vue
@@ -0,0 +1,170 @@
+<template>
+  <div :class="bem()" class="flex px-2 py-1.5 items-center">
+    <slot name="headerTitle" v-if="slots.headerTitle"></slot>
+    <BasicTitle :helpMessage="helpMessage" v-if="!slots.headerTitle && title">
+      {{ title }}
+    </BasicTitle>
+    <div
+      class="flex items-center flex-1 cursor-pointer justify-self-stretch"
+      v-if="search || toolbar"
+    >
+      <div :class="getInputSearchCls" v-if="search">
+        <InputSearch
+          :placeholder="t('common.searchText')"
+          size="small"
+          allowClear
+          v-model:value="searchValue"
+        />
+      </div>
+      <Dropdown @click.prevent v-if="toolbar">
+        <Icon icon="ion:ellipsis-vertical" />
+        <template #overlay>
+          <Menu @click="handleMenuClick">
+            <template v-for="item in toolbarList" :key="item.value">
+              <MenuItem v-bind="{ key: item.value }">
+                {{ item.label }}
+              </MenuItem>
+              <MenuDivider v-if="item.divider" />
+            </template>
+          </Menu>
+        </template>
+      </Dropdown>
+    </div>
+  </div>
+</template>
+<script lang="ts" setup>
+  import { computed, ref, watch, useSlots } from "vue";
+  import { Dropdown, Menu, MenuItem, MenuDivider, InputSearch } from "ant-design-vue";
+  import { Icon } from "/@/components/Icon";
+  import { BasicTitle } from "/@/components/Basic";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { useDebounceFn } from "@vueuse/core";
+  import { createBEM } from "/@/utils/bem";
+  import { ToolbarEnum } from "../types/tree";
+
+  const searchValue = ref("");
+
+  const [bem] = createBEM("tree-header");
+
+  const props = defineProps({
+    helpMessage: {
+      type: [String, Array] as PropType<string | string[]>,
+      default: "",
+    },
+    title: {
+      type: String,
+      default: "",
+    },
+    toolbar: {
+      type: Boolean,
+      default: false,
+    },
+    checkable: {
+      type: Boolean,
+      default: false,
+    },
+    search: {
+      type: Boolean,
+      default: false,
+    },
+    searchText: {
+      type: String,
+      default: "",
+    },
+    checkAll: {
+      type: Function,
+      default: undefined,
+    },
+    expandAll: {
+      type: Function,
+      default: undefined,
+    },
+  } as const);
+  const emit = defineEmits(["strictly-change", "search"]);
+
+  const slots = useSlots();
+  const { t } = useI18n();
+
+  const getInputSearchCls = computed(() => {
+    const titleExists = slots.headerTitle || props.title;
+    return [
+      "mr-1",
+      "w-full",
+      {
+        ["ml-5"]: titleExists,
+      },
+    ];
+  });
+
+  const toolbarList = computed(() => {
+    const { checkable } = props;
+    const defaultToolbarList = [
+      { label: t("component.tree.expandAll"), value: ToolbarEnum.EXPAND_ALL },
+      {
+        label: t("component.tree.unExpandAll"),
+        value: ToolbarEnum.UN_EXPAND_ALL,
+        divider: checkable,
+      },
+    ];
+
+    return checkable
+      ? [
+          { label: t("component.tree.selectAll"), value: ToolbarEnum.SELECT_ALL },
+          {
+            label: t("component.tree.unSelectAll"),
+            value: ToolbarEnum.UN_SELECT_ALL,
+            divider: checkable,
+          },
+          ...defaultToolbarList,
+          { label: t("component.tree.checkStrictly"), value: ToolbarEnum.CHECK_STRICTLY },
+          { label: t("component.tree.checkUnStrictly"), value: ToolbarEnum.CHECK_UN_STRICTLY },
+        ]
+      : defaultToolbarList;
+  });
+
+  function handleMenuClick(e: { key: ToolbarEnum }) {
+    const { key } = e;
+    switch (key) {
+      case ToolbarEnum.SELECT_ALL:
+        props.checkAll?.(true);
+        break;
+      case ToolbarEnum.UN_SELECT_ALL:
+        props.checkAll?.(false);
+        break;
+      case ToolbarEnum.EXPAND_ALL:
+        props.expandAll?.(true);
+        break;
+      case ToolbarEnum.UN_EXPAND_ALL:
+        props.expandAll?.(false);
+        break;
+      case ToolbarEnum.CHECK_STRICTLY:
+        emit("strictly-change", false);
+        break;
+      case ToolbarEnum.CHECK_UN_STRICTLY:
+        emit("strictly-change", true);
+        break;
+    }
+  }
+
+  function emitChange(value?: string): void {
+    emit("search", value);
+  }
+
+  const debounceEmitChange = useDebounceFn(emitChange, 200);
+
+  watch(
+    () => searchValue.value,
+    (v) => {
+      debounceEmitChange(v);
+    },
+  );
+
+  watch(
+    () => props.searchText,
+    (v) => {
+      if (v !== searchValue.value) {
+        searchValue.value = v;
+      }
+    },
+  );
+</script>
diff --git a/src/components/Tree/src/useTree.ts b/src/components/Tree/src/hooks/useTree.ts
similarity index 78%
rename from src/components/Tree/src/useTree.ts
rename to src/components/Tree/src/hooks/useTree.ts
index 840e5bc193c9eba6cbed916ad32237577e243fbe..61d7ac98b5db30055407d87803a97f2ded82430b 100644
--- a/src/components/Tree/src/useTree.ts
+++ b/src/components/Tree/src/hooks/useTree.ts
@@ -1,19 +1,16 @@
-import type { InsertNodeParams, Keys, ReplaceFields } from './typing';
-import type { Ref, ComputedRef } from 'vue';
-import type { TreeDataItem } from 'ant-design-vue/es/tree/Tree';
-
-import { cloneDeep } from 'lodash-es';
-import { unref } from 'vue';
-import { forEach } from '/@/utils/helper/treeHelper';
-
-export function useTree(
-  treeDataRef: Ref<TreeDataItem[]>,
-  getReplaceFields: ComputedRef<ReplaceFields>,
-) {
+import type { InsertNodeParams, KeyType, FieldNames, TreeItem } from "../types/tree";
+import type { Ref, ComputedRef } from "vue";
+import type { TreeDataItem } from "ant-design-vue/es/tree/Tree";
+
+import { cloneDeep } from "lodash-es";
+import { unref } from "vue";
+import { forEach } from "/@/utils/helper/treeHelper";
+
+export function useTree(treeDataRef: Ref<TreeDataItem[]>, getFieldNames: ComputedRef<FieldNames>) {
   function getAllKeys(list?: TreeDataItem[]) {
     const keys: string[] = [];
     const treeData = list || unref(treeDataRef);
-    const { key: keyField, children: childrenField } = unref(getReplaceFields);
+    const { key: keyField, children: childrenField } = unref(getFieldNames);
     if (!childrenField || !keyField) return keys;
 
     for (let index = 0; index < treeData.length; index++) {
@@ -24,13 +21,14 @@ export function useTree(
         keys.push(...(getAllKeys(children) as string[]));
       }
     }
-    return keys as Keys;
+    return keys as KeyType[];
   }
+
   // get keys that can be checked and selected
   function getEnabledKeys(list?: TreeDataItem[]) {
     const keys: string[] = [];
     const treeData = list || unref(treeDataRef);
-    const { key: keyField, children: childrenField } = unref(getReplaceFields);
+    const { key: keyField, children: childrenField } = unref(getFieldNames);
     if (!childrenField || !keyField) return keys;
 
     for (let index = 0; index < treeData.length; index++) {
@@ -41,13 +39,13 @@ export function useTree(
         keys.push(...(getEnabledKeys(children) as string[]));
       }
     }
-    return keys as Keys;
+    return keys as KeyType[];
   }
 
-  function getChildrenKeys(nodeKey: string | number, list?: TreeDataItem[]): Keys {
-    const keys: Keys = [];
+  function getChildrenKeys(nodeKey: string | number, list?: TreeDataItem[]) {
+    const keys: KeyType[] = [];
     const treeData = list || unref(treeDataRef);
-    const { key: keyField, children: childrenField } = unref(getReplaceFields);
+    const { key: keyField, children: childrenField } = unref(getFieldNames);
     if (!childrenField || !keyField) return keys;
     for (let index = 0; index < treeData.length; index++) {
       const node = treeData[index];
@@ -63,14 +61,14 @@ export function useTree(
         }
       }
     }
-    return keys as Keys;
+    return keys as KeyType[];
   }
 
   // Update node
   function updateNodeByKey(key: string, node: TreeDataItem, list?: TreeDataItem[]) {
     if (!key) return;
     const treeData = list || unref(treeDataRef);
-    const { key: keyField, children: childrenField } = unref(getReplaceFields);
+    const { key: keyField, children: childrenField } = unref(getFieldNames);
 
     if (!childrenField || !keyField) return;
 
@@ -97,8 +95,8 @@ export function useTree(
     for (let index = 0; index < data.length; index++) {
       const item = data[index];
 
-      const { key: keyField, children: childrenField } = unref(getReplaceFields);
-      const key = keyField ? item[keyField] : '';
+      const { key: keyField, children: childrenField } = unref(getFieldNames);
+      const key = keyField ? item[keyField] : "";
       const children = childrenField ? item[childrenField] : [];
       res.push(key);
       if (children && children.length && currentLevel < level) {
@@ -112,14 +110,14 @@ export function useTree(
   /**
    * 添加节点
    */
-  function insertNodeByKey({ parentKey = null, node, push = 'push' }: InsertNodeParams) {
+  function insertNodeByKey({ parentKey = null, node, push = "push" }: InsertNodeParams) {
     const treeData: any = cloneDeep(unref(treeDataRef));
     if (!parentKey) {
       treeData[push](node);
       treeDataRef.value = treeData;
       return;
     }
-    const { key: keyField, children: childrenField } = unref(getReplaceFields);
+    const { key: keyField, children: childrenField } = unref(getFieldNames);
     if (!childrenField || !keyField) return;
 
     forEach(treeData, (treeItem) => {
@@ -134,7 +132,7 @@ export function useTree(
   /**
    * 批量添加节点
    */
-  function insertNodesByKey({ parentKey = null, list, push = 'push' }: InsertNodeParams) {
+  function insertNodesByKey({ parentKey = null, list, push = "push" }: InsertNodeParams) {
     const treeData: any = cloneDeep(unref(treeDataRef));
     if (!list || list.length < 1) {
       return;
@@ -144,7 +142,7 @@ export function useTree(
         treeData[push](list[i]);
       }
     } else {
-      const { key: keyField, children: childrenField } = unref(getReplaceFields);
+      const { key: keyField, children: childrenField } = unref(getFieldNames);
       if (!childrenField || !keyField) return;
 
       forEach(treeData, (treeItem) => {
@@ -163,7 +161,7 @@ export function useTree(
   function deleteNodeByKey(key: string, list?: TreeDataItem[]) {
     if (!key) return;
     const treeData = list || unref(treeDataRef);
-    const { key: keyField, children: childrenField } = unref(getReplaceFields);
+    const { key: keyField, children: childrenField } = unref(getFieldNames);
     if (!childrenField || !keyField) return;
 
     for (let index = 0; index < treeData.length; index++) {
@@ -178,6 +176,23 @@ export function useTree(
       }
     }
   }
+
+  // Get selected node
+  function getSelectedNode(key: KeyType, list?: TreeItem[], selectedNode?: TreeItem | null) {
+    if (!key && key !== 0) return null;
+    const treeData = list || unref(treeDataRef);
+    treeData.forEach((item) => {
+      if (selectedNode?.key || selectedNode?.key === 0) return selectedNode;
+      if (item.key === key) {
+        selectedNode = item;
+        return;
+      }
+      if (item.children && item.children.length) {
+        selectedNode = getSelectedNode(key, item.children, selectedNode);
+      }
+    });
+    return selectedNode || null;
+  }
   return {
     deleteNodeByKey,
     insertNodeByKey,
@@ -187,5 +202,6 @@ export function useTree(
     getAllKeys,
     getChildrenKeys,
     getEnabledKeys,
+    getSelectedNode,
   };
 }
diff --git a/src/components/Tree/src/props.ts b/src/components/Tree/src/types/tree.ts
similarity index 30%
rename from src/components/Tree/src/props.ts
rename to src/components/Tree/src/types/tree.ts
index faa5c03f78880bf22817dda6ff8fb4872c0b419d..b0a0648d1e67821cf4b5677a19e989f4a585d3d5 100644
--- a/src/components/Tree/src/props.ts
+++ b/src/components/Tree/src/types/tree.ts
@@ -1,44 +1,83 @@
-import type { PropType } from 'vue';
-import type {
-  ReplaceFields,
-  ActionItem,
-  Keys,
-  CheckKeys,
-  ContextMenuOptions,
-  TreeItem,
-} from './typing';
-import type { ContextMenuItem } from '/@/hooks/web/useContextMenu';
-import type { TreeDataItem } from 'ant-design-vue/es/tree/Tree';
-import { propTypes } from '/@/utils/propTypes';
-
-export const basicProps = {
+import type { ExtractPropTypes } from "vue";
+import type { TreeDataItem } from "ant-design-vue/es/tree/Tree";
+
+import { buildProps } from "/@/utils/props";
+
+export enum ToolbarEnum {
+  SELECT_ALL,
+  UN_SELECT_ALL,
+  EXPAND_ALL,
+  UN_EXPAND_ALL,
+  CHECK_STRICTLY,
+  CHECK_UN_STRICTLY,
+}
+
+export const treeEmits = [
+  "update:expandedKeys",
+  "update:selectedKeys",
+  "update:value",
+  "change",
+  "check",
+  "update:searchValue",
+];
+
+export interface TreeState {
+  expandedKeys: KeyType[];
+  selectedKeys: KeyType[];
+  checkedKeys: CheckKeys;
+  checkStrictly: boolean;
+}
+
+export interface FieldNames {
+  children?: string;
+  title?: string;
+  key?: string;
+}
+
+export type KeyType = string | number;
+
+export type CheckKeys =
+  | KeyType[]
+  | { checked: string[] | number[]; halfChecked: string[] | number[] };
+
+export const treeProps = buildProps({
   value: {
-    type: [Object, Array] as PropType<Keys | CheckKeys>,
+    type: [Object, Array] as PropType<KeyType[] | CheckKeys>,
   },
+
   renderIcon: {
     type: Function as PropType<(params: Recordable) => string>,
   },
 
   helpMessage: {
     type: [String, Array] as PropType<string | string[]>,
-    default: '',
+    default: "",
   },
 
-  title: propTypes.string,
-  toolbar: propTypes.bool,
-  search: propTypes.bool,
-  searchValue: propTypes.string,
-  checkStrictly: propTypes.bool,
-  clickRowToExpand: propTypes.bool.def(true),
-  checkable: propTypes.bool.def(false),
+  title: {
+    type: String,
+    default: "",
+  },
+  toolbar: Boolean,
+  search: Boolean,
+  searchValue: {
+    type: String,
+    default: "",
+  },
+  checkStrictly: Boolean,
+  clickRowToExpand: {
+    type: Boolean,
+    default: false,
+  },
+  checkable: Boolean,
   defaultExpandLevel: {
     type: [String, Number] as PropType<string | number>,
-    default: '',
+    default: "",
   },
-  defaultExpandAll: propTypes.bool.def(false),
+  defaultExpandAll: Boolean,
 
-  replaceFields: {
-    type: Object as PropType<ReplaceFields>,
+  fieldNames: {
+    type: Object as PropType<FieldNames>,
   },
 
   treeData: {
@@ -46,17 +85,17 @@ export const basicProps = {
   },
 
   actionList: {
-    type: Array as PropType<ActionItem[]>,
+    type: Array as PropType<TreeActionItem[]>,
     default: () => [],
   },
 
   expandedKeys: {
-    type: Array as PropType<Keys>,
+    type: Array as PropType<KeyType[]>,
     default: () => [],
   },
 
   selectedKeys: {
-    type: Array as PropType<Keys>,
+    type: Array as PropType<KeyType[]>,
     default: () => [],
   },
 
@@ -67,7 +106,7 @@ export const basicProps = {
 
   beforeRightClick: {
     type: Function as PropType<(...arg: any) => ContextMenuItem[] | ContextMenuOptions>,
-    default: null,
+    default: undefined,
   },
 
   rightMenuList: {
@@ -76,9 +115,9 @@ export const basicProps = {
   // 自定义数据过滤判断方法(注: 不是整个过滤方法,而是内置过滤的判断方法,用于增强原本仅能通过title进行过滤的方式)
   filterFn: {
     type: Function as PropType<
-      (searchValue: any, node: TreeItem, replaceFields: ReplaceFields) => boolean
+      (searchValue: any, node: TreeItem, fieldNames: FieldNames) => boolean
     >,
-    default: null,
+    default: undefined,
   },
   // 高亮搜索值,仅高亮具体匹配值(通过title)值为true时使用默认色值,值为#xxx时使用此值替代且高亮开启
   highlight: {
@@ -86,23 +125,70 @@ export const basicProps = {
     default: false,
   },
   // 搜索完成时自动展开结果
-  expandOnSearch: propTypes.bool.def(false),
+  expandOnSearch: Boolean,
   // 搜索完成自动选中所有结果,当且仅当 checkable===true 时生效
-  checkOnSearch: propTypes.bool.def(false),
+  checkOnSearch: Boolean,
   // 搜索完成自动select所有结果
-  selectedOnSearch: propTypes.bool.def(false),
-};
-
-export const treeNodeProps = {
-  actionList: {
-    type: Array as PropType<ActionItem[]>,
-    default: () => [],
-  },
-  replaceFields: {
-    type: Object as PropType<ReplaceFields>,
-  },
-  treeData: {
-    type: Array as PropType<TreeDataItem[]>,
-    default: () => [],
+  selectedOnSearch: Boolean,
+  loading: {
+    type: Boolean,
+    default: false,
   },
-};
+});
+
+export type TreeProps = ExtractPropTypes<typeof treeProps>;
+
+export interface ContextMenuItem {
+  label: string;
+  icon?: string;
+  hidden?: boolean;
+  disabled?: boolean;
+  handler?: Fn;
+  divider?: boolean;
+  children?: ContextMenuItem[];
+}
+
+export interface ContextMenuOptions {
+  icon?: string;
+  styles?: any;
+  items?: ContextMenuItem[];
+}
+
+export interface TreeItem extends TreeDataItem {
+  icon?: any;
+}
+
+export interface TreeActionItem {
+  render: (record: Recordable) => any;
+  show?: boolean | ((record: Recordable) => boolean);
+}
+
+export interface InsertNodeParams {
+  parentKey: string | null;
+  node: TreeDataItem;
+  list?: TreeDataItem[];
+  push?: "push" | "unshift";
+}
+
+export interface TreeActionType {
+  checkAll: (checkAll: boolean) => void;
+  expandAll: (expandAll: boolean) => void;
+  setExpandedKeys: (keys: KeyType[]) => void;
+  getExpandedKeys: () => KeyType[];
+  setSelectedKeys: (keys: KeyType[]) => void;
+  getSelectedKeys: () => KeyType[];
+  setCheckedKeys: (keys: CheckKeys) => void;
+  getCheckedKeys: () => CheckKeys;
+  filterByLevel: (level: number) => void;
+  insertNodeByKey: (opt: InsertNodeParams) => void;
+  insertNodesByKey: (opt: InsertNodeParams) => void;
+  deleteNodeByKey: (key: string) => void;
+  updateNodeByKey: (key: string, node: Omit<TreeDataItem, "key">) => void;
+  setSearchValue: (value: string) => void;
+  getSearchValue: () => string;
+  getSelectedNode: (
+    key: KeyType,
+    treeList?: TreeItem[],
+    selectNode?: TreeItem | null,
+  ) => TreeItem | null;
+}
diff --git a/src/components/Tree/src/typing.ts b/src/components/Tree/src/typing.ts
deleted file mode 100644
index df8d6d9ed51529c1239c303264f077c2febdb24e..0000000000000000000000000000000000000000
--- a/src/components/Tree/src/typing.ts
+++ /dev/null
@@ -1,54 +0,0 @@
-import type { TreeDataItem, CheckEvent as CheckEventOrigin } from 'ant-design-vue/es/tree/Tree';
-import { ContextMenuItem } from '/@/hooks/web/useContextMenu';
-export interface ActionItem {
-  render: (record: Recordable) => any;
-  show?: boolean | ((record: Recordable) => boolean);
-}
-
-export interface TreeItem extends TreeDataItem {
-  icon?: any;
-}
-
-export interface ReplaceFields {
-  children?: string;
-  title?: string;
-  key?: string;
-}
-
-export type Keys = (string | number)[];
-export type CheckKeys =
-  | (string | number)[]
-  | { checked: (string | number)[]; halfChecked: (string | number)[] };
-
-export interface TreeActionType {
-  checkAll: (checkAll: boolean) => void;
-  expandAll: (expandAll: boolean) => void;
-  setExpandedKeys: (keys: Keys) => void;
-  getExpandedKeys: () => Keys;
-  setSelectedKeys: (keys: Keys) => void;
-  getSelectedKeys: () => Keys;
-  setCheckedKeys: (keys: CheckKeys) => void;
-  getCheckedKeys: () => CheckKeys;
-  filterByLevel: (level: number) => void;
-  insertNodeByKey: (opt: InsertNodeParams) => void;
-  insertNodesByKey: (opt: InsertNodeParams) => void;
-  deleteNodeByKey: (key: string) => void;
-  updateNodeByKey: (key: string, node: Omit<TreeDataItem, 'key'>) => void;
-  setSearchValue: (value: string) => void;
-  getSearchValue: () => string;
-}
-
-export interface InsertNodeParams {
-  parentKey: string | null;
-  node: TreeDataItem;
-  list?: TreeDataItem[];
-  push?: 'push' | 'unshift';
-}
-
-export interface ContextMenuOptions {
-  icon?: string;
-  styles?: any;
-  items?: ContextMenuItem[];
-}
-
-export type CheckEvent = CheckEventOrigin;
diff --git a/src/components/Tree/style/index.less b/src/components/Tree/style/index.less
new file mode 100644
index 0000000000000000000000000000000000000000..6f0a36fd7274dc2d54fb29d9e78276517c890033
--- /dev/null
+++ b/src/components/Tree/style/index.less
@@ -0,0 +1,52 @@
+@tree-prefix-cls: ~"@{namespace}-tree";
+
+.@{tree-prefix-cls} {
+  background-color: @component-background;
+
+  .ant-tree-node-content-wrapper {
+    position: relative;
+
+    .ant-tree-title {
+      position: absolute;
+      left: 0;
+      width: 100%;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      white-space: nowrap;
+    }
+  }
+
+  &__title {
+    position: relative;
+    display: flex;
+    align-items: center;
+    width: 100%;
+    padding-right: 10px;
+
+    &:hover {
+      .@{tree-prefix-cls}__action {
+        visibility: visible;
+      }
+    }
+  }
+
+  &__content {
+    overflow: hidden;
+  }
+
+  &__actions {
+    position: absolute;
+    //top: 2px;
+    right: 3px;
+    display: flex;
+  }
+
+  &__action {
+    margin-left: 4px;
+    visibility: hidden;
+  }
+
+  &-header {
+    border-bottom: 1px solid @border-color-base;
+  }
+}
diff --git a/src/components/Tree/style/index.ts b/src/components/Tree/style/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..49f7e3f1750e259e12e6d07a263da1cb0f8f8fe3
--- /dev/null
+++ b/src/components/Tree/style/index.ts
@@ -0,0 +1 @@
+import "./index.less";
diff --git a/src/components/Upload/index.ts b/src/components/Upload/index.ts
index 568a7d9807da5205695f7b42563361f53c27faa3..5fbb9e838c3062f80dfda118680eaab1b6f37b06 100644
--- a/src/components/Upload/index.ts
+++ b/src/components/Upload/index.ts
@@ -1,4 +1,4 @@
-import { withInstall } from '/@/utils';
-import basicUpload from './src/BasicUpload.vue';
+import { withInstall } from "/@/utils";
+import basicUpload from "./src/BasicUpload.vue";
 
 export const BasicUpload = withInstall(basicUpload);
diff --git a/src/components/Upload/src/BasicUpload.vue b/src/components/Upload/src/BasicUpload.vue
index 0d3ea2346c508b6aac7cc2f5cd42e0794cf46e3d..a38e4f1cadad0472fe66550ab870423c401c03a4 100644
--- a/src/components/Upload/src/BasicUpload.vue
+++ b/src/components/Upload/src/BasicUpload.vue
@@ -1,12 +1,12 @@
 <template>
   <div>
-    <a-button-group>
+    <Space>
       <a-button type="primary" @click="openUploadModal" preIcon="carbon:cloud-upload">
-        {{ t('component.upload.upload') }}
+        {{ t("component.upload.upload") }}
       </a-button>
       <Tooltip placement="bottom" v-if="showPreview">
         <template #title>
-          {{ t('component.upload.uploaded') }}
+          {{ t("component.upload.uploaded") }}
           <template v-if="fileList.length">
             {{ fileList.length }}
           </template>
@@ -18,8 +18,7 @@
           </template>
         </a-button>
       </Tooltip>
-    </a-button-group>
-
+    </Space>
     <UploadModal
       v-bind="bindValue"
       :previewFileList="fileList"
@@ -37,22 +36,22 @@
   </div>
 </template>
 <script lang="ts">
-  import { defineComponent, ref, watch, unref, computed } from 'vue';
-  import UploadModal from './UploadModal.vue';
-  import UploadPreviewModal from './UploadPreviewModal.vue';
-  import { Icon } from '/@/components/Icon';
-  import { Tooltip } from 'ant-design-vue';
-  import { useModal } from '/@/components/Modal';
-  import { uploadContainerProps } from './props';
-  import { omit } from 'lodash-es';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { isArray } from '/@/utils/is';
+  import { defineComponent, ref, watch, unref, computed } from "vue";
+  import { Icon } from "/@/components/Icon";
+  import { Tooltip, Space } from "ant-design-vue";
+  import { useModal } from "/@/components/Modal";
+  import { uploadContainerProps } from "./props";
+  import { omit } from "lodash-es";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { isArray } from "/@/utils/is";
+  import UploadModal from "./UploadModal.vue";
+  import UploadPreviewModal from "./UploadPreviewModal.vue";
 
   export default defineComponent({
-    name: 'BasicUpload',
-    components: { UploadModal, UploadPreviewModal, Icon, Tooltip },
+    name: "BasicUpload",
+    components: { UploadModal, Space, UploadPreviewModal, Icon, Tooltip },
     props: uploadContainerProps,
-    emits: ['change', 'delete', 'preview-delete', 'update:value'],
+    emits: ["change", "delete", "preview-delete", "update:value"],
 
     setup(props, { emit, attrs }) {
       const { t } = useI18n();
@@ -72,7 +71,7 @@
 
       const bindValue = computed(() => {
         const value = { ...attrs, ...props };
-        return omit(value, 'onChange');
+        return omit(value, "onChange");
       });
 
       watch(
@@ -86,23 +85,23 @@
       // 上传modal保存操作
       function handleChange(urls: string[]) {
         fileList.value = [...unref(fileList), ...(urls || [])];
-        emit('update:value', fileList.value);
-        emit('change', fileList.value);
+        emit("update:value", fileList.value);
+        emit("change", fileList.value);
       }
 
       // 预览modal保存操作
       function handlePreviewChange(urls: string[]) {
         fileList.value = [...(urls || [])];
-        emit('update:value', fileList.value);
-        emit('change', fileList.value);
+        emit("update:value", fileList.value);
+        emit("change", fileList.value);
       }
 
       function handleDelete(record: Recordable) {
-        emit('delete', record);
+        emit("delete", record);
       }
 
       function handlePreviewDelete(url: string) {
-        emit('preview-delete', url);
+        emit("preview-delete", url);
       }
 
       return {
diff --git a/src/components/Upload/src/FileList.vue b/src/components/Upload/src/FileList.vue
index ddb087e5bba6fd14346d97cdaa1dfeb95ae701d5..0c1c12229026e36b9c3d1087423479bb23299609 100644
--- a/src/components/Upload/src/FileList.vue
+++ b/src/components/Upload/src/FileList.vue
@@ -1,11 +1,11 @@
 <script lang="tsx">
-  import { defineComponent, CSSProperties, watch, nextTick } from 'vue';
-  import { fileListProps } from './props';
-  import { isFunction } from '/@/utils/is';
-  import { useModalContext } from '/@/components/Modal/src/hooks/useModalContext';
+  import { defineComponent, CSSProperties, watch, nextTick } from "vue";
+  import { fileListProps } from "./props";
+  import { isFunction } from "/@/utils/is";
+  import { useModalContext } from "/@/components/Modal/src/hooks/useModalContext";
 
   export default defineComponent({
-    name: 'FileList',
+    name: "FileList",
     props: fileListProps,
     setup(props) {
       const modalFn = useModalContext();
@@ -35,9 +35,9 @@
             <thead>
               <tr class="file-table-tr">
                 {columnList.map((item) => {
-                  const { title = '', align = 'center', dataIndex } = item;
+                  const { title = "", align = "center", dataIndex } = item;
                   return (
-                    <th class={['file-table-th', align]} key={dataIndex}>
+                    <th class={["file-table-th", align]} key={dataIndex}>
                       {title}
                     </th>
                   );
@@ -47,12 +47,12 @@
             <tbody>
               {dataSource.map((record = {}, index) => {
                 return (
-                  <tr class="file-table-tr" key={`${index + record.name || ''}`}>
+                  <tr class="file-table-tr" key={`${index + record.name || ""}`}>
                     {columnList.map((item) => {
-                      const { dataIndex = '', customRender, align = 'center' } = item;
+                      const { dataIndex = "", customRender, align = "center" } = item;
                       const render = customRender && isFunction(customRender);
                       return (
-                        <td class={['file-table-td', align]} key={dataIndex}>
+                        <td class={["file-table-td", align]} key={dataIndex}>
                           {render
                             ? customRender?.({ text: record[dataIndex], record })
                             : record[dataIndex]}
diff --git a/src/components/Upload/src/ThumbUrl.vue b/src/components/Upload/src/ThumbUrl.vue
index 80fb203dc71656da26a56a8d6e7ea04b703e75e7..74d8a624937595a53bcb52f7251d372cca4bb389 100644
--- a/src/components/Upload/src/ThumbUrl.vue
+++ b/src/components/Upload/src/ThumbUrl.vue
@@ -4,15 +4,15 @@
   </span>
 </template>
 <script lang="ts">
-  import { defineComponent } from 'vue';
-  import { propTypes } from '/@/utils/propTypes';
-  import { Image } from 'ant-design-vue';
+  import { defineComponent } from "vue";
+  import { propTypes } from "/@/utils/propTypes";
+  import { Image } from "ant-design-vue";
 
   export default defineComponent({
     components: { Image },
     props: {
-      fileUrl: propTypes.string.def(''),
-      fileName: propTypes.string.def(''),
+      fileUrl: propTypes.string.def(""),
+      fileName: propTypes.string.def(""),
     },
   });
 </script>
diff --git a/src/components/Upload/src/UploadModal.vue b/src/components/Upload/src/UploadModal.vue
index 41ed8619c7ac5b7a085fdfc619d068f22ab48f8a..fdc4985b947d81f98422e42e5f64e3a1f029b858 100644
--- a/src/components/Upload/src/UploadModal.vue
+++ b/src/components/Upload/src/UploadModal.vue
@@ -9,7 +9,7 @@
     :closeFunc="handleCloseFunc"
     :maskClosable="false"
     :keyboard="false"
-    wrapClassName="upload-modal"
+    class="upload-modal"
     :okButtonProps="getOkButtonProps"
     :cancelButtonProps="{ disabled: isUploadingRef }"
   >
@@ -31,10 +31,11 @@
         :accept="getStringAccept"
         :multiple="multiple"
         :before-upload="beforeUpload"
+        :show-upload-list="false"
         class="upload-modal-toolbar__btn"
       >
         <a-button type="primary">
-          {{ t('component.upload.choose') }}
+          {{ t("component.upload.choose") }}
         </a-button>
       </Upload>
     </div>
@@ -42,24 +43,24 @@
   </BasicModal>
 </template>
 <script lang="ts">
-  import { defineComponent, reactive, ref, toRefs, unref, computed, PropType } from 'vue';
-  import { Upload, Alert } from 'ant-design-vue';
-  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { defineComponent, reactive, ref, toRefs, unref, computed, PropType } from "vue";
+  import { Upload, Alert } from "ant-design-vue";
+  import { BasicModal, useModalInner } from "/@/components/Modal";
   //   import { BasicTable, useTable } from '/@/components/Table';
   // hooks
-  import { useUploadType } from './useUpload';
-  import { useMessage } from '/@/hooks/web/useMessage';
+  import { useUploadType } from "./useUpload";
+  import { useMessage } from "/@/hooks/web/useMessage";
   //   types
-  import { FileItem, UploadResultStatus } from './typing';
-  import { basicProps } from './props';
-  import { createTableColumns, createActionColumn } from './data';
+  import { FileItem, UploadResultStatus } from "./typing";
+  import { basicProps } from "./props";
+  import { createTableColumns, createActionColumn } from "./data";
   // utils
-  import { checkFileType, checkImgType, getBase64WithFile } from './helper';
-  import { buildUUID } from '/@/utils/uuid';
-  import { isFunction } from '/@/utils/is';
-  import { warn } from '/@/utils/log';
-  import FileList from './FileList.vue';
-  import { useI18n } from '/@/hooks/web/useI18n';
+  import { checkImgType, getBase64WithFile } from "./helper";
+  import { buildUUID } from "/@/utils/uuid";
+  import { isFunction } from "/@/utils/is";
+  import { warn } from "/@/utils/log";
+  import FileList from "./FileList.vue";
+  import { useI18n } from "/@/hooks/web/useI18n";
 
   export default defineComponent({
     components: { BasicModal, Upload, Alert, FileList },
@@ -70,7 +71,7 @@
         default: () => [],
       },
     },
-    emits: ['change', 'register', 'delete'],
+    emits: ["change", "register", "delete"],
     setup(props, { emit }) {
       const state = reactive<{ fileList: FileItem[] }>({
         fileList: [],
@@ -84,7 +85,7 @@
       const { t } = useI18n();
       const [register, { closeModal }] = useModalInner();
 
-      const { getAccept, getStringAccept, getHelpText } = useUploadType({
+      const { getStringAccept, getHelpText } = useUploadType({
         acceptRef: accept,
         helpTextRef: helpText,
         maxNumberRef: maxNumber,
@@ -114,35 +115,29 @@
           (item) => item.status === UploadResultStatus.ERROR,
         );
         return isUploadingRef.value
-          ? t('component.upload.uploading')
+          ? t("component.upload.uploading")
           : someError
-          ? t('component.upload.reUploadFailed')
-          : t('component.upload.startUpload');
+          ? t("component.upload.reUploadFailed")
+          : t("component.upload.startUpload");
       });
 
       // 上传前校验
       function beforeUpload(file: File) {
         const { size, name } = file;
         const { maxSize } = props;
-        const accept = unref(getAccept);
         // 设置最大值,则判断
         if (maxSize && file.size / 1024 / 1024 >= maxSize) {
-          createMessage.error(t('component.upload.maxSizeMultiple', [maxSize]));
+          createMessage.error(t("component.upload.maxSizeMultiple", [maxSize]));
           return false;
         }
 
-        // 设置类型,则判断
-        if (accept.length > 0 && !checkFileType(file, accept)) {
-          createMessage.error!(t('component.upload.acceptUpload', [accept.join(',')]));
-          return false;
-        }
         const commonItem = {
           uuid: buildUUID(),
           file,
           size,
           name,
           percent: 0,
-          type: name.split('.').pop(),
+          type: name.split(".").pop(),
         };
         // 生成图片缩略图
         if (checkImgType(file)) {
@@ -167,7 +162,7 @@
       function handleRemove(record: FileItem) {
         const index = fileListRef.value.findIndex((item) => item.uuid === record.uuid);
         index !== -1 && fileListRef.value.splice(index, 1);
-        emit('delete', record);
+        emit("delete", record);
       }
 
       // 预览
@@ -181,7 +176,7 @@
       async function uploadApiByItem(item: FileItem) {
         const { api } = props;
         if (!api || !isFunction(api)) {
-          return warn('upload api must exist and be a function');
+          return warn("upload api must exist and be a function");
         }
         try {
           item.status = UploadResultStatus.UPLOADING;
@@ -219,7 +214,7 @@
       async function handleStartUpload() {
         const { maxNumber } = props;
         if ((fileListRef.value.length + props.previewFileList?.length ?? 0) > maxNumber) {
-          return createMessage.warning(t('component.upload.maxNumber', [maxNumber]));
+          return createMessage.warning(t("component.upload.maxNumber", [maxNumber]));
         }
         try {
           isUploadingRef.value = true;
@@ -246,10 +241,10 @@
         const { maxNumber } = props;
 
         if (fileListRef.value.length > maxNumber) {
-          return createMessage.warning(t('component.upload.maxNumber', [maxNumber]));
+          return createMessage.warning(t("component.upload.maxNumber", [maxNumber]));
         }
         if (isUploadingRef.value) {
-          return createMessage.warning(t('component.upload.saveWarn'));
+          return createMessage.warning(t("component.upload.saveWarn"));
         }
         const fileList: string[] = [];
 
@@ -261,11 +256,11 @@
         }
         // 存在一个上传成功的即可保存
         if (fileList.length <= 0) {
-          return createMessage.warning(t('component.upload.saveError'));
+          return createMessage.warning(t("component.upload.saveError"));
         }
         fileListRef.value = [];
         closeModal();
-        emit('change', fileList);
+        emit("change", fileList);
       }
 
       // 点击关闭:则所有操作不保存,包括上传的
@@ -274,7 +269,7 @@
           fileListRef.value = [];
           return true;
         } else {
-          createMessage.warning(t('component.upload.uploadWait'));
+          createMessage.warning(t("component.upload.uploadWait"));
           return false;
         }
       }
diff --git a/src/components/Upload/src/UploadPreviewModal.vue b/src/components/Upload/src/UploadPreviewModal.vue
index 48392d605ba9784f35b4cb9f677a2807687fe325..de80322d354b8cc498b48cfedbebb517909b8874 100644
--- a/src/components/Upload/src/UploadPreviewModal.vue
+++ b/src/components/Upload/src/UploadPreviewModal.vue
@@ -2,7 +2,7 @@
   <BasicModal
     width="800px"
     :title="t('component.upload.preview')"
-    wrapClassName="upload-preview-modal"
+    class="upload-preview-modal"
     v-bind="$attrs"
     @register="register"
     :showOkBtn="false"
@@ -11,21 +11,21 @@
   </BasicModal>
 </template>
 <script lang="ts">
-  import { defineComponent, watch, ref } from 'vue';
+  import { defineComponent, watch, ref } from "vue";
   //   import { BasicTable, useTable } from '/@/components/Table';
-  import FileList from './FileList.vue';
-  import { BasicModal, useModalInner } from '/@/components/Modal';
-  import { previewProps } from './props';
-  import { PreviewFileItem } from './typing';
-  import { downloadByUrl } from '/@/utils/file/download';
-  import { createPreviewColumns, createPreviewActionColumn } from './data';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { isArray } from '/@/utils/is';
+  import FileList from "./FileList.vue";
+  import { BasicModal, useModalInner } from "/@/components/Modal";
+  import { previewProps } from "./props";
+  import { PreviewFileItem } from "./typing";
+  import { downloadByUrl } from "/@/utils/file/download";
+  import { createPreviewColumns, createPreviewActionColumn } from "./data";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { isArray } from "/@/utils/is";
 
   export default defineComponent({
     components: { BasicModal, FileList },
     props: previewProps,
-    emits: ['list-change', 'register', 'delete'],
+    emits: ["list-change", "register", "delete"],
     setup(props, { emit }) {
       const [register, { closeModal }] = useModalInner();
       const { t } = useI18n();
@@ -40,8 +40,8 @@
             .map((item) => {
               return {
                 url: item,
-                type: item.split('.').pop() || '',
-                name: item.split('/').pop() || '',
+                type: item.split(".").pop() || "",
+                name: item.split("/").pop() || "",
               };
             });
         },
@@ -53,9 +53,9 @@
         const index = fileListRef.value.findIndex((item) => item.url === record.url);
         if (index !== -1) {
           const removed = fileListRef.value.splice(index, 1);
-          emit('delete', removed[0].url);
+          emit("delete", removed[0].url);
           emit(
-            'list-change',
+            "list-change",
             fileListRef.value.map((item) => item.url),
           );
         }
@@ -71,7 +71,7 @@
 
       // 下载
       function handleDownload(record: PreviewFileItem) {
-        const { url = '' } = record;
+        const { url = "" } = record;
         downloadByUrl({ url });
       }
 
diff --git a/src/components/Upload/src/data.tsx b/src/components/Upload/src/data.tsx
index 8e088332ac416c43d05509a08b84f99a66ad120e..02f88d4dffc4975cda99cd9bf822311559573a45 100644
--- a/src/components/Upload/src/data.tsx
+++ b/src/components/Upload/src/data.tsx
@@ -1,13 +1,13 @@
-import type { BasicColumn, ActionItem } from '/@/components/Table';
-import { FileItem, PreviewFileItem, UploadResultStatus } from './typing';
+import type { BasicColumn, ActionItem } from "/@/components/Table";
+import { FileItem, PreviewFileItem, UploadResultStatus } from "./typing";
 import {
   // checkImgType,
   isImgTypeByName,
-} from './helper';
-import { Progress, Tag } from 'ant-design-vue';
-import TableAction from '/@/components/Table/src/components/TableAction.vue';
-import ThumbUrl from './ThumbUrl.vue';
-import { useI18n } from '/@/hooks/web/useI18n';
+} from "./helper";
+import { Progress, Tag } from "ant-design-vue";
+import TableAction from "/@/components/Table/src/components/TableAction.vue";
+import ThumbUrl from "./ThumbUrl.vue";
+import { useI18n } from "/@/hooks/web/useI18n";
 
 const { t } = useI18n();
 
@@ -15,8 +15,8 @@ const { t } = useI18n();
 export function createTableColumns(): BasicColumn[] {
   return [
     {
-      dataIndex: 'thumbUrl',
-      title: t('component.upload.legend'),
+      dataIndex: "thumbUrl",
+      title: t("component.upload.legend"),
       width: 100,
       customRender: ({ record }) => {
         const { thumbUrl } = (record as FileItem) || {};
@@ -24,18 +24,18 @@ export function createTableColumns(): BasicColumn[] {
       },
     },
     {
-      dataIndex: 'name',
-      title: t('component.upload.fileName'),
-      align: 'left',
+      dataIndex: "name",
+      title: t("component.upload.fileName"),
+      align: "left",
       customRender: ({ text, record }) => {
         const { percent, status: uploadStatus } = (record as FileItem) || {};
-        let status: 'normal' | 'exception' | 'active' | 'success' = 'normal';
+        let status: "normal" | "exception" | "active" | "success" = "normal";
         if (uploadStatus === UploadResultStatus.ERROR) {
-          status = 'exception';
+          status = "exception";
         } else if (uploadStatus === UploadResultStatus.UPLOADING) {
-          status = 'active';
+          status = "active";
         } else if (uploadStatus === UploadResultStatus.SUCCESS) {
-          status = 'success';
+          status = "success";
         }
         return (
           <span>
@@ -48,11 +48,11 @@ export function createTableColumns(): BasicColumn[] {
       },
     },
     {
-      dataIndex: 'size',
-      title: t('component.upload.fileSize'),
+      dataIndex: "size",
+      title: t("component.upload.fileSize"),
       width: 100,
       customRender: ({ text = 0 }) => {
-        return text && (text / 1024).toFixed(2) + 'KB';
+        return text && (text / 1024).toFixed(2) + "KB";
       },
     },
     // {
@@ -61,16 +61,16 @@ export function createTableColumns(): BasicColumn[] {
     //   width: 100,
     // },
     {
-      dataIndex: 'status',
-      title: t('component.upload.fileStatue'),
+      dataIndex: "status",
+      title: t("component.upload.fileStatue"),
       width: 100,
       customRender: ({ text }) => {
         if (text === UploadResultStatus.SUCCESS) {
-          return <Tag color="green">{() => t('component.upload.uploadSuccess')}</Tag>;
+          return <Tag color="green">{() => t("component.upload.uploadSuccess")}</Tag>;
         } else if (text === UploadResultStatus.ERROR) {
-          return <Tag color="red">{() => t('component.upload.uploadError')}</Tag>;
+          return <Tag color="red">{() => t("component.upload.uploadError")}</Tag>;
         } else if (text === UploadResultStatus.UPLOADING) {
-          return <Tag color="blue">{() => t('component.upload.uploading')}</Tag>;
+          return <Tag color="blue">{() => t("component.upload.uploading")}</Tag>;
         }
 
         return text;
@@ -81,14 +81,14 @@ export function createTableColumns(): BasicColumn[] {
 export function createActionColumn(handleRemove: Function): BasicColumn {
   return {
     width: 120,
-    title: t('component.upload.operating'),
-    dataIndex: 'action',
+    title: t("component.upload.operating"),
+    dataIndex: "action",
     fixed: false,
     customRender: ({ record }) => {
       const actions: ActionItem[] = [
         {
-          label: t('component.upload.del'),
-          color: 'error',
+          label: t("component.upload.del"),
+          color: "error",
           onClick: handleRemove.bind(null, record),
         },
       ];
@@ -106,8 +106,8 @@ export function createActionColumn(handleRemove: Function): BasicColumn {
 export function createPreviewColumns(): BasicColumn[] {
   return [
     {
-      dataIndex: 'url',
-      title: t('component.upload.legend'),
+      dataIndex: "url",
+      title: t("component.upload.legend"),
       width: 100,
       customRender: ({ record }) => {
         const { url } = (record as PreviewFileItem) || {};
@@ -115,9 +115,9 @@ export function createPreviewColumns(): BasicColumn[] {
       },
     },
     {
-      dataIndex: 'name',
-      title: t('component.upload.fileName'),
-      align: 'left',
+      dataIndex: "name",
+      title: t("component.upload.fileName"),
+      align: "left",
     },
   ];
 }
@@ -131,18 +131,18 @@ export function createPreviewActionColumn({
 }): BasicColumn {
   return {
     width: 160,
-    title: t('component.upload.operating'),
-    dataIndex: 'action',
+    title: t("component.upload.operating"),
+    dataIndex: "action",
     fixed: false,
     customRender: ({ record }) => {
       const actions: ActionItem[] = [
         {
-          label: t('component.upload.del'),
-          color: 'error',
+          label: t("component.upload.del"),
+          color: "error",
           onClick: handleRemove.bind(null, record),
         },
         {
-          label: t('component.upload.download'),
+          label: t("component.upload.download"),
           onClick: handleDownload.bind(null, record),
         },
       ];
diff --git a/src/components/Upload/src/helper.ts b/src/components/Upload/src/helper.ts
index a0c574b7aba7ebab0115ed641c94a27a61f2a403..fec69fc9b9811269ffb59895b76034f5eb814c62 100644
--- a/src/components/Upload/src/helper.ts
+++ b/src/components/Upload/src/helper.ts
@@ -1,7 +1,7 @@
 export function checkFileType(file: File, accepts: string[]) {
-  const newTypes = accepts.join('|');
+  const newTypes = accepts.join("|");
   // const reg = /\.(jpg|jpeg|png|gif|txt|doc|docx|xls|xlsx|xml)$/i;
-  const reg = new RegExp('\\.(' + newTypes + ')$', 'i');
+  const reg = new RegExp("\\.(" + newTypes + ")$", "i");
 
   return reg.test(file.name);
 }
diff --git a/src/components/Upload/src/props.ts b/src/components/Upload/src/props.ts
index 413b95d797b813dc9ed82d32b3ff5f04428e8528..90c3e9b5e316a66b009ad8d80171ebef68aa8e41 100644
--- a/src/components/Upload/src/props.ts
+++ b/src/components/Upload/src/props.ts
@@ -1,10 +1,10 @@
-import type { PropType } from 'vue';
-import { FileBasicColumn } from './typing';
+import type { PropType } from "vue";
+import { FileBasicColumn } from "./typing";
 
 export const basicProps = {
   helpText: {
     type: String as PropType<string>,
-    default: '',
+    default: "",
   },
   // 文件最大多少MB
   maxSize: {
@@ -36,7 +36,7 @@ export const basicProps = {
   },
   name: {
     type: String as PropType<string>,
-    default: 'file',
+    default: "file",
   },
   filename: {
     type: String as PropType<string>,
diff --git a/src/components/Upload/src/typing.ts b/src/components/Upload/src/typing.ts
index c6301100a209fe3f22144d296d3b4c53b6f8fe1a..7214069067957268b4ff1b613f6473a458c01d6b 100644
--- a/src/components/Upload/src/typing.ts
+++ b/src/components/Upload/src/typing.ts
@@ -1,9 +1,9 @@
-import { UploadApiResult } from '/@/api/sys/model/uploadModel';
+import { UploadApiResult } from "/@/api/sys/model/uploadModel";
 
 export enum UploadResultStatus {
-  SUCCESS = 'success',
-  ERROR = 'error',
-  UPLOADING = 'uploading',
+  SUCCESS = "success",
+  ERROR = "error",
+  UPLOADING = "uploading",
 }
 
 export interface FileItem {
@@ -51,5 +51,5 @@ export interface FileBasicColumn {
    * @default 'left'
    * @type string
    */
-  align?: 'left' | 'right' | 'center';
+  align?: "left" | "right" | "center";
 }
diff --git a/src/components/Upload/src/useUpload.ts b/src/components/Upload/src/useUpload.ts
index 694cc2757b49e80826ef7109b8cf0073de4d1504..c05ab3ce84e5ea07717599aab4ebb34e6f92856a 100644
--- a/src/components/Upload/src/useUpload.ts
+++ b/src/components/Upload/src/useUpload.ts
@@ -1,5 +1,5 @@
-import { Ref, unref, computed } from 'vue';
-import { useI18n } from '/@/hooks/web/useI18n';
+import { Ref, unref, computed } from "vue";
+import { useI18n } from "/@/hooks/web/useI18n";
 const { t } = useI18n();
 export function useUploadType({
   acceptRef,
@@ -23,13 +23,13 @@ export function useUploadType({
   const getStringAccept = computed(() => {
     return unref(getAccept)
       .map((item) => {
-        if (item.indexOf('/') > 0 || item.startsWith('.')) {
+        if (item.indexOf("/") > 0 || item.startsWith(".")) {
           return item;
         } else {
           return `.${item}`;
         }
       })
-      .join(',');
+      .join(",");
   });
 
   // 支持jpg、jpeg、png格式,不超过2M,最多可选择10张图片,。
@@ -42,19 +42,19 @@ export function useUploadType({
 
     const accept = unref(acceptRef);
     if (accept.length > 0) {
-      helpTexts.push(t('component.upload.accept', [accept.join(',')]));
+      helpTexts.push(t("component.upload.accept", [accept.join(",")]));
     }
 
     const maxSize = unref(maxSizeRef);
     if (maxSize) {
-      helpTexts.push(t('component.upload.maxSize', [maxSize]));
+      helpTexts.push(t("component.upload.maxSize", [maxSize]));
     }
 
     const maxNumber = unref(maxNumberRef);
     if (maxNumber && maxNumber !== Infinity) {
-      helpTexts.push(t('component.upload.maxNumber', [maxNumber]));
+      helpTexts.push(t("component.upload.maxNumber", [maxNumber]));
     }
-    return helpTexts.join(',');
+    return helpTexts.join(",");
   });
   return { getAccept, getStringAccept, getHelpText };
 }
diff --git a/src/components/Verify/index.ts b/src/components/Verify/index.ts
index 7c67101b689aa3f301da47a8c3282bde883f03f7..2df9d93cb878c9448a9df66e16324a40a5dc6928 100644
--- a/src/components/Verify/index.ts
+++ b/src/components/Verify/index.ts
@@ -1,7 +1,7 @@
-import { withInstall } from '/@/utils/index';
-import basicDragVerify from './src/DragVerify.vue';
-import rotateDragVerify from './src/ImgRotate.vue';
+import { withInstall } from "/@/utils/index";
+import basicDragVerify from "./src/DragVerify.vue";
+import rotateDragVerify from "./src/ImgRotate.vue";
 
 export const BasicDragVerify = withInstall(basicDragVerify);
 export const RotateDragVerify = withInstall(rotateDragVerify);
-export * from './src/typing';
+export * from "./src/typing";
diff --git a/src/components/Verify/src/DragVerify.vue b/src/components/Verify/src/DragVerify.vue
index c457bc03c4a2b04f9482e5ae884253edcc4d62c3..cb6ce2fb450a50053bf1fb8dc8a0a81b89d0fa5c 100644
--- a/src/components/Verify/src/DragVerify.vue
+++ b/src/components/Verify/src/DragVerify.vue
@@ -1,16 +1,16 @@
 <script lang="tsx">
-  import type { Ref } from 'vue';
-  import { defineComponent, ref, computed, unref, reactive, watch, watchEffect } from 'vue';
-  import { useTimeoutFn } from '/@/hooks/core/useTimeout';
-  import { useEventListener } from '/@/hooks/event/useEventListener';
-  import { basicProps } from './props';
-  import { getSlot } from '/@/utils/helper/tsxHelper';
-  import { CheckOutlined, DoubleRightOutlined } from '@ant-design/icons-vue';
+  import type { Ref } from "vue";
+  import { defineComponent, ref, computed, unref, reactive, watch, watchEffect } from "vue";
+  import { useTimeoutFn } from "/@/hooks/core/useTimeout";
+  import { useEventListener } from "/@/hooks/event/useEventListener";
+  import { basicProps } from "./props";
+  import { getSlot } from "/@/utils/helper/tsxHelper";
+  import { CheckOutlined, DoubleRightOutlined } from "@ant-design/icons-vue";
 
   export default defineComponent({
-    name: 'BaseDargVerify',
+    name: "BaseDargVerify",
     props: basicProps,
-    emits: ['success', 'update:value', 'change', 'start', 'move', 'end'],
+    emits: ["success", "update:value", "change", "start", "move", "end"],
     setup(props, { emit, slots, expose }) {
       const state = reactive({
         isMoving: false,
@@ -28,7 +28,7 @@
 
       useEventListener({
         el: document,
-        name: 'mouseup',
+        name: "mouseup",
         listener: () => {
           if (state.isMoving) {
             resume();
@@ -55,7 +55,7 @@
           width: w,
           height: `${h}px`,
           lineHeight: `${h}px`,
-          borderRadius: circle ? h / 2 + 'px' : 0,
+          borderRadius: circle ? h / 2 + "px" : 0,
           ...wrapStyle,
         };
       });
@@ -65,7 +65,7 @@
         const h = parseInt(height as string);
         return {
           height: `${h}px`,
-          borderRadius: circle ? h / 2 + 'px 0 0 ' + h / 2 + 'px' : 0,
+          borderRadius: circle ? h / 2 + "px 0 0 " + h / 2 + "px" : 0,
           ...barStyle,
         };
       });
@@ -88,9 +88,9 @@
           if (isPassing) {
             const { startTime, endTime } = state;
             const time = (endTime - startTime) / 1000;
-            emit('success', { isPassing, time: time.toFixed(1) });
-            emit('update:value', isPassing);
-            emit('change', isPassing);
+            emit("success", { isPassing, time: time.toFixed(1) });
+            emit("update:value", isPassing);
+            emit("change", isPassing);
           }
         },
       );
@@ -109,8 +109,8 @@
         }
         const actionEl = unref(actionElRef);
         if (!actionEl) return;
-        emit('start', e);
-        state.moveDistance = getEventPageX(e) - parseInt(actionEl.style.left.replace('px', ''), 10);
+        emit("start", e);
+        state.moveDistance = getEventPageX(e) - parseInt(actionEl.style.left.replace("px", ""), 10);
         state.startTime = new Date().getTime();
         state.isMoving = true;
       }
@@ -132,7 +132,7 @@
           const { offset, widthNum, actionWidth } = getOffset(actionEl);
           const moveX = getEventPageX(e) - moveDistance;
 
-          emit('move', {
+          emit("move", {
             event: e,
             moveDistance,
             moveX,
@@ -153,7 +153,7 @@
       function handleDragOver(e: MouseEvent | TouchEvent) {
         const { isMoving, isPassing, moveDistance } = state;
         if (isMoving && !isPassing) {
-          emit('end', e);
+          emit("end", e);
           const actionEl = unref(actionElRef);
           const barEl = unref(barElRef);
           if (!actionEl || !barEl) return;
@@ -207,8 +207,8 @@
         state.toLeft = true;
         useTimeoutFn(() => {
           state.toLeft = false;
-          actionEl.style.left = '0';
-          barEl.style.width = '0';
+          actionEl.style.left = "0";
+          barEl.style.width = "0";
           //  The time is consistent with the animation time
         }, 300);
         contentEl.style.width = unref(getContentStyleRef).width;
@@ -222,7 +222,7 @@
         const renderBar = () => {
           const cls = [`darg-verify-bar`];
           if (state.toLeft) {
-            cls.push('to-left');
+            cls.push("to-left");
           }
           return <div class={cls} ref={barElRef} style={unref(getBarStyleRef)} />;
         };
@@ -232,11 +232,11 @@
           const { isPassing } = state;
           const { text, successText } = props;
 
-          isPassing && cls.push('success');
+          isPassing && cls.push("success");
 
           return (
             <div class={cls} ref={contentElRef} style={unref(getContentStyleRef)}>
-              {getSlot(slots, 'text', isPassing) || (isPassing ? successText : text)}
+              {getSlot(slots, "text", isPassing) || (isPassing ? successText : text)}
             </div>
           );
         };
@@ -245,7 +245,7 @@
           const cls = [`darg-verify-action`];
           const { toLeft, isPassing } = state;
           if (toLeft) {
-            cls.push('to-left');
+            cls.push("to-left");
           }
           return (
             <div
@@ -255,7 +255,7 @@
               style={unref(getActionStyleRef)}
               ref={actionElRef}
             >
-              {getSlot(slots, 'actionIcon', isPassing) ||
+              {getSlot(slots, "actionIcon", isPassing) ||
                 (isPassing ? (
                   <CheckOutlined class={`darg-verify-action__icon`} />
                 ) : (
diff --git a/src/components/Verify/src/ImgRotate.vue b/src/components/Verify/src/ImgRotate.vue
index 53788ed6137eae1800195a2830a978a2c101e00f..e0ccbbc49f04be14993efcd0721e82cc7f1e4c06 100644
--- a/src/components/Verify/src/ImgRotate.vue
+++ b/src/components/Verify/src/ImgRotate.vue
@@ -1,17 +1,17 @@
 <script lang="tsx">
-  import type { MoveData, DragVerifyActionType } from './typing';
-  import { defineComponent, computed, unref, reactive, watch, ref } from 'vue';
-  import { useTimeoutFn } from '/@/hooks/core/useTimeout';
-  import BasicDragVerify from './DragVerify.vue';
-  import { hackCss } from '/@/utils/domUtils';
-  import { rotateProps } from './props';
-  import { useI18n } from '/@/hooks/web/useI18n';
+  import type { MoveData, DragVerifyActionType } from "./typing";
+  import { defineComponent, computed, unref, reactive, watch, ref } from "vue";
+  import { useTimeoutFn } from "/@/hooks/core/useTimeout";
+  import BasicDragVerify from "./DragVerify.vue";
+  import { hackCss } from "/@/utils/domUtils";
+  import { rotateProps } from "./props";
+  import { useI18n } from "/@/hooks/web/useI18n";
 
   export default defineComponent({
-    name: 'ImgRotateDragVerify',
+    name: "ImgRotateDragVerify",
     inheritAttrs: false,
     props: rotateProps,
-    emits: ['success', 'change', 'update:value'],
+    emits: ["success", "change", "update:value"],
     setup(props, { emit, attrs, expose }) {
       const basicRef = ref<Nullable<DragVerifyActionType>>(null);
       const state = reactive({
@@ -33,9 +33,9 @@
           if (isPassing) {
             const { startTime, endTime } = state;
             const time = (endTime - startTime) / 1000;
-            emit('success', { isPassing, time: time.toFixed(1) });
-            emit('change', isPassing);
-            emit('update:value', isPassing);
+            emit("success", { isPassing, time: time.toFixed(1) });
+            emit("change", isPassing);
+            emit("update:value", isPassing);
           }
         },
       );
@@ -68,14 +68,14 @@
           (moveX / (imgWidth! - parseInt(height as string))) * maxDegree! * unref(getFactorRef),
         );
         state.currentRotate = currentRotate;
-        state.imgStyle = hackCss('transform', `rotateZ(${state.randomRotate - currentRotate}deg)`);
+        state.imgStyle = hackCss("transform", `rotateZ(${state.randomRotate - currentRotate}deg)`);
       }
 
       function handleImgOnLoad() {
         const { minDegree, maxDegree } = props;
         const ranRotate = Math.floor(minDegree! + Math.random() * (maxDegree! - minDegree!)); // 生成随机角度
         state.randomRotate = ranRotate;
-        state.imgStyle = hackCss('transform', `rotateZ(${ranRotate}deg)`);
+        state.imgStyle = hackCss("transform", `rotateZ(${ranRotate}deg)`);
       }
 
       function handleDragEnd() {
@@ -83,7 +83,7 @@
         const { diffDegree } = props;
 
         if (Math.abs(randomRotate - currentRotate) >= (diffDegree || 20)) {
-          state.imgStyle = hackCss('transform', `rotateZ(${randomRotate}deg)`);
+          state.imgStyle = hackCss("transform", `rotateZ(${randomRotate}deg)`);
           state.toOrigin = true;
           useTimeoutFn(() => {
             state.toOrigin = false;
@@ -120,7 +120,7 @@
         const { toOrigin, isPassing, startTime, endTime } = state;
         const imgCls: string[] = [];
         if (toOrigin) {
-          imgCls.push('to-origin');
+          imgCls.push("to-origin");
         }
         const time = (endTime - startTime) / 1000;
 
@@ -139,14 +139,14 @@
                 alt="verify"
               />
               {state.showTip && (
-                <span class={[`ir-dv-img__tip`, state.isPassing ? 'success' : 'error']}>
+                <span class={[`ir-dv-img__tip`, state.isPassing ? "success" : "error"]}>
                   {state.isPassing
-                    ? t('component.verify.time', { time: time.toFixed(1) })
-                    : t('component.verify.error')}
+                    ? t("component.verify.time", { time: time.toFixed(1) })
+                    : t("component.verify.error")}
                 </span>
               )}
               {!state.showTip && !state.draged && (
-                <span class={[`ir-dv-img__tip`, 'normal']}>{t('component.verify.redoTip')}</span>
+                <span class={[`ir-dv-img__tip`, "normal"]}>{t("component.verify.redoTip")}</span>
               )}
             </div>
             <BasicDragVerify
diff --git a/src/components/Verify/src/props.ts b/src/components/Verify/src/props.ts
index 1e149703bb1f946aeb979bf592bba92fc2341b9a..55bb9d9b62812e6767444c7e619ae6db9c5a04f9 100644
--- a/src/components/Verify/src/props.ts
+++ b/src/components/Verify/src/props.ts
@@ -1,5 +1,5 @@
-import type { PropType } from 'vue';
-import { useI18n } from '/@/hooks/web/useI18n';
+import type { PropType } from "vue";
+import { useI18n } from "/@/hooks/web/useI18n";
 
 const { t } = useI18n();
 export const basicProps = {
@@ -15,11 +15,11 @@ export const basicProps = {
 
   text: {
     type: [String] as PropType<string>,
-    default: t('component.verify.dragText'),
+    default: t("component.verify.dragText"),
   },
   successText: {
     type: [String] as PropType<string>,
-    default: t('component.verify.successText'),
+    default: t("component.verify.successText"),
   },
   height: {
     type: [Number, String] as PropType<number | string>,
diff --git a/src/components/VirtualScroll/index.ts b/src/components/VirtualScroll/index.ts
index a4c608975dbb289b81f33c4dda3cb3285d039d19..8aead6e49c4dadd09b848bf4ea091a48121ce9b7 100644
--- a/src/components/VirtualScroll/index.ts
+++ b/src/components/VirtualScroll/index.ts
@@ -1,4 +1,4 @@
-import { withInstall } from '/@/utils/index';
-import vScroll from './src/VirtualScroll.vue';
+import { withInstall } from "/@/utils/index";
+import vScroll from "./src/VirtualScroll.vue";
 
 export const VScroll = withInstall(vScroll);
diff --git a/src/components/VirtualScroll/src/VirtualScroll.vue b/src/components/VirtualScroll/src/VirtualScroll.vue
index b37a0587dcb2ec07ff67973bc0141e4b1431779d..df17b8f2822614c28348ad8203b50f261c459efe 100644
--- a/src/components/VirtualScroll/src/VirtualScroll.vue
+++ b/src/components/VirtualScroll/src/VirtualScroll.vue
@@ -9,9 +9,9 @@
     watch,
     nextTick,
     CSSProperties,
-  } from 'vue';
-  import { useEventListener } from '/@/hooks/event/useEventListener';
-  import { getSlot } from '/@/utils/helper/tsxHelper';
+  } from "vue";
+  import { useEventListener } from "/@/hooks/event/useEventListener";
+  import { getSlot } from "/@/utils/helper/tsxHelper";
 
   type NumberOrNumberString = PropType<string | number | undefined>;
 
@@ -36,10 +36,10 @@
     },
   };
 
-  const prefixCls = 'virtual-scroll';
+  const prefixCls = "virtual-scroll";
 
-  function convertToUnit(str: string | number | null | undefined, unit = 'px'): string | undefined {
-    if (str == null || str === '') {
+  function convertToUnit(str: string | number | null | undefined, unit = "px"): string | undefined {
+    if (str == null || str === "") {
       return undefined;
     } else if (isNaN(+str!)) {
       return String(str);
@@ -49,7 +49,7 @@
   }
 
   export default defineComponent({
-    name: 'VirtualScroll',
+    name: "VirtualScroll",
     props,
     setup(props, { slots }) {
       const wrapElRef = ref<HTMLDivElement | null>(null);
@@ -137,7 +137,7 @@
         const top = convertToUnit(index * unref(getItemHeightRef));
         return (
           <div class={`${prefixCls}__item`} style={{ top }} key={index}>
-            {getSlot(slots, 'default', { index, item })}
+            {getSlot(slots, "default", { index, item })}
           </div>
         );
       }
@@ -151,7 +151,7 @@
           }
           useEventListener({
             el: wrapEl,
-            name: 'scroll',
+            name: "scroll",
             listener: onScroll,
             wait: 0,
           });
diff --git a/src/components/registerGlobComp.ts b/src/components/registerGlobComp.ts
index feb060e79e89df8e3fd88d98c8801a34dbcf5477..5661469a572b87a1dd619e19b93ecbb7990a8d9f 100644
--- a/src/components/registerGlobComp.ts
+++ b/src/components/registerGlobComp.ts
@@ -1,18 +1,7 @@
-import type { App } from 'vue';
-import { Button } from './Button';
-import {
-  // Need
-  Button as AntButton,
-  Input,
-  Layout,
-} from 'ant-design-vue';
-
-const compList = [AntButton.Group];
+import type { App } from "vue";
+import { Button } from "./Button";
+import { Input, Layout } from "ant-design-vue";
 
 export function registerGlobComp(app: App) {
-  compList.forEach((comp) => {
-    app.component(comp.name || comp.displayName, comp);
-  });
-
   app.use(Input).use(Button).use(Layout);
 }
diff --git a/src/design/ant/btn.less b/src/design/ant/btn.less
index ab194f16b354ea31437cd5a179711b490ed95f4f..69da595ec21bd1af21275e729f7dd5845c0a6946 100644
--- a/src/design/ant/btn.less
+++ b/src/design/ant/btn.less
@@ -1,19 +1,5 @@
 // button reset
 .ant-btn {
-  // display: inline-flex;
-  // justify-content: center;
-  // align-items: center;
-  // &.ant-btn-success:not(.ant-btn-link),
-  // &.ant-btn-error:not(.ant-btn-link),
-  // &.ant-btn-warning:not(.ant-btn-link),
-  // &.ant-btn-primary:not(.ant-btn-link) {
-  //   box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.12), 0 2px 4px 0 rgba(0, 0, 0, 0.08) !important;
-  // }
-  // &-group {
-  //   .ant-btn:not(:first-child) {
-  //     bottom: 1px;
-  //   }
-  // }
   &-link:hover,
   &-link:focus,
   &-link:active {
@@ -29,23 +15,12 @@
       color: @white;
       background-color: @button-primary-hover-color;
     }
-    //
-    //&[disabled],
-    //&[disabled]:hover {
-    //  color: fade(@button-cancel-color, 40%) !important;
-    //  background-color: fade(@button-cancel-bg-color, 40%) !important;
-    //  border-color: fade(@button-cancel-border-color, 40%) !important;
-    //}
   }
 
   &-primary:not(&-background-ghost):not([disabled]) {
     color: @white;
   }
 
-  //&-primary:not(&-background-ghost) {
-  //  border-width: 0;
-  //}
-
   &-default {
     color: @button-cancel-color;
     background-color: @button-cancel-bg-color;
@@ -66,7 +41,7 @@
     //}
   }
 
-  [data-theme='light'] &.ant-btn-link.is-disabled {
+  [data-theme="light"] &.ant-btn-link.is-disabled {
     color: rgb(0 0 0 / 25%);
     text-shadow: none;
     cursor: not-allowed !important;
@@ -75,7 +50,7 @@
     box-shadow: none;
   }
 
-  [data-theme='dark'] &.ant-btn-link.is-disabled {
+  [data-theme="dark"] &.ant-btn-link.is-disabled {
     color: rgb(255 255 255 / 25%) !important;
     text-shadow: none;
     cursor: not-allowed !important;
@@ -86,7 +61,7 @@
 
   // color: @white;
 
-  &-success.ant-btn-link:not([disabled='disabled']) {
+  &-success.ant-btn-link:not([disabled="disabled"]) {
     color: @button-success-color;
 
     &:hover,
@@ -127,16 +102,9 @@
       background-color: @button-success-active-color;
       border-color: @button-success-active-color;
     }
-
-    //&[disabled],
-    //&[disabled]:hover {
-    //  color: @white;
-    //  background-color: fade(@button-success-color, 40%);
-    //  border-color: fade(@button-success-color, 40%);
-    //}
   }
 
-  &-warning.ant-btn-link:not([disabled='disabled']) {
+  &-warning.ant-btn-link:not([disabled="disabled"]) {
     color: @button-warn-color;
 
     &:hover,
@@ -176,7 +144,7 @@
     //}
   }
 
-  &-error.ant-btn-link:not([disabled='disabled']) {
+  &-error.ant-btn-link:not([disabled="disabled"]) {
     color: @button-error-color;
 
     &:hover,
@@ -305,7 +273,7 @@
     }
   }
 
-  &-ghost.ant-btn-link:not([disabled='disabled']) {
+  &-ghost.ant-btn-link:not([disabled="disabled"]) {
     color: @button-ghost-color;
 
     &:hover,
diff --git a/src/design/ant/index.less b/src/design/ant/index.less
index fc9349cedb2d6fba96dedf6b81e04d301f8714e6..77ec98fdc75ae530daf7159e96d58e86336e95aa 100644
--- a/src/design/ant/index.less
+++ b/src/design/ant/index.less
@@ -1,12 +1,6 @@
-@import './pagination.less';
-@import './input.less';
-@import './btn.less';
-// @import './table.less';
-
-// TODO beta.11 fix
-.ant-col {
-  width: 100%;
-}
+@import "./pagination.less";
+@import "./input.less";
+@import "./btn.less";
 
 .ant-image-preview-root {
   img {
diff --git a/src/design/ant/input.less b/src/design/ant/input.less
index 57f85e57c8e7aec4b2706d6852b86ccd6b11802a..c6c13172e06b4a5f49df8084b9686294c7c93eac 100644
--- a/src/design/ant/input.less
+++ b/src/design/ant/input.less
@@ -1,4 +1,4 @@
-@import (reference) '../color.less';
+@import (reference) "../color.less";
 
 // input
 .ant-input {
@@ -22,3 +22,8 @@
     padding: 4px;
   }
 }
+
+.ant-input-number {
+  width: 100% !important;
+  max-width: 100%;
+}
diff --git a/src/design/ant/pagination.less b/src/design/ant/pagination.less
index b3580f9582086cda7e1a4656db080ea27c811006..7c05a74d5025c0bc68a93ad53bcecc78ce2e5d0c 100644
--- a/src/design/ant/pagination.less
+++ b/src/design/ant/pagination.less
@@ -1,4 +1,4 @@
-html[data-theme='dark'] {
+html[data-theme="dark"] {
   .ant-pagination {
     &.mini {
       .ant-pagination-prev,
diff --git a/src/design/ant/table.less b/src/design/ant/table.less
index ee62b998d21ff2be8feb65babc7efff06965769d..2e3a8194294344ade4708c57afd000667ff089d4 100644
--- a/src/design/ant/table.less
+++ b/src/design/ant/table.less
@@ -1,4 +1,4 @@
-@prefix-cls: ~'@{namespace}-basic-table';
+@prefix-cls: ~"@{namespace}-basic-table";
 
 // fix table unnecessary scrollbar
 .@{prefix-cls} {
diff --git a/src/design/config.less b/src/design/config.less
index 64c33f6f1717e83f15cb26a40433d6bedaa5ab27..f7ba9a36bc7d567feb463f96e7d45ddbeff3ed33 100644
--- a/src/design/config.less
+++ b/src/design/config.less
@@ -1,2 +1,2 @@
-@import (reference) 'color.less';
-@import (reference) 'var/index.less';
+@import (reference) "color.less";
+@import (reference) "var/index.less";
diff --git a/src/design/index.less b/src/design/index.less
index 1d52f05c8906ac3d56c7f8c802d0c23c7ea8229d..e5a65ec9a80f98770265126603ce3cdcc34600e3 100644
--- a/src/design/index.less
+++ b/src/design/index.less
@@ -1,8 +1,8 @@
-@import 'transition/index.less';
-@import 'var/index.less';
-@import 'public.less';
-@import 'ant/index.less';
-@import './theme.less';
+@import "transition/index.less";
+@import "var/index.less";
+@import "public.less";
+@import "ant/index.less";
+@import "./theme.less";
 
 input:-webkit-autofill {
   box-shadow: 0 0 0 1000px white inset !important;
@@ -21,8 +21,8 @@ html,
 body {
   width: 100%;
   height: 100%;
-  overflow: visible !important;
-  overflow-x: hidden !important;
+  overflow: visible;
+  overflow-x: hidden;
 
   &.color-weak {
     filter: invert(80%);
@@ -40,5 +40,5 @@ button,
 div,
 svg,
 span {
-  outline: none !important;
+  outline: none;
 }
diff --git a/src/design/public.less b/src/design/public.less
index 798fe02208a984a4d868671eca5342df36385f34..644bfab217fe442568bf8fd26dd5cdbe1814b192 100644
--- a/src/design/public.less
+++ b/src/design/public.less
@@ -46,6 +46,6 @@
     width: 100%;
     height: 2px;
     background-color: @primary-color;
-    opacity: 75%;
+    opacity: 0.75;
   }
 }
diff --git a/src/design/theme.less b/src/design/theme.less
index aa05033dd2e725e31cf09db2df9782b492e911f8..a9aade53f7dec41c67371f91609b65bb38272105 100644
--- a/src/design/theme.less
+++ b/src/design/theme.less
@@ -2,7 +2,7 @@
   background-color: @component-background !important;
 }
 
-html[data-theme='light'] {
+html[data-theme="light"] {
   .text-secondary {
     color: rgb(0 0 0 / 45%);
   }
@@ -27,7 +27,7 @@ html[data-theme='light'] {
   }
 }
 
-[data-theme='dark'] {
+[data-theme="dark"] {
   .text-secondary {
     color: #8b949e;
   }
diff --git a/src/design/transition/fade.less b/src/design/transition/fade.less
index 420f144194cb6a5c333d1d5a457685d6303ebf70..6ed17713510e53f5513e32acff54778615d67833 100644
--- a/src/design/transition/fade.less
+++ b/src/design/transition/fade.less
@@ -1,3 +1,15 @@
+.fade-transition {
+  &-enter-active,
+  &-leave-active {
+    transition: opacity 0.2s ease-in-out;
+  }
+
+  &-enter-from,
+  &-leave-to {
+    opacity: 0;
+  }
+}
+
 .fade-enter-active,
 .fade-leave-active {
   transition: opacity 0.2s ease-in-out;
@@ -5,7 +17,7 @@
 
 .fade-enter-from,
 .fade-leave-to {
-  opacity: 0%;
+  opacity: 0;
 }
 
 /* fade-slide */
@@ -15,12 +27,12 @@
 }
 
 .fade-slide-enter-from {
-  opacity: 0%;
+  opacity: 0;
   transform: translateX(-30px);
 }
 
 .fade-slide-leave-to {
-  opacity: 0%;
+  opacity: 0;
   transform: translateX(30px);
 }
 
@@ -35,12 +47,12 @@
 }
 
 .fade-bottom-enter-from {
-  opacity: 0%;
+  opacity: 0;
   transform: translateY(-10%);
 }
 
 .fade-bottom-leave-to {
-  opacity: 0%;
+  opacity: 0;
   transform: translateY(10%);
 }
 
@@ -51,12 +63,12 @@
 }
 
 .fade-scale-enter-from {
-  opacity: 0%;
+  opacity: 0;
   transform: scale(1.2);
 }
 
 .fade-scale-leave-to {
-  opacity: 0%;
+  opacity: 0;
   transform: scale(0.8);
 }
 
@@ -71,11 +83,11 @@
 }
 
 .fade-top-enter-from {
-  opacity: 0%;
+  opacity: 0;
   transform: translateY(8%);
 }
 
 .fade-top-leave-to {
-  opacity: 0%;
+  opacity: 0;
   transform: translateY(-8%);
 }
diff --git a/src/design/transition/index.less b/src/design/transition/index.less
index e372b259e423cd1eebe204439b90f91746bdd398..51db0d70d28d270d2a947edd985bafe0dd0271e1 100644
--- a/src/design/transition/index.less
+++ b/src/design/transition/index.less
@@ -1,9 +1,9 @@
-@import './base.less';
-@import './fade.less';
-@import './scale.less';
-@import './slide.less';
-@import './scroll.less';
-@import './zoom.less';
+@import "./base.less";
+@import "./fade.less";
+@import "./scale.less";
+@import "./slide.less";
+@import "./scroll.less";
+@import "./zoom.less";
 
 .collapse-transition {
   transition: 0.2s height ease-in-out, 0.2s padding-top ease-in-out, 0.2s padding-bottom ease-in-out;
diff --git a/src/design/transition/scale.less b/src/design/transition/scale.less
index d5c30b69a3f9899a8b6a07f63e949ae8ae97a423..c9654935798035fbc8a5a0d55ba903e40597f400 100644
--- a/src/design/transition/scale.less
+++ b/src/design/transition/scale.less
@@ -4,7 +4,7 @@
   &-enter-from,
   &-leave,
   &-leave-to {
-    opacity: 0%;
+    opacity: 0;
     transform: scale(0);
   }
 }
@@ -15,7 +15,7 @@
   &-enter-from,
   &-leave,
   &-leave-to {
-    opacity: 0%;
+    opacity: 0;
     transform: scale(0) rotate(-45deg);
   }
 }
diff --git a/src/design/transition/scroll.less b/src/design/transition/scroll.less
index 10d056701d6cfc20e7e1ab488867c7ff3cfabc83..a5f45e4cb8ca409c72abbabd7904dd18630a2942 100644
--- a/src/design/transition/scroll.less
+++ b/src/design/transition/scroll.less
@@ -3,7 +3,7 @@
 
   &-enter-from,
   &-leave-to {
-    opacity: 0%;
+    opacity: 0;
   }
 
   &-enter-from {
@@ -20,7 +20,7 @@
 
   &-enter-from,
   &-leave-to {
-    opacity: 0%;
+    opacity: 0;
   }
 
   &-enter-from {
@@ -37,7 +37,7 @@
 
   &-enter-from,
   &-leave-to {
-    opacity: 0%;
+    opacity: 0;
   }
 
   &-enter-from {
@@ -54,7 +54,7 @@
 
   &-enter-from,
   &-leave-to {
-    opacity: 0%;
+    opacity: 0;
   }
 
   &-enter-from {
diff --git a/src/design/transition/slide.less b/src/design/transition/slide.less
index 6c3166d14d834dd030e1e6786652ff77312ace5c..79b00df87afad899f83c1a012f92bb7a98d3f5a6 100644
--- a/src/design/transition/slide.less
+++ b/src/design/transition/slide.less
@@ -3,7 +3,7 @@
 
   &-enter-from,
   &-leave-to {
-    opacity: 0%;
+    opacity: 0;
     transform: translateY(-15px);
   }
 }
@@ -13,7 +13,7 @@
 
   &-enter-from,
   &-leave-to {
-    opacity: 0%;
+    opacity: 0;
     transform: translateY(15px);
   }
 }
@@ -23,7 +23,7 @@
 
   &-enter-from,
   &-leave-to {
-    opacity: 0%;
+    opacity: 0;
     transform: translateX(-15px);
   }
 }
@@ -33,7 +33,7 @@
 
   &-enter-from,
   &-leave-to {
-    opacity: 0%;
+    opacity: 0;
     transform: translateX(15px);
   }
 }
diff --git a/src/design/transition/zoom.less b/src/design/transition/zoom.less
index f9b14dde7fe2b33ab493103e74ea77145fa57a02..2ea378ca72bf2829e6b70ebf8803b9771cca4204 100644
--- a/src/design/transition/zoom.less
+++ b/src/design/transition/zoom.less
@@ -6,7 +6,7 @@
 
 .zoom-out-enter-from,
 .zoom-out-leave-to {
-  opacity: 0%;
+  opacity: 0;
   transform: scale(0);
 }
 
@@ -17,11 +17,11 @@
 }
 
 .zoom-fade-enter-from {
-  opacity: 0%;
+  opacity: 0;
   transform: scale(0.92);
 }
 
 .zoom-fade-leave-to {
-  opacity: 0%;
+  opacity: 0;
   transform: scale(1.06);
 }
diff --git a/src/design/var/index.less b/src/design/var/index.less
index 1689f76d29e4ea5be0addb6e56cefb95c5fe466f..6d0a656e8769c5084dae8f4cb4ef16d258d3b346 100644
--- a/src/design/var/index.less
+++ b/src/design/var/index.less
@@ -1,6 +1,6 @@
-@import (reference) '../color.less';
-@import 'easing';
-@import 'breakpoint';
+@import (reference) "../color.less";
+@import "easing";
+@import "breakpoint";
 
 @namespace: vben;
 
diff --git a/src/directives/clickOutside.ts b/src/directives/clickOutside.ts
index f6f3051a3d98290c40debb9889448d317047896f..f18c822489cf9342a9676a6d340ac4a97c71a941 100644
--- a/src/directives/clickOutside.ts
+++ b/src/directives/clickOutside.ts
@@ -1,6 +1,6 @@
-import { on } from '/@/utils/domUtils';
-import { isServer } from '/@/utils/is';
-import type { ComponentPublicInstance, DirectiveBinding, ObjectDirective } from 'vue';
+import { on } from "/@/utils/domUtils";
+import { isServer } from "/@/utils/is";
+import type { ComponentPublicInstance, DirectiveBinding, ObjectDirective } from "vue";
 
 type DocumentHandler = <T extends MouseEvent>(mouseup: T, mousedown: T) => void;
 
@@ -17,8 +17,8 @@ const nodeList: FlushList = new Map();
 let startClick: MouseEvent;
 
 if (!isServer) {
-  on(document, 'mousedown', (e: MouseEvent) => (startClick = e));
-  on(document, 'mouseup', (e: MouseEvent) => {
+  on(document, "mousedown", (e: MouseEvent) => (startClick = e));
+  on(document, "mouseup", (e: MouseEvent) => {
     for (const { documentHandler } of nodeList.values()) {
       documentHandler(e, startClick);
     }
diff --git a/src/directives/index.ts b/src/directives/index.ts
index 0329eb651b90831dcc6bdef85db58250323ae515..536e734d4990f7b469793505a33df9134ba109be 100644
--- a/src/directives/index.ts
+++ b/src/directives/index.ts
@@ -1,9 +1,9 @@
 /**
  * Configure and register global directives
  */
-import type { App } from 'vue';
-import { setupPermissionDirective } from './permission';
-import { setupLoadingDirective } from './loading';
+import type { App } from "vue";
+import { setupPermissionDirective } from "./permission";
+import { setupLoadingDirective } from "./loading";
 
 export function setupGlobDirectives(app: App) {
   setupPermissionDirective(app);
diff --git a/src/directives/loading.ts b/src/directives/loading.ts
index 06101ad58c8aee4cbf5e217b2c56cad9f9e8559b..192a2b5fba95eb0e9b0b0c744439a9072f84ef31 100644
--- a/src/directives/loading.ts
+++ b/src/directives/loading.ts
@@ -1,17 +1,17 @@
-import { createLoading } from '/@/components/Loading';
-import type { Directive, App } from 'vue';
+import { createLoading } from "/@/components/Loading";
+import type { Directive, App } from "vue";
 
 const loadingDirective: Directive = {
   mounted(el, binding) {
-    const tip = el.getAttribute('loading-tip');
-    const background = el.getAttribute('loading-background');
-    const size = el.getAttribute('loading-size');
+    const tip = el.getAttribute("loading-tip");
+    const background = el.getAttribute("loading-background");
+    const size = el.getAttribute("loading-size");
     const fullscreen = !!binding.modifiers.fullscreen;
     const instance = createLoading(
       {
         tip,
         background,
-        size: size || 'large',
+        size: size || "large",
         loading: !!binding.value,
         absolute: !fullscreen,
       },
@@ -22,11 +22,9 @@ const loadingDirective: Directive = {
   updated(el, binding) {
     const instance = el.instance;
     if (!instance) return;
-    instance.setTip(el.getAttribute('loading-tip'));
+    instance.setTip(el.getAttribute("loading-tip"));
     if (binding.oldValue !== binding.value) {
-      if (binding.oldValue !== binding.value) {
-        instance.setLoading?.(binding.value && !instance.loading);
-      }
+      instance.setLoading?.(binding.value && !instance.loading);
     }
   },
   unmounted(el) {
@@ -35,7 +33,7 @@ const loadingDirective: Directive = {
 };
 
 export function setupLoadingDirective(app: App) {
-  app.directive('loading', loadingDirective);
+  app.directive("loading", loadingDirective);
 }
 
 export default loadingDirective;
diff --git a/src/directives/permission.ts b/src/directives/permission.ts
index ca5d0fca1090d6b10e3c5171dd73c73edae792d5..df447dabc9b6d3f5098b14190d5d0a8f5ad047e2 100644
--- a/src/directives/permission.ts
+++ b/src/directives/permission.ts
@@ -3,9 +3,9 @@
  * Used for fine-grained control of component permissions
  * @Example v-auth="RoleEnum.TEST"
  */
-import type { App, Directive, DirectiveBinding } from 'vue';
+import type { App, Directive, DirectiveBinding } from "vue";
 
-import { usePermission } from '/@/hooks/web/usePermission';
+import { usePermission } from "/@/hooks/web/usePermission";
 
 function isAuth(el: Element, binding: any) {
   const { hasPermission } = usePermission();
@@ -26,7 +26,7 @@ const authDirective: Directive = {
 };
 
 export function setupPermissionDirective(app: App) {
-  app.directive('auth', authDirective);
+  app.directive("auth", authDirective);
 }
 
 export default authDirective;
diff --git a/src/directives/repeatClick.ts b/src/directives/repeatClick.ts
index d4ef150d88d971343027076aa11ea97f5229a01e..7d674b4d02db517e9bff075dd818beb80427ab0a 100644
--- a/src/directives/repeatClick.ts
+++ b/src/directives/repeatClick.ts
@@ -2,8 +2,8 @@
  * Prevent repeated clicks
  * @Example v-repeat-click="()=>{}"
  */
-import { on, once } from '/@/utils/domUtils';
-import type { Directive, DirectiveBinding } from 'vue';
+import { on, once } from "/@/utils/domUtils";
+import type { Directive, DirectiveBinding } from "vue";
 
 const repeatDirective: Directive = {
   beforeMount(el: Element, binding: DirectiveBinding<any>) {
@@ -18,10 +18,10 @@ const repeatDirective: Directive = {
       interval = null;
     };
 
-    on(el, 'mousedown', (e: MouseEvent): void => {
+    on(el, "mousedown", (e: MouseEvent): void => {
       if ((e as any).button !== 0) return;
       startTime = Date.now();
-      once(document as any, 'mouseup', clear);
+      once(document as any, "mouseup", clear);
       interval && clearInterval(interval);
       interval = setInterval(handler, 100);
     });
diff --git a/src/directives/ripple/index.ts b/src/directives/ripple/index.ts
index 85a80e8f3ebc4dc8bdae1322c1dc3233b7bed820..036024d3146e487f6c8c01fe6616117212da6ac8 100644
--- a/src/directives/ripple/index.ts
+++ b/src/directives/ripple/index.ts
@@ -1,5 +1,5 @@
-import type { Directive } from 'vue';
-import './index.less';
+import type { Directive } from "vue";
+import "./index.less";
 export interface RippleOptions {
   event: string;
   transition: number;
@@ -13,7 +13,7 @@ export interface RippleProto {
 export type EventType = Event & MouseEvent & TouchEvent;
 
 const options: RippleOptions = {
-  event: 'mousedown',
+  event: "mousedown",
   transition: 400,
 };
 
@@ -21,7 +21,7 @@ const RippleDirective: Directive & RippleProto = {
   beforeMount: (el: HTMLElement, binding) => {
     if (binding.value === false) return;
 
-    const bg = el.getAttribute('ripple-background');
+    const bg = el.getAttribute("ripple-background");
     setProps(Object.keys(binding.modifiers), options);
 
     const background = bg || RippleDirective.background;
@@ -41,7 +41,7 @@ const RippleDirective: Directive & RippleProto = {
       el?.clearRipple?.();
       return;
     }
-    const bg = el.getAttribute('ripple-background');
+    const bg = el.getAttribute("ripple-background");
     el?.setBackground?.(bg);
   },
 };
@@ -52,7 +52,7 @@ function rippler({
   zIndex,
   background,
 }: { event: EventType; el: HTMLElement } & RippleProto) {
-  const targetBorder = parseInt(getComputedStyle(el).borderWidth.replace('px', ''));
+  const targetBorder = parseInt(getComputedStyle(el).borderWidth.replace("px", ""));
   const clientX = event.clientX || event.touches[0].clientX;
   const clientY = event.clientY || event.touches[0].clientY;
 
@@ -68,42 +68,42 @@ function rippler({
   const radius = Math.sqrt(maxX * maxX + maxY * maxY);
   const border = targetBorder > 0 ? targetBorder : 0;
 
-  const ripple = document.createElement('div');
-  const rippleContainer = document.createElement('div');
+  const ripple = document.createElement("div");
+  const rippleContainer = document.createElement("div");
 
   // Styles for ripple
-  ripple.className = 'ripple';
+  ripple.className = "ripple";
 
   Object.assign(ripple.style ?? {}, {
-    marginTop: '0px',
-    marginLeft: '0px',
-    width: '1px',
-    height: '1px',
+    marginTop: "0px",
+    marginLeft: "0px",
+    width: "1px",
+    height: "1px",
     transition: `all ${transition}ms cubic-bezier(0.4, 0, 0.2, 1)`,
-    borderRadius: '50%',
-    pointerEvents: 'none',
-    position: 'relative',
-    zIndex: zIndex ?? '9999',
-    backgroundColor: background ?? 'rgba(0, 0, 0, 0.12)',
+    borderRadius: "50%",
+    pointerEvents: "none",
+    position: "relative",
+    zIndex: zIndex ?? "9999",
+    backgroundColor: background ?? "rgba(0, 0, 0, 0.12)",
   });
 
   // Styles for rippleContainer
-  rippleContainer.className = 'ripple-container';
+  rippleContainer.className = "ripple-container";
   Object.assign(rippleContainer.style ?? {}, {
-    position: 'absolute',
+    position: "absolute",
     left: `${0 - border}px`,
     top: `${0 - border}px`,
-    height: '0',
-    width: '0',
-    pointerEvents: 'none',
-    overflow: 'hidden',
+    height: "0",
+    width: "0",
+    pointerEvents: "none",
+    overflow: "hidden",
   });
 
   const storedTargetPosition =
     el.style.position.length > 0 ? el.style.position : getComputedStyle(el).position;
 
-  if (storedTargetPosition !== 'relative') {
-    el.style.position = 'relative';
+  if (storedTargetPosition !== "relative") {
+    el.style.position = "relative";
   }
 
   rippleContainer.appendChild(ripple);
@@ -123,7 +123,7 @@ function rippler({
   Object.assign(rippleContainer.style, {
     width: `${width}px`,
     height: `${height}px`,
-    direction: 'ltr',
+    direction: "ltr",
     borderTopLeftRadius,
     borderTopRightRadius,
     borderBottomLeftRadius,
@@ -142,33 +142,33 @@ function rippler({
 
   function clearRipple() {
     setTimeout(() => {
-      ripple.style.backgroundColor = 'rgba(0, 0, 0, 0)';
+      ripple.style.backgroundColor = "rgba(0, 0, 0, 0)";
     }, 250);
 
     setTimeout(() => {
       rippleContainer?.parentNode?.removeChild(rippleContainer);
     }, 850);
-    el.removeEventListener('mouseup', clearRipple, false);
-    el.removeEventListener('mouseleave', clearRipple, false);
-    el.removeEventListener('dragstart', clearRipple, false);
+    el.removeEventListener("mouseup", clearRipple, false);
+    el.removeEventListener("mouseleave", clearRipple, false);
+    el.removeEventListener("dragstart", clearRipple, false);
     setTimeout(() => {
       let clearPosition = true;
       for (let i = 0; i < el.childNodes.length; i++) {
-        if ((el.childNodes[i] as Recordable).className === 'ripple-container') {
+        if ((el.childNodes[i] as Recordable).className === "ripple-container") {
           clearPosition = false;
         }
       }
 
       if (clearPosition) {
-        el.style.position = storedTargetPosition !== 'static' ? storedTargetPosition : '';
+        el.style.position = storedTargetPosition !== "static" ? storedTargetPosition : "";
       }
     }, options.transition + 260);
   }
 
-  if (event.type === 'mousedown') {
-    el.addEventListener('mouseup', clearRipple, false);
-    el.addEventListener('mouseleave', clearRipple, false);
-    el.addEventListener('dragstart', clearRipple, false);
+  if (event.type === "mousedown") {
+    el.addEventListener("mouseup", clearRipple, false);
+    el.addEventListener("mouseleave", clearRipple, false);
+    el.addEventListener("dragstart", clearRipple, false);
   } else {
     clearRipple();
   }
diff --git a/src/enums/appEnum.ts b/src/enums/appEnum.ts
index 63869d20b985988d678be14f9876c4f50ee5c024..0112af0c79e12536f1395dc232c5bef23aaa6cef 100644
--- a/src/enums/appEnum.ts
+++ b/src/enums/appEnum.ts
@@ -3,21 +3,21 @@ export const SIDE_BAR_SHOW_TIT_MINI_WIDTH = 80;
 
 export enum ContentEnum {
   // auto width
-  FULL = 'full',
+  FULL = "full",
   // fixed width
-  FIXED = 'fixed',
+  FIXED = "fixed",
 }
 
 // menu theme enum
 export enum ThemeEnum {
-  DARK = 'dark',
-  LIGHT = 'light',
+  DARK = "dark",
+  LIGHT = "light",
 }
 
 export enum SettingButtonPositionEnum {
-  AUTO = 'auto',
-  HEADER = 'header',
-  FIXED = 'fixed',
+  AUTO = "auto",
+  HEADER = "header",
+  FIXED = "fixed",
 }
 
 export enum SessionTimeoutProcessingEnum {
@@ -30,19 +30,23 @@ export enum SessionTimeoutProcessingEnum {
  */
 export enum PermissionModeEnum {
   // role
-  ROLE = 'ROLE',
+  // 角色权限
+  ROLE = "ROLE",
   // black
-  BACK = 'BACK',
+  // 后端
+  BACK = "BACK",
   // route mapping
-  ROUTE_MAPPING = 'ROUTE_MAPPING',
+  // 路由映射
+  ROUTE_MAPPING = "ROUTE_MAPPING",
 }
 
-//  Route switching animation
+// Route switching animation
+// 路由切换动画
 export enum RouterTransitionEnum {
-  ZOOM_FADE = 'zoom-fade',
-  ZOOM_OUT = 'zoom-out',
-  FADE_SIDE = 'fade-slide',
-  FADE = 'fade',
-  FADE_BOTTOM = 'fade-bottom',
-  FADE_SCALE = 'fade-scale',
+  ZOOM_FADE = "zoom-fade",
+  ZOOM_OUT = "zoom-out",
+  FADE_SIDE = "fade-slide",
+  FADE = "fade",
+  FADE_BOTTOM = "fade-bottom",
+  FADE_SCALE = "fade-scale",
 }
diff --git a/src/enums/breakpointEnum.ts b/src/enums/breakpointEnum.ts
index 93acc1a3198777870e5fd12226a83af4764ab839..12386b749a3d558f282fa9e872043e396676e489 100644
--- a/src/enums/breakpointEnum.ts
+++ b/src/enums/breakpointEnum.ts
@@ -1,10 +1,10 @@
 export enum sizeEnum {
-  XS = 'XS',
-  SM = 'SM',
-  MD = 'MD',
-  LG = 'LG',
-  XL = 'XL',
-  XXL = 'XXL',
+  XS = "XS",
+  SM = "SM",
+  MD = "MD",
+  LG = "LG",
+  XL = "XL",
+  XXL = "XXL",
 }
 
 export enum screenEnum {
diff --git a/src/enums/cacheEnum.ts b/src/enums/cacheEnum.ts
index 4a5cc11b8db460361dd78c1e9d9c322fbd713778..de1c271ee915a3f964ca4eb976de0988c2be999d 100644
--- a/src/enums/cacheEnum.ts
+++ b/src/enums/cacheEnum.ts
@@ -1,29 +1,29 @@
 // token key
-export const TOKEN_KEY = 'TOKEN__';
+export const TOKEN_KEY = "TOKEN__";
 
-export const LOCALE_KEY = 'LOCALE__';
+export const LOCALE_KEY = "LOCALE__";
 
 // user info key
-export const USER_INFO_KEY = 'USER__INFO__';
+export const USER_INFO_KEY = "USER__INFO__";
 
 // role info key
-export const ROLES_KEY = 'ROLES__KEY__';
+export const ROLES_KEY = "ROLES__KEY__";
 
 // project config key
-export const PROJ_CFG_KEY = 'PROJ__CFG__KEY__';
+export const PROJ_CFG_KEY = "PROJ__CFG__KEY__";
 
 // lock info
-export const LOCK_INFO_KEY = 'LOCK__INFO__KEY__';
+export const LOCK_INFO_KEY = "LOCK__INFO__KEY__";
 
-export const MULTIPLE_TABS_KEY = 'MULTIPLE_TABS__KEY__';
+export const MULTIPLE_TABS_KEY = "MULTIPLE_TABS__KEY__";
 
-export const APP_DARK_MODE_KEY_ = '__APP__DARK__MODE__';
+export const APP_DARK_MODE_KEY_ = "__APP__DARK__MODE__";
 
 // base global local key
-export const APP_LOCAL_CACHE_KEY = 'COMMON__LOCAL__KEY__';
+export const APP_LOCAL_CACHE_KEY = "COMMON__LOCAL__KEY__";
 
 // base global session key
-export const APP_SESSION_CACHE_KEY = 'COMMON__SESSION__KEY__';
+export const APP_SESSION_CACHE_KEY = "COMMON__SESSION__KEY__";
 
 export enum CacheTypeEnum {
   SESSION,
diff --git a/src/enums/exceptionEnum.ts b/src/enums/exceptionEnum.ts
index d28f4d0e35edc540849e480b113ac5a5b8d55839..521f145ef9d94fda75256edd1ae1a05f7c08a7ed 100644
--- a/src/enums/exceptionEnum.ts
+++ b/src/enums/exceptionEnum.ts
@@ -19,9 +19,9 @@ export enum ExceptionEnum {
 }
 
 export enum ErrorTypeEnum {
-  VUE = 'vue',
-  SCRIPT = 'script',
-  RESOURCE = 'resource',
-  AJAX = 'ajax',
-  PROMISE = 'promise',
+  VUE = "vue",
+  SCRIPT = "script",
+  RESOURCE = "resource",
+  AJAX = "ajax",
+  PROMISE = "promise",
 }
diff --git a/src/enums/httpEnum.ts b/src/enums/httpEnum.ts
index 4944af5c2cfe7e897fd4da46af0e0e2ae81bde6c..695b38af73c07b194cf6a94b872ab701bbba8b6a 100644
--- a/src/enums/httpEnum.ts
+++ b/src/enums/httpEnum.ts
@@ -2,30 +2,30 @@
  * @description: Request result set
  */
 export enum ResultEnum {
-  SUCCESS = 0,
-  ERROR = 1,
+  SUCCESS = 200,
+  ERROR = -1,
   TIMEOUT = 401,
-  TYPE = 'success',
+  TYPE = "success",
 }
 
 /**
  * @description: request method
  */
 export enum RequestEnum {
-  GET = 'GET',
-  POST = 'POST',
-  PUT = 'PUT',
-  DELETE = 'DELETE',
+  GET = "GET",
+  POST = "POST",
+  PUT = "PUT",
+  DELETE = "DELETE",
 }
 
 /**
- * @description:  contentTyp
+ * @description:  contentType
  */
 export enum ContentTypeEnum {
   // json
-  JSON = 'application/json;charset=UTF-8',
+  JSON = "application/json;charset=UTF-8",
   // form-data qs
-  FORM_URLENCODED = 'application/x-www-form-urlencoded;charset=UTF-8',
+  FORM_URLENCODED = "application/x-www-form-urlencoded;charset=UTF-8",
   // form-data  upload
-  FORM_DATA = 'multipart/form-data;charset=UTF-8',
+  FORM_DATA = "multipart/form-data;charset=UTF-8",
 }
diff --git a/src/enums/menuEnum.ts b/src/enums/menuEnum.ts
index 89cfa9f5c3046b1d6a8a28a080e418881c34e318..d5e02fe716b52f329dfdee8b0a844bea6266bbbd 100644
--- a/src/enums/menuEnum.ts
+++ b/src/enums/menuEnum.ts
@@ -3,33 +3,33 @@
  */
 export enum MenuTypeEnum {
   // left menu
-  SIDEBAR = 'sidebar',
+  SIDEBAR = "sidebar",
 
-  MIX_SIDEBAR = 'mix-sidebar',
+  MIX_SIDEBAR = "mix-sidebar",
   // mixin menu
-  MIX = 'mix',
+  MIX = "mix",
   // top menu
-  TOP_MENU = 'top-menu',
+  TOP_MENU = "top-menu",
 }
 
 // 折叠触发器位置
 export enum TriggerEnum {
   // 不显示
-  NONE = 'NONE',
+  NONE = "NONE",
   // 菜单底部
-  FOOTER = 'FOOTER',
+  FOOTER = "FOOTER",
   // 头部
-  HEADER = 'HEADER',
+  HEADER = "HEADER",
 }
 
-export type Mode = 'vertical' | 'vertical-right' | 'horizontal' | 'inline';
+export type Mode = "vertical" | "vertical-right" | "horizontal" | "inline";
 
 // menu mode
 export enum MenuModeEnum {
-  VERTICAL = 'vertical',
-  HORIZONTAL = 'horizontal',
-  VERTICAL_RIGHT = 'vertical-right',
-  INLINE = 'inline',
+  VERTICAL = "vertical",
+  HORIZONTAL = "horizontal",
+  VERTICAL_RIGHT = "vertical-right",
+  INLINE = "inline",
 }
 
 export enum MenuSplitTyeEnum {
@@ -39,12 +39,12 @@ export enum MenuSplitTyeEnum {
 }
 
 export enum TopMenuAlignEnum {
-  CENTER = 'center',
-  START = 'start',
-  END = 'end',
+  CENTER = "center",
+  START = "start",
+  END = "end",
 }
 
 export enum MixSidebarTriggerEnum {
-  HOVER = 'hover',
-  CLICK = 'click',
+  HOVER = "hover",
+  CLICK = "click",
 }
diff --git a/src/enums/pageEnum.ts b/src/enums/pageEnum.ts
index c7ca3632487393e40df02a4c00a1e9e1b810cadb..317c76f4f877c43e56de764a65e49ff7c1680f25 100644
--- a/src/enums/pageEnum.ts
+++ b/src/enums/pageEnum.ts
@@ -1,10 +1,10 @@
 export enum PageEnum {
   // basic login path
-  BASE_LOGIN = '/login',
+  BASE_LOGIN = "/login",
   // basic home path
-  BASE_HOME = '/dashboard',
+  BASE_HOME = "/dashboard",
   // error page path
-  ERROR_PAGE = '/exception',
+  ERROR_PAGE = "/exception",
   // error log page path
-  ERROR_LOG_PAGE = '/error-log/list',
+  ERROR_LOG_PAGE = "/error-log/list",
 }
diff --git a/src/enums/roleEnum.ts b/src/enums/roleEnum.ts
index 857868d59a7641983b94cce622595738838732a3..ff8b8f02d4f9785210ec4b03bd9f3ce4cce344bf 100644
--- a/src/enums/roleEnum.ts
+++ b/src/enums/roleEnum.ts
@@ -1,7 +1,7 @@
 export enum RoleEnum {
   // super admin
-  SUPER = 'super',
+  SUPER = "super",
 
   // tester
-  TEST = 'test',
+  TEST = "test",
 }
diff --git a/src/enums/sizeEnum.ts b/src/enums/sizeEnum.ts
index 9bac18437c03265a9179494ec589420ca44b6848..d4694dfba569d662344e442a253cb14b5225e0d9 100644
--- a/src/enums/sizeEnum.ts
+++ b/src/enums/sizeEnum.ts
@@ -1,7 +1,7 @@
 export enum SizeEnum {
-  DEFAULT = 'default',
-  SMALL = 'small',
-  LARGE = 'large',
+  DEFAULT = "default",
+  SMALL = "small",
+  LARGE = "large",
 }
 
 export enum SizeNumberEnum {
diff --git a/src/enums/tableOperationTypeEnum.ts b/src/enums/tableOperationTypeEnum.ts
new file mode 100644
index 0000000000000000000000000000000000000000..91f18c421fa78c834fed8e70714c4f1f9a260e88
--- /dev/null
+++ b/src/enums/tableOperationTypeEnum.ts
@@ -0,0 +1,4 @@
+export enum TableOperationTypeEnum {
+  UPDATE = "update",
+  SAVE = "save",
+}
diff --git a/src/hooks/component/useFormItem.ts b/src/hooks/component/useFormItem.ts
index cee415e887378b1f35d8ef529fe98b84f9cbe575..25f8875d0d7dea72b226af79f752b27a71e42a24 100644
--- a/src/hooks/component/useFormItem.ts
+++ b/src/hooks/component/useFormItem.ts
@@ -1,4 +1,4 @@
-import type { UnwrapRef, Ref, WritableComputedRef, DeepReadonly } from 'vue';
+import type { UnwrapRef, Ref, WritableComputedRef, DeepReadonly } from "vue";
 import {
   reactive,
   readonly,
@@ -8,9 +8,9 @@ import {
   unref,
   nextTick,
   toRaw,
-} from 'vue';
+} from "vue";
 
-import { isEqual } from 'lodash-es';
+import { isEqual } from "lodash-es";
 
 export function useRuleFormItem<T extends Recordable, K extends keyof T, V = UnwrapRef<T[K]>>(
   props: T,
@@ -21,8 +21,8 @@ export function useRuleFormItem<T extends Recordable, K extends keyof T, V = Unw
 
 export function useRuleFormItem<T extends Recordable>(
   props: T,
-  key: keyof T = 'value',
-  changeEvent = 'change',
+  key: keyof T = "value",
+  changeEvent = "change",
   emitData?: Ref<any[]>,
 ) {
   const instance = getCurrentInstance();
diff --git a/src/hooks/component/usePageContext.ts b/src/hooks/component/usePageContext.ts
index 12cc160572ecbf115693b6d9eeb48331fc59cd2a..10a3256027d9aefb79b9f83d49960165fa7ea04c 100644
--- a/src/hooks/component/usePageContext.ts
+++ b/src/hooks/component/usePageContext.ts
@@ -1,5 +1,5 @@
-import type { InjectionKey, ComputedRef, Ref } from 'vue';
-import { createContext, useContext } from '/@/hooks/core/useContext';
+import type { InjectionKey, ComputedRef, Ref } from "vue";
+import { createContext, useContext } from "/@/hooks/core/useContext";
 
 export interface PageContextProps {
   contentHeight: ComputedRef<number>;
diff --git a/src/hooks/core/onMountedOrActivated.ts b/src/hooks/core/onMountedOrActivated.ts
index ffabf18deff5000fcf138687598f6deee7e0af89..1570d2fba86ec5e43b39f353a80a9cdf01eb2651 100644
--- a/src/hooks/core/onMountedOrActivated.ts
+++ b/src/hooks/core/onMountedOrActivated.ts
@@ -1,4 +1,4 @@
-import { nextTick, onMounted, onActivated } from 'vue';
+import { nextTick, onMounted, onActivated } from "vue";
 
 export function onMountedOrActivated(hook: Fn) {
   let mounted: boolean;
diff --git a/src/hooks/core/useAttrs.ts b/src/hooks/core/useAttrs.ts
index a7c5bd74c60204d6c5d636288a5570fd05393462..72a9abb9b0543a76fd6760bdbef4cbd973a33225 100644
--- a/src/hooks/core/useAttrs.ts
+++ b/src/hooks/core/useAttrs.ts
@@ -1,12 +1,12 @@
-import { getCurrentInstance, reactive, shallowRef, watchEffect } from 'vue';
-import type { Ref } from 'vue';
+import { getCurrentInstance, reactive, shallowRef, watchEffect } from "vue";
+import type { Ref } from "vue";
 interface Params {
   excludeListeners?: boolean;
   excludeKeys?: string[];
   excludeDefaultKeys?: boolean;
 }
 
-const DEFAULT_EXCLUDE_KEYS = ['class', 'style'];
+const DEFAULT_EXCLUDE_KEYS = ["class", "style"];
 const LISTENER_PREFIX = /^on[A-Z]/;
 
 export function entries<T>(obj: Recordable<T>): [string, T][] {
diff --git a/src/hooks/core/useContext.ts b/src/hooks/core/useContext.ts
index 522e10bb2e932e13824fb22c379bb2242bfc56e8..6cdcfc395698b35fd7fc8ced4c53c58c1749f2f5 100644
--- a/src/hooks/core/useContext.ts
+++ b/src/hooks/core/useContext.ts
@@ -6,7 +6,7 @@ import {
   readonly as defineReadonly,
   // defineComponent,
   UnwrapRef,
-} from 'vue';
+} from "vue";
 
 export interface CreateContextOptions {
   readonly?: boolean;
@@ -35,7 +35,6 @@ export function createContext<T>(
 }
 
 export function useContext<T>(key: InjectionKey<T>, native?: boolean): T;
-export function useContext<T>(key: InjectionKey<T>, defaultValue?: any, native?: boolean): T;
 
 export function useContext<T>(
   key: InjectionKey<T> = Symbol(),
diff --git a/src/hooks/core/useLockFn.ts b/src/hooks/core/useLockFn.ts
index 0a8b3a79e63d7a5af16ac6cc3f915e858fb7f0da..02c1c29889ef81402bb2eda73535f09daf5130f7 100644
--- a/src/hooks/core/useLockFn.ts
+++ b/src/hooks/core/useLockFn.ts
@@ -1,4 +1,4 @@
-import { ref, unref } from 'vue';
+import { ref, unref } from "vue";
 
 export function useLockFn<P extends any[] = any[], V = any>(fn: (...args: P) => Promise<V>) {
   const lockRef = ref(false);
diff --git a/src/hooks/core/useRefs.ts b/src/hooks/core/useRefs.ts
index 180bb1497b4971b220ed26652015bc106f192055..f9f68f9730aea6e07ba87912d0eea7868cc97a31 100644
--- a/src/hooks/core/useRefs.ts
+++ b/src/hooks/core/useRefs.ts
@@ -1,5 +1,5 @@
-import type { Ref } from 'vue';
-import { ref, onBeforeUpdate } from 'vue';
+import type { Ref } from "vue";
+import { ref, onBeforeUpdate } from "vue";
 
 export function useRefs(): [Ref<HTMLElement[]>, (index: number) => (el: HTMLElement) => void] {
   const refs = ref([]) as Ref<HTMLElement[]>;
diff --git a/src/hooks/core/useTimeout.ts b/src/hooks/core/useTimeout.ts
index 9905c2b6f619ca6755b45877e2086b9e0f047b41..e0710c1007efb12a987de08bd00670bcc4cf567e 100644
--- a/src/hooks/core/useTimeout.ts
+++ b/src/hooks/core/useTimeout.ts
@@ -1,10 +1,10 @@
-import { ref, watch } from 'vue';
-import { tryOnUnmounted } from '@vueuse/core';
-import { isFunction } from '/@/utils/is';
+import { ref, watch } from "vue";
+import { tryOnUnmounted } from "@vueuse/core";
+import { isFunction } from "/@/utils/is";
 
 export function useTimeoutFn(handle: Fn<any>, wait: number, native = false) {
   if (!isFunction(handle)) {
-    throw new Error('handle is not Function!');
+    throw new Error("handle is not Function!");
   }
 
   const { readyRef, stop, start } = useTimeoutRef(wait);
diff --git a/src/hooks/event/useBreakpoint.ts b/src/hooks/event/useBreakpoint.ts
index 01bbbecc50ffd5a2dcdcc4bc6e24a76098ece90b..106533b5f46873db4fa220e6eca50fc797e18b73 100644
--- a/src/hooks/event/useBreakpoint.ts
+++ b/src/hooks/event/useBreakpoint.ts
@@ -1,6 +1,6 @@
-import { ref, computed, ComputedRef, unref } from 'vue';
-import { useEventListener } from '/@/hooks/event/useEventListener';
-import { screenMap, sizeEnum, screenEnum } from '/@/enums/breakpointEnum';
+import { ref, computed, ComputedRef, unref } from "vue";
+import { useEventListener } from "/@/hooks/event/useEventListener";
+import { screenMap, sizeEnum, screenEnum } from "/@/enums/breakpointEnum";
 
 let globalScreenRef: ComputedRef<sizeEnum | undefined>;
 let globalWidthRef: ComputedRef<number>;
@@ -54,7 +54,7 @@ export function createBreakpointListen(fn?: (opt: CreateCallbackParams) => void)
 
   useEventListener({
     el: window,
-    name: 'resize',
+    name: "resize",
 
     listener: () => {
       getWindowWidth();
diff --git a/src/hooks/event/useEventListener.ts b/src/hooks/event/useEventListener.ts
index 892cd92e1e741eb1b204715b5a8e077b9ca6d452..89915ff86774746ea8c8d9c81ef049c46e56cab5 100644
--- a/src/hooks/event/useEventListener.ts
+++ b/src/hooks/event/useEventListener.ts
@@ -1,6 +1,6 @@
-import type { Ref } from 'vue';
-import { ref, watch, unref } from 'vue';
-import { useThrottleFn, useDebounceFn } from '@vueuse/core';
+import type { Ref } from "vue";
+import { ref, watch, unref } from "vue";
+import { useThrottleFn, useDebounceFn } from "@vueuse/core";
 
 export type RemoveEventFn = () => void;
 export interface UseEventParams {
diff --git a/src/hooks/event/useIntersectionObserver.ts b/src/hooks/event/useIntersectionObserver.ts
index b9badcaee2e47e4c92fb24ea7504d1279d2a9589..285a27f7fe96cca36447f5f4d6f53b9c1d086971 100644
--- a/src/hooks/event/useIntersectionObserver.ts
+++ b/src/hooks/event/useIntersectionObserver.ts
@@ -1,4 +1,4 @@
-import { Ref, watchEffect, ref } from 'vue';
+import { Ref, watchEffect, ref } from "vue";
 
 interface IntersectionObserverProps {
   target: Ref<Element | null | undefined>;
@@ -12,7 +12,7 @@ export function useIntersectionObserver({
   target,
   root,
   onIntersect,
-  rootMargin = '0px',
+  rootMargin = "0px",
   threshold = 0.1,
 }: IntersectionObserverProps) {
   let cleanup = () => {};
diff --git a/src/hooks/event/useScroll.ts b/src/hooks/event/useScroll.ts
index cc60f9bf5fca615962f319370471435f346791a7..8296886a9e7c4d8c44446654baba1fe979cef450 100644
--- a/src/hooks/event/useScroll.ts
+++ b/src/hooks/event/useScroll.ts
@@ -1,8 +1,8 @@
-import type { Ref } from 'vue';
+import type { Ref } from "vue";
 
-import { ref, onMounted, watch, onUnmounted } from 'vue';
-import { isWindow, isObject } from '/@/utils/is';
-import { useThrottleFn } from '@vueuse/core';
+import { ref, onMounted, watch, onUnmounted } from "vue";
+import { isWindow, isObject } from "/@/utils/is";
+import { useThrottleFn } from "@vueuse/core";
 
 export function useScroll(
   refEl: Ref<Element | Window | null>,
@@ -28,7 +28,7 @@ export function useScroll(
     let wait = 0;
     if (options.wait && options.wait > 0) {
       wait = options.wait;
-      Reflect.deleteProperty(options, 'wait');
+      Reflect.deleteProperty(options, "wait");
     }
 
     handler = useThrottleFn(handler, wait);
@@ -40,13 +40,13 @@ export function useScroll(
       refEl,
       (el, prevEl, onCleanup) => {
         if (el) {
-          el.addEventListener('scroll', handler);
+          el.addEventListener("scroll", handler);
         } else if (prevEl) {
-          prevEl.removeEventListener('scroll', handler);
+          prevEl.removeEventListener("scroll", handler);
         }
         onCleanup(() => {
           refX.value = refY.value = 0;
-          el && el.removeEventListener('scroll', handler);
+          el && el.removeEventListener("scroll", handler);
         });
       },
       { immediate: true },
@@ -54,7 +54,7 @@ export function useScroll(
   });
 
   onUnmounted(() => {
-    refEl.value && refEl.value.removeEventListener('scroll', handler);
+    refEl.value && refEl.value.removeEventListener("scroll", handler);
   });
 
   function stop() {
diff --git a/src/hooks/event/useScrollTo.ts b/src/hooks/event/useScrollTo.ts
index f6d5dc61bfe96563fe9af0d44c58973582868a2e..8a875467ff79830ac5c26ed14245f1bdb3a4f129 100644
--- a/src/hooks/event/useScrollTo.ts
+++ b/src/hooks/event/useScrollTo.ts
@@ -1,5 +1,5 @@
-import { isFunction, isUnDef } from '/@/utils/is';
-import { ref, unref } from 'vue';
+import { isFunction, isUnDef } from "/@/utils/is";
+import { ref, unref } from "vue";
 
 export interface ScrollToParams {
   el: any;
diff --git a/src/hooks/event/useWindowSizeFn.ts b/src/hooks/event/useWindowSizeFn.ts
index 7b18ca0ebd609e6a813226d7da4e14713b78c246..e7988e18e511702ec8fe572d562b072d2ce2413c 100644
--- a/src/hooks/event/useWindowSizeFn.ts
+++ b/src/hooks/event/useWindowSizeFn.ts
@@ -1,5 +1,4 @@
-import { tryOnMounted, tryOnUnmounted } from '@vueuse/core';
-import { useDebounceFn } from '@vueuse/core';
+import { tryOnMounted, tryOnUnmounted, useDebounceFn } from "@vueuse/core";
 
 interface WindowSizeOptions {
   once?: boolean;
@@ -18,11 +17,11 @@ export function useWindowSizeFn<T>(fn: Fn<T>, wait = 150, options?: WindowSizeOp
     if (options && options.immediate) {
       handler();
     }
-    window.addEventListener('resize', handler);
+    window.addEventListener("resize", handler);
   };
 
   const stop = () => {
-    window.removeEventListener('resize', handler);
+    window.removeEventListener("resize", handler);
   };
 
   tryOnMounted(() => {
diff --git a/src/hooks/setting/index.ts b/src/hooks/setting/index.ts
index 56e393fa12d0db3ad7ccdbbe2604c1fbac4c6f5d..e8c9586a851793b107fc0425cbbbe9f821bad080 100644
--- a/src/hooks/setting/index.ts
+++ b/src/hooks/setting/index.ts
@@ -1,7 +1,7 @@
-import type { GlobConfig } from '/#/config';
+import type { GlobConfig } from "/#/config";
 
-import { warn } from '/@/utils/log';
-import { getAppEnvConfig } from '/@/utils/env';
+import { warn } from "/@/utils/log";
+import { getAppEnvConfig } from "/@/utils/env";
 
 export const useGlobSetting = (): Readonly<GlobConfig> => {
   const {
diff --git a/src/hooks/setting/useHeaderSetting.ts b/src/hooks/setting/useHeaderSetting.ts
index d590be8cf71635a747c187f506efc9a071cff800..bad96e05aba048806198eceae95c676f8d05c24d 100644
--- a/src/hooks/setting/useHeaderSetting.ts
+++ b/src/hooks/setting/useHeaderSetting.ts
@@ -1,13 +1,13 @@
-import type { HeaderSetting } from '/#/config';
+import type { HeaderSetting } from "/#/config";
 
-import { computed, unref } from 'vue';
+import { computed, unref } from "vue";
 
-import { useAppStore } from '/@/store/modules/app';
+import { useAppStore } from "/@/store/modules/app";
 
-import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
-import { useRootSetting } from '/@/hooks/setting/useRootSetting';
-import { useFullContent } from '/@/hooks/web/useFullContent';
-import { MenuModeEnum } from '/@/enums/menuEnum';
+import { useMenuSetting } from "/@/hooks/setting/useMenuSetting";
+import { useRootSetting } from "/@/hooks/setting/useRootSetting";
+import { useFullContent } from "/@/hooks/web/useFullContent";
+import { MenuModeEnum } from "/@/enums/menuEnum";
 
 export function useHeaderSetting() {
   const { getFullContent } = useFullContent();
diff --git a/src/hooks/setting/useMenuSetting.ts b/src/hooks/setting/useMenuSetting.ts
index 62ccf42fba8b89e317d6d1fde953f8bc9c59727d..6290dc6a91408ea64d3b11cb3298bd937617aa6a 100644
--- a/src/hooks/setting/useMenuSetting.ts
+++ b/src/hooks/setting/useMenuSetting.ts
@@ -1,12 +1,12 @@
-import type { MenuSetting } from '/#/config';
+import type { MenuSetting } from "/#/config";
 
-import { computed, unref, ref } from 'vue';
+import { computed, unref, ref } from "vue";
 
-import { useAppStore } from '/@/store/modules/app';
+import { useAppStore } from "/@/store/modules/app";
 
-import { SIDE_BAR_MINI_WIDTH, SIDE_BAR_SHOW_TIT_MINI_WIDTH } from '/@/enums/appEnum';
-import { MenuModeEnum, MenuTypeEnum, TriggerEnum } from '/@/enums/menuEnum';
-import { useFullContent } from '/@/hooks/web/useFullContent';
+import { SIDE_BAR_MINI_WIDTH, SIDE_BAR_SHOW_TIT_MINI_WIDTH } from "/@/enums/appEnum";
+import { MenuModeEnum, MenuTypeEnum, TriggerEnum } from "/@/enums/menuEnum";
+import { useFullContent } from "/@/hooks/web/useFullContent";
 
 const mixSideHasChildren = ref(false);
 
@@ -101,8 +101,12 @@ export function useMenuSetting() {
   });
 
   const getMiniWidthNumber = computed(() => {
-    const { collapsedShowTitle } = appStore.getMenuSetting;
-    return collapsedShowTitle ? SIDE_BAR_SHOW_TIT_MINI_WIDTH : SIDE_BAR_MINI_WIDTH;
+    const { collapsedShowTitle, siderHidden } = appStore.getMenuSetting;
+    return siderHidden
+      ? 0
+      : collapsedShowTitle
+      ? SIDE_BAR_SHOW_TIT_MINI_WIDTH
+      : SIDE_BAR_MINI_WIDTH;
   });
 
   const getCalcContentWidth = computed(() => {
diff --git a/src/hooks/setting/useMultipleTabSetting.ts b/src/hooks/setting/useMultipleTabSetting.ts
index 7caa753788a5e2e7b6ac275ea7aed841f4c933df..772248ffe0c766171c94c026a33b4e6f5e4e1856 100644
--- a/src/hooks/setting/useMultipleTabSetting.ts
+++ b/src/hooks/setting/useMultipleTabSetting.ts
@@ -1,8 +1,8 @@
-import type { MultiTabsSetting } from '/#/config';
+import type { MultiTabsSetting } from "/#/config";
 
-import { computed } from 'vue';
+import { computed } from "vue";
 
-import { useAppStore } from '/@/store/modules/app';
+import { useAppStore } from "/@/store/modules/app";
 
 export function useMultipleTabSetting() {
   const appStore = useAppStore();
diff --git a/src/hooks/setting/useRootSetting.ts b/src/hooks/setting/useRootSetting.ts
index 4976e40acba0f645711afa572c0739860e5142cd..2e53503a502562e09144da161dd712377b0f2e32 100644
--- a/src/hooks/setting/useRootSetting.ts
+++ b/src/hooks/setting/useRootSetting.ts
@@ -1,13 +1,13 @@
-import type { ProjectConfig } from '/#/config';
+import type { ProjectConfig } from "/#/config";
 
-import { computed } from 'vue';
+import { computed } from "vue";
 
-import { useAppStore } from '/@/store/modules/app';
-import { ContentEnum, ThemeEnum } from '/@/enums/appEnum';
+import { useAppStore } from "/@/store/modules/app";
+import { ContentEnum, ThemeEnum } from "/@/enums/appEnum";
 
 type RootSetting = Omit<
   ProjectConfig,
-  'locale' | 'headerSetting' | 'menuSetting' | 'multiTabsSetting'
+  "locale" | "headerSetting" | "menuSetting" | "multiTabsSetting"
 >;
 
 export function useRootSetting() {
diff --git a/src/hooks/setting/useTransitionSetting.ts b/src/hooks/setting/useTransitionSetting.ts
index b6d421afb23806fcca59cc5620fd0cb8fb9ee1dc..105794c2845c09ca05315e3b32807e7908b48145 100644
--- a/src/hooks/setting/useTransitionSetting.ts
+++ b/src/hooks/setting/useTransitionSetting.ts
@@ -1,8 +1,8 @@
-import type { TransitionSetting } from '/#/config';
+import type { TransitionSetting } from "/#/config";
 
-import { computed } from 'vue';
+import { computed } from "vue";
 
-import { useAppStore } from '/@/store/modules/app';
+import { useAppStore } from "/@/store/modules/app";
 
 export function useTransitionSetting() {
   const appStore = useAppStore();
diff --git a/src/hooks/web/useAppInject.ts b/src/hooks/web/useAppInject.ts
index 7d6efb2b83a1dfc4a1bed22699f55af645dcacd8..db0c7ceb97e64eb159a989433611b651db2f8ec6 100644
--- a/src/hooks/web/useAppInject.ts
+++ b/src/hooks/web/useAppInject.ts
@@ -1,5 +1,5 @@
-import { useAppProviderContext } from '/@/components/Application';
-import { computed, unref } from 'vue';
+import { useAppProviderContext } from "/@/components/Application";
+import { computed, unref } from "vue";
 
 export function useAppInject() {
   const values = useAppProviderContext();
diff --git a/src/hooks/web/useContentHeight.ts b/src/hooks/web/useContentHeight.ts
index d51f4ca4f0cca50c577f21ea9caced481d1554e0..59c4ab47855f13543a6af52ec2848b060160ddf5 100644
--- a/src/hooks/web/useContentHeight.ts
+++ b/src/hooks/web/useContentHeight.ts
@@ -1,9 +1,9 @@
-import { ComputedRef, isRef, nextTick, Ref, ref, unref, watch } from 'vue';
-import { onMountedOrActivated } from '/@/hooks/core/onMountedOrActivated';
-import { useWindowSizeFn } from '/@/hooks/event/useWindowSizeFn';
-import { useLayoutHeight } from '/@/layouts/default/content/useContentViewHeight';
-import { getViewportOffset } from '/@/utils/domUtils';
-import { isNumber, isString } from '/@/utils/is';
+import { ComputedRef, isRef, nextTick, Ref, ref, unref, watch } from "vue";
+import { onMountedOrActivated } from "/@/hooks/core/onMountedOrActivated";
+import { useWindowSizeFn } from "/@/hooks/event/useWindowSizeFn";
+import { useLayoutHeight } from "/@/layouts/default/content/useContentViewHeight";
+import { getViewportOffset } from "/@/utils/domUtils";
+import { isNumber, isString } from "/@/utils/is";
 
 export interface CompensationHeight {
   // 使用 layout Footer 高度作为判断补偿高度的条件
@@ -52,25 +52,25 @@ export function useContentHeight(
 
   function calcSubtractSpace(
     element: Element | null | undefined,
-    direction: 'all' | 'top' | 'bottom' = 'all',
+    direction: "all" | "top" | "bottom" = "all",
   ): number {
     function numberPx(px: string) {
-      return Number(px.replace(/[^\d]/g, ''));
+      return Number(px.replace(/[^\d]/g, ""));
     }
     let subtractHeight = 0;
-    const ZERO_PX = '0px';
+    const ZERO_PX = "0px";
     if (element) {
       const cssStyle = getComputedStyle(element);
       const marginTop = numberPx(cssStyle?.marginTop ?? ZERO_PX);
       const marginBottom = numberPx(cssStyle?.marginBottom ?? ZERO_PX);
       const paddingTop = numberPx(cssStyle?.paddingTop ?? ZERO_PX);
       const paddingBottom = numberPx(cssStyle?.paddingBottom ?? ZERO_PX);
-      if (direction === 'all') {
+      if (direction === "all") {
         subtractHeight += marginTop;
         subtractHeight += marginBottom;
         subtractHeight += paddingTop;
         subtractHeight += paddingBottom;
-      } else if (direction === 'top') {
+      } else if (direction === "top") {
         subtractHeight += marginTop;
         subtractHeight += paddingTop;
       } else {
@@ -121,14 +121,14 @@ export function useContentHeight(
         if (parent) {
           if (isString(upwardLvlOrClass)) {
             if (!parent.classList.contains(upwardLvlOrClass)) {
-              upwardSpaceHeight += calcSubtractSpace(parent, 'bottom');
+              upwardSpaceHeight += calcSubtractSpace(parent, "bottom");
               upward(parent, upwardLvlOrClass);
             } else {
-              upwardSpaceHeight += calcSubtractSpace(parent, 'bottom');
+              upwardSpaceHeight += calcSubtractSpace(parent, "bottom");
             }
           } else if (isNumber(upwardLvlOrClass)) {
             if (upwardLvlOrClass > 0) {
-              upwardSpaceHeight += calcSubtractSpace(parent, 'bottom');
+              upwardSpaceHeight += calcSubtractSpace(parent, "bottom");
               upward(parent, --upwardLvlOrClass);
             }
           }
@@ -182,7 +182,7 @@ export function useContentHeight(
       calcContentHeight();
     },
     {
-      flush: 'post',
+      flush: "post",
       immediate: true,
     },
   );
diff --git a/src/hooks/web/useContextMenu.ts b/src/hooks/web/useContextMenu.ts
index d3c53ce68a7e1ac102c51ba21c616a587a66cb95..c37c8d18f519b4b4ab9b043eb75cd05ffc522798 100644
--- a/src/hooks/web/useContextMenu.ts
+++ b/src/hooks/web/useContextMenu.ts
@@ -1,6 +1,6 @@
-import { onUnmounted, getCurrentInstance } from 'vue';
-import { createContextMenu, destroyContextMenu } from '/@/components/ContextMenu';
-import type { ContextMenuItem } from '/@/components/ContextMenu';
+import { onUnmounted, getCurrentInstance } from "vue";
+import { createContextMenu, destroyContextMenu } from "/@/components/ContextMenu";
+import type { ContextMenuItem } from "/@/components/ContextMenu";
 export type { ContextMenuItem };
 export function useContextMenu(authRemove = true) {
   if (getCurrentInstance() && authRemove) {
diff --git a/src/hooks/web/useCopyToClipboard.ts b/src/hooks/web/useCopyToClipboard.ts
index 69abf26d8657fa2b9a9ff5a17b1e0b3f4c028caa..195e2c7483acaca66a9fe6915d80aaeaaf791fa9 100644
--- a/src/hooks/web/useCopyToClipboard.ts
+++ b/src/hooks/web/useCopyToClipboard.ts
@@ -1,11 +1,11 @@
-import { ref, watch } from 'vue';
+import { ref, watch } from "vue";
 
-import { isDef } from '/@/utils/is';
+import { isDef } from "/@/utils/is";
 interface Options {
   target?: HTMLElement;
 }
 export function useCopyToClipboard(initial?: string) {
-  const clipboardRef = ref(initial || '');
+  const clipboardRef = ref(initial || "");
   const isSuccessRef = ref(false);
   const copiedRef = ref(false);
 
@@ -17,24 +17,24 @@ export function useCopyToClipboard(initial?: string) {
         isSuccessRef.value = copyTextToClipboard(str);
       }
     },
-    { immediate: !!initial, flush: 'sync' },
+    { immediate: !!initial, flush: "sync" },
   );
 
   return { clipboardRef, isSuccessRef, copiedRef };
 }
 
 export function copyTextToClipboard(input: string, { target = document.body }: Options = {}) {
-  const element = document.createElement('textarea');
+  const element = document.createElement("textarea");
   const previouslyFocusedElement = document.activeElement;
 
   element.value = input;
 
-  element.setAttribute('readonly', '');
+  element.setAttribute("readonly", "");
 
-  (element.style as any).contain = 'strict';
-  element.style.position = 'absolute';
-  element.style.left = '-9999px';
-  element.style.fontSize = '12pt';
+  (element.style as any).contain = "strict";
+  element.style.position = "absolute";
+  element.style.left = "-9999px";
+  element.style.fontSize = "12pt";
 
   const selection = document.getSelection();
   let originalRange;
@@ -50,7 +50,7 @@ export function copyTextToClipboard(input: string, { target = document.body }: O
 
   let isSuccess = false;
   try {
-    isSuccess = document.execCommand('copy');
+    isSuccess = document.execCommand("copy");
   } catch (e: any) {
     throw new Error(e);
   }
diff --git a/src/hooks/web/useDesign.ts b/src/hooks/web/useDesign.ts
index 046674b64506260e4ff2a7d0ca2591991c2c2765..0cc450ea3733355e9329cb82deb6ec0b1c5b6c42 100644
--- a/src/hooks/web/useDesign.ts
+++ b/src/hooks/web/useDesign.ts
@@ -1,4 +1,4 @@
-import { useAppProviderContext } from '/@/components/Application';
+import { useAppProviderContext } from "/@/components/Application";
 // import { computed } from 'vue';
 // import { lowerFirst } from 'lodash-es';
 export function useDesign(scope: string) {
diff --git a/src/hooks/web/useECharts.ts b/src/hooks/web/useECharts.ts
index fa93e608fe9ec6de9feea14e490aac999dd4db07..4b5af57382c6107bb89ccf7c0610184db208a59e 100644
--- a/src/hooks/web/useECharts.ts
+++ b/src/hooks/web/useECharts.ts
@@ -1,22 +1,22 @@
-import type { EChartsOption } from 'echarts';
-import type { Ref } from 'vue';
-import { useTimeoutFn } from '/@/hooks/core/useTimeout';
-import { tryOnUnmounted } from '@vueuse/core';
-import { unref, nextTick, watch, computed, ref } from 'vue';
-import { useDebounceFn } from '@vueuse/core';
-import { useEventListener } from '/@/hooks/event/useEventListener';
-import { useBreakpoint } from '/@/hooks/event/useBreakpoint';
-import echarts from '/@/utils/lib/echarts';
-import { useRootSetting } from '/@/hooks/setting/useRootSetting';
+import type { EChartsOption } from "echarts";
+import type { Ref } from "vue";
+import { useTimeoutFn } from "/@/hooks/core/useTimeout";
+import { tryOnUnmounted } from "@vueuse/core";
+import { unref, nextTick, watch, computed, ref } from "vue";
+import { useDebounceFn } from "@vueuse/core";
+import { useEventListener } from "/@/hooks/event/useEventListener";
+import { useBreakpoint } from "/@/hooks/event/useBreakpoint";
+import echarts from "/@/utils/lib/echarts";
+import { useRootSetting } from "/@/hooks/setting/useRootSetting";
 
 export function useECharts(
   elRef: Ref<HTMLDivElement>,
-  theme: 'light' | 'dark' | 'default' = 'default',
+  theme: "light" | "dark" | "default" = "default",
 ) {
   const { getDarkMode: getSysDarkMode } = useRootSetting();
 
   const getDarkMode = computed(() => {
-    return theme === 'default' ? getSysDarkMode.value : theme;
+    return theme === "default" ? getSysDarkMode.value : theme;
   });
   let chartInstance: echarts.ECharts | null = null;
   let resizeFn: Fn = resize;
@@ -26,11 +26,11 @@ export function useECharts(
   resizeFn = useDebounceFn(resize, 200);
 
   const getOptions = computed(() => {
-    if (getDarkMode.value !== 'dark') {
+    if (getDarkMode.value !== "dark") {
       return cacheOptions.value as EChartsOption;
     }
     return {
-      backgroundColor: 'transparent',
+      backgroundColor: "transparent",
       ...cacheOptions.value,
     } as EChartsOption;
   });
@@ -44,7 +44,7 @@ export function useECharts(
     chartInstance = echarts.init(el, t);
     const { removeEvent } = useEventListener({
       el: window,
-      name: 'resize',
+      name: "resize",
       listener: resizeFn,
     });
     removeResizeFn = removeEvent;
@@ -67,7 +67,7 @@ export function useECharts(
     nextTick(() => {
       useTimeoutFn(() => {
         if (!chartInstance) {
-          initCharts(getDarkMode.value as 'default');
+          initCharts(getDarkMode.value as "default");
 
           if (!chartInstance) return;
         }
@@ -79,7 +79,12 @@ export function useECharts(
   }
 
   function resize() {
-    chartInstance?.resize();
+    chartInstance?.resize({
+      animation: {
+        duration: 300,
+        easing: "quadraticIn",
+      },
+    });
   }
 
   watch(
@@ -87,7 +92,7 @@ export function useECharts(
     (theme) => {
       if (chartInstance) {
         chartInstance.dispose();
-        initCharts(theme as 'default');
+        initCharts(theme as "default");
         setOptions(cacheOptions.value);
       }
     },
@@ -102,7 +107,7 @@ export function useECharts(
 
   function getInstance(): echarts.ECharts | null {
     if (!chartInstance) {
-      initCharts(getDarkMode.value as 'default');
+      initCharts(getDarkMode.value as "default");
     }
     return chartInstance;
   }
diff --git a/src/hooks/web/useFullContent.ts b/src/hooks/web/useFullContent.ts
index 7dea0770926eceb7b106cf306b4cc576fe7066c8..d4405aabf710e6d16d0cd071ef93731f25cc1351 100644
--- a/src/hooks/web/useFullContent.ts
+++ b/src/hooks/web/useFullContent.ts
@@ -1,8 +1,8 @@
-import { computed, unref } from 'vue';
+import { computed, unref } from "vue";
 
-import { useAppStore } from '/@/store/modules/app';
+import { useAppStore } from "/@/store/modules/app";
 
-import { useRouter } from 'vue-router';
+import { useRouter } from "vue-router";
 
 /**
  * @description: Full screen display content
@@ -17,7 +17,7 @@ export const useFullContent = () => {
     // Query parameters, the full screen is displayed when the address bar has a full parameter
     const route = unref(currentRoute);
     const query = route.query;
-    if (query && Reflect.has(query, '__full__')) {
+    if (query && Reflect.has(query, "__full__")) {
       return true;
     }
     // Return to the configuration in the configuration file
diff --git a/src/hooks/web/useI18n.ts b/src/hooks/web/useI18n.ts
index 2a777b7815f22a3bb6cf3c4545929ea86d7fa05a..2f300bc71fb9f466043d15d6143f030993b05e11 100644
--- a/src/hooks/web/useI18n.ts
+++ b/src/hooks/web/useI18n.ts
@@ -1,4 +1,4 @@
-import { i18n } from '/@/locales/setupI18n';
+import { i18n } from "/@/locales/setupI18n";
 
 type I18nGlobalTranslation = {
   (key: string): string;
@@ -37,8 +37,8 @@ export function useI18n(namespace?: string): {
   const { t, ...methods } = i18n.global;
 
   const tFn: I18nGlobalTranslation = (key: string, ...arg: any[]) => {
-    if (!key) return '';
-    if (!key.includes('.') && !namespace) return key;
+    if (!key) return "";
+    if (!key.includes(".") && !namespace) return key;
     return t(getKey(namespace, key), ...(arg as I18nTranslationRestParameters));
   };
   return {
diff --git a/src/hooks/web/useLockPage.ts b/src/hooks/web/useLockPage.ts
index c543be9542090b8f1cf683c36b50a25515a6091f..1281493a3a32d0dd0feb5d524a9a1b6c9a12d836 100644
--- a/src/hooks/web/useLockPage.ts
+++ b/src/hooks/web/useLockPage.ts
@@ -1,11 +1,11 @@
-import { computed, onUnmounted, unref, watchEffect } from 'vue';
-import { useThrottleFn } from '@vueuse/core';
+import { computed, onUnmounted, unref, watchEffect } from "vue";
+import { useThrottleFn } from "@vueuse/core";
 
-import { useAppStore } from '/@/store/modules/app';
-import { useLockStore } from '/@/store/modules/lock';
+import { useAppStore } from "/@/store/modules/app";
+import { useLockStore } from "/@/store/modules/lock";
 
-import { useUserStore } from '/@/store/modules/user';
-import { useRootSetting } from '../setting/useRootSetting';
+import { useUserStore } from "/@/store/modules/user";
+import { useRootSetting } from "../setting/useRootSetting";
 
 export function useLockPage() {
   const { getLockTime } = useRootSetting();
diff --git a/src/hooks/web/useMessage.tsx b/src/hooks/web/useMessage.tsx
index 91112f34a09d9e836a39bddafd3e5125baeb8921..8dc856bac516c895038e209446b849ac7f907370 100644
--- a/src/hooks/web/useMessage.tsx
+++ b/src/hooks/web/useMessage.tsx
@@ -1,11 +1,11 @@
-import type { ModalFunc, ModalFuncProps } from 'ant-design-vue/lib/modal/Modal';
+import type { ModalFunc, ModalFuncProps } from "ant-design-vue/lib/modal/Modal";
 
-import { Modal, message as Message, notification } from 'ant-design-vue';
-import { InfoCircleFilled, CheckCircleFilled, CloseCircleFilled } from '@ant-design/icons-vue';
+import { Modal, message as Message, notification } from "ant-design-vue";
+import { InfoCircleFilled, CheckCircleFilled, CloseCircleFilled } from "@ant-design/icons-vue";
 
-import { NotificationArgsProps, ConfigProps } from 'ant-design-vue/lib/notification';
-import { useI18n } from './useI18n';
-import { isString } from '/@/utils/is';
+import { NotificationArgsProps, ConfigProps } from "ant-design-vue/lib/notification";
+import { useI18n } from "./useI18n";
+import { isString } from "/@/utils/is";
 
 export interface NotifyApi {
   info(config: NotificationArgsProps): void;
@@ -19,12 +19,12 @@ export interface NotifyApi {
   destroy(): void;
 }
 
-export declare type NotificationPlacement = 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight';
-export declare type IconType = 'success' | 'info' | 'error' | 'warning';
-export interface ModalOptionsEx extends Omit<ModalFuncProps, 'iconType'> {
-  iconType: 'warning' | 'success' | 'error' | 'info';
+export declare type NotificationPlacement = "topLeft" | "topRight" | "bottomLeft" | "bottomRight";
+export declare type IconType = "success" | "info" | "error" | "warning";
+export interface ModalOptionsEx extends Omit<ModalFuncProps, "iconType"> {
+  iconType: "warning" | "success" | "error" | "info";
 }
-export type ModalOptionsPartial = Partial<ModalOptionsEx> & Pick<ModalOptionsEx, 'content'>;
+export type ModalOptionsPartial = Partial<ModalOptionsEx> & Pick<ModalOptionsEx, "content">;
 
 interface ConfirmOptions {
   info: ModalFunc;
@@ -35,18 +35,18 @@ interface ConfirmOptions {
 }
 
 function getIcon(iconType: string) {
-  if (iconType === 'warning') {
+  if (iconType === "warning") {
     return <InfoCircleFilled class="modal-icon-warning" />;
-  } else if (iconType === 'success') {
+  } else if (iconType === "success") {
     return <CheckCircleFilled class="modal-icon-success" />;
-  } else if (iconType === 'info') {
+  } else if (iconType === "info") {
     return <InfoCircleFilled class="modal-icon-info" />;
   } else {
     return <CloseCircleFilled class="modal-icon-error" />;
   }
 }
 
-function renderContent({ content }: Pick<ModalOptionsEx, 'content'>) {
+function renderContent({ content }: Pick<ModalOptionsEx, "content">) {
   if (isString(content)) {
     return <div innerHTML={`<div>${content as string}</div>`}></div>;
   } else {
@@ -58,8 +58,8 @@ function renderContent({ content }: Pick<ModalOptionsEx, 'content'>) {
  * @description: Create confirmation box
  */
 function createConfirm(options: ModalOptionsEx): ConfirmOptions {
-  const iconType = options.iconType || 'warning';
-  Reflect.deleteProperty(options, 'iconType');
+  const iconType = options.iconType || "warning";
+  Reflect.deleteProperty(options, "iconType");
   const opt: ModalFuncProps = {
     centered: true,
     icon: getIcon(iconType),
@@ -72,7 +72,7 @@ function createConfirm(options: ModalOptionsEx): ConfirmOptions {
 const getBaseOptions = () => {
   const { t } = useI18n();
   return {
-    okText: t('common.okText'),
+    okText: t("common.okText"),
     centered: true,
   };
 };
@@ -87,23 +87,23 @@ function createModalOptions(options: ModalOptionsPartial, icon: string): ModalOp
 }
 
 function createSuccessModal(options: ModalOptionsPartial) {
-  return Modal.success(createModalOptions(options, 'success'));
+  return Modal.success(createModalOptions(options, "success"));
 }
 
 function createErrorModal(options: ModalOptionsPartial) {
-  return Modal.error(createModalOptions(options, 'close'));
+  return Modal.error(createModalOptions(options, "close"));
 }
 
 function createInfoModal(options: ModalOptionsPartial) {
-  return Modal.info(createModalOptions(options, 'info'));
+  return Modal.info(createModalOptions(options, "info"));
 }
 
 function createWarningModal(options: ModalOptionsPartial) {
-  return Modal.warning(createModalOptions(options, 'warning'));
+  return Modal.warning(createModalOptions(options, "warning"));
 }
 
 notification.config({
-  placement: 'topRight',
+  placement: "topRight",
   duration: 3,
 });
 
diff --git a/src/hooks/web/usePage.ts b/src/hooks/web/usePage.ts
index ffe1ebc5472f12bb4f51c01623ecf3343d393793..ce4b8e5dba072e9b81f603c1dafac21d02829673 100644
--- a/src/hooks/web/usePage.ts
+++ b/src/hooks/web/usePage.ts
@@ -1,35 +1,28 @@
-import type { RouteLocationRaw, Router } from 'vue-router';
+import type { RouteLocationRaw, Router } from "vue-router";
 
-import { PageEnum } from '/@/enums/pageEnum';
-import { isString } from '/@/utils/is';
-import { unref } from 'vue';
+import { PageEnum } from "/@/enums/pageEnum";
+import { unref } from "vue";
 
-import { useRouter } from 'vue-router';
-import { REDIRECT_NAME } from '/@/router/constant';
+import { useRouter } from "vue-router";
+import { REDIRECT_NAME } from "/@/router/constant";
 
-export type RouteLocationRawEx = Omit<RouteLocationRaw, 'path'> & { path: PageEnum };
+export type PathAsPageEnum<T> = T extends { path: string } ? T & { path: PageEnum } : T;
+export type RouteLocationRawEx = PathAsPageEnum<RouteLocationRaw>;
 
 function handleError(e: Error) {
   console.error(e);
 }
 
-// page switch
+/**
+ * page switch
+ */
 export function useGo(_router?: Router) {
-  let router;
-  if (!_router) {
-    router = useRouter();
-  }
-  const { push, replace } = _router || router;
-  function go(opt: PageEnum | RouteLocationRawEx | string = PageEnum.BASE_HOME, isReplace = false) {
+  const { push, replace } = _router || useRouter();
+  function go(opt: RouteLocationRawEx = PageEnum.BASE_HOME, isReplace = false) {
     if (!opt) {
       return;
     }
-    if (isString(opt)) {
-      isReplace ? replace(opt).catch(handleError) : push(opt).catch(handleError);
-    } else {
-      const o = opt as RouteLocationRaw;
-      isReplace ? replace(o).catch(handleError) : push(o).catch(handleError);
-    }
+    isReplace ? replace(opt).catch(handleError) : push(opt).catch(handleError);
   }
   return go;
 }
@@ -38,7 +31,7 @@ export function useGo(_router?: Router) {
  * @description: redo current page
  */
 export const useRedo = (_router?: Router) => {
-  const { push, currentRoute } = _router || useRouter();
+  const { replace, currentRoute } = _router || useRouter();
   const { query, params = {}, name, fullPath } = unref(currentRoute.value);
   function redo(): Promise<boolean> {
     return new Promise((resolve) => {
@@ -47,13 +40,13 @@ export const useRedo = (_router?: Router) => {
         return;
       }
       if (name && Object.keys(params).length > 0) {
-        params['_redirect_type'] = 'name';
-        params['path'] = String(name);
+        params["_redirect_type"] = "name";
+        params["path"] = String(name);
       } else {
-        params['_redirect_type'] = 'path';
-        params['path'] = fullPath;
+        params["_redirect_type"] = "path";
+        params["path"] = fullPath;
       }
-      push({ name: REDIRECT_NAME, params, query }).then(() => resolve(true));
+      replace({ name: REDIRECT_NAME, params, query }).then(() => resolve(true));
     });
   }
   return redo;
diff --git a/src/hooks/web/usePagination.ts b/src/hooks/web/usePagination.ts
index 1e199139e5acaa33cbc4959b644133912e5a82bc..a8c266d51663c0a5d00d702a684b0dbb35cc2c27 100644
--- a/src/hooks/web/usePagination.ts
+++ b/src/hooks/web/usePagination.ts
@@ -1,5 +1,5 @@
-import type { Ref } from 'vue';
-import { ref, unref, computed } from 'vue';
+import type { Ref } from "vue";
+import { ref, unref, computed } from "vue";
 
 function pagination<T = any>(list: T[], pageNo: number, pageSize: number): T[] {
   const offset = (pageNo - 1) * Number(pageSize);
diff --git a/src/hooks/web/usePermission.ts b/src/hooks/web/usePermission.ts
index cb2d442bde939ae5b66b624b55eb5ddb9c13a877..e762fb75272c0b8379dedfdd3edd647c94b14485 100644
--- a/src/hooks/web/usePermission.ts
+++ b/src/hooks/web/usePermission.ts
@@ -1,21 +1,21 @@
-import type { RouteRecordRaw } from 'vue-router';
+import type { RouteRecordRaw } from "vue-router";
 
-import { useAppStore } from '/@/store/modules/app';
-import { usePermissionStore } from '/@/store/modules/permission';
-import { useUserStore } from '/@/store/modules/user';
+import { useAppStore } from "/@/store/modules/app";
+import { usePermissionStore } from "/@/store/modules/permission";
+import { useUserStore } from "/@/store/modules/user";
 
-import { useTabs } from './useTabs';
+import { useTabs } from "./useTabs";
 
-import { router, resetRouter } from '/@/router';
+import { router, resetRouter } from "/@/router";
 // import { RootRoute } from '/@/router/routes';
 
-import projectSetting from '/@/settings/projectSetting';
-import { PermissionModeEnum } from '/@/enums/appEnum';
-import { RoleEnum } from '/@/enums/roleEnum';
+import projectSetting from "/@/settings/projectSetting";
+import { PermissionModeEnum } from "/@/enums/appEnum";
+import { RoleEnum } from "/@/enums/roleEnum";
 
-import { intersection } from 'lodash-es';
-import { isArray } from '/@/utils/is';
-import { useMultipleTabStore } from '/@/store/modules/multipleTab';
+import { intersection } from "lodash-es";
+import { isArray } from "/@/utils/is";
+import { useMultipleTabStore } from "/@/store/modules/multipleTab";
 
 // User permissions related operations
 export function usePermission() {
@@ -39,6 +39,7 @@ export function usePermission() {
 
   /**
    * Reset and regain authority resource information
+   * 重置和重新获得权限资源信息
    * @param id
    */
   async function resume() {
@@ -88,7 +89,7 @@ export function usePermission() {
   async function changeRole(roles: RoleEnum | RoleEnum[]): Promise<void> {
     if (projectSetting.permissionMode !== PermissionModeEnum.ROUTE_MAPPING) {
       throw new Error(
-        'Please switch PermissionModeEnum to ROUTE_MAPPING mode in the configuration to operate!',
+        "Please switch PermissionModeEnum to ROUTE_MAPPING mode in the configuration to operate!",
       );
     }
 
diff --git a/src/hooks/web/useScript.ts b/src/hooks/web/useScript.ts
index 9707116a27eac062d0c427ace5a53a4d8ab57b54..3c36cc5337357ec0acc3f7a6bd630823a3ea082c 100644
--- a/src/hooks/web/useScript.ts
+++ b/src/hooks/web/useScript.ts
@@ -1,4 +1,4 @@
-import { onMounted, onUnmounted, ref } from 'vue';
+import { onMounted, onUnmounted, ref } from "vue";
 
 interface ScriptOptions {
   src: string;
@@ -12,13 +12,13 @@ export function useScript(opts: ScriptOptions) {
 
   const promise = new Promise((resolve, reject) => {
     onMounted(() => {
-      script = document.createElement('script');
-      script.type = 'text/javascript';
+      script = document.createElement("script");
+      script.type = "text/javascript";
       script.onload = function () {
         isLoading.value = false;
         success.value = true;
         error.value = false;
-        resolve('');
+        resolve("");
       };
 
       script.onerror = function (err) {
diff --git a/src/hooks/web/useSortable.ts b/src/hooks/web/useSortable.ts
index 4c66b6af160995a7ae7b7ef736fdcac5906eb918..f94ab5818e6575dd51ce3a768a6d6ed33b081ae7 100644
--- a/src/hooks/web/useSortable.ts
+++ b/src/hooks/web/useSortable.ts
@@ -1,13 +1,13 @@
-import { nextTick, unref } from 'vue';
-import type { Ref } from 'vue';
-import type { Options } from 'sortablejs';
+import { nextTick, unref } from "vue";
+import type { Ref } from "vue";
+import type { Options } from "sortablejs";
 
 export function useSortable(el: HTMLElement | Ref<HTMLElement>, options?: Options) {
   function initSortable() {
     nextTick(async () => {
       if (!el) return;
 
-      const Sortable = (await import('sortablejs')).default;
+      const Sortable = (await import("sortablejs")).default;
       Sortable.create(unref(el), {
         animation: 500,
         delay: 400,
diff --git a/src/hooks/web/useTabs.ts b/src/hooks/web/useTabs.ts
index 926d90b80ca81b0f38117815140e25803aee0346..5032de81a436fa43debac52a6034c90b8b8ecc52 100644
--- a/src/hooks/web/useTabs.ts
+++ b/src/hooks/web/useTabs.ts
@@ -1,10 +1,10 @@
-import type { RouteLocationNormalized, Router } from 'vue-router';
+import type { RouteLocationNormalized, Router } from "vue-router";
 
-import { useRouter } from 'vue-router';
-import { unref } from 'vue';
+import { useRouter } from "vue-router";
+import { unref } from "vue";
 
-import { useMultipleTabStore } from '/@/store/modules/multipleTab';
-import { useAppStore } from '/@/store/modules/app';
+import { useMultipleTabStore } from "/@/store/modules/multipleTab";
+import { useAppStore } from "/@/store/modules/app";
 
 enum TableActionEnum {
   REFRESH,
@@ -22,7 +22,7 @@ export function useTabs(_router?: Router) {
   function canIUseTabs(): boolean {
     const { show } = appStore.getMultiTabsSetting;
     if (!show) {
-      throw new Error('The multi-tab page is currently not open, please open it in the settings!');
+      throw new Error("The multi-tab page is currently not open, please open it in the settings!");
     }
     return !!show;
   }
@@ -34,7 +34,7 @@ export function useTabs(_router?: Router) {
 
   function getCurrentTab() {
     const route = unref(currentRoute);
-    return tabStore.getTabList.find((item) => item.path === route.path)!;
+    return tabStore.getTabList.find((item) => item.fullPath === route.fullPath)!;
   }
 
   async function updateTabTitle(title: string, tab?: RouteLocationNormalized) {
diff --git a/src/hooks/web/useTitle.ts b/src/hooks/web/useTitle.ts
index a7f48d8543f9e7eda694ff916402d3d3cce5444c..335450c2f2dd76c252cf267c1bd628a29c72da0c 100644
--- a/src/hooks/web/useTitle.ts
+++ b/src/hooks/web/useTitle.ts
@@ -1,11 +1,11 @@
-import { watch, unref } from 'vue';
-import { useI18n } from '/@/hooks/web/useI18n';
-import { useTitle as usePageTitle } from '@vueuse/core';
-import { useGlobSetting } from '/@/hooks/setting';
-import { useRouter } from 'vue-router';
-import { useLocaleStore } from '/@/store/modules/locale';
+import { watch, unref } from "vue";
+import { useI18n } from "/@/hooks/web/useI18n";
+import { useTitle as usePageTitle } from "@vueuse/core";
+import { useGlobSetting } from "/@/hooks/setting";
+import { useRouter } from "vue-router";
+import { useLocaleStore } from "/@/store/modules/locale";
 
-import { REDIRECT_NAME } from '/@/router/constant';
+import { REDIRECT_NAME } from "/@/router/constant";
 
 /**
  * Listening to page changes and dynamically changing site titles
diff --git a/src/hooks/web/useWatermark.ts b/src/hooks/web/useWatermark.ts
index a42b84b2103edbbffdffab3c338bb2ee930ca6f1..01f7bb9c5f68249c25423795fcf698b0a172005f 100644
--- a/src/hooks/web/useWatermark.ts
+++ b/src/hooks/web/useWatermark.ts
@@ -1,9 +1,9 @@
-import { getCurrentInstance, onBeforeUnmount, ref, Ref, shallowRef, unref } from 'vue';
-import { useRafThrottle } from '/@/utils/domUtils';
-import { addResizeListener, removeResizeListener } from '/@/utils/event';
-import { isDef } from '/@/utils/is';
+import { getCurrentInstance, onBeforeUnmount, ref, Ref, shallowRef, unref } from "vue";
+import { useRafThrottle } from "/@/utils/domUtils";
+import { addResizeListener, removeResizeListener } from "/@/utils/event";
+import { isDef } from "/@/utils/is";
 
-const domSymbol = Symbol('watermark-dom');
+const domSymbol = Symbol("watermark-dom");
 
 export function useWatermark(
   appendEl: Ref<HTMLElement | null> = ref(document.body) as Ref<HTMLElement>,
@@ -27,21 +27,21 @@ export function useWatermark(
   };
 
   function createBase64(str: string) {
-    const can = document.createElement('canvas');
+    const can = document.createElement("canvas");
     const width = 300;
     const height = 240;
     Object.assign(can, { width, height });
 
-    const cans = can.getContext('2d');
+    const cans = can.getContext("2d");
     if (cans) {
       cans.rotate((-20 * Math.PI) / 120);
-      cans.font = '15px Vedana';
-      cans.fillStyle = 'rgba(0, 0, 0, 0.15)';
-      cans.textAlign = 'left';
-      cans.textBaseline = 'middle';
+      cans.font = "15px Vedana";
+      cans.fillStyle = "rgba(0, 0, 0, 0.15)";
+      cans.textAlign = "left";
+      cans.textBaseline = "middle";
       cans.fillText(str, width / 20, height);
     }
-    return can.toDataURL('image/png');
+    return can.toDataURL("image/png");
   }
 
   function updateWatermark(
@@ -69,14 +69,14 @@ export function useWatermark(
       updateWatermark({ str });
       return id;
     }
-    const div = document.createElement('div');
+    const div = document.createElement("div");
     watermarkEl.value = div;
     div.id = id;
-    div.style.pointerEvents = 'none';
-    div.style.top = '0px';
-    div.style.left = '0px';
-    div.style.position = 'absolute';
-    div.style.zIndex = '100000';
+    div.style.pointerEvents = "none";
+    div.style.top = "0px";
+    div.style.left = "0px";
+    div.style.position = "absolute";
+    div.style.zIndex = "100000";
     const el = unref(appendEl);
     if (!el) return id;
     const { clientHeight: height, clientWidth: width } = el;
diff --git a/src/layouts/default/content/index.vue b/src/layouts/default/content/index.vue
index 3f6d193b461753ceccd3cdf478921951a2d02709..e6c1b7de455365c79f3fc55d86fc316554c17994 100644
--- a/src/layouts/default/content/index.vue
+++ b/src/layouts/default/content/index.vue
@@ -4,18 +4,18 @@
   </div>
 </template>
 <script lang="ts">
-  import { defineComponent } from 'vue';
-  import PageLayout from '/@/layouts/page/index.vue';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useRootSetting } from '/@/hooks/setting/useRootSetting';
-  import { useTransitionSetting } from '/@/hooks/setting/useTransitionSetting';
-  import { useContentViewHeight } from './useContentViewHeight';
+  import { defineComponent } from "vue";
+  import PageLayout from "/@/layouts/page/index.vue";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useRootSetting } from "/@/hooks/setting/useRootSetting";
+  import { useTransitionSetting } from "/@/hooks/setting/useTransitionSetting";
+  import { useContentViewHeight } from "./useContentViewHeight";
 
   export default defineComponent({
-    name: 'LayoutContent',
+    name: "LayoutContent",
     components: { PageLayout },
     setup() {
-      const { prefixCls } = useDesign('layout-content');
+      const { prefixCls } = useDesign("layout-content");
       const { getOpenPageLoading } = useTransitionSetting();
       const { getLayoutContentMode, getPageLoading } = useRootSetting();
 
@@ -30,7 +30,7 @@
   });
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-layout-content';
+  @prefix-cls: ~"@{namespace}-layout-content";
 
   .@{prefix-cls} {
     position: relative;
diff --git a/src/layouts/default/content/useContentContext.ts b/src/layouts/default/content/useContentContext.ts
index f12e77b79821f832af65f078077e7ac82c5814eb..3e73492cf506f088c87394af6ad1dc7081c6cf68 100644
--- a/src/layouts/default/content/useContentContext.ts
+++ b/src/layouts/default/content/useContentContext.ts
@@ -1,5 +1,5 @@
-import type { InjectionKey, ComputedRef } from 'vue';
-import { createContext, useContext } from '/@/hooks/core/useContext';
+import type { InjectionKey, ComputedRef } from "vue";
+import { createContext, useContext } from "/@/hooks/core/useContext";
 
 export interface ContentContextProps {
   contentHeight: ComputedRef<number>;
diff --git a/src/layouts/default/content/useContentViewHeight.ts b/src/layouts/default/content/useContentViewHeight.ts
index f620a336f99b6cf5e11478b9deed1012ef065ba2..bb87d2f5b5fd896a45aac5eda291a52c2b7e45df 100644
--- a/src/layouts/default/content/useContentViewHeight.ts
+++ b/src/layouts/default/content/useContentViewHeight.ts
@@ -1,6 +1,6 @@
-import { ref, computed, unref } from 'vue';
-import { createPageContext } from '/@/hooks/component/usePageContext';
-import { useWindowSizeFn } from '/@/hooks/event/useWindowSizeFn';
+import { ref, computed, unref } from "vue";
+import { createPageContext } from "/@/hooks/component/usePageContext";
+import { useWindowSizeFn } from "/@/hooks/event/useWindowSizeFn";
 
 const headerHeightRef = ref(0);
 const footerHeightRef = ref(0);
diff --git a/src/layouts/default/feature/index.vue b/src/layouts/default/feature/index.vue
index 0787014a10a3f1e30d7f4d6f0e411a5996d9be21..855cd5423a1992749d489fc63e86a9636ae8f2a7 100644
--- a/src/layouts/default/feature/index.vue
+++ b/src/layouts/default/feature/index.vue
@@ -1,29 +1,29 @@
 <script lang="ts">
-  import { defineComponent, computed, unref } from 'vue';
-  import { BackTop } from 'ant-design-vue';
+  import { defineComponent, computed, unref } from "vue";
+  import { BackTop } from "ant-design-vue";
 
-  import { useRootSetting } from '/@/hooks/setting/useRootSetting';
-  import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useUserStoreWithOut } from '/@/store/modules/user';
+  import { useRootSetting } from "/@/hooks/setting/useRootSetting";
+  import { useHeaderSetting } from "/@/hooks/setting/useHeaderSetting";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useUserStoreWithOut } from "/@/store/modules/user";
 
-  import { SettingButtonPositionEnum } from '/@/enums/appEnum';
-  import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
+  import { SettingButtonPositionEnum } from "/@/enums/appEnum";
+  import { createAsyncComponent } from "/@/utils/factory/createAsyncComponent";
 
-  import SessionTimeoutLogin from '/@/views/sys/login/SessionTimeoutLogin.vue';
+  import SessionTimeoutLogin from "/@/views/sys/login/SessionTimeoutLogin.vue";
   export default defineComponent({
-    name: 'LayoutFeatures',
+    name: "LayoutFeatures",
     components: {
       BackTop,
-      LayoutLockPage: createAsyncComponent(() => import('/@/views/sys/lock/index.vue')),
-      SettingDrawer: createAsyncComponent(() => import('/@/layouts/default/setting/index.vue')),
+      LayoutLockPage: createAsyncComponent(() => import("/@/views/sys/lock/index.vue")),
+      SettingDrawer: createAsyncComponent(() => import("/@/layouts/default/setting/index.vue")),
       SessionTimeoutLogin,
     },
     setup() {
       const { getUseOpenBackTop, getShowSettingButton, getSettingButtonPosition, getFullContent } =
         useRootSetting();
       const userStore = useUserStoreWithOut();
-      const { prefixCls } = useDesign('setting-drawer-fearure');
+      const { prefixCls } = useDesign("setting-drawer-feature");
       const { getShowHeader } = useHeaderSetting();
 
       const getIsSessionTimeout = computed(() => userStore.getSessionTimeout);
@@ -59,7 +59,7 @@
 </template>
 
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-setting-drawer-fearure';
+  @prefix-cls: ~"@{namespace}-setting-drawer-feature";
 
   .@{prefix-cls} {
     position: absolute;
diff --git a/src/layouts/default/footer/index.vue b/src/layouts/default/footer/index.vue
index 62e3c5e98f1c68a6e7fa6158ae08c2c789f6ff25..4e87603bede9910ba599f85dbd00baefe7e29232 100644
--- a/src/layouts/default/footer/index.vue
+++ b/src/layouts/default/footer/index.vue
@@ -1,39 +1,39 @@
 <template>
   <Footer :class="prefixCls" v-if="getShowLayoutFooter" ref="footerRef">
     <div :class="`${prefixCls}__links`">
-      <a @click="openWindow(SITE_URL)">{{ t('layout.footer.onlinePreview') }}</a>
+      <a @click="openWindow(SITE_URL)">{{ t("layout.footer.onlinePreview") }}</a>
 
       <GithubFilled @click="openWindow(GITHUB_URL)" :class="`${prefixCls}__github`" />
 
-      <a @click="openWindow(DOC_URL)">{{ t('layout.footer.onlineDocument') }}</a>
+      <a @click="openWindow(DOC_URL)">{{ t("layout.footer.onlineDocument") }}</a>
     </div>
     <div>Copyright &copy;2020 Vben Admin</div>
   </Footer>
 </template>
 
 <script lang="ts">
-  import { computed, defineComponent, unref, ref } from 'vue';
-  import { Layout } from 'ant-design-vue';
+  import { computed, defineComponent, unref, ref } from "vue";
+  import { Layout } from "ant-design-vue";
 
-  import { GithubFilled } from '@ant-design/icons-vue';
+  import { GithubFilled } from "@ant-design/icons-vue";
 
-  import { DOC_URL, GITHUB_URL, SITE_URL } from '/@/settings/siteSetting';
-  import { openWindow } from '/@/utils';
+  import { DOC_URL, GITHUB_URL, SITE_URL } from "/@/settings/siteSetting";
+  import { openWindow } from "/@/utils";
 
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { useRootSetting } from '/@/hooks/setting/useRootSetting';
-  import { useRouter } from 'vue-router';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useLayoutHeight } from '../content/useContentViewHeight';
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { useRootSetting } from "/@/hooks/setting/useRootSetting";
+  import { useRouter } from "vue-router";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useLayoutHeight } from "../content/useContentViewHeight";
 
   export default defineComponent({
-    name: 'LayoutFooter',
+    name: "LayoutFooter",
     components: { Footer: Layout.Footer, GithubFilled },
     setup() {
       const { t } = useI18n();
       const { getShowFooter } = useRootSetting();
       const { currentRoute } = useRouter();
-      const { prefixCls } = useDesign('layout-footer');
+      const { prefixCls } = useDesign("layout-footer");
 
       const footerRef = ref<ComponentRef>(null);
       const { setFooterHeight } = useLayoutHeight();
@@ -62,7 +62,7 @@
   });
 </script>
 <style lang="less" scoped>
-  @prefix-cls: ~'@{namespace}-layout-footer';
+  @prefix-cls: ~"@{namespace}-layout-footer";
 
   @normal-color: rgba(0, 0, 0, 0.45);
 
diff --git a/src/layouts/default/header/MultipleHeader.vue b/src/layouts/default/header/MultipleHeader.vue
index c852b7ee74005c8813709827625ab1f7c5627f89..c568a6c8f173354f643d1a2fd33fd3db75cf391f 100644
--- a/src/layouts/default/header/MultipleHeader.vue
+++ b/src/layouts/default/header/MultipleHeader.vue
@@ -6,28 +6,28 @@
   </div>
 </template>
 <script lang="ts">
-  import { defineComponent, unref, computed, CSSProperties } from 'vue';
+  import { defineComponent, unref, computed, CSSProperties } from "vue";
 
-  import LayoutHeader from './index.vue';
-  import MultipleTabs from '../tabs/index.vue';
+  import LayoutHeader from "./index.vue";
+  import MultipleTabs from "../tabs/index.vue";
 
-  import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';
-  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
-  import { useFullContent } from '/@/hooks/web/useFullContent';
-  import { useMultipleTabSetting } from '/@/hooks/setting/useMultipleTabSetting';
-  import { useAppInject } from '/@/hooks/web/useAppInject';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useLayoutHeight } from '../content/useContentViewHeight';
+  import { useHeaderSetting } from "/@/hooks/setting/useHeaderSetting";
+  import { useMenuSetting } from "/@/hooks/setting/useMenuSetting";
+  import { useFullContent } from "/@/hooks/web/useFullContent";
+  import { useMultipleTabSetting } from "/@/hooks/setting/useMultipleTabSetting";
+  import { useAppInject } from "/@/hooks/web/useAppInject";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useLayoutHeight } from "../content/useContentViewHeight";
 
   const HEADER_HEIGHT = 48;
 
   const TABS_HEIGHT = 32;
   export default defineComponent({
-    name: 'LayoutMultipleHeader',
+    name: "LayoutMultipleHeader",
     components: { LayoutHeader, MultipleTabs },
     setup() {
       const { setHeaderHeight } = useLayoutHeight();
-      const { prefixCls } = useDesign('layout-multiple-header');
+      const { prefixCls } = useDesign("layout-multiple-header");
 
       const { getCalcContentWidth, getSplit } = useMenuSetting();
       const { getIsMobile } = useAppInject();
@@ -54,7 +54,7 @@
       const getWrapStyle = computed((): CSSProperties => {
         const style: CSSProperties = {};
         if (unref(getFixed)) {
-          style.width = unref(getIsMobile) ? '100%' : unref(getCalcContentWidth);
+          style.width = unref(getIsMobile) ? "100%" : unref(getCalcContentWidth);
         }
         if (unref(getShowFullHeaderRef)) {
           style.top = `${HEADER_HEIGHT}px`;
@@ -106,7 +106,7 @@
   });
 </script>
 <style lang="less" scoped>
-  @prefix-cls: ~'@{namespace}-layout-multiple-header';
+  @prefix-cls: ~"@{namespace}-layout-multiple-header";
 
   .@{prefix-cls} {
     transition: width 0.2s;
diff --git a/src/layouts/default/header/components/Breadcrumb.vue b/src/layouts/default/header/components/Breadcrumb.vue
index 9f2e77b76f7c0a2bef543bd0cd7173f12a70fc34..8ca62509e27ad722e950d51e651ae54f2703e054 100644
--- a/src/layouts/default/header/components/Breadcrumb.vue
+++ b/src/layouts/default/header/components/Breadcrumb.vue
@@ -14,38 +14,38 @@
   </div>
 </template>
 <script lang="ts">
-  import type { RouteLocationMatched } from 'vue-router';
-  import { useRouter } from 'vue-router';
-  import type { Menu } from '/@/router/types';
+  import type { RouteLocationMatched } from "vue-router";
+  import { useRouter } from "vue-router";
+  import type { Menu } from "/@/router/types";
 
-  import { defineComponent, ref, watchEffect } from 'vue';
+  import { defineComponent, ref, watchEffect } from "vue";
 
-  import { Breadcrumb } from 'ant-design-vue';
-  import Icon from '/@/components/Icon';
+  import { Breadcrumb } from "ant-design-vue";
+  import Icon from "/@/components/Icon";
 
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useRootSetting } from '/@/hooks/setting/useRootSetting';
-  import { useGo } from '/@/hooks/web/usePage';
-  import { useI18n } from '/@/hooks/web/useI18n';
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useRootSetting } from "/@/hooks/setting/useRootSetting";
+  import { useGo } from "/@/hooks/web/usePage";
+  import { useI18n } from "/@/hooks/web/useI18n";
 
-  import { propTypes } from '/@/utils/propTypes';
-  import { isString } from '/@/utils/is';
-  import { filter } from '/@/utils/helper/treeHelper';
-  import { getMenus } from '/@/router/menus';
+  import { propTypes } from "/@/utils/propTypes";
+  import { isString } from "/@/utils/is";
+  import { filter } from "/@/utils/helper/treeHelper";
+  import { getMenus } from "/@/router/menus";
 
-  import { REDIRECT_NAME } from '/@/router/constant';
-  import { getAllParentPath } from '/@/router/helper/menuHelper';
+  import { REDIRECT_NAME } from "/@/router/constant";
+  import { getAllParentPath } from "/@/router/helper/menuHelper";
 
   export default defineComponent({
-    name: 'LayoutBreadcrumb',
+    name: "LayoutBreadcrumb",
     components: { Icon, [Breadcrumb.name]: Breadcrumb },
     props: {
-      theme: propTypes.oneOf(['dark', 'light']),
+      theme: propTypes.oneOf(["dark", "light"]),
     },
     setup() {
       const routes = ref<RouteLocationMatched[]>([]);
       const { currentRoute } = useRouter();
-      const { prefixCls } = useDesign('layout-breadcrumb');
+      const { prefixCls } = useDesign("layout-breadcrumb");
       const { getShowBreadCrumbIcon } = useRootSetting();
       const go = useGo();
 
@@ -101,8 +101,8 @@
           if (!meta) {
             return !!name;
           }
-          const { title, hideBreadcrumb } = meta;
-          if (!title || hideBreadcrumb) {
+          const { title, hideBreadcrumb, hideMenu } = meta;
+          if (!title || hideBreadcrumb || hideMenu) {
             return false;
           }
           return true;
@@ -124,12 +124,12 @@
         if (redirect && isString(redirect)) {
           go(redirect);
         } else {
-          let goPath = '';
+          let goPath = "";
           if (paths.length === 1) {
             goPath = paths[0];
           } else {
             const ps = paths.slice(1);
-            const lastPath = ps.pop() || '';
+            const lastPath = ps.pop() || "";
             goPath = `${lastPath}`;
           }
           goPath = /^\//.test(goPath) ? goPath : `/${goPath}`;
@@ -150,7 +150,7 @@
   });
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-layout-breadcrumb';
+  @prefix-cls: ~"@{namespace}-layout-breadcrumb";
 
   .@{prefix-cls} {
     display: flex;
diff --git a/src/layouts/default/header/components/ErrorAction.vue b/src/layouts/default/header/components/ErrorAction.vue
index 243e587000a6215221eb2b068a42910647e77b79..a3918001890695c9fc7f0099a03933cfe7327721 100644
--- a/src/layouts/default/header/components/ErrorAction.vue
+++ b/src/layouts/default/header/components/ErrorAction.vue
@@ -11,18 +11,18 @@
   </Tooltip>
 </template>
 <script lang="ts">
-  import { defineComponent, computed } from 'vue';
-  import { Tooltip, Badge } from 'ant-design-vue';
-  import Icon from '/@/components/Icon';
+  import { defineComponent, computed } from "vue";
+  import { Tooltip, Badge } from "ant-design-vue";
+  import Icon from "/@/components/Icon";
 
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { useErrorLogStore } from '/@/store/modules/errorLog';
-  import { PageEnum } from '/@/enums/pageEnum';
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { useErrorLogStore } from "/@/store/modules/errorLog";
+  import { PageEnum } from "/@/enums/pageEnum";
 
-  import { useRouter } from 'vue-router';
+  import { useRouter } from "vue-router";
 
   export default defineComponent({
-    name: 'ErrorAction',
+    name: "ErrorAction",
     components: { Icon, Tooltip, Badge },
 
     setup() {
diff --git a/src/layouts/default/header/components/FullScreen.vue b/src/layouts/default/header/components/FullScreen.vue
index 374ee76197bb3045697cdb8eb6db0bb5aa0c37a5..ff91fc47139550a770ba0f22f4122eb9a597a70d 100644
--- a/src/layouts/default/header/components/FullScreen.vue
+++ b/src/layouts/default/header/components/FullScreen.vue
@@ -7,14 +7,14 @@
   </Tooltip>
 </template>
 <script lang="ts">
-  import { defineComponent, computed, unref } from 'vue';
-  import { Tooltip } from 'ant-design-vue';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { useFullscreen } from '@vueuse/core';
+  import { defineComponent, computed, unref } from "vue";
+  import { Tooltip } from "ant-design-vue";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { useFullscreen } from "@vueuse/core";
 
-  import { FullscreenExitOutlined, FullscreenOutlined } from '@ant-design/icons-vue';
+  import { FullscreenExitOutlined, FullscreenOutlined } from "@ant-design/icons-vue";
   export default defineComponent({
-    name: 'FullScreen',
+    name: "FullScreen",
     components: { FullscreenExitOutlined, FullscreenOutlined, Tooltip },
 
     setup() {
@@ -23,8 +23,8 @@
 
       const getTitle = computed(() => {
         return unref(isFullscreen)
-          ? t('layout.header.tooltipExitFull')
-          : t('layout.header.tooltipEntryFull');
+          ? t("layout.header.tooltipExitFull")
+          : t("layout.header.tooltipEntryFull");
       });
 
       return {
diff --git a/src/layouts/default/header/components/index.ts b/src/layouts/default/header/components/index.ts
index 09e767e7f16a602e80b04aa527f1c22258421d84..f64dda33bb69e2cc7f201a1c39babaab668e0106 100644
--- a/src/layouts/default/header/components/index.ts
+++ b/src/layouts/default/header/components/index.ts
@@ -1,14 +1,14 @@
-import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
-import FullScreen from './FullScreen.vue';
+import { createAsyncComponent } from "/@/utils/factory/createAsyncComponent";
+import FullScreen from "./FullScreen.vue";
 
-export const UserDropDown = createAsyncComponent(() => import('./user-dropdown/index.vue'), {
+export const UserDropDown = createAsyncComponent(() => import("./user-dropdown/index.vue"), {
   loading: true,
 });
 
-export const LayoutBreadcrumb = createAsyncComponent(() => import('./Breadcrumb.vue'));
+export const LayoutBreadcrumb = createAsyncComponent(() => import("./Breadcrumb.vue"));
 
-export const Notify = createAsyncComponent(() => import('./notify/index.vue'));
+export const Notify = createAsyncComponent(() => import("./notify/index.vue"));
 
-export const ErrorAction = createAsyncComponent(() => import('./ErrorAction.vue'));
+export const ErrorAction = createAsyncComponent(() => import("./ErrorAction.vue"));
 
 export { FullScreen };
diff --git a/src/layouts/default/header/components/lock/LockModal.vue b/src/layouts/default/header/components/lock/LockModal.vue
index 90a3f7c7213172fd90b6c47efca6715dfcdb7ce1..f8b34a33b3f1aab6ceeee7eeac0740811b9b0b18 100644
--- a/src/layouts/default/header/components/lock/LockModal.vue
+++ b/src/layouts/default/header/components/lock/LockModal.vue
@@ -18,29 +18,29 @@
 
       <div :class="`${prefixCls}__footer`">
         <a-button type="primary" block class="mt-2" @click="handleLock">
-          {{ t('layout.header.lockScreenBtn') }}
+          {{ t("layout.header.lockScreenBtn") }}
         </a-button>
       </div>
     </div>
   </BasicModal>
 </template>
 <script lang="ts">
-  import { defineComponent, computed } from 'vue';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { BasicModal, useModalInner } from '/@/components/Modal/index';
-  import { BasicForm, useForm } from '/@/components/Form/index';
+  import { defineComponent, computed } from "vue";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { BasicModal, useModalInner } from "/@/components/Modal/index";
+  import { BasicForm, useForm } from "/@/components/Form/index";
 
-  import { useUserStore } from '/@/store/modules/user';
-  import { useLockStore } from '/@/store/modules/lock';
-  import headerImg from '/@/assets/images/header.jpg';
+  import { useUserStore } from "/@/store/modules/user";
+  import { useLockStore } from "/@/store/modules/lock";
+  import headerImg from "/@/assets/images/header.jpg";
   export default defineComponent({
-    name: 'LockModal',
+    name: "LockModal",
     components: { BasicModal, BasicForm },
 
     setup() {
       const { t } = useI18n();
-      const { prefixCls } = useDesign('header-lock-modal');
+      const { prefixCls } = useDesign("header-lock-modal");
       const userStore = useUserStore();
       const lockStore = useLockStore();
 
@@ -51,9 +51,12 @@
         showActionButtonGroup: false,
         schemas: [
           {
-            field: 'password',
-            label: t('layout.header.lockScreenPassword'),
-            component: 'InputPassword',
+            field: "password",
+            label: t("layout.header.lockScreenPassword"),
+            colProps: {
+              span: 24,
+            },
+            component: "InputPassword",
             required: true,
           },
         ],
@@ -89,7 +92,7 @@
   });
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-header-lock-modal';
+  @prefix-cls: ~"@{namespace}-header-lock-modal";
 
   .@{prefix-cls} {
     &__entry {
diff --git a/src/layouts/default/header/components/notify/NoticeList.vue b/src/layouts/default/header/components/notify/NoticeList.vue
index dbc09398f12830c4ba1dfbd40b6d172f03fd3d64..71d724894d0d1e744a53c0a907a9ac34a366d3b5 100644
--- a/src/layouts/default/header/components/notify/NoticeList.vue
+++ b/src/layouts/default/header/components/notify/NoticeList.vue
@@ -54,11 +54,11 @@
   </a-list>
 </template>
 <script lang="ts">
-  import { computed, defineComponent, PropType, ref, watch, unref } from 'vue';
-  import { ListItem } from './data';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { List, Avatar, Tag, Typography } from 'ant-design-vue';
-  import { isNumber } from '/@/utils/is';
+  import { computed, defineComponent, PropType, ref, watch, unref } from "vue";
+  import { ListItem } from "./data";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { List, Avatar, Tag, Typography } from "ant-design-vue";
+  import { isNumber } from "/@/utils/is";
   export default defineComponent({
     components: {
       [Avatar.name]: Avatar,
@@ -93,9 +93,9 @@
         type: Function as PropType<(Recordable) => void>,
       },
     },
-    emits: ['update:currentPage'],
+    emits: ["update:currentPage"],
     setup(props, { emit }) {
-      const { prefixCls } = useDesign('header-notify-list');
+      const { prefixCls } = useDesign("header-notify-list");
       const current = ref(props.currentPage || 1);
       const getData = computed(() => {
         const { pageSize, list } = props;
@@ -120,7 +120,7 @@
             current: unref(current),
             onChange(page) {
               current.value = page;
-              emit('update:currentPage', page);
+              emit("update:currentPage", page);
             },
           };
         } else {
@@ -137,7 +137,7 @@
   });
 </script>
 <style lang="less" scoped>
-  @prefix-cls: ~'@{namespace}-header-notify-list';
+  @prefix-cls: ~"@{namespace}-header-notify-list";
 
   .@{prefix-cls} {
     &::-webkit-scrollbar {
diff --git a/src/layouts/default/header/components/notify/data.ts b/src/layouts/default/header/components/notify/data.ts
index 15d524d7bccd1220a5becd1b6826096c9366b85a..6a9596b8ef694e16f1de3b9f1e92abbeb1343df7 100644
--- a/src/layouts/default/header/components/notify/data.ts
+++ b/src/layouts/default/header/components/notify/data.ts
@@ -23,170 +23,170 @@ export interface TabItem {
 
 export const tabListData: TabItem[] = [
   {
-    key: '1',
-    name: '通知',
+    key: "1",
+    name: "通知",
     list: [
       {
-        id: '000000001',
-        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png',
-        title: '你收到了 14 份新周报',
-        description: '',
-        datetime: '2017-08-09',
-        type: '1',
+        id: "000000001",
+        avatar: "https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png",
+        title: "你收到了 14 份新周报",
+        description: "",
+        datetime: "2017-08-09",
+        type: "1",
       },
       {
-        id: '000000002',
-        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/OKJXDXrmkNshAMvwtvhu.png',
-        title: '你推荐的 曲妮妮 已通过第三轮面试',
-        description: '',
-        datetime: '2017-08-08',
-        type: '1',
+        id: "000000002",
+        avatar: "https://gw.alipayobjects.com/zos/rmsportal/OKJXDXrmkNshAMvwtvhu.png",
+        title: "你推荐的 曲妮妮 已通过第三轮面试",
+        description: "",
+        datetime: "2017-08-08",
+        type: "1",
       },
       {
-        id: '000000003',
-        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/kISTdvpyTAhtGxpovNWd.png',
-        title: '这种模板可以区分多种通知类型',
-        description: '',
-        datetime: '2017-08-07',
+        id: "000000003",
+        avatar: "https://gw.alipayobjects.com/zos/rmsportal/kISTdvpyTAhtGxpovNWd.png",
+        title: "这种模板可以区分多种通知类型",
+        description: "",
+        datetime: "2017-08-07",
         // read: true,
-        type: '1',
+        type: "1",
       },
       {
-        id: '000000004',
-        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png',
-        title: '左侧图标用于区分不同的类型',
-        description: '',
-        datetime: '2017-08-07',
-        type: '1',
+        id: "000000004",
+        avatar: "https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png",
+        title: "左侧图标用于区分不同的类型",
+        description: "",
+        datetime: "2017-08-07",
+        type: "1",
       },
       {
-        id: '000000005',
-        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png',
+        id: "000000005",
+        avatar: "https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png",
         title:
-          '标题可以设置自动显示省略号,本例中标题行数已设为1行,如果内容超过1行将自动截断并支持tooltip显示完整标题。',
-        description: '',
-        datetime: '2017-08-07',
-        type: '1',
+          "标题可以设置自动显示省略号,本例中标题行数已设为1行,如果内容超过1行将自动截断并支持tooltip显示完整标题。",
+        description: "",
+        datetime: "2017-08-07",
+        type: "1",
       },
       {
-        id: '000000006',
-        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png',
-        title: '左侧图标用于区分不同的类型',
-        description: '',
-        datetime: '2017-08-07',
-        type: '1',
+        id: "000000006",
+        avatar: "https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png",
+        title: "左侧图标用于区分不同的类型",
+        description: "",
+        datetime: "2017-08-07",
+        type: "1",
       },
       {
-        id: '000000007',
-        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png',
-        title: '左侧图标用于区分不同的类型',
-        description: '',
-        datetime: '2017-08-07',
-        type: '1',
+        id: "000000007",
+        avatar: "https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png",
+        title: "左侧图标用于区分不同的类型",
+        description: "",
+        datetime: "2017-08-07",
+        type: "1",
       },
       {
-        id: '000000008',
-        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png',
-        title: '左侧图标用于区分不同的类型',
-        description: '',
-        datetime: '2017-08-07',
-        type: '1',
+        id: "000000008",
+        avatar: "https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png",
+        title: "左侧图标用于区分不同的类型",
+        description: "",
+        datetime: "2017-08-07",
+        type: "1",
       },
       {
-        id: '000000009',
-        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png',
-        title: '左侧图标用于区分不同的类型',
-        description: '',
-        datetime: '2017-08-07',
-        type: '1',
+        id: "000000009",
+        avatar: "https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png",
+        title: "左侧图标用于区分不同的类型",
+        description: "",
+        datetime: "2017-08-07",
+        type: "1",
       },
       {
-        id: '000000010',
-        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png',
-        title: '左侧图标用于区分不同的类型',
-        description: '',
-        datetime: '2017-08-07',
-        type: '1',
+        id: "000000010",
+        avatar: "https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png",
+        title: "左侧图标用于区分不同的类型",
+        description: "",
+        datetime: "2017-08-07",
+        type: "1",
       },
     ],
   },
   {
-    key: '2',
-    name: '消息',
+    key: "2",
+    name: "消息",
     list: [
       {
-        id: '000000006',
-        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg',
-        title: '曲丽丽 评论了你',
-        description: '描述信息描述信息描述信息',
-        datetime: '2017-08-07',
-        type: '2',
+        id: "000000006",
+        avatar: "https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg",
+        title: "曲丽丽 评论了你",
+        description: "描述信息描述信息描述信息",
+        datetime: "2017-08-07",
+        type: "2",
         clickClose: true,
       },
       {
-        id: '000000007',
-        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg',
-        title: '朱偏右 回复了你',
-        description: '这种模板用于提醒谁与你发生了互动',
-        datetime: '2017-08-07',
-        type: '2',
+        id: "000000007",
+        avatar: "https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg",
+        title: "朱偏右 回复了你",
+        description: "这种模板用于提醒谁与你发生了互动",
+        datetime: "2017-08-07",
+        type: "2",
         clickClose: true,
       },
       {
-        id: '000000008',
-        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg',
-        title: '标题',
+        id: "000000008",
+        avatar: "https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg",
+        title: "标题",
         description:
-          '请将鼠标移动到此处,以便测试超长的消息在此处将如何处理。本例中设置的描述最大行数为2,超过2行的描述内容将被省略并且可以通过tooltip查看完整内容',
-        datetime: '2017-08-07',
-        type: '2',
+          "请将鼠标移动到此处,以便测试超长的消息在此处将如何处理。本例中设置的描述最大行数为2,超过2行的描述内容将被省略并且可以通过tooltip查看完整内容",
+        datetime: "2017-08-07",
+        type: "2",
         clickClose: true,
       },
     ],
   },
   {
-    key: '3',
-    name: '待办',
+    key: "3",
+    name: "待办",
     list: [
       {
-        id: '000000009',
-        avatar: '',
-        title: '任务名称',
-        description: '任务需要在 2017-01-12 20:00 前启动',
-        datetime: '',
-        extra: '未开始',
-        color: '',
-        type: '3',
-      },
-      {
-        id: '000000010',
-        avatar: '',
-        title: '第三方紧急代码变更',
-        description: '冠霖 需在 2017-01-07 前完成代码变更任务',
-        datetime: '',
-        extra: '马上到期',
-        color: 'red',
-        type: '3',
-      },
-      {
-        id: '000000011',
-        avatar: '',
-        title: '信息安全考试',
-        description: '指派竹尔于 2017-01-09 前完成更新并发布',
-        datetime: '',
-        extra: '已耗时 8 天',
-        color: 'gold',
-        type: '3',
-      },
-      {
-        id: '000000012',
-        avatar: '',
-        title: 'ABCD 版本发布',
-        description: '指派竹尔于 2017-01-09 前完成更新并发布',
-        datetime: '',
-        extra: '进行中',
-        color: 'blue',
-        type: '3',
+        id: "000000009",
+        avatar: "",
+        title: "任务名称",
+        description: "任务需要在 2017-01-12 20:00 前启动",
+        datetime: "",
+        extra: "未开始",
+        color: "",
+        type: "3",
+      },
+      {
+        id: "000000010",
+        avatar: "",
+        title: "第三方紧急代码变更",
+        description: "冠霖 需在 2017-01-07 前完成代码变更任务",
+        datetime: "",
+        extra: "马上到期",
+        color: "red",
+        type: "3",
+      },
+      {
+        id: "000000011",
+        avatar: "",
+        title: "信息安全考试",
+        description: "指派竹尔于 2017-01-09 前完成更新并发布",
+        datetime: "",
+        extra: "已耗时 8 天",
+        color: "gold",
+        type: "3",
+      },
+      {
+        id: "000000012",
+        avatar: "",
+        title: "ABCD 版本发布",
+        description: "指派竹尔于 2017-01-09 前完成更新并发布",
+        datetime: "",
+        extra: "进行中",
+        color: "blue",
+        type: "3",
       },
     ],
   },
diff --git a/src/layouts/default/header/components/notify/index.vue b/src/layouts/default/header/components/notify/index.vue
index da66affb7d456643f7ec55cf5bd7863784f73d25..d83126c386ecf6e4f0bb6fb2c1cf22c020f15918 100644
--- a/src/layouts/default/header/components/notify/index.vue
+++ b/src/layouts/default/header/components/notify/index.vue
@@ -23,18 +23,18 @@
   </div>
 </template>
 <script lang="ts">
-  import { computed, defineComponent, ref } from 'vue';
-  import { Popover, Tabs, Badge } from 'ant-design-vue';
-  import { BellOutlined } from '@ant-design/icons-vue';
-  import { tabListData, ListItem } from './data';
-  import NoticeList from './NoticeList.vue';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useMessage } from '/@/hooks/web/useMessage';
+  import { computed, defineComponent, ref } from "vue";
+  import { Popover, Tabs, Badge } from "ant-design-vue";
+  import { BellOutlined } from "@ant-design/icons-vue";
+  import { tabListData, ListItem } from "./data";
+  import NoticeList from "./NoticeList.vue";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useMessage } from "/@/hooks/web/useMessage";
 
   export default defineComponent({
     components: { Popover, BellOutlined, Tabs, TabPane: Tabs.TabPane, Badge, NoticeList },
     setup() {
-      const { prefixCls } = useDesign('header-notify');
+      const { prefixCls } = useDesign("header-notify");
       const { createMessage } = useMessage();
       const listData = ref(tabListData);
 
@@ -47,7 +47,7 @@
       });
 
       function onNoticeClick(record: ListItem) {
-        createMessage.success('你点击了通知,ID=' + record.id);
+        createMessage.success("你点击了通知,ID=" + record.id);
         // 可以直接将其标记为已读(为标题添加删除线),此处演示的代码会切换删除线状态
         record.titleDelete = !record.titleDelete;
       }
@@ -63,7 +63,7 @@
   });
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-header-notify';
+  @prefix-cls: ~"@{namespace}-header-notify";
 
   .@{prefix-cls} {
     padding-top: 2px;
diff --git a/src/layouts/default/header/components/user-dropdown/DropMenuItem.vue b/src/layouts/default/header/components/user-dropdown/DropMenuItem.vue
index aa193d5b084288541921dd33529c504d4b3582be..6aee29800ef9a112382906b4334777989ba383ac 100644
--- a/src/layouts/default/header/components/user-dropdown/DropMenuItem.vue
+++ b/src/layouts/default/header/components/user-dropdown/DropMenuItem.vue
@@ -7,17 +7,18 @@
   </MenuItem>
 </template>
 <script lang="ts">
-  import { Menu } from 'ant-design-vue';
+  import { Menu } from "ant-design-vue";
 
-  import { computed, defineComponent, getCurrentInstance } from 'vue';
+  import { computed, defineComponent, getCurrentInstance } from "vue";
 
-  import Icon from '/@/components/Icon/index';
-  import { propTypes } from '/@/utils/propTypes';
+  import Icon from "/@/components/Icon/index";
+  import { propTypes } from "/@/utils/propTypes";
 
   export default defineComponent({
-    name: 'DropdownMenuItem',
+    name: "DropdownMenuItem",
     components: { MenuItem: Menu.Item, Icon },
     props: {
+      // eslint-disable-next-line
       key: propTypes.string,
       text: propTypes.string,
       icon: propTypes.string,
diff --git a/src/layouts/default/header/components/user-dropdown/index.vue b/src/layouts/default/header/components/user-dropdown/index.vue
index 2c3669a4334bab7306dd5da756e25d16a691e472..01cb8f4ecfe091c5d058d3ddcb4032e7622d2c6a 100644
--- a/src/layouts/default/header/components/user-dropdown/index.vue
+++ b/src/layouts/default/header/components/user-dropdown/index.vue
@@ -36,46 +36,47 @@
 </template>
 <script lang="ts">
   // components
-  import { Dropdown, Menu } from 'ant-design-vue';
+  import { Dropdown, Menu } from "ant-design-vue";
+  import type { MenuInfo } from "ant-design-vue/lib/menu/src/interface";
 
-  import { defineComponent, computed } from 'vue';
+  import { defineComponent, computed } from "vue";
 
-  import { DOC_URL } from '/@/settings/siteSetting';
+  import { DOC_URL } from "/@/settings/siteSetting";
 
-  import { useUserStore } from '/@/store/modules/user';
-  import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useModal } from '/@/components/Modal';
+  import { useUserStore } from "/@/store/modules/user";
+  import { useHeaderSetting } from "/@/hooks/setting/useHeaderSetting";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useModal } from "/@/components/Modal";
 
-  import headerImg from '/@/assets/images/header.jpg';
-  import { propTypes } from '/@/utils/propTypes';
-  import { openWindow } from '/@/utils';
+  import headerImg from "/@/assets/images/header.jpg";
+  import { propTypes } from "/@/utils/propTypes";
+  import { openWindow } from "/@/utils";
 
-  import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
+  import { createAsyncComponent } from "/@/utils/factory/createAsyncComponent";
 
-  type MenuEvent = 'logout' | 'doc' | 'lock';
+  type MenuEvent = "logout" | "doc" | "lock";
 
   export default defineComponent({
-    name: 'UserDropdown',
+    name: "UserDropdown",
     components: {
       Dropdown,
       Menu,
-      MenuItem: createAsyncComponent(() => import('./DropMenuItem.vue')),
+      MenuItem: createAsyncComponent(() => import("./DropMenuItem.vue")),
       MenuDivider: Menu.Divider,
-      LockAction: createAsyncComponent(() => import('../lock/LockModal.vue')),
+      LockAction: createAsyncComponent(() => import("../lock/LockModal.vue")),
     },
     props: {
-      theme: propTypes.oneOf(['dark', 'light']),
+      theme: propTypes.oneOf(["dark", "light"]),
     },
     setup() {
-      const { prefixCls } = useDesign('header-user-dropdown');
+      const { prefixCls } = useDesign("header-user-dropdown");
       const { t } = useI18n();
       const { getShowDoc, getUseLockPage } = useHeaderSetting();
       const userStore = useUserStore();
 
       const getUserInfo = computed(() => {
-        const { realName = '', avatar, desc } = userStore.getUserInfo || {};
+        const { realName = "", avatar, desc } = userStore.getUserInfo || {};
         return { realName, avatar: avatar || headerImg, desc };
       });
 
@@ -95,15 +96,15 @@
         openWindow(DOC_URL);
       }
 
-      function handleMenuClick(e: { key: MenuEvent }) {
-        switch (e.key) {
-          case 'logout':
+      function handleMenuClick(e: MenuInfo) {
+        switch (e.key as MenuEvent) {
+          case "logout":
             handleLoginOut();
             break;
-          case 'doc':
+          case "doc":
             openDoc();
             break;
-          case 'lock':
+          case "lock":
             handleLock();
             break;
         }
@@ -122,7 +123,7 @@
   });
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-header-user-dropdown';
+  @prefix-cls: ~"@{namespace}-header-user-dropdown";
 
   .@{prefix-cls} {
     height: @header-height;
diff --git a/src/layouts/default/header/index.less b/src/layouts/default/header/index.less
index b16007e77058ff0531f925ff30c832c4da35ef6a..adef6b3c7de1b0f74769158b696cc69f3e7ed97a 100644
--- a/src/layouts/default/header/index.less
+++ b/src/layouts/default/header/index.less
@@ -1,7 +1,7 @@
-@header-trigger-prefix-cls: ~'@{namespace}-layout-header-trigger';
-@header-prefix-cls: ~'@{namespace}-layout-header';
-@breadcrumb-prefix-cls: ~'@{namespace}-layout-breadcrumb';
-@logo-prefix-cls: ~'@{namespace}-app-logo';
+@header-trigger-prefix-cls: ~"@{namespace}-layout-header-trigger";
+@header-prefix-cls: ~"@{namespace}-layout-header";
+@breadcrumb-prefix-cls: ~"@{namespace}-layout-breadcrumb";
+@logo-prefix-cls: ~"@{namespace}-app-logo";
 
 .@{header-prefix-cls} {
   display: flex;
@@ -125,7 +125,7 @@
       }
     }
 
-    span[role='img'] {
+    span[role="img"] {
       padding: 0 8px;
     }
   }
@@ -158,7 +158,7 @@
       }
 
       &-icon,
-      span[role='img'] {
+      span[role="img"] {
         color: @text-color-base;
       }
     }
diff --git a/src/layouts/default/header/index.vue b/src/layouts/default/header/index.vue
index 6ce6a939391cc18806c8e9980da1282b73b7f2ae..824d92c6afd4dbf34416811fafee6f344a053993 100644
--- a/src/layouts/default/header/index.vue
+++ b/src/layouts/default/header/index.vue
@@ -55,34 +55,34 @@
   </Header>
 </template>
 <script lang="ts">
-  import { defineComponent, unref, computed } from 'vue';
+  import { defineComponent, unref, computed } from "vue";
 
-  import { propTypes } from '/@/utils/propTypes';
+  import { propTypes } from "/@/utils/propTypes";
 
-  import { Layout } from 'ant-design-vue';
-  import { AppLogo } from '/@/components/Application';
-  import LayoutMenu from '../menu/index.vue';
-  import LayoutTrigger from '../trigger/index.vue';
+  import { Layout } from "ant-design-vue";
+  import { AppLogo } from "/@/components/Application";
+  import LayoutMenu from "../menu/index.vue";
+  import LayoutTrigger from "../trigger/index.vue";
 
-  import { AppSearch } from '/@/components/Application';
+  import { AppSearch } from "/@/components/Application";
 
-  import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';
-  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
-  import { useRootSetting } from '/@/hooks/setting/useRootSetting';
+  import { useHeaderSetting } from "/@/hooks/setting/useHeaderSetting";
+  import { useMenuSetting } from "/@/hooks/setting/useMenuSetting";
+  import { useRootSetting } from "/@/hooks/setting/useRootSetting";
 
-  import { MenuModeEnum, MenuSplitTyeEnum } from '/@/enums/menuEnum';
-  import { SettingButtonPositionEnum } from '/@/enums/appEnum';
-  import { AppLocalePicker } from '/@/components/Application';
+  import { MenuModeEnum, MenuSplitTyeEnum } from "/@/enums/menuEnum";
+  import { SettingButtonPositionEnum } from "/@/enums/appEnum";
+  import { AppLocalePicker } from "/@/components/Application";
 
-  import { UserDropDown, LayoutBreadcrumb, FullScreen, Notify, ErrorAction } from './components';
-  import { useAppInject } from '/@/hooks/web/useAppInject';
-  import { useDesign } from '/@/hooks/web/useDesign';
+  import { UserDropDown, LayoutBreadcrumb, FullScreen, Notify, ErrorAction } from "./components";
+  import { useAppInject } from "/@/hooks/web/useAppInject";
+  import { useDesign } from "/@/hooks/web/useDesign";
 
-  import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
-  import { useLocale } from '/@/locales/useLocale';
+  import { createAsyncComponent } from "/@/utils/factory/createAsyncComponent";
+  import { useLocale } from "/@/locales/useLocale";
 
   export default defineComponent({
-    name: 'LayoutHeader',
+    name: "LayoutHeader",
     components: {
       Header: Layout.Header,
       AppLogo,
@@ -95,7 +95,7 @@
       Notify,
       AppSearch,
       ErrorAction,
-      SettingDrawer: createAsyncComponent(() => import('/@/layouts/default/setting/index.vue'), {
+      SettingDrawer: createAsyncComponent(() => import("/@/layouts/default/setting/index.vue"), {
         loading: true,
       }),
     },
@@ -103,7 +103,7 @@
       fixed: propTypes.bool,
     },
     setup(props) {
-      const { prefixCls } = useDesign('layout-header');
+      const { prefixCls } = useDesign("layout-header");
       const {
         getShowTopMenu,
         getShowHeaderTrigger,
@@ -197,5 +197,5 @@
   });
 </script>
 <style lang="less">
-  @import './index.less';
+  @import "./index.less";
 </style>
diff --git a/src/layouts/default/index.vue b/src/layouts/default/index.vue
index 4a230ba6b7e52151a7b589586c99500ea1507eb0..2c92a0d52aaf9f68796304657004b3c22960f645 100644
--- a/src/layouts/default/index.vue
+++ b/src/layouts/default/index.vue
@@ -14,27 +14,27 @@
 </template>
 
 <script lang="ts">
-  import { defineComponent, computed, unref } from 'vue';
-  import { Layout } from 'ant-design-vue';
-  import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
+  import { defineComponent, computed, unref } from "vue";
+  import { Layout } from "ant-design-vue";
+  import { createAsyncComponent } from "/@/utils/factory/createAsyncComponent";
 
-  import LayoutHeader from './header/index.vue';
-  import LayoutContent from './content/index.vue';
-  import LayoutSideBar from './sider/index.vue';
-  import LayoutMultipleHeader from './header/MultipleHeader.vue';
+  import LayoutHeader from "./header/index.vue";
+  import LayoutContent from "./content/index.vue";
+  import LayoutSideBar from "./sider/index.vue";
+  import LayoutMultipleHeader from "./header/MultipleHeader.vue";
 
-  import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';
-  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useLockPage } from '/@/hooks/web/useLockPage';
+  import { useHeaderSetting } from "/@/hooks/setting/useHeaderSetting";
+  import { useMenuSetting } from "/@/hooks/setting/useMenuSetting";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useLockPage } from "/@/hooks/web/useLockPage";
 
-  import { useAppInject } from '/@/hooks/web/useAppInject';
+  import { useAppInject } from "/@/hooks/web/useAppInject";
 
   export default defineComponent({
-    name: 'DefaultLayout',
+    name: "DefaultLayout",
     components: {
-      LayoutFeatures: createAsyncComponent(() => import('/@/layouts/default/feature/index.vue')),
-      LayoutFooter: createAsyncComponent(() => import('/@/layouts/default/footer/index.vue')),
+      LayoutFeatures: createAsyncComponent(() => import("/@/layouts/default/feature/index.vue")),
+      LayoutFooter: createAsyncComponent(() => import("/@/layouts/default/footer/index.vue")),
       LayoutHeader,
       LayoutContent,
       LayoutSideBar,
@@ -42,7 +42,7 @@
       Layout,
     },
     setup() {
-      const { prefixCls } = useDesign('default-layout');
+      const { prefixCls } = useDesign("default-layout");
       const { getIsMobile } = useAppInject();
       const { getShowFullHeaderRef } = useHeaderSetting();
       const { getShowSidebar, getIsMixSidebar, getShowMenu } = useMenuSetting();
@@ -51,9 +51,9 @@
       const lockEvents = useLockPage();
 
       const layoutClass = computed(() => {
-        let cls: string[] = ['ant-layout'];
+        let cls: string[] = ["ant-layout"];
         if (unref(getIsMixSidebar) || unref(getShowMenu)) {
-          cls.push('ant-layout-has-sider');
+          cls.push("ant-layout-has-sider");
         }
         return cls;
       });
@@ -71,7 +71,7 @@
   });
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-default-layout';
+  @prefix-cls: ~"@{namespace}-default-layout";
 
   .@{prefix-cls} {
     display: flex;
diff --git a/src/layouts/default/menu/index.vue b/src/layouts/default/menu/index.vue
index a6b7dff6d68a993259636b858918a4bbb16fb376..509ae16738a45f92cb3ecd89ae4f3084dadbae76 100644
--- a/src/layouts/default/menu/index.vue
+++ b/src/layouts/default/menu/index.vue
@@ -1,29 +1,29 @@
 <script lang="tsx">
-  import type { PropType, CSSProperties } from 'vue';
+  import type { PropType, CSSProperties } from "vue";
 
-  import { computed, defineComponent, unref, toRef } from 'vue';
-  import { BasicMenu } from '/@/components/Menu';
-  import { SimpleMenu } from '/@/components/SimpleMenu';
-  import { AppLogo } from '/@/components/Application';
+  import { computed, defineComponent, unref, toRef } from "vue";
+  import { BasicMenu } from "/@/components/Menu";
+  import { SimpleMenu } from "/@/components/SimpleMenu";
+  import { AppLogo } from "/@/components/Application";
 
-  import { MenuModeEnum, MenuSplitTyeEnum } from '/@/enums/menuEnum';
+  import { MenuModeEnum, MenuSplitTyeEnum } from "/@/enums/menuEnum";
 
-  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
-  import { ScrollContainer } from '/@/components/Container';
+  import { useMenuSetting } from "/@/hooks/setting/useMenuSetting";
+  import { ScrollContainer } from "/@/components/Container";
 
-  import { useGo } from '/@/hooks/web/usePage';
-  import { useSplitMenu } from './useLayoutMenu';
-  import { openWindow } from '/@/utils';
-  import { propTypes } from '/@/utils/propTypes';
-  import { isUrl } from '/@/utils/is';
-  import { useRootSetting } from '/@/hooks/setting/useRootSetting';
-  import { useAppInject } from '/@/hooks/web/useAppInject';
-  import { useDesign } from '/@/hooks/web/useDesign';
+  import { useGo } from "/@/hooks/web/usePage";
+  import { useSplitMenu } from "./useLayoutMenu";
+  import { openWindow } from "/@/utils";
+  import { propTypes } from "/@/utils/propTypes";
+  import { isUrl } from "/@/utils/is";
+  import { useRootSetting } from "/@/hooks/setting/useRootSetting";
+  import { useAppInject } from "/@/hooks/web/useAppInject";
+  import { useDesign } from "/@/hooks/web/useDesign";
 
   export default defineComponent({
-    name: 'LayoutMenu',
+    name: "LayoutMenu",
     props: {
-      theme: propTypes.oneOf(['light', 'dark']),
+      theme: propTypes.oneOf(["light", "dark"]),
 
       splitType: {
         type: Number as PropType<MenuSplitTyeEnum>,
@@ -34,7 +34,7 @@
       // menu Mode
       menuMode: {
         type: [String] as PropType<Nullable<MenuModeEnum>>,
-        default: '',
+        default: "",
       },
     },
     setup(props) {
@@ -53,9 +53,9 @@
       } = useMenuSetting();
       const { getShowLogo } = useRootSetting();
 
-      const { prefixCls } = useDesign('layout-menu');
+      const { prefixCls } = useDesign("layout-menu");
 
-      const { menusRef } = useSplitMenu(toRef(props, 'splitType'));
+      const { menusRef } = useSplitMenu(toRef(props, "splitType"));
 
       const { getIsMobile } = useAppInject();
 
@@ -78,7 +78,7 @@
 
       const getWrapperStyle = computed((): CSSProperties => {
         return {
-          height: `calc(100% - ${unref(getIsShowLogo) ? '48px' : '0px'})`,
+          height: `calc(100% - ${unref(getIsShowLogo) ? "48px" : "0px"})`,
         };
       });
 
@@ -172,8 +172,8 @@
   });
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-layout-menu';
-  @logo-prefix-cls: ~'@{namespace}-app-logo';
+  @prefix-cls: ~"@{namespace}-layout-menu";
+  @logo-prefix-cls: ~"@{namespace}-app-logo";
 
   .@{prefix-cls} {
     &-logo {
diff --git a/src/layouts/default/menu/useLayoutMenu.ts b/src/layouts/default/menu/useLayoutMenu.ts
index 33c77680091549e75a702f3263f425ba7133a41a..64a1cf94253f181a94082e1bfc610a269e8bdb67 100644
--- a/src/layouts/default/menu/useLayoutMenu.ts
+++ b/src/layouts/default/menu/useLayoutMenu.ts
@@ -1,13 +1,13 @@
-import type { Menu } from '/@/router/types';
-import type { Ref } from 'vue';
-import { watch, unref, ref, computed } from 'vue';
-import { useRouter } from 'vue-router';
-import { MenuSplitTyeEnum } from '/@/enums/menuEnum';
-import { useThrottleFn } from '@vueuse/core';
-import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
-import { getChildrenMenus, getCurrentParentPath, getMenus, getShallowMenus } from '/@/router/menus';
-import { usePermissionStore } from '/@/store/modules/permission';
-import { useAppInject } from '/@/hooks/web/useAppInject';
+import type { Menu } from "/@/router/types";
+import type { Ref } from "vue";
+import { watch, unref, ref, computed } from "vue";
+import { useRouter } from "vue-router";
+import { MenuSplitTyeEnum } from "/@/enums/menuEnum";
+import { useThrottleFn } from "@vueuse/core";
+import { useMenuSetting } from "/@/hooks/setting/useMenuSetting";
+import { getChildrenMenus, getCurrentParentPath, getMenus, getShallowMenus } from "/@/router/menus";
+import { usePermissionStore } from "/@/store/modules/permission";
+import { useAppInject } from "/@/hooks/web/useAppInject";
 
 export function useSplitMenu(splitType: Ref<MenuSplitTyeEnum>) {
   // Menu array
diff --git a/src/layouts/default/setting/SettingDrawer.tsx b/src/layouts/default/setting/SettingDrawer.tsx
index c98288683db6c690c60a72878b5ab45dd8356572..2cb54259da46cd95f2c10d2b0ff1e22e4b6c7ddc 100644
--- a/src/layouts/default/setting/SettingDrawer.tsx
+++ b/src/layouts/default/setting/SettingDrawer.tsx
@@ -1,6 +1,6 @@
-import { defineComponent, computed, unref } from 'vue';
-import { BasicDrawer } from '/@/components/Drawer/index';
-import { Divider } from 'ant-design-vue';
+import { defineComponent, computed, unref } from "vue";
+import { BasicDrawer } from "/@/components/Drawer/index";
+import { Divider } from "ant-design-vue";
 import {
   TypePicker,
   ThemeColorPicker,
@@ -8,20 +8,20 @@ import {
   SwitchItem,
   SelectItem,
   InputNumberItem,
-} from './components';
+} from "./components";
 
-import { AppDarkModeToggle } from '/@/components/Application';
+import { AppDarkModeToggle } from "/@/components/Application";
 
-import { MenuTypeEnum, TriggerEnum } from '/@/enums/menuEnum';
+import { MenuTypeEnum, TriggerEnum } from "/@/enums/menuEnum";
 
-import { useRootSetting } from '/@/hooks/setting/useRootSetting';
-import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
-import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';
-import { useMultipleTabSetting } from '/@/hooks/setting/useMultipleTabSetting';
-import { useTransitionSetting } from '/@/hooks/setting/useTransitionSetting';
-import { useI18n } from '/@/hooks/web/useI18n';
+import { useRootSetting } from "/@/hooks/setting/useRootSetting";
+import { useMenuSetting } from "/@/hooks/setting/useMenuSetting";
+import { useHeaderSetting } from "/@/hooks/setting/useHeaderSetting";
+import { useMultipleTabSetting } from "/@/hooks/setting/useMultipleTabSetting";
+import { useTransitionSetting } from "/@/hooks/setting/useTransitionSetting";
+import { useI18n } from "/@/hooks/web/useI18n";
 
-import { baseHandler } from './handler';
+import { baseHandler } from "./handler";
 
 import {
   HandlerEnum,
@@ -31,18 +31,18 @@ import {
   routerTransitionOptions,
   menuTypeList,
   mixSidebarTriggerOptions,
-} from './enum';
+} from "./enum";
 
 import {
   HEADER_PRESET_BG_COLOR_LIST,
   SIDE_BAR_BG_COLOR_LIST,
   APP_PRESET_COLOR_LIST,
-} from '/@/settings/designSetting';
+} from "/@/settings/designSetting";
 
 const { t } = useI18n();
 
 export default defineComponent({
-  name: 'SettingDrawer',
+  name: "SettingDrawer",
   setup(_, { attrs }) {
     const {
       getContentMode,
@@ -158,78 +158,78 @@ export default defineComponent({
       return (
         <>
           <SwitchItem
-            title={t('layout.setting.splitMenu')}
+            title={t("layout.setting.splitMenu")}
             event={HandlerEnum.MENU_SPLIT}
             def={unref(getSplit)}
             disabled={!unref(getShowMenuRef) || unref(getMenuType) !== MenuTypeEnum.MIX}
           />
           <SwitchItem
-            title={t('layout.setting.mixSidebarFixed')}
+            title={t("layout.setting.mixSidebarFixed")}
             event={HandlerEnum.MENU_FIXED_MIX_SIDEBAR}
             def={unref(getMixSideFixed)}
             disabled={!unref(getIsMixSidebar)}
           />
 
           <SwitchItem
-            title={t('layout.setting.closeMixSidebarOnChange')}
+            title={t("layout.setting.closeMixSidebarOnChange")}
             event={HandlerEnum.MENU_CLOSE_MIX_SIDEBAR_ON_CHANGE}
             def={unref(getCloseMixSidebarOnChange)}
             disabled={!unref(getIsMixSidebar)}
           />
           <SwitchItem
-            title={t('layout.setting.menuCollapse')}
+            title={t("layout.setting.menuCollapse")}
             event={HandlerEnum.MENU_COLLAPSED}
             def={unref(getCollapsed)}
             disabled={!unref(getShowMenuRef)}
           />
 
           <SwitchItem
-            title={t('layout.setting.menuDrag')}
+            title={t("layout.setting.menuDrag")}
             event={HandlerEnum.MENU_HAS_DRAG}
             def={unref(getCanDrag)}
             disabled={!unref(getShowMenuRef)}
           />
           <SwitchItem
-            title={t('layout.setting.menuSearch')}
+            title={t("layout.setting.menuSearch")}
             event={HandlerEnum.HEADER_SEARCH}
             def={unref(getShowSearch)}
             disabled={!unref(getShowHeader)}
           />
           <SwitchItem
-            title={t('layout.setting.menuAccordion')}
+            title={t("layout.setting.menuAccordion")}
             event={HandlerEnum.MENU_ACCORDION}
             def={unref(getAccordion)}
             disabled={!unref(getShowMenuRef)}
           />
 
           <SwitchItem
-            title={t('layout.setting.collapseMenuDisplayName')}
+            title={t("layout.setting.collapseMenuDisplayName")}
             event={HandlerEnum.MENU_COLLAPSED_SHOW_TITLE}
             def={unref(getCollapsedShowTitle)}
             disabled={!unref(getShowMenuRef) || !unref(getCollapsed) || unref(getIsMixSidebar)}
           />
 
           <SwitchItem
-            title={t('layout.setting.fixedHeader')}
+            title={t("layout.setting.fixedHeader")}
             event={HandlerEnum.HEADER_FIXED}
             def={unref(getHeaderFixed)}
             disabled={!unref(getShowHeader)}
           />
           <SwitchItem
-            title={t('layout.setting.fixedSideBar')}
+            title={t("layout.setting.fixedSideBar")}
             event={HandlerEnum.MENU_FIXED}
             def={unref(getMenuFixed)}
             disabled={!unref(getShowMenuRef) || unref(getIsMixSidebar)}
           />
           <SelectItem
-            title={t('layout.setting.mixSidebarTrigger')}
+            title={t("layout.setting.mixSidebarTrigger")}
             event={HandlerEnum.MENU_TRIGGER_MIX_SIDEBAR}
             def={unref(getMixSideTrigger)}
             options={mixSidebarTriggerOptions}
             disabled={!unref(getIsMixSidebar)}
           />
           <SelectItem
-            title={t('layout.setting.topMenuLayout')}
+            title={t("layout.setting.topMenuLayout")}
             event={HandlerEnum.MENU_TOP_ALIGN}
             def={unref(getTopMenuAlign)}
             options={topMenuAlignOptions}
@@ -241,31 +241,31 @@ export default defineComponent({
             }
           />
           <SelectItem
-            title={t('layout.setting.menuCollapseButton')}
+            title={t("layout.setting.menuCollapseButton")}
             event={HandlerEnum.MENU_TRIGGER}
             def={triggerDef}
             options={triggerOptions}
             disabled={!unref(getShowMenuRef) || unref(getIsMixSidebar)}
           />
           <SelectItem
-            title={t('layout.setting.contentMode')}
+            title={t("layout.setting.contentMode")}
             event={HandlerEnum.CONTENT_MODE}
             def={unref(getContentMode)}
             options={contentModeOptions}
           />
           <InputNumberItem
-            title={t('layout.setting.autoScreenLock')}
+            title={t("layout.setting.autoScreenLock")}
             min={0}
             event={HandlerEnum.LOCK_TIME}
             defaultValue={unref(getLockTime)}
             formatter={(value: string) => {
               return parseInt(value) === 0
-                ? `0(${t('layout.setting.notAutoScreenLock')})`
-                : `${value}${t('layout.setting.minute')}`;
+                ? `0(${t("layout.setting.notAutoScreenLock")})`
+                : `${value}${t("layout.setting.minute")}`;
             }}
           />
           <InputNumberItem
-            title={t('layout.setting.expandedMenuWidth')}
+            title={t("layout.setting.expandedMenuWidth")}
             max={600}
             min={100}
             step={10}
@@ -282,54 +282,54 @@ export default defineComponent({
       return (
         <>
           <SwitchItem
-            title={t('layout.setting.breadcrumb')}
+            title={t("layout.setting.breadcrumb")}
             event={HandlerEnum.SHOW_BREADCRUMB}
             def={unref(getShowBreadCrumb)}
             disabled={!unref(getShowHeader)}
           />
 
           <SwitchItem
-            title={t('layout.setting.breadcrumbIcon')}
+            title={t("layout.setting.breadcrumbIcon")}
             event={HandlerEnum.SHOW_BREADCRUMB_ICON}
             def={unref(getShowBreadCrumbIcon)}
             disabled={!unref(getShowHeader)}
           />
 
           <SwitchItem
-            title={t('layout.setting.tabs')}
+            title={t("layout.setting.tabs")}
             event={HandlerEnum.TABS_SHOW}
             def={unref(getShowMultipleTab)}
           />
 
           <SwitchItem
-            title={t('layout.setting.tabsRedoBtn')}
+            title={t("layout.setting.tabsRedoBtn")}
             event={HandlerEnum.TABS_SHOW_REDO}
             def={unref(getShowRedo)}
             disabled={!unref(getShowMultipleTab)}
           />
 
           <SwitchItem
-            title={t('layout.setting.tabsQuickBtn')}
+            title={t("layout.setting.tabsQuickBtn")}
             event={HandlerEnum.TABS_SHOW_QUICK}
             def={unref(getShowQuick)}
             disabled={!unref(getShowMultipleTab)}
           />
           <SwitchItem
-            title={t('layout.setting.tabsFoldBtn')}
+            title={t("layout.setting.tabsFoldBtn")}
             event={HandlerEnum.TABS_SHOW_FOLD}
             def={unref(getShowFold)}
             disabled={!unref(getShowMultipleTab)}
           />
 
           <SwitchItem
-            title={t('layout.setting.sidebar')}
+            title={t("layout.setting.sidebar")}
             event={HandlerEnum.MENU_SHOW_SIDEBAR}
             def={unref(getShowMenu)}
             disabled={unref(getIsHorizontal)}
           />
 
           <SwitchItem
-            title={t('layout.setting.header')}
+            title={t("layout.setting.header")}
             event={HandlerEnum.HEADER_SHOW}
             def={unref(getShowHeader)}
           />
@@ -340,24 +340,24 @@ export default defineComponent({
             disabled={unref(getIsMixSidebar)}
           />
           <SwitchItem
-            title={t('layout.setting.footer')}
+            title={t("layout.setting.footer")}
             event={HandlerEnum.SHOW_FOOTER}
             def={unref(getShowFooter)}
           />
           <SwitchItem
-            title={t('layout.setting.fullContent')}
+            title={t("layout.setting.fullContent")}
             event={HandlerEnum.FULL_CONTENT}
             def={unref(getFullContent)}
           />
 
           <SwitchItem
-            title={t('layout.setting.grayMode')}
+            title={t("layout.setting.grayMode")}
             event={HandlerEnum.GRAY_MODE}
             def={unref(getGrayMode)}
           />
 
           <SwitchItem
-            title={t('layout.setting.colorWeak')}
+            title={t("layout.setting.colorWeak")}
             event={HandlerEnum.COLOR_WEAK}
             def={unref(getColorWeak)}
           />
@@ -369,24 +369,24 @@ export default defineComponent({
       return (
         <>
           <SwitchItem
-            title={t('layout.setting.progress')}
+            title={t("layout.setting.progress")}
             event={HandlerEnum.OPEN_PROGRESS}
             def={unref(getOpenNProgress)}
           />
           <SwitchItem
-            title={t('layout.setting.switchLoading')}
+            title={t("layout.setting.switchLoading")}
             event={HandlerEnum.OPEN_PAGE_LOADING}
             def={unref(getOpenPageLoading)}
           />
 
           <SwitchItem
-            title={t('layout.setting.switchAnimation')}
+            title={t("layout.setting.switchAnimation")}
             event={HandlerEnum.OPEN_ROUTE_TRANSITION}
             def={unref(getEnableTransition)}
           />
 
           <SelectItem
-            title={t('layout.setting.animationType')}
+            title={t("layout.setting.animationType")}
             event={HandlerEnum.ROUTER_TRANSITION}
             def={unref(getBasicTransition)}
             options={routerTransitionOptions}
@@ -399,25 +399,25 @@ export default defineComponent({
     return () => (
       <BasicDrawer
         {...attrs}
-        title={t('layout.setting.drawerTitle')}
+        title={t("layout.setting.drawerTitle")}
         width={330}
-        wrapClassName="setting-drawer"
+        class="setting-drawer"
       >
-        {unref(getShowDarkModeToggle) && <Divider>{() => t('layout.setting.darkMode')}</Divider>}
+        {unref(getShowDarkModeToggle) && <Divider>{() => t("layout.setting.darkMode")}</Divider>}
         {unref(getShowDarkModeToggle) && <AppDarkModeToggle class="mx-auto" />}
-        <Divider>{() => t('layout.setting.navMode')}</Divider>
+        <Divider>{() => t("layout.setting.navMode")}</Divider>
         {renderSidebar()}
-        <Divider>{() => t('layout.setting.sysTheme')}</Divider>
+        <Divider>{() => t("layout.setting.sysTheme")}</Divider>
         {renderMainTheme()}
-        <Divider>{() => t('layout.setting.headerTheme')}</Divider>
+        <Divider>{() => t("layout.setting.headerTheme")}</Divider>
         {renderHeaderTheme()}
-        <Divider>{() => t('layout.setting.sidebarTheme')}</Divider>
+        <Divider>{() => t("layout.setting.sidebarTheme")}</Divider>
         {renderSiderTheme()}
-        <Divider>{() => t('layout.setting.interfaceFunction')}</Divider>
+        <Divider>{() => t("layout.setting.interfaceFunction")}</Divider>
         {renderFeatures()}
-        <Divider>{() => t('layout.setting.interfaceDisplay')}</Divider>
+        <Divider>{() => t("layout.setting.interfaceDisplay")}</Divider>
         {renderContent()}
-        <Divider>{() => t('layout.setting.animation')}</Divider>
+        <Divider>{() => t("layout.setting.animation")}</Divider>
         {renderTransition()}
         <Divider />
         <SettingFooter />
diff --git a/src/layouts/default/setting/components/InputNumberItem.vue b/src/layouts/default/setting/components/InputNumberItem.vue
index a2f5bc5c755f010d2862056872c1a5ae47dfc43f..96c4efdbdb45db4744482f830ebb3a1ac4d2dd71 100644
--- a/src/layouts/default/setting/components/InputNumberItem.vue
+++ b/src/layouts/default/setting/components/InputNumberItem.vue
@@ -10,15 +10,15 @@
   </div>
 </template>
 <script lang="ts">
-  import { defineComponent, PropType } from 'vue';
+  import { defineComponent, PropType } from "vue";
 
-  import { InputNumber } from 'ant-design-vue';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { baseHandler } from '../handler';
-  import { HandlerEnum } from '../enum';
+  import { InputNumber } from "ant-design-vue";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { baseHandler } from "../handler";
+  import { HandlerEnum } from "../enum";
 
   export default defineComponent({
-    name: 'InputNumberItem',
+    name: "InputNumberItem",
     components: { InputNumber },
     props: {
       event: {
@@ -29,7 +29,7 @@
       },
     },
     setup(props) {
-      const { prefixCls } = useDesign('setting-input-number-item');
+      const { prefixCls } = useDesign("setting-input-number-item");
 
       function handleChange(e) {
         props.event && baseHandler(props.event, e);
@@ -42,7 +42,7 @@
   });
 </script>
 <style lang="less" scoped>
-  @prefix-cls: ~'@{namespace}-setting-input-number-item';
+  @prefix-cls: ~"@{namespace}-setting-input-number-item";
 
   .@{prefix-cls} {
     display: flex;
diff --git a/src/layouts/default/setting/components/SelectItem.vue b/src/layouts/default/setting/components/SelectItem.vue
index 676ca9125c46de3960a092d1990c8bfd3e573f7c..56060abc0b48eb12bb22e90048c14333f1ac0c44 100644
--- a/src/layouts/default/setting/components/SelectItem.vue
+++ b/src/layouts/default/setting/components/SelectItem.vue
@@ -12,15 +12,15 @@
   </div>
 </template>
 <script lang="ts">
-  import { defineComponent, PropType, computed } from 'vue';
+  import { defineComponent, PropType, computed } from "vue";
 
-  import { Select } from 'ant-design-vue';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { baseHandler } from '../handler';
-  import { HandlerEnum } from '../enum';
+  import { Select } from "ant-design-vue";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { baseHandler } from "../handler";
+  import { HandlerEnum } from "../enum";
 
   export default defineComponent({
-    name: 'SelectItem',
+    name: "SelectItem",
     components: { Select },
     props: {
       event: {
@@ -44,7 +44,7 @@
       },
     },
     setup(props) {
-      const { prefixCls } = useDesign('setting-select-item');
+      const { prefixCls } = useDesign("setting-select-item");
       const getBindValue = computed(() => {
         return props.def ? { value: props.def, defaultValue: props.initValue || props.def } : {};
       });
@@ -61,7 +61,7 @@
   });
 </script>
 <style lang="less" scoped>
-  @prefix-cls: ~'@{namespace}-setting-select-item';
+  @prefix-cls: ~"@{namespace}-setting-select-item";
 
   .@{prefix-cls} {
     display: flex;
diff --git a/src/layouts/default/setting/components/SettingFooter.vue b/src/layouts/default/setting/components/SettingFooter.vue
index 2375664014d1eb74763158f8fd94236dae02f69f..47c3f7baa86b641e66f7d81ef0e37dd9aa594849 100644
--- a/src/layouts/default/setting/components/SettingFooter.vue
+++ b/src/layouts/default/setting/components/SettingFooter.vue
@@ -2,45 +2,45 @@
   <div :class="prefixCls">
     <a-button type="primary" block @click="handleCopy">
       <CopyOutlined class="mr-2" />
-      {{ t('layout.setting.copyBtn') }}
+      {{ t("layout.setting.copyBtn") }}
     </a-button>
 
     <a-button color="warning" block @click="handleResetSetting" class="my-3">
       <RedoOutlined class="mr-2" />
-      {{ t('common.resetText') }}
+      {{ t("common.resetText") }}
     </a-button>
 
     <a-button color="error" block @click="handleClearAndRedo">
       <RedoOutlined class="mr-2" />
-      {{ t('layout.setting.clearBtn') }}
+      {{ t("layout.setting.clearBtn") }}
     </a-button>
   </div>
 </template>
 <script lang="ts">
-  import { defineComponent, unref } from 'vue';
+  import { defineComponent, unref } from "vue";
 
-  import { CopyOutlined, RedoOutlined } from '@ant-design/icons-vue';
+  import { CopyOutlined, RedoOutlined } from "@ant-design/icons-vue";
 
-  import { useAppStore } from '/@/store/modules/app';
-  import { usePermissionStore } from '/@/store/modules/permission';
-  import { useMultipleTabStore } from '/@/store/modules/multipleTab';
-  import { useUserStore } from '/@/store/modules/user';
+  import { useAppStore } from "/@/store/modules/app";
+  import { usePermissionStore } from "/@/store/modules/permission";
+  import { useMultipleTabStore } from "/@/store/modules/multipleTab";
+  import { useUserStore } from "/@/store/modules/user";
 
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { useMessage } from '/@/hooks/web/useMessage';
-  import { useCopyToClipboard } from '/@/hooks/web/useCopyToClipboard';
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { useMessage } from "/@/hooks/web/useMessage";
+  import { useCopyToClipboard } from "/@/hooks/web/useCopyToClipboard";
 
-  import { updateColorWeak } from '/@/logics/theme/updateColorWeak';
-  import { updateGrayMode } from '/@/logics/theme/updateGrayMode';
-  import defaultSetting from '/@/settings/projectSetting';
+  import { updateColorWeak } from "/@/logics/theme/updateColorWeak";
+  import { updateGrayMode } from "/@/logics/theme/updateGrayMode";
+  import defaultSetting from "/@/settings/projectSetting";
 
   export default defineComponent({
-    name: 'SettingFooter',
+    name: "SettingFooter",
     components: { CopyOutlined, RedoOutlined },
     setup() {
       const permissionStore = usePermissionStore();
-      const { prefixCls } = useDesign('setting-footer');
+      const { prefixCls } = useDesign("setting-footer");
       const { t } = useI18n();
       const { createSuccessModal, createMessage } = useMessage();
       const tabStore = useMultipleTabStore();
@@ -53,8 +53,8 @@
         );
         unref(isSuccessRef) &&
           createSuccessModal({
-            title: t('layout.setting.operatingTitle'),
-            content: t('layout.setting.operatingContent'),
+            title: t("layout.setting.operatingTitle"),
+            content: t("layout.setting.operatingContent"),
           });
       }
       function handleResetSetting() {
@@ -64,7 +64,7 @@
           // updateTheme(themeColor);
           updateColorWeak(colorWeak);
           updateGrayMode(grayMode);
-          createMessage.success(t('layout.setting.resetSuccess'));
+          createMessage.success(t("layout.setting.resetSuccess"));
         } catch (error: any) {
           createMessage.error(error);
         }
@@ -89,7 +89,7 @@
   });
 </script>
 <style lang="less" scoped>
-  @prefix-cls: ~'@{namespace}-setting-footer';
+  @prefix-cls: ~"@{namespace}-setting-footer";
 
   .@{prefix-cls} {
     display: flex;
diff --git a/src/layouts/default/setting/components/SwitchItem.vue b/src/layouts/default/setting/components/SwitchItem.vue
index ff274777740db781388f40719e7d930f54a68a22..eda91c1b5b6124903a3754770e2c7e093a7ac5fa 100644
--- a/src/layouts/default/setting/components/SwitchItem.vue
+++ b/src/layouts/default/setting/components/SwitchItem.vue
@@ -11,16 +11,16 @@
   </div>
 </template>
 <script lang="ts">
-  import { defineComponent, PropType, computed } from 'vue';
+  import { defineComponent, PropType, computed } from "vue";
 
-  import { Switch } from 'ant-design-vue';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { baseHandler } from '../handler';
-  import { HandlerEnum } from '../enum';
+  import { Switch } from "ant-design-vue";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { baseHandler } from "../handler";
+  import { HandlerEnum } from "../enum";
 
   export default defineComponent({
-    name: 'SwitchItem',
+    name: "SwitchItem",
     components: { Switch },
     props: {
       event: {
@@ -37,7 +37,7 @@
       },
     },
     setup(props) {
-      const { prefixCls } = useDesign('setting-switch-item');
+      const { prefixCls } = useDesign("setting-switch-item");
       const { t } = useI18n();
 
       const getBindValue = computed(() => {
@@ -56,7 +56,7 @@
   });
 </script>
 <style lang="less" scoped>
-  @prefix-cls: ~'@{namespace}-setting-switch-item';
+  @prefix-cls: ~"@{namespace}-setting-switch-item";
 
   .@{prefix-cls} {
     display: flex;
diff --git a/src/layouts/default/setting/components/ThemeColorPicker.vue b/src/layouts/default/setting/components/ThemeColorPicker.vue
index d0f28ba894d93d9ba1af38a79aaea8ca1875ca98..db6bd6f61baec5c27fc2ac678eca893718b216a5 100644
--- a/src/layouts/default/setting/components/ThemeColorPicker.vue
+++ b/src/layouts/default/setting/components/ThemeColorPicker.vue
@@ -17,16 +17,16 @@
   </div>
 </template>
 <script lang="ts">
-  import { defineComponent, PropType } from 'vue';
-  import { CheckOutlined } from '@ant-design/icons-vue';
+  import { defineComponent, PropType } from "vue";
+  import { CheckOutlined } from "@ant-design/icons-vue";
 
-  import { useDesign } from '/@/hooks/web/useDesign';
+  import { useDesign } from "/@/hooks/web/useDesign";
 
-  import { baseHandler } from '../handler';
-  import { HandlerEnum } from '../enum';
+  import { baseHandler } from "../handler";
+  import { HandlerEnum } from "../enum";
 
   export default defineComponent({
-    name: 'ThemeColorPicker',
+    name: "ThemeColorPicker",
     components: { CheckOutlined },
     props: {
       colorList: {
@@ -41,7 +41,7 @@
       },
     },
     setup(props) {
-      const { prefixCls } = useDesign('setting-theme-picker');
+      const { prefixCls } = useDesign("setting-theme-picker");
 
       function handleClick(color: string) {
         props.event && baseHandler(props.event, color);
@@ -54,7 +54,7 @@
   });
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-setting-theme-picker';
+  @prefix-cls: ~"@{namespace}-setting-theme-picker";
 
   .@{prefix-cls} {
     display: flex;
diff --git a/src/layouts/default/setting/components/TypePicker.vue b/src/layouts/default/setting/components/TypePicker.vue
index ce8610a20cc9c26e4f8f6d42c2cfe2a3bcc08eb8..ef1536b2774f362c360af1055af8f32fdc2b59e8 100644
--- a/src/layouts/default/setting/components/TypePicker.vue
+++ b/src/layouts/default/setting/components/TypePicker.vue
@@ -19,14 +19,14 @@
   </div>
 </template>
 <script lang="ts">
-  import { defineComponent, PropType } from 'vue';
+  import { defineComponent, PropType } from "vue";
 
-  import { Tooltip } from 'ant-design-vue';
-  import { useDesign } from '/@/hooks/web/useDesign';
+  import { Tooltip } from "ant-design-vue";
+  import { useDesign } from "/@/hooks/web/useDesign";
 
-  import { menuTypeList } from '../enum';
+  import { menuTypeList } from "../enum";
   export default defineComponent({
-    name: 'MenuTypePicker',
+    name: "MenuTypePicker",
     components: { Tooltip },
     props: {
       menuTypeList: {
@@ -39,11 +39,11 @@
       },
       def: {
         type: String,
-        default: '',
+        default: "",
       },
     },
     setup() {
-      const { prefixCls } = useDesign('setting-menu-type-picker');
+      const { prefixCls } = useDesign("setting-menu-type-picker");
 
       return {
         prefixCls,
@@ -52,7 +52,7 @@
   });
 </script>
 <style lang="less" scoped>
-  @prefix-cls: ~'@{namespace}-setting-menu-type-picker';
+  @prefix-cls: ~"@{namespace}-setting-menu-type-picker";
 
   .@{prefix-cls} {
     display: flex;
@@ -71,7 +71,7 @@
       &::before,
       &::after {
         position: absolute;
-        content: '';
+        content: "";
       }
 
       &--sidebar,
diff --git a/src/layouts/default/setting/components/index.ts b/src/layouts/default/setting/components/index.ts
index bd248885d49f80f15364f66cea78f9b7683cd2b7..d753dd81ae09f5d9801e58ccaab20fce527bdd9e 100644
--- a/src/layouts/default/setting/components/index.ts
+++ b/src/layouts/default/setting/components/index.ts
@@ -1,8 +1,8 @@
-import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
+import { createAsyncComponent } from "/@/utils/factory/createAsyncComponent";
 
-export const TypePicker = createAsyncComponent(() => import('./TypePicker.vue'));
-export const ThemeColorPicker = createAsyncComponent(() => import('./ThemeColorPicker.vue'));
-export const SettingFooter = createAsyncComponent(() => import('./SettingFooter.vue'));
-export const SwitchItem = createAsyncComponent(() => import('./SwitchItem.vue'));
-export const SelectItem = createAsyncComponent(() => import('./SelectItem.vue'));
-export const InputNumberItem = createAsyncComponent(() => import('./InputNumberItem.vue'));
+export const TypePicker = createAsyncComponent(() => import("./TypePicker.vue"));
+export const ThemeColorPicker = createAsyncComponent(() => import("./ThemeColorPicker.vue"));
+export const SettingFooter = createAsyncComponent(() => import("./SettingFooter.vue"));
+export const SwitchItem = createAsyncComponent(() => import("./SwitchItem.vue"));
+export const SelectItem = createAsyncComponent(() => import("./SelectItem.vue"));
+export const InputNumberItem = createAsyncComponent(() => import("./InputNumberItem.vue"));
diff --git a/src/layouts/default/setting/enum.ts b/src/layouts/default/setting/enum.ts
index 1e9633a7a1a21aec955d0c2f12bdf99a8c6c11c5..772f657d945958615de5441f1b1d0274b519763b 100644
--- a/src/layouts/default/setting/enum.ts
+++ b/src/layouts/default/setting/enum.ts
@@ -1,13 +1,13 @@
-import { ContentEnum, RouterTransitionEnum } from '/@/enums/appEnum';
+import { ContentEnum, RouterTransitionEnum } from "/@/enums/appEnum";
 import {
   MenuModeEnum,
   MenuTypeEnum,
   TopMenuAlignEnum,
   TriggerEnum,
   MixSidebarTriggerEnum,
-} from '/@/enums/menuEnum';
+} from "/@/enums/menuEnum";
 
-import { useI18n } from '/@/hooks/web/useI18n';
+import { useI18n } from "/@/hooks/web/useI18n";
 
 const { t } = useI18n();
 
@@ -62,26 +62,26 @@ export enum HandlerEnum {
 export const contentModeOptions = [
   {
     value: ContentEnum.FULL,
-    label: t('layout.setting.contentModeFull'),
+    label: t("layout.setting.contentModeFull"),
   },
   {
     value: ContentEnum.FIXED,
-    label: t('layout.setting.contentModeFixed'),
+    label: t("layout.setting.contentModeFixed"),
   },
 ];
 
 export const topMenuAlignOptions = [
   {
     value: TopMenuAlignEnum.CENTER,
-    label: t('layout.setting.topMenuAlignRight'),
+    label: t("layout.setting.topMenuAlignRight"),
   },
   {
     value: TopMenuAlignEnum.START,
-    label: t('layout.setting.topMenuAlignLeft'),
+    label: t("layout.setting.topMenuAlignLeft"),
   },
   {
     value: TopMenuAlignEnum.END,
-    label: t('layout.setting.topMenuAlignCenter'),
+    label: t("layout.setting.topMenuAlignCenter"),
   },
 ];
 
@@ -89,18 +89,18 @@ export const getMenuTriggerOptions = (hideTop: boolean) => {
   return [
     {
       value: TriggerEnum.NONE,
-      label: t('layout.setting.menuTriggerNone'),
+      label: t("layout.setting.menuTriggerNone"),
     },
     {
       value: TriggerEnum.FOOTER,
-      label: t('layout.setting.menuTriggerBottom'),
+      label: t("layout.setting.menuTriggerBottom"),
     },
     ...(hideTop
       ? []
       : [
           {
             value: TriggerEnum.HEADER,
-            label: t('layout.setting.menuTriggerTop'),
+            label: t("layout.setting.menuTriggerTop"),
           },
         ]),
   ];
@@ -122,23 +122,23 @@ export const routerTransitionOptions = [
 
 export const menuTypeList = [
   {
-    title: t('layout.setting.menuTypeSidebar'),
+    title: t("layout.setting.menuTypeSidebar"),
     mode: MenuModeEnum.INLINE,
     type: MenuTypeEnum.SIDEBAR,
   },
   {
-    title: t('layout.setting.menuTypeMix'),
+    title: t("layout.setting.menuTypeMix"),
     mode: MenuModeEnum.INLINE,
     type: MenuTypeEnum.MIX,
   },
 
   {
-    title: t('layout.setting.menuTypeTopMenu'),
+    title: t("layout.setting.menuTypeTopMenu"),
     mode: MenuModeEnum.HORIZONTAL,
     type: MenuTypeEnum.TOP_MENU,
   },
   {
-    title: t('layout.setting.menuTypeMixSidebar'),
+    title: t("layout.setting.menuTypeMixSidebar"),
     mode: MenuModeEnum.INLINE,
     type: MenuTypeEnum.MIX_SIDEBAR,
   },
@@ -147,10 +147,10 @@ export const menuTypeList = [
 export const mixSidebarTriggerOptions = [
   {
     value: MixSidebarTriggerEnum.HOVER,
-    label: t('layout.setting.triggerHover'),
+    label: t("layout.setting.triggerHover"),
   },
   {
     value: MixSidebarTriggerEnum.CLICK,
-    label: t('layout.setting.triggerClick'),
+    label: t("layout.setting.triggerClick"),
   },
 ];
diff --git a/src/layouts/default/setting/handler.ts b/src/layouts/default/setting/handler.ts
index 0909008a659e17d57e18ba68b0678d0c0e14c480..0586109366abba5f3b40f307a40b6b8024d3206f 100644
--- a/src/layouts/default/setting/handler.ts
+++ b/src/layouts/default/setting/handler.ts
@@ -1,13 +1,13 @@
-import { HandlerEnum } from './enum';
-import { updateHeaderBgColor, updateSidebarBgColor } from '/@/logics/theme/updateBackground';
-import { updateColorWeak } from '/@/logics/theme/updateColorWeak';
-import { updateGrayMode } from '/@/logics/theme/updateGrayMode';
-
-import { useAppStore } from '/@/store/modules/app';
-import { ProjectConfig } from '/#/config';
-import { changeTheme } from '/@/logics/theme';
-import { updateDarkTheme } from '/@/logics/theme/dark';
-import { useRootSetting } from '/@/hooks/setting/useRootSetting';
+import { HandlerEnum } from "./enum";
+import { updateHeaderBgColor, updateSidebarBgColor } from "/@/logics/theme/updateBackground";
+import { updateColorWeak } from "/@/logics/theme/updateColorWeak";
+import { updateGrayMode } from "/@/logics/theme/updateGrayMode";
+
+import { useAppStore } from "/@/store/modules/app";
+import { ProjectConfig } from "/#/config";
+import { changeTheme } from "/@/logics/theme";
+import { updateDarkTheme } from "/@/logics/theme/dark";
+import { useRootSetting } from "/@/hooks/setting/useRootSetting";
 
 export function baseHandler(event: HandlerEnum, value: any) {
   const appStore = useAppStore();
diff --git a/src/layouts/default/setting/index.vue b/src/layouts/default/setting/index.vue
index 9c5bb87f4f175348d2aecfd519d99bb36a42a25e..74affd5ff5c24007a44da976f794fb6bf6c7a00d 100644
--- a/src/layouts/default/setting/index.vue
+++ b/src/layouts/default/setting/index.vue
@@ -5,14 +5,14 @@
   </div>
 </template>
 <script lang="ts">
-  import { defineComponent } from 'vue';
-  import SettingDrawer from './SettingDrawer';
-  import Icon from '/@/components/Icon';
+  import { defineComponent } from "vue";
+  import SettingDrawer from "./SettingDrawer";
+  import Icon from "/@/components/Icon";
 
-  import { useDrawer } from '/@/components/Drawer';
+  import { useDrawer } from "/@/components/Drawer";
 
   export default defineComponent({
-    name: 'SettingButton',
+    name: "SettingButton",
     components: { SettingDrawer, Icon },
     setup() {
       const [register, { openDrawer }] = useDrawer();
diff --git a/src/layouts/default/sider/DragBar.vue b/src/layouts/default/sider/DragBar.vue
index 9bae60c1ef9f10955794f8bb415788a1aae3a089..0db074d7d7f8be91a9e64fa0f1899a23e297fe69 100644
--- a/src/layouts/default/sider/DragBar.vue
+++ b/src/layouts/default/sider/DragBar.vue
@@ -2,20 +2,20 @@
   <div :class="getClass" :style="getDragBarStyle"></div>
 </template>
 <script lang="ts">
-  import { defineComponent, computed, unref } from 'vue';
+  import { defineComponent, computed, unref } from "vue";
 
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useMenuSetting } from "/@/hooks/setting/useMenuSetting";
 
   export default defineComponent({
-    name: 'DargBar',
+    name: "DargBar",
     props: {
       mobile: Boolean,
     },
     setup(props) {
       const { getMiniWidthNumber, getCollapsed, getCanDrag } = useMenuSetting();
 
-      const { prefixCls } = useDesign('darg-bar');
+      const { prefixCls } = useDesign("darg-bar");
       const getDragBarStyle = computed(() => {
         if (unref(getCollapsed)) {
           return { left: `${unref(getMiniWidthNumber)}px` };
@@ -41,7 +41,7 @@
   });
 </script>
 <style lang="less" scoped>
-  @prefix-cls: ~'@{namespace}-darg-bar';
+  @prefix-cls: ~"@{namespace}-darg-bar";
 
   .@{prefix-cls} {
     position: absolute;
diff --git a/src/layouts/default/sider/LayoutSider.vue b/src/layouts/default/sider/LayoutSider.vue
index 21445059c08119944d72e51269ea77c69c1fc9b2..e43c5f854b51778dd0d2f3a7b860d0b0b4b95bac 100644
--- a/src/layouts/default/sider/LayoutSider.vue
+++ b/src/layouts/default/sider/LayoutSider.vue
@@ -26,22 +26,22 @@
   </Sider>
 </template>
 <script lang="ts">
-  import { computed, defineComponent, ref, unref, CSSProperties, h } from 'vue';
+  import { computed, defineComponent, ref, unref, CSSProperties, h } from "vue";
 
-  import { Layout } from 'ant-design-vue';
-  import LayoutMenu from '../menu/index.vue';
-  import LayoutTrigger from '/@/layouts/default/trigger/index.vue';
+  import { Layout } from "ant-design-vue";
+  import LayoutMenu from "../menu/index.vue";
+  import LayoutTrigger from "/@/layouts/default/trigger/index.vue";
 
-  import { MenuModeEnum, MenuSplitTyeEnum } from '/@/enums/menuEnum';
+  import { MenuModeEnum, MenuSplitTyeEnum } from "/@/enums/menuEnum";
 
-  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
-  import { useTrigger, useDragLine, useSiderEvent } from './useLayoutSider';
-  import { useAppInject } from '/@/hooks/web/useAppInject';
-  import { useDesign } from '/@/hooks/web/useDesign';
+  import { useMenuSetting } from "/@/hooks/setting/useMenuSetting";
+  import { useTrigger, useDragLine, useSiderEvent } from "./useLayoutSider";
+  import { useAppInject } from "/@/hooks/web/useAppInject";
+  import { useDesign } from "/@/hooks/web/useDesign";
 
-  import DragBar from './DragBar.vue';
+  import DragBar from "./DragBar.vue";
   export default defineComponent({
-    name: 'LayoutSideBar',
+    name: "LayoutSideBar",
     components: { Sider: Layout.Sider, LayoutMenu, DragBar, LayoutTrigger },
     setup() {
       const dragBarRef = ref<ElRef>(null);
@@ -59,7 +59,7 @@
         toggleCollapsed,
       } = useMenuSetting();
 
-      const { prefixCls } = useDesign('layout-sideBar');
+      const { prefixCls } = useDesign("layout-sideBar");
 
       const { getIsMobile } = useAppInject();
 
@@ -95,11 +95,11 @@
         const width = `${unref(getRealWidth)}px`;
         return {
           width: width,
-          overflow: 'hidden',
+          overflow: "hidden",
           flex: `0 0 ${width}`,
           maxWidth: width,
           minWidth: width,
-          transition: 'all 0.2s',
+          transition: "all 0.2s",
         };
       });
 
@@ -132,7 +132,7 @@
   });
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-layout-sideBar';
+  @prefix-cls: ~"@{namespace}-layout-sideBar";
 
   .@{prefix-cls} {
     z-index: @layout-sider-fixed-z-index;
diff --git a/src/layouts/default/sider/MixSider.vue b/src/layouts/default/sider/MixSider.vue
index d212afe1c246a84003f897e8d9ff856f4d6e28b4..0edc2777766d04527f9dc785adfb0e87a40d9344 100644
--- a/src/layouts/default/sider/MixSider.vue
+++ b/src/layouts/default/sider/MixSider.vue
@@ -66,7 +66,7 @@
           :items="childrenMenus"
           :theme="getMenuTheme"
           mixSider
-          @menuClick="handleMenuClick"
+          @menu-click="handleMenuClick"
         />
       </ScrollContainer>
       <div
@@ -78,29 +78,29 @@
   </div>
 </template>
 <script lang="ts">
-  import type { Menu } from '/@/router/types';
-  import type { CSSProperties } from 'vue';
-  import { computed, defineComponent, onMounted, ref, unref, watch } from 'vue';
-  import type { RouteLocationNormalized } from 'vue-router';
-  import { ScrollContainer } from '/@/components/Container';
-  import { SimpleMenu, SimpleMenuTag } from '/@/components/SimpleMenu';
-  import { Icon } from '/@/components/Icon';
-  import { AppLogo } from '/@/components/Application';
-  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
-  import { usePermissionStore } from '/@/store/modules/permission';
-  import { useDragLine } from './useLayoutSider';
-  import { useGlobSetting } from '/@/hooks/setting';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { useGo } from '/@/hooks/web/usePage';
-  import { SIDE_BAR_MINI_WIDTH, SIDE_BAR_SHOW_TIT_MINI_WIDTH } from '/@/enums/appEnum';
-  import clickOutside from '/@/directives/clickOutside';
-  import { getChildrenMenus, getCurrentParentPath, getShallowMenus } from '/@/router/menus';
-  import { listenerRouteChange } from '/@/logics/mitt/routeChange';
-  import LayoutTrigger from '../trigger/index.vue';
+  import type { Menu } from "/@/router/types";
+  import type { CSSProperties } from "vue";
+  import { computed, defineComponent, onMounted, ref, unref, watch } from "vue";
+  import type { RouteLocationNormalized } from "vue-router";
+  import { ScrollContainer } from "/@/components/Container";
+  import { SimpleMenu, SimpleMenuTag } from "/@/components/SimpleMenu";
+  import { Icon } from "/@/components/Icon";
+  import { AppLogo } from "/@/components/Application";
+  import { useMenuSetting } from "/@/hooks/setting/useMenuSetting";
+  import { usePermissionStore } from "/@/store/modules/permission";
+  import { useDragLine } from "./useLayoutSider";
+  import { useGlobSetting } from "/@/hooks/setting";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { useGo } from "/@/hooks/web/usePage";
+  import { SIDE_BAR_MINI_WIDTH, SIDE_BAR_SHOW_TIT_MINI_WIDTH } from "/@/enums/appEnum";
+  import clickOutside from "/@/directives/clickOutside";
+  import { getChildrenMenus, getCurrentParentPath, getShallowMenus } from "/@/router/menus";
+  import { listenerRouteChange } from "/@/logics/mitt/routeChange";
+  import LayoutTrigger from "../trigger/index.vue";
 
   export default defineComponent({
-    name: 'LayoutMixSider',
+    name: "LayoutMixSider",
     components: {
       ScrollContainer,
       AppLogo,
@@ -114,14 +114,14 @@
     },
     setup() {
       let menuModules = ref<Menu[]>([]);
-      const activePath = ref('');
+      const activePath = ref("");
       const childrenMenus = ref<Menu[]>([]);
       const openMenu = ref(false);
       const dragBarRef = ref<ElRef>(null);
       const sideRef = ref<ElRef>(null);
       const currentRoute = ref<Nullable<RouteLocationNormalized>>(null);
 
-      const { prefixCls } = useDesign('layout-mix-sider');
+      const { prefixCls } = useDesign("layout-mix-sider");
       const go = useGo();
       const { t } = useI18n();
       const {
@@ -288,7 +288,7 @@
       }
 
       function getItemEvents(item: Menu) {
-        if (unref(getMixSideTrigger) === 'hover') {
+        if (unref(getMixSideTrigger) === "hover") {
           return {
             onMouseenter: () => handleModuleClick(item.path, true),
             onClick: async () => {
@@ -343,7 +343,7 @@
   });
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-layout-mix-sider';
+  @prefix-cls: ~"@{namespace}-layout-mix-sider";
   @width: 80px;
   .@{prefix-cls} {
     position: fixed;
@@ -476,7 +476,7 @@
             width: 3px;
             height: 100%;
             background-color: @primary-color;
-            content: '';
+            content: "";
           }
         }
       }
diff --git a/src/layouts/default/sider/index.vue b/src/layouts/default/sider/index.vue
index d5357f44a5a904b0d39857d2bf4b364b20f35918..a281220d904bcd50f78cffa81304c3b3a47e0283 100644
--- a/src/layouts/default/sider/index.vue
+++ b/src/layouts/default/sider/index.vue
@@ -14,20 +14,20 @@
   <Sider v-else />
 </template>
 <script lang="ts">
-  import { defineComponent } from 'vue';
+  import { defineComponent } from "vue";
 
-  import Sider from './LayoutSider.vue';
-  import MixSider from './MixSider.vue';
-  import { Drawer } from 'ant-design-vue';
+  import Sider from "./LayoutSider.vue";
+  import MixSider from "./MixSider.vue";
+  import { Drawer } from "ant-design-vue";
 
-  import { useAppInject } from '/@/hooks/web/useAppInject';
-  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
-  import { useDesign } from '/@/hooks/web/useDesign';
+  import { useAppInject } from "/@/hooks/web/useAppInject";
+  import { useMenuSetting } from "/@/hooks/setting/useMenuSetting";
+  import { useDesign } from "/@/hooks/web/useDesign";
   export default defineComponent({
-    name: 'SiderWrapper',
+    name: "SiderWrapper",
     components: { Sider, Drawer, MixSider },
     setup() {
-      const { prefixCls } = useDesign('layout-sider-wrapper');
+      const { prefixCls } = useDesign("layout-sider-wrapper");
       const { getIsMobile } = useAppInject();
       const { setMenuSetting, getCollapsed, getMenuWidth, getIsMixSidebar } = useMenuSetting();
 
@@ -42,7 +42,7 @@
   });
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-layout-sider-wrapper';
+  @prefix-cls: ~"@{namespace}-layout-sider-wrapper";
 
   .@{prefix-cls} {
     .ant-drawer-body {
diff --git a/src/layouts/default/sider/useLayoutSider.ts b/src/layouts/default/sider/useLayoutSider.ts
index 292c146f609767662aff39331597ebd50263912b..3fc5f8f724edcd68a3dbb22d946487f23be71dab 100644
--- a/src/layouts/default/sider/useLayoutSider.ts
+++ b/src/layouts/default/sider/useLayoutSider.ts
@@ -1,26 +1,30 @@
-import type { Ref } from 'vue';
+import type { Ref } from "vue";
 
-import { computed, unref, onMounted, nextTick, ref } from 'vue';
+import { computed, unref, onMounted, nextTick } from "vue";
 
-import { TriggerEnum } from '/@/enums/menuEnum';
+import { TriggerEnum } from "/@/enums/menuEnum";
 
-import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
-import { useDebounceFn } from '@vueuse/core';
+import { useMenuSetting } from "/@/hooks/setting/useMenuSetting";
+import { useDebounceFn } from "@vueuse/core";
+import { useAppStore } from "/@/store/modules/app";
 
 /**
  * Handle related operations of menu events
  */
 export function useSiderEvent() {
-  const brokenRef = ref(false);
-
+  const appStore = useAppStore();
   const { getMiniWidthNumber } = useMenuSetting();
 
   const getCollapsedWidth = computed(() => {
-    return unref(brokenRef) ? 0 : unref(getMiniWidthNumber);
+    return unref(getMiniWidthNumber);
   });
 
   function onBreakpointChange(broken: boolean) {
-    brokenRef.value = broken;
+    appStore.setProjectConfig({
+      menuSetting: {
+        siderHidden: broken,
+      },
+    });
   }
 
   return { getCollapsedWidth, onBreakpointChange };
@@ -72,7 +76,7 @@ export function useDragLine(siderRef: Ref<any>, dragBarRef: Ref<any>, mix = fals
   function getEl(elRef: Ref<ElRef | ComponentRef>): any {
     const el = unref(elRef);
     if (!el) return null;
-    if (Reflect.has(el, '$el')) {
+    if (Reflect.has(el, "$el")) {
       return (unref(elRef) as ComponentRef)?.$el;
     }
     return unref(elRef);
@@ -87,7 +91,7 @@ export function useDragLine(siderRef: Ref<any>, dragBarRef: Ref<any>, mix = fals
       iT < 0 && (iT = 0);
       iT > maxT && (iT = maxT);
       iT < minT && (iT = minT);
-      ele.style.left = wrap.style.width = iT + 'px';
+      ele.style.left = wrap.style.width = iT + "px";
       return false;
     };
   }
@@ -98,7 +102,7 @@ export function useDragLine(siderRef: Ref<any>, dragBarRef: Ref<any>, mix = fals
     document.onmouseup = function () {
       document.onmousemove = null;
       document.onmouseup = null;
-      wrap.style.transition = 'width 0.2s';
+      wrap.style.transition = "width 0.2s";
       const width = parseInt(wrap.style.width);
 
       if (!mix) {
@@ -125,7 +129,7 @@ export function useDragLine(siderRef: Ref<any>, dragBarRef: Ref<any>, mix = fals
     if (!wrap) return;
 
     ele.onmousedown = (e: any) => {
-      wrap.style.transition = 'unset';
+      wrap.style.transition = "unset";
       const clientX = e?.clientX;
       ele.left = ele.offsetLeft;
       handleMouseMove(ele, wrap, clientX);
diff --git a/src/layouts/default/tabs/components/FoldButton.vue b/src/layouts/default/tabs/components/FoldButton.vue
index c8ea290eaa3393b7a8ff1c7ca5f9830266dc062c..2ffdb5485a89f0b31148ba7e8ca4ec6be6faf8ae 100644
--- a/src/layouts/default/tabs/components/FoldButton.vue
+++ b/src/layouts/default/tabs/components/FoldButton.vue
@@ -4,26 +4,26 @@
   </span>
 </template>
 <script lang="ts">
-  import { defineComponent, unref, computed } from 'vue';
-  import { Icon } from '/@/components/Icon';
+  import { defineComponent, unref, computed } from "vue";
+  import { Icon } from "/@/components/Icon";
 
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting';
-  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
-  import { triggerWindowResize } from '/@/utils/event';
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useHeaderSetting } from "/@/hooks/setting/useHeaderSetting";
+  import { useMenuSetting } from "/@/hooks/setting/useMenuSetting";
+  import { triggerWindowResize } from "/@/utils/event";
 
   export default defineComponent({
-    name: 'FoldButton',
+    name: "FoldButton",
     components: { Icon },
     setup() {
-      const { prefixCls } = useDesign('multiple-tabs-content');
+      const { prefixCls } = useDesign("multiple-tabs-content");
       const { getShowMenu, setMenuSetting } = useMenuSetting();
       const { getShowHeader, setHeaderSetting } = useHeaderSetting();
 
       const getIsUnFold = computed(() => !unref(getShowMenu) && !unref(getShowHeader));
 
       const getIcon = computed(() =>
-        unref(getIsUnFold) ? 'codicon:screen-normal' : 'codicon:screen-full',
+        unref(getIsUnFold) ? "codicon:screen-normal" : "codicon:screen-full",
       );
 
       function handleFold() {
diff --git a/src/layouts/default/tabs/components/TabContent.vue b/src/layouts/default/tabs/components/TabContent.vue
index 1023a231e7cb27668f7d776f385c12fd5c25a379..a2afa8137f67a7014325f6ba6924e8277901df86 100644
--- a/src/layouts/default/tabs/components/TabContent.vue
+++ b/src/layouts/default/tabs/components/TabContent.vue
@@ -1,5 +1,11 @@
 <template>
-  <Dropdown :dropMenuList="getDropMenuList" :trigger="getTrigger" @menuEvent="handleMenuEvent">
+  <Dropdown
+    :dropMenuList="getDropMenuList"
+    :trigger="getTrigger"
+    placement="bottom"
+    overlayClassName="multiple-tabs__dropdown"
+    @menu-event="handleMenuEvent"
+  >
     <div :class="`${prefixCls}__info`" @contextmenu="handleContext" v-if="getIsTabs">
       <span class="ml-1">{{ getTitle }}</span>
     </div>
@@ -9,21 +15,21 @@
   </Dropdown>
 </template>
 <script lang="ts">
-  import type { PropType } from 'vue';
-  import type { RouteLocationNormalized } from 'vue-router';
+  import type { PropType } from "vue";
+  import type { RouteLocationNormalized } from "vue-router";
 
-  import { defineComponent, computed, unref } from 'vue';
-  import { Dropdown } from '/@/components/Dropdown/index';
-  import { Icon } from '/@/components/Icon';
+  import { defineComponent, computed, unref } from "vue";
+  import { Dropdown } from "/@/components/Dropdown/index";
+  import { Icon } from "/@/components/Icon";
 
-  import { TabContentProps } from '../types';
+  import { TabContentProps } from "../types";
 
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { useTabDropdown } from '../useTabDropdown';
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { useTabDropdown } from "../useTabDropdown";
 
   export default defineComponent({
-    name: 'TabContent',
+    name: "TabContent",
     components: { Dropdown, Icon },
     props: {
       tabItem: {
@@ -33,7 +39,7 @@
       isExtra: Boolean,
     },
     setup(props) {
-      const { prefixCls } = useDesign('multiple-tabs-content');
+      const { prefixCls } = useDesign("multiple-tabs-content");
       const { t } = useI18n();
 
       const getTitle = computed(() => {
@@ -43,8 +49,8 @@
 
       const getIsTabs = computed(() => !props.isExtra);
 
-      const getTrigger = computed((): ('contextmenu' | 'click' | 'hover')[] =>
-        unref(getIsTabs) ? ['contextmenu'] : ['click'],
+      const getTrigger = computed((): ("contextmenu" | "click" | "hover")[] =>
+        unref(getIsTabs) ? ["contextmenu"] : ["click"],
       );
 
       const { getDropMenuList, handleMenuEvent, handleContextMenu } = useTabDropdown(
diff --git a/src/layouts/default/tabs/components/TabRedo.vue b/src/layouts/default/tabs/components/TabRedo.vue
index a6fa657548658aac2958fd7b22578de9531e3a64..cb60a80cbd3feb325cb6100397cc9884dd0ad2d3 100644
--- a/src/layouts/default/tabs/components/TabRedo.vue
+++ b/src/layouts/default/tabs/components/TabRedo.vue
@@ -4,19 +4,19 @@
   </span>
 </template>
 <script lang="ts">
-  import { defineComponent, ref } from 'vue';
-  import { RedoOutlined } from '@ant-design/icons-vue';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useTabs } from '/@/hooks/web/useTabs';
+  import { defineComponent, ref } from "vue";
+  import { RedoOutlined } from "@ant-design/icons-vue";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useTabs } from "/@/hooks/web/useTabs";
 
   export default defineComponent({
-    name: 'TabRedo',
+    name: "TabRedo",
     components: { RedoOutlined },
 
     setup() {
       const loading = ref(false);
 
-      const { prefixCls } = useDesign('multiple-tabs-content');
+      const { prefixCls } = useDesign("multiple-tabs-content");
       const { refreshPage } = useTabs();
 
       async function handleRedo() {
diff --git a/src/layouts/default/tabs/index.less b/src/layouts/default/tabs/index.less
index 6cc4878441a04e3bfd260fdc93ac72ce6df04a21..dbb98144708d8cc68f59730ed8ffc0da444ec1bd 100644
--- a/src/layouts/default/tabs/index.less
+++ b/src/layouts/default/tabs/index.less
@@ -1,6 +1,6 @@
-@prefix-cls: ~'@{namespace}-multiple-tabs';
+@prefix-cls: ~"@{namespace}-multiple-tabs";
 
-html[data-theme='dark'] {
+html[data-theme="dark"] {
   .@{prefix-cls} {
     .ant-tabs-tab {
       border-bottom: 1px solid @border-color-base;
@@ -8,7 +8,7 @@ html[data-theme='dark'] {
   }
 }
 
-html[data-theme='light'] {
+html[data-theme="light"] {
   .@{prefix-cls} {
     .ant-tabs-tab:not(.ant-tabs-tab-active) {
       border: 1px solid #d9d9d9 !important;
@@ -28,7 +28,8 @@ html[data-theme='light'] {
   }
 
   .ant-tabs.ant-tabs-card {
-    .ant-tabs-card-bar {
+    .ant-tabs-nav {
+      padding-top: 2px;
       height: @multiple-height;
       margin: 0;
       background-color: @component-background;
@@ -49,18 +50,20 @@ html[data-theme='light'] {
         transition: none;
 
         &:hover {
-          .ant-tabs-close-x {
-            opacity: 100%;
+          .ant-tabs-tab-remove {
+            opacity: 1;
           }
         }
 
-        .ant-tabs-close-x {
+        .ant-tabs-tab-remove {
           width: 8px;
-          height: 12px;
+          height: 28px;
           font-size: 12px;
           color: inherit;
-          opacity: 0%;
+          opacity: 0;
           transition: none;
+          margin-left: 2px;
+          margin-right: -4px;
 
           &:hover {
             svg {
@@ -69,11 +72,11 @@ html[data-theme='light'] {
           }
         }
 
-        > div {
-          display: flex;
-          justify-content: center;
-          align-items: center;
-        }
+        // > div {
+        //   display: flex;
+        //   justify-content: center;
+        //   align-items: center;
+        // }
 
         svg {
           fill: @text-color-base;
@@ -89,13 +92,16 @@ html[data-theme='light'] {
       .ant-tabs-tab-active {
         position: relative;
         padding-left: 18px;
-        color: @white !important;
         background: @primary-color;
         border: 0;
         transition: none;
 
-        .ant-tabs-close-x {
-          opacity: 100%;
+        span {
+          color: @white !important;
+        }
+
+        .ant-tabs-tab-remove {
+          opacity: 1;
         }
 
         svg {
@@ -124,18 +130,13 @@ html[data-theme='light'] {
     }
   }
 
-  .ant-tabs-extra-content {
-    margin-top: 2px;
-    line-height: @multiple-height !important;
-  }
-
   .ant-dropdown-trigger {
     display: inline-flex;
   }
 
   &--hide-close {
-    .ant-tabs-close-x {
-      opacity: 0% !important;
+    .ant-tabs-tab-remove {
+      opacity: 0 !important;
     }
   }
 
@@ -156,13 +157,13 @@ html[data-theme='light'] {
         color: @text-color-base;
       }
 
-      span[role='img'] {
+      span[role="img"] {
         transform: rotate(90deg);
       }
     }
 
     &__extra-redo {
-      span[role='img'] {
+      span[role="img"] {
         transform: rotate(0deg);
       }
     }
@@ -179,3 +180,28 @@ html[data-theme='light'] {
     }
   }
 }
+
+.ant-tabs-dropdown-menu {
+  &-title-content {
+    display: flex;
+    align-items: center;
+
+    .@{prefix-cls} {
+      &-content__info {
+        width: auto;
+        margin-left: 0;
+        line-height: 28px;
+      }
+    }
+  }
+
+  &-item-remove {
+    margin-left: auto;
+  }
+}
+
+.multiple-tabs__dropdown {
+  .ant-dropdown-content {
+    width: 172px;
+  }
+}
diff --git a/src/layouts/default/tabs/index.vue b/src/layouts/default/tabs/index.vue
index ac59c81bddae91af3d4d98125d6a549ee5a2bb1f..a9b2774aeb2d93193167a42426d803a8350f71be 100644
--- a/src/layouts/default/tabs/index.vue
+++ b/src/layouts/default/tabs/index.vue
@@ -18,7 +18,7 @@
         </TabPane>
       </template>
 
-      <template #tabBarExtraContent v-if="getShowRedo || getShowQuick">
+      <template #rightExtra v-if="getShowRedo || getShowQuick">
         <TabRedo v-if="getShowRedo" />
         <TabContent isExtra :tabItem="$route" v-if="getShowQuick" />
         <FoldButton v-if="getShowFold" />
@@ -27,31 +27,31 @@
   </div>
 </template>
 <script lang="ts">
-  import type { RouteLocationNormalized, RouteMeta } from 'vue-router';
+  import type { RouteLocationNormalized, RouteMeta } from "vue-router";
 
-  import { defineComponent, computed, unref, ref } from 'vue';
+  import { defineComponent, computed, unref, ref } from "vue";
 
-  import { Tabs } from 'ant-design-vue';
-  import TabContent from './components/TabContent.vue';
-  import FoldButton from './components/FoldButton.vue';
-  import TabRedo from './components/TabRedo.vue';
+  import { Tabs } from "ant-design-vue";
+  import TabContent from "./components/TabContent.vue";
+  import FoldButton from "./components/FoldButton.vue";
+  import TabRedo from "./components/TabRedo.vue";
 
-  import { useGo } from '/@/hooks/web/usePage';
+  import { useGo } from "/@/hooks/web/usePage";
 
-  import { useMultipleTabStore } from '/@/store/modules/multipleTab';
-  import { useUserStore } from '/@/store/modules/user';
+  import { useMultipleTabStore } from "/@/store/modules/multipleTab";
+  import { useUserStore } from "/@/store/modules/user";
 
-  import { initAffixTabs, useTabsDrag } from './useMultipleTabs';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useMultipleTabSetting } from '/@/hooks/setting/useMultipleTabSetting';
+  import { initAffixTabs, useTabsDrag } from "./useMultipleTabs";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useMultipleTabSetting } from "/@/hooks/setting/useMultipleTabSetting";
 
-  import { REDIRECT_NAME } from '/@/router/constant';
-  import { listenerRouteChange } from '/@/logics/mitt/routeChange';
+  import { REDIRECT_NAME } from "/@/router/constant";
+  import { listenerRouteChange } from "/@/logics/mitt/routeChange";
 
-  import { useRouter } from 'vue-router';
+  import { useRouter } from "vue-router";
 
   export default defineComponent({
-    name: 'MultipleTabs',
+    name: "MultipleTabs",
     components: {
       TabRedo,
       FoldButton,
@@ -61,14 +61,14 @@
     },
     setup() {
       const affixTextList = initAffixTabs();
-      const activeKeyRef = ref('');
+      const activeKeyRef = ref("");
 
       useTabsDrag(affixTextList);
       const tabStore = useMultipleTabStore();
       const userStore = useUserStore();
       const router = useRouter();
 
-      const { prefixCls } = useDesign('multiple-tabs');
+      const { prefixCls } = useDesign("multiple-tabs");
       const go = useGo();
       const { getShowQuick, getShowRedo, getShowFold } = useMultipleTabSetting();
 
@@ -127,8 +127,6 @@
         tabStore.closeTabByKey(targetKey, router);
       }
       return {
-        prefixCls,
-        unClose,
         getWrapClass,
         handleEdit,
         handleChange,
@@ -142,5 +140,5 @@
   });
 </script>
 <style lang="less">
-  @import './index.less';
+  @import "./index.less";
 </style>
diff --git a/src/layouts/default/tabs/types.ts b/src/layouts/default/tabs/types.ts
index 3a8cfd9cccc1a7736f7bbfd41751d839ed1bce64..d22c0477725632b471f9495a11d09634bfa45a42 100644
--- a/src/layouts/default/tabs/types.ts
+++ b/src/layouts/default/tabs/types.ts
@@ -1,5 +1,5 @@
-import type { DropMenu } from '/@/components/Dropdown/index';
-import type { RouteLocationNormalized } from 'vue-router';
+import type { DropMenu } from "/@/components/Dropdown/index";
+import type { RouteLocationNormalized } from "vue-router";
 
 export enum TabContentEnum {
   TAB_TYPE,
@@ -11,7 +11,7 @@ export type { DropMenu };
 export interface TabContentProps {
   tabItem: RouteLocationNormalized;
   type?: TabContentEnum;
-  trigger?: ('click' | 'hover' | 'contextmenu')[];
+  trigger?: ("click" | "hover" | "contextmenu")[];
 }
 
 export enum MenuEventEnum {
diff --git a/src/layouts/default/tabs/useMultipleTabs.ts b/src/layouts/default/tabs/useMultipleTabs.ts
index 35b553b3d4a1b5f7ea9c43d046a22b21c0b93ce9..259eedb404d369cd1d12d4204f07f3e0397913f3 100644
--- a/src/layouts/default/tabs/useMultipleTabs.ts
+++ b/src/layouts/default/tabs/useMultipleTabs.ts
@@ -1,11 +1,11 @@
-import { toRaw, ref, nextTick } from 'vue';
-import type { RouteLocationNormalized } from 'vue-router';
-import { useDesign } from '/@/hooks/web/useDesign';
-import { useSortable } from '/@/hooks/web/useSortable';
-import { useMultipleTabStore } from '/@/store/modules/multipleTab';
-import { isNullAndUnDef } from '/@/utils/is';
-import projectSetting from '/@/settings/projectSetting';
-import { useRouter } from 'vue-router';
+import { toRaw, ref, nextTick } from "vue";
+import type { RouteLocationNormalized } from "vue-router";
+import { useDesign } from "/@/hooks/web/useDesign";
+import { useSortable } from "/@/hooks/web/useSortable";
+import { useMultipleTabStore } from "/@/store/modules/multipleTab";
+import { isNullAndUnDef } from "/@/utils/is";
+import projectSetting from "/@/settings/projectSetting";
+import { useRouter } from "vue-router";
 
 export function initAffixTabs(): string[] {
   const affixList = ref<RouteLocationNormalized[]>([]);
@@ -53,10 +53,12 @@ export function initAffixTabs(): string[] {
 export function useTabsDrag(affixTextList: string[]) {
   const tabStore = useMultipleTabStore();
   const { multiTabsSetting } = projectSetting;
-  const { prefixCls } = useDesign('multiple-tabs');
+  const { prefixCls } = useDesign("multiple-tabs");
   nextTick(() => {
     if (!multiTabsSetting.canDrag) return;
-    const el = document.querySelectorAll(`.${prefixCls} .ant-tabs-nav > div`)?.[0] as HTMLElement;
+    const el = document.querySelectorAll(
+      `.${prefixCls} .ant-tabs-nav-wrap > div`,
+    )?.[0] as HTMLElement;
     const { initSortable } = useSortable(el, {
       filter: (e: ChangeEvent) => {
         const text = e?.target?.innerText;
diff --git a/src/layouts/default/tabs/useTabDropdown.ts b/src/layouts/default/tabs/useTabDropdown.ts
index 016ce8c34a50783baa82278a21641d4d3e28a5c4..0cd5ee270e61acbe5365b07c399580a07815a0c1 100644
--- a/src/layouts/default/tabs/useTabDropdown.ts
+++ b/src/layouts/default/tabs/useTabDropdown.ts
@@ -1,13 +1,13 @@
-import type { TabContentProps } from './types';
-import type { DropMenu } from '/@/components/Dropdown';
-import type { ComputedRef } from 'vue';
+import type { TabContentProps } from "./types";
+import type { DropMenu } from "/@/components/Dropdown";
+import type { ComputedRef } from "vue";
 
-import { computed, unref, reactive } from 'vue';
-import { MenuEventEnum } from './types';
-import { useMultipleTabStore } from '/@/store/modules/multipleTab';
-import { RouteLocationNormalized, useRouter } from 'vue-router';
-import { useTabs } from '/@/hooks/web/useTabs';
-import { useI18n } from '/@/hooks/web/useI18n';
+import { computed, unref, reactive } from "vue";
+import { MenuEventEnum } from "./types";
+import { useMultipleTabStore } from "/@/store/modules/multipleTab";
+import { RouteLocationNormalized, useRouter } from "vue-router";
+import { useTabs } from "/@/hooks/web/useTabs";
+import { useI18n } from "/@/hooks/web/useI18n";
 
 export function useTabDropdown(tabContentProps: TabContentProps, getIsTabs: ComputedRef<boolean>) {
   const state = reactive({
@@ -51,42 +51,42 @@ export function useTabDropdown(tabContentProps: TabContentProps, getIsTabs: Comp
       !isCurItem || (index === tabStore.getTabList.length - 1 && tabStore.getLastDragEndIndex >= 0);
     const dropMenuList: DropMenu[] = [
       {
-        icon: 'ion:reload-sharp',
+        icon: "ion:reload-sharp",
         event: MenuEventEnum.REFRESH_PAGE,
-        text: t('layout.multipleTab.reload'),
+        text: t("layout.multipleTab.reload"),
         disabled: refreshDisabled,
       },
       {
-        icon: 'clarity:close-line',
+        icon: "clarity:close-line",
         event: MenuEventEnum.CLOSE_CURRENT,
-        text: t('layout.multipleTab.close'),
+        text: t("layout.multipleTab.close"),
         disabled: !!meta?.affix || disabled,
         divider: true,
       },
       {
-        icon: 'line-md:arrow-close-left',
+        icon: "line-md:arrow-close-left",
         event: MenuEventEnum.CLOSE_LEFT,
-        text: t('layout.multipleTab.closeLeft'),
+        text: t("layout.multipleTab.closeLeft"),
         disabled: closeLeftDisabled,
         divider: false,
       },
       {
-        icon: 'line-md:arrow-close-right',
+        icon: "line-md:arrow-close-right",
         event: MenuEventEnum.CLOSE_RIGHT,
-        text: t('layout.multipleTab.closeRight'),
+        text: t("layout.multipleTab.closeRight"),
         disabled: closeRightDisabled,
         divider: true,
       },
       {
-        icon: 'dashicons:align-center',
+        icon: "dashicons:align-center",
         event: MenuEventEnum.CLOSE_OTHER,
-        text: t('layout.multipleTab.closeOther'),
+        text: t("layout.multipleTab.closeOther"),
         disabled: disabled || !isCurItem,
       },
       {
-        icon: 'clarity:minus-line',
+        icon: "clarity:minus-line",
         event: MenuEventEnum.CLOSE_ALL,
-        text: t('layout.multipleTab.closeAll'),
+        text: t("layout.multipleTab.closeAll"),
         disabled: disabled,
       },
     ];
diff --git a/src/layouts/default/trigger/HeaderTrigger.vue b/src/layouts/default/trigger/HeaderTrigger.vue
index d7dbb238ddf49944bffa6fbf70e0c86aa0b4e6af..66efa1a40c207d7df88bef1464326c2dacfbd86e 100644
--- a/src/layouts/default/trigger/HeaderTrigger.vue
+++ b/src/layouts/default/trigger/HeaderTrigger.vue
@@ -4,21 +4,21 @@
   </span>
 </template>
 <script lang="ts">
-  import { defineComponent } from 'vue';
-  import { MenuUnfoldOutlined, MenuFoldOutlined } from '@ant-design/icons-vue';
-  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { propTypes } from '/@/utils/propTypes';
+  import { defineComponent } from "vue";
+  import { MenuUnfoldOutlined, MenuFoldOutlined } from "@ant-design/icons-vue";
+  import { useMenuSetting } from "/@/hooks/setting/useMenuSetting";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { propTypes } from "/@/utils/propTypes";
 
   export default defineComponent({
-    name: 'HeaderTrigger',
+    name: "HeaderTrigger",
     components: { MenuUnfoldOutlined, MenuFoldOutlined },
     props: {
-      theme: propTypes.oneOf(['light', 'dark']),
+      theme: propTypes.oneOf(["light", "dark"]),
     },
     setup() {
       const { getCollapsed, toggleCollapsed } = useMenuSetting();
-      const { prefixCls } = useDesign('layout-header-trigger');
+      const { prefixCls } = useDesign("layout-header-trigger");
       return { getCollapsed, toggleCollapsed, prefixCls };
     },
   });
diff --git a/src/layouts/default/trigger/SiderTrigger.vue b/src/layouts/default/trigger/SiderTrigger.vue
index 0eb38b560ef226dda9eac5f69c5218183ca880a5..ea7f785c31befa319083351c5d0f45849ff7af04 100644
--- a/src/layouts/default/trigger/SiderTrigger.vue
+++ b/src/layouts/default/trigger/SiderTrigger.vue
@@ -5,12 +5,12 @@
   </div>
 </template>
 <script lang="ts">
-  import { defineComponent } from 'vue';
-  import { DoubleRightOutlined, DoubleLeftOutlined } from '@ant-design/icons-vue';
-  import { useMenuSetting } from '/@/hooks/setting/useMenuSetting';
+  import { defineComponent } from "vue";
+  import { DoubleRightOutlined, DoubleLeftOutlined } from "@ant-design/icons-vue";
+  import { useMenuSetting } from "/@/hooks/setting/useMenuSetting";
 
   export default defineComponent({
-    name: 'SiderTrigger',
+    name: "SiderTrigger",
     components: { DoubleRightOutlined, DoubleLeftOutlined },
     setup() {
       const { getCollapsed, toggleCollapsed } = useMenuSetting();
diff --git a/src/layouts/default/trigger/index.vue b/src/layouts/default/trigger/index.vue
index 61f43b347f6902413e202305d77693b599bd0a6e..07893d7b569f8c4d1fe15c607b43e7846a54518c 100644
--- a/src/layouts/default/trigger/index.vue
+++ b/src/layouts/default/trigger/index.vue
@@ -3,20 +3,20 @@
   <HeaderTrigger v-else :theme="theme" />
 </template>
 <script lang="ts">
-  import { defineComponent } from 'vue';
-  import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent';
-  import { propTypes } from '/@/utils/propTypes';
-  import HeaderTrigger from './HeaderTrigger.vue';
+  import { defineComponent } from "vue";
+  import { createAsyncComponent } from "/@/utils/factory/createAsyncComponent";
+  import { propTypes } from "/@/utils/propTypes";
+  import HeaderTrigger from "./HeaderTrigger.vue";
 
   export default defineComponent({
-    name: 'LayoutTrigger',
+    name: "LayoutTrigger",
     components: {
-      SiderTrigger: createAsyncComponent(() => import('./SiderTrigger.vue')),
+      SiderTrigger: createAsyncComponent(() => import("./SiderTrigger.vue")),
       HeaderTrigger: HeaderTrigger,
     },
     props: {
       sider: propTypes.bool.def(true),
-      theme: propTypes.oneOf(['light', 'dark']),
+      theme: propTypes.oneOf(["light", "dark"]),
     },
   });
 </script>
diff --git a/src/layouts/iframe/index.vue b/src/layouts/iframe/index.vue
index d9ee7e5b8b7d61cd0ee0d6fc5f29d567d7957bfb..a28dd158e556339ace7e5938b82ce4069071c7fc 100644
--- a/src/layouts/iframe/index.vue
+++ b/src/layouts/iframe/index.vue
@@ -10,13 +10,13 @@
   </div>
 </template>
 <script lang="ts">
-  import { defineComponent, unref, computed } from 'vue';
-  import FramePage from '/@/views/sys/iframe/index.vue';
+  import { defineComponent, unref, computed } from "vue";
+  import FramePage from "/@/views/sys/iframe/index.vue";
 
-  import { useFrameKeepAlive } from './useFrameKeepAlive';
+  import { useFrameKeepAlive } from "./useFrameKeepAlive";
 
   export default defineComponent({
-    name: 'FrameLayout',
+    name: "FrameLayout",
     components: { FramePage },
     setup() {
       const { getFramePages, hasRenderFrame, showIframe } = useFrameKeepAlive();
diff --git a/src/layouts/iframe/useFrameKeepAlive.ts b/src/layouts/iframe/useFrameKeepAlive.ts
index e84c49fe969c97b360ea7107295d15a04253edfa..3ec12a2799c5ead086ed7f887fdd0652b0acb618 100644
--- a/src/layouts/iframe/useFrameKeepAlive.ts
+++ b/src/layouts/iframe/useFrameKeepAlive.ts
@@ -1,14 +1,14 @@
-import type { AppRouteRecordRaw } from '/@/router/types';
+import type { AppRouteRecordRaw } from "/@/router/types";
 
-import { computed, toRaw, unref } from 'vue';
+import { computed, toRaw, unref } from "vue";
 
-import { useMultipleTabStore } from '/@/store/modules/multipleTab';
+import { useMultipleTabStore } from "/@/store/modules/multipleTab";
 
-import { uniqBy } from 'lodash-es';
+import { uniqBy } from "lodash-es";
 
-import { useMultipleTabSetting } from '/@/hooks/setting/useMultipleTabSetting';
+import { useMultipleTabSetting } from "/@/hooks/setting/useMultipleTabSetting";
 
-import { useRouter } from 'vue-router';
+import { useRouter } from "vue-router";
 
 export function useFrameKeepAlive() {
   const router = useRouter();
@@ -22,7 +22,7 @@ export function useFrameKeepAlive() {
 
   const getOpenTabList = computed((): string[] => {
     return tabStore.getTabList.reduce((prev: string[], next) => {
-      if (next.meta && Reflect.has(next.meta, 'frameSrc')) {
+      if (next.meta && Reflect.has(next.meta, "frameSrc")) {
         prev.push(next.name as string);
       }
       return prev;
@@ -40,7 +40,7 @@ export function useFrameKeepAlive() {
         res.push(...getAllFramePages(children));
       }
     }
-    res = uniqBy(res, 'name');
+    res = uniqBy(res, "name");
     return res;
   }
 
diff --git a/src/layouts/page/index.vue b/src/layouts/page/index.vue
index 72fe90f61e40a11b1128f73b6bc699eab5ca742a..74249271b5e930207acc4700fce7c89cfbaa4fca 100644
--- a/src/layouts/page/index.vue
+++ b/src/layouts/page/index.vue
@@ -17,7 +17,9 @@
         <keep-alive v-if="openCache" :include="getCaches">
           <component :is="Component" :key="route.fullPath" />
         </keep-alive>
-        <component v-else :is="Component" :key="route.fullPath" />
+        <div v-else :key="route.name">
+          <component :is="Component" :key="route.fullPath" />
+        </div>
       </transition>
     </template>
   </RouterView>
@@ -25,20 +27,20 @@
 </template>
 
 <script lang="ts">
-  import { computed, defineComponent, unref } from 'vue';
+  import { computed, defineComponent, unref } from "vue";
 
-  import FrameLayout from '/@/layouts/iframe/index.vue';
+  import FrameLayout from "/@/layouts/iframe/index.vue";
 
-  import { useRootSetting } from '/@/hooks/setting/useRootSetting';
+  import { useRootSetting } from "/@/hooks/setting/useRootSetting";
 
-  import { useTransitionSetting } from '/@/hooks/setting/useTransitionSetting';
-  import { useMultipleTabSetting } from '/@/hooks/setting/useMultipleTabSetting';
-  import { getTransitionName } from './transition';
+  import { useTransitionSetting } from "/@/hooks/setting/useTransitionSetting";
+  import { useMultipleTabSetting } from "/@/hooks/setting/useMultipleTabSetting";
+  import { getTransitionName } from "./transition";
 
-  import { useMultipleTabStore } from '/@/store/modules/multipleTab';
+  import { useMultipleTabStore } from "/@/store/modules/multipleTab";
 
   export default defineComponent({
-    name: 'PageLayout',
+    name: "PageLayout",
     components: { FrameLayout },
     setup() {
       const { getShowMultipleTab } = useMultipleTabSetting();
diff --git a/src/layouts/page/transition.ts b/src/layouts/page/transition.ts
index 9e93009d2446157636053874f3445bd56651ea24..c584211a385c016d7fbac040df3b582d380d3ccf 100644
--- a/src/layouts/page/transition.ts
+++ b/src/layouts/page/transition.ts
@@ -1,5 +1,5 @@
-import type { FunctionalComponent } from 'vue';
-import type { RouteLocation } from 'vue-router';
+import type { FunctionalComponent } from "vue";
+import type { RouteLocation } from "vue-router";
 
 export interface DefaultContext {
   Component: FunctionalComponent & { type: Recordable };
@@ -12,7 +12,7 @@ export function getTransitionName({
   cacheTabs,
   enableTransition,
   def,
-}: Pick<DefaultContext, 'route'> & {
+}: Pick<DefaultContext, "route"> & {
   enableTransition: boolean;
   openCache: boolean;
   def: string;
@@ -23,7 +23,7 @@ export function getTransitionName({
   }
 
   const isInCache = cacheTabs.includes(route.name as string);
-  const transitionName = 'fade-slide';
+  const transitionName = "fade-slide";
   let name: string | undefined = transitionName;
 
   if (openCache) {
diff --git a/src/locales/helper.ts b/src/locales/helper.ts
index 4f784394cb727acfaea656759ef431c1a8d6c33c..88e5e4a0985f4bcdd1cbee0560fe9425a827ab22 100644
--- a/src/locales/helper.ts
+++ b/src/locales/helper.ts
@@ -1,28 +1,28 @@
-import type { LocaleType } from '/#/config';
+import type { LocaleType } from "/#/config";
 
-import { set } from 'lodash-es';
+import { set } from "lodash-es";
 
 export const loadLocalePool: LocaleType[] = [];
 
 export function setHtmlPageLang(locale: LocaleType) {
-  document.querySelector('html')?.setAttribute('lang', locale);
+  document.querySelector("html")?.setAttribute("lang", locale);
 }
 
 export function setLoadLocalePool(cb: (loadLocalePool: LocaleType[]) => void) {
   cb(loadLocalePool);
 }
 
-export function genMessage(langs: Record<string, Record<string, any>>, prefix = 'lang') {
+export function genMessage(langs: Record<string, Record<string, any>>, prefix = "lang") {
   const obj: Recordable = {};
 
   Object.keys(langs).forEach((key) => {
     const langFileModule = langs[key].default;
-    let fileName = key.replace(`./${prefix}/`, '').replace(/^\.\//, '');
-    const lastIndex = fileName.lastIndexOf('.');
+    let fileName = key.replace(`./${prefix}/`, "").replace(/^\.\//, "");
+    const lastIndex = fileName.lastIndexOf(".");
     fileName = fileName.substring(0, lastIndex);
-    const keyList = fileName.split('/');
+    const keyList = fileName.split("/");
     const moduleName = keyList.shift();
-    const objKey = keyList.join('.');
+    const objKey = keyList.join(".");
 
     if (moduleName) {
       if (objKey) {
diff --git a/src/locales/lang/en.ts b/src/locales/lang/en.ts
index 1afa87db21aaf22ccd1b1288dff71a35ee97b94f..972b9e37d5b96df3c81b4297c40ca8fd0792bca9 100644
--- a/src/locales/lang/en.ts
+++ b/src/locales/lang/en.ts
@@ -1,13 +1,12 @@
-import { genMessage } from '../helper';
-import antdLocale from 'ant-design-vue/es/locale/en_US';
-// import momentLocale from 'moment/dist/locale/en-us';
+import { genMessage } from "../helper";
+import antdLocale from "ant-design-vue/es/locale/en_US";
 
-const modules = import.meta.globEager('./en/**/*.ts');
+const modules = import.meta.globEager("./en/**/*.ts");
 export default {
   message: {
-    ...genMessage(modules, 'en'),
+    ...genMessage(modules, "en"),
     antdLocale,
   },
-  momentLocale: null,
-  momentLocaleName: 'en',
+  dateLocale: null,
+  dateLocaleName: "en",
 };
diff --git a/src/locales/lang/en/common.ts b/src/locales/lang/en/common.ts
index f7cdce0b57b440a1d4256c1039ffb20e233cefb7..deb795987a6110da38a38cc1dc4ffd28cc4bb422 100644
--- a/src/locales/lang/en/common.ts
+++ b/src/locales/lang/en/common.ts
@@ -1,20 +1,20 @@
 export default {
-  okText: 'OK',
-  closeText: 'Close',
-  cancelText: 'Cancel',
-  loadingText: 'Loading...',
-  saveText: 'Save',
-  delText: 'Delete',
-  resetText: 'Reset',
-  searchText: 'Search',
-  queryText: 'Search',
+  okText: "OK",
+  closeText: "Close",
+  cancelText: "Cancel",
+  loadingText: "Loading...",
+  saveText: "Save",
+  delText: "Delete",
+  resetText: "Reset",
+  searchText: "Search",
+  queryText: "Search",
 
-  inputText: 'Please enter',
-  chooseText: 'Please choose',
+  inputText: "Please enter",
+  chooseText: "Please choose",
 
-  redo: 'Refresh',
-  back: 'Back',
+  redo: "Refresh",
+  back: "Back",
 
-  light: 'Light',
-  dark: 'Dark',
+  light: "Light",
+  dark: "Dark",
 };
diff --git a/src/locales/lang/en/component.ts b/src/locales/lang/en/component.ts
index b93dbd548603d124b80d17b166651d645e979760..1d35b1c147ad81389679b728d9b942ff2f4b0414 100644
--- a/src/locales/lang/en/component.ts
+++ b/src/locales/lang/en/component.ts
@@ -1,129 +1,129 @@
 export default {
   app: {
-    searchNotData: 'No search results yet',
-    toSearch: 'to search',
-    toNavigate: 'to navigate',
+    searchNotData: "No search results yet",
+    toSearch: "to search",
+    toNavigate: "to navigate",
   },
   countdown: {
-    normalText: 'Get SMS code',
-    sendText: 'Reacquire in {0}s',
+    normalText: "Get SMS code",
+    sendText: "Reacquire in {0}s",
   },
   cropper: {
-    selectImage: 'Select Image',
-    uploadSuccess: 'Uploaded success!',
-    modalTitle: 'Avatar upload',
-    okText: 'Confirm and upload',
-    btn_reset: 'Reset',
-    btn_rotate_left: 'Counterclockwise rotation',
-    btn_rotate_right: 'Clockwise rotation',
-    btn_scale_x: 'Flip horizontal',
-    btn_scale_y: 'Flip vertical',
-    btn_zoom_in: 'Zoom in',
-    btn_zoom_out: 'Zoom out',
-    preview: 'Preivew',
+    selectImage: "Select Image",
+    uploadSuccess: "Uploaded success!",
+    modalTitle: "Avatar upload",
+    okText: "Confirm and upload",
+    btn_reset: "Reset",
+    btn_rotate_left: "Counterclockwise rotation",
+    btn_rotate_right: "Clockwise rotation",
+    btn_scale_x: "Flip horizontal",
+    btn_scale_y: "Flip vertical",
+    btn_zoom_in: "Zoom in",
+    btn_zoom_out: "Zoom out",
+    preview: "Preivew",
   },
   drawer: {
-    loadingText: 'Loading...',
-    cancelText: 'Close',
-    okText: 'Confirm',
+    loadingText: "Loading...",
+    cancelText: "Close",
+    okText: "Confirm",
   },
   excel: {
-    exportModalTitle: 'Export data',
-    fileType: 'File type',
-    fileName: 'File name',
+    exportModalTitle: "Export data",
+    fileType: "File type",
+    fileName: "File name",
   },
   form: {
-    putAway: 'Put away',
-    unfold: 'Unfold',
-    maxTip: 'The number of characters should be less than {0}',
-    apiSelectNotFound: 'Wait for data loading to complete...',
+    putAway: "Put away",
+    unfold: "Unfold",
+    maxTip: "The number of characters should be less than {0}",
+    apiSelectNotFound: "Wait for data loading to complete...",
   },
   icon: {
-    placeholder: 'Click the select icon',
-    search: 'Search icon',
-    copy: 'Copy icon successfully!',
+    placeholder: "Click the select icon",
+    search: "Search icon",
+    copy: "Copy icon successfully!",
   },
   menu: {
-    search: 'Menu search',
+    search: "Menu search",
   },
   modal: {
-    cancelText: 'Close',
-    okText: 'Confirm',
-    close: 'Close',
-    maximize: 'Maximize',
-    restore: 'Restore',
+    cancelText: "Close",
+    okText: "Confirm",
+    close: "Close",
+    maximize: "Maximize",
+    restore: "Restore",
   },
   table: {
-    settingDens: 'Density',
-    settingDensDefault: 'Default',
-    settingDensMiddle: 'Middle',
-    settingDensSmall: 'Compact',
-    settingColumn: 'Column settings',
-    settingColumnShow: 'Column display',
-    settingIndexColumnShow: 'Index Column',
-    settingSelectColumnShow: 'Selection Column',
-    settingFixedLeft: 'Fixed Left',
-    settingFixedRight: 'Fixed Right',
-    settingFullScreen: 'Full Screen',
-    index: 'Index',
-    total: 'total of {total}',
+    settingDens: "Density",
+    settingDensDefault: "Default",
+    settingDensMiddle: "Middle",
+    settingDensSmall: "Compact",
+    settingColumn: "Column settings",
+    settingColumnShow: "Column display",
+    settingIndexColumnShow: "Index Column",
+    settingSelectColumnShow: "Selection Column",
+    settingFixedLeft: "Fixed Left",
+    settingFixedRight: "Fixed Right",
+    settingFullScreen: "Full Screen",
+    index: "Index",
+    total: "total of {total}",
   },
   time: {
-    before: ' ago',
-    after: ' after',
-    just: 'just now',
-    seconds: ' seconds',
-    minutes: ' minutes',
-    hours: ' hours',
-    days: ' days',
+    before: " ago",
+    after: " after",
+    just: "just now",
+    seconds: " seconds",
+    minutes: " minutes",
+    hours: " hours",
+    days: " days",
   },
   tree: {
-    selectAll: 'Select All',
-    unSelectAll: 'Cancel Select',
-    expandAll: 'Expand All',
-    unExpandAll: 'Collapse all',
+    selectAll: "Select All",
+    unSelectAll: "Cancel Select",
+    expandAll: "Expand All",
+    unExpandAll: "Collapse all",
 
-    checkStrictly: 'Hierarchical association',
-    checkUnStrictly: 'Hierarchical independence',
+    checkStrictly: "Hierarchical association",
+    checkUnStrictly: "Hierarchical independence",
   },
   upload: {
-    save: 'Save',
-    upload: 'Upload',
-    imgUpload: 'ImageUpload',
-    uploaded: 'Uploaded',
+    save: "Save",
+    upload: "Upload",
+    imgUpload: "ImageUpload",
+    uploaded: "Uploaded",
 
-    operating: 'Operating',
-    del: 'Delete',
-    download: 'download',
-    saveWarn: 'Please wait for the file to upload and save!',
-    saveError: 'There is no file successfully uploaded and cannot be saved!',
+    operating: "Operating",
+    del: "Delete",
+    download: "download",
+    saveWarn: "Please wait for the file to upload and save!",
+    saveError: "There is no file successfully uploaded and cannot be saved!",
 
-    preview: 'Preview',
-    choose: 'Select the file',
+    preview: "Preview",
+    choose: "Select the file",
 
-    accept: 'Support {0} format',
-    acceptUpload: 'Only upload files in {0} format',
-    maxSize: 'A single file does not exceed {0}MB ',
-    maxSizeMultiple: 'Only upload files up to {0}MB!',
-    maxNumber: 'Only upload up to {0} files',
+    accept: "Support {0} format",
+    acceptUpload: "Only upload files in {0} format",
+    maxSize: "A single file does not exceed {0}MB ",
+    maxSizeMultiple: "Only upload files up to {0}MB!",
+    maxNumber: "Only upload up to {0} files",
 
-    legend: 'Legend',
-    fileName: 'File name',
-    fileSize: 'File size',
-    fileStatue: 'File status',
+    legend: "Legend",
+    fileName: "File name",
+    fileSize: "File size",
+    fileStatue: "File status",
 
-    startUpload: 'Start upload',
-    uploadSuccess: 'Upload successfully',
-    uploadError: 'Upload failed',
-    uploading: 'Uploading',
-    uploadWait: 'Please wait for the file upload to finish',
-    reUploadFailed: 'Re-upload failed files',
+    startUpload: "Start upload",
+    uploadSuccess: "Upload successfully",
+    uploadError: "Upload failed",
+    uploading: "Uploading",
+    uploadWait: "Please wait for the file upload to finish",
+    reUploadFailed: "Re-upload failed files",
   },
   verify: {
-    error: 'verification failed!',
-    time: 'The verification is successful and it takes {time} seconds!',
-    redoTip: 'Click the picture to refresh',
-    dragText: 'Hold down the slider and drag',
-    successText: 'Verified',
+    error: "verification failed!",
+    time: "The verification is successful and it takes {time} seconds!",
+    redoTip: "Click the picture to refresh",
+    dragText: "Hold down the slider and drag",
+    successText: "Verified",
   },
 };
diff --git a/src/locales/lang/en/layout.ts b/src/locales/lang/en/layout.ts
index 5a9408a088b544453214f54d6392d91714e85fc5..02c2b4f60b10abba414a9666a20b615547d6a25f 100644
--- a/src/locales/lang/en/layout.ts
+++ b/src/locales/lang/en/layout.ts
@@ -1,115 +1,115 @@
 export default {
-  footer: { onlinePreview: 'Preview', onlineDocument: 'Document' },
+  footer: { onlinePreview: "Preview", onlineDocument: "Document" },
   header: {
     // user dropdown
-    dropdownItemDoc: 'Document',
-    dropdownItemLoginOut: 'Login Out',
+    dropdownItemDoc: "Document",
+    dropdownItemLoginOut: "Login Out",
 
-    tooltipErrorLog: 'Error log',
-    tooltipLock: 'Lock screen',
-    tooltipNotify: 'Notification',
+    tooltipErrorLog: "Error log",
+    tooltipLock: "Lock screen",
+    tooltipNotify: "Notification",
 
-    tooltipEntryFull: 'Full Screen',
-    tooltipExitFull: 'Exit Full Screen',
+    tooltipEntryFull: "Full Screen",
+    tooltipExitFull: "Exit Full Screen",
 
     // lock
-    lockScreenPassword: 'Lock screen password',
-    lockScreen: 'Lock screen',
-    lockScreenBtn: 'Locking',
+    lockScreenPassword: "Lock screen password",
+    lockScreen: "Lock screen",
+    lockScreenBtn: "Locking",
 
-    home: 'Home',
+    home: "Home",
   },
   multipleTab: {
-    reload: 'Refresh current',
-    close: 'Close current',
-    closeLeft: 'Close Left',
-    closeRight: 'Close Right',
-    closeOther: 'Close Other',
-    closeAll: 'Close All',
+    reload: "Refresh current",
+    close: "Close current",
+    closeLeft: "Close Left",
+    closeRight: "Close Right",
+    closeOther: "Close Other",
+    closeAll: "Close All",
   },
   setting: {
     // content mode
-    contentModeFull: 'Full',
-    contentModeFixed: 'Fixed width',
+    contentModeFull: "Full",
+    contentModeFixed: "Fixed width",
     // topMenu align
-    topMenuAlignLeft: 'Left',
-    topMenuAlignRight: 'Center',
-    topMenuAlignCenter: 'Right',
+    topMenuAlignLeft: "Left",
+    topMenuAlignRight: "Center",
+    topMenuAlignCenter: "Right",
     // menu trigger
-    menuTriggerNone: 'Not Show',
-    menuTriggerBottom: 'Bottom',
-    menuTriggerTop: 'Top',
+    menuTriggerNone: "Not Show",
+    menuTriggerBottom: "Bottom",
+    menuTriggerTop: "Top",
     // menu type
-    menuTypeSidebar: 'Left menu mode',
-    menuTypeMixSidebar: 'Left menu mixed mode',
-    menuTypeMix: 'Top Menu Mix mode',
-    menuTypeTopMenu: 'Top menu mode',
+    menuTypeSidebar: "Left menu mode",
+    menuTypeMixSidebar: "Left menu mixed mode",
+    menuTypeMix: "Top Menu Mix mode",
+    menuTypeTopMenu: "Top menu mode",
 
-    on: 'On',
-    off: 'Off',
-    minute: 'Minute',
+    on: "On",
+    off: "Off",
+    minute: "Minute",
 
-    operatingTitle: 'Successful!',
+    operatingTitle: "Successful!",
     operatingContent:
-      'The copy is successful, please go to src/settings/projectSetting.ts to modify the configuration!',
-    resetSuccess: 'Successfully reset!',
-
-    copyBtn: 'Copy',
-    clearBtn: 'Clear cache and to the login page',
-
-    drawerTitle: 'Configuration',
-
-    darkMode: 'Dark mode',
-    navMode: 'Navigation mode',
-    interfaceFunction: 'Interface function',
-    interfaceDisplay: 'Interface display',
-    animation: 'Animation',
-    splitMenu: 'Split menu',
-    closeMixSidebarOnChange: 'Switch page to close menu',
-
-    sysTheme: 'System theme',
-    headerTheme: 'Header theme',
-    sidebarTheme: 'Menu theme',
-
-    menuDrag: 'Drag Sidebar',
-    menuSearch: 'Menu search',
-    menuAccordion: 'Sidebar accordion',
-    menuCollapse: 'Collapse menu',
-    collapseMenuDisplayName: 'Collapse menu display name',
-    topMenuLayout: 'Top menu layout',
-    menuCollapseButton: 'Menu collapse button',
-    contentMode: 'Content area width',
-    expandedMenuWidth: 'Expanded menu width',
-
-    breadcrumb: 'Breadcrumbs',
-    breadcrumbIcon: 'Breadcrumbs Icon',
-    tabs: 'Tabs',
-    tabDetail: 'Tab Detail',
-    tabsQuickBtn: 'Tabs quick button',
-    tabsRedoBtn: 'Tabs redo button',
-    tabsFoldBtn: 'Tabs flod button',
-    sidebar: 'Sidebar',
-    header: 'Header',
-    footer: 'Footer',
-    fullContent: 'Full content',
-    grayMode: 'Gray mode',
-    colorWeak: 'Color Weak Mode',
-
-    progress: 'Progress',
-    switchLoading: 'Switch Loading',
-    switchAnimation: 'Switch animation',
-    animationType: 'Animation type',
-
-    autoScreenLock: 'Auto screen lock',
-    notAutoScreenLock: 'Not auto lock',
-
-    fixedHeader: 'Fixed header',
-    fixedSideBar: 'Fixed Sidebar',
-
-    mixSidebarTrigger: 'Mixed menu Trigger',
-    triggerHover: 'Hover',
-    triggerClick: 'Click',
-
-    mixSidebarFixed: 'Fixed expanded menu',
+      "The copy is successful, please go to src/settings/projectSetting.ts to modify the configuration!",
+    resetSuccess: "Successfully reset!",
+
+    copyBtn: "Copy",
+    clearBtn: "Clear cache and to the login page",
+
+    drawerTitle: "Configuration",
+
+    darkMode: "Dark mode",
+    navMode: "Navigation mode",
+    interfaceFunction: "Interface function",
+    interfaceDisplay: "Interface display",
+    animation: "Animation",
+    splitMenu: "Split menu",
+    closeMixSidebarOnChange: "Switch page to close menu",
+
+    sysTheme: "System theme",
+    headerTheme: "Header theme",
+    sidebarTheme: "Menu theme",
+
+    menuDrag: "Drag Sidebar",
+    menuSearch: "Menu search",
+    menuAccordion: "Sidebar accordion",
+    menuCollapse: "Collapse menu",
+    collapseMenuDisplayName: "Collapse menu display name",
+    topMenuLayout: "Top menu layout",
+    menuCollapseButton: "Menu collapse button",
+    contentMode: "Content area width",
+    expandedMenuWidth: "Expanded menu width",
+
+    breadcrumb: "Breadcrumbs",
+    breadcrumbIcon: "Breadcrumbs Icon",
+    tabs: "Tabs",
+    tabDetail: "Tab Detail",
+    tabsQuickBtn: "Tabs quick button",
+    tabsRedoBtn: "Tabs redo button",
+    tabsFoldBtn: "Tabs flod button",
+    sidebar: "Sidebar",
+    header: "Header",
+    footer: "Footer",
+    fullContent: "Full content",
+    grayMode: "Gray mode",
+    colorWeak: "Color Weak Mode",
+
+    progress: "Progress",
+    switchLoading: "Switch Loading",
+    switchAnimation: "Switch animation",
+    animationType: "Animation type",
+
+    autoScreenLock: "Auto screen lock",
+    notAutoScreenLock: "Not auto lock",
+
+    fixedHeader: "Fixed header",
+    fixedSideBar: "Fixed Sidebar",
+
+    mixSidebarTrigger: "Mixed menu Trigger",
+    triggerHover: "Hover",
+    triggerClick: "Click",
+
+    mixSidebarFixed: "Fixed expanded menu",
   },
 };
diff --git a/src/locales/lang/en/routes/basic.ts b/src/locales/lang/en/routes/basic.ts
index b6faa00ef02536104c66548fdc1d0671df2e5d8f..48b1bb51c3f26e80649a6a692ef61477f5580e6e 100644
--- a/src/locales/lang/en/routes/basic.ts
+++ b/src/locales/lang/en/routes/basic.ts
@@ -1,4 +1,4 @@
 export default {
-  login: 'Login',
-  errorLogList: 'Error Log',
+  login: "Login",
+  errorLogList: "Error Log",
 };
diff --git a/src/locales/lang/en/routes/dashboard.ts b/src/locales/lang/en/routes/dashboard.ts
index 6d047b5709c4a5d28eace26af4ef48121c420942..23bc9c7fd90269cbe06b348ec17969efcdf9fe7b 100644
--- a/src/locales/lang/en/routes/dashboard.ts
+++ b/src/locales/lang/en/routes/dashboard.ts
@@ -1,6 +1,6 @@
 export default {
-  dashboard: 'Dashboard',
-  about: 'About',
-  workbench: 'Workbench',
-  analysis: 'Analysis',
+  dashboard: "Dashboard",
+  about: "About",
+  workbench: "Workbench",
+  analysis: "Analysis",
 };
diff --git a/src/locales/lang/en/routes/demo.ts b/src/locales/lang/en/routes/demo.ts
index b2991922bd57475214f0ccd15f65cb44f05659a0..cac807b2d6eeedbcd35a56150aaacb738e4d5449 100644
--- a/src/locales/lang/en/routes/demo.ts
+++ b/src/locales/lang/en/routes/demo.ts
@@ -1,199 +1,202 @@
 export default {
   charts: {
-    baiduMap: 'Baidu map',
-    aMap: 'A map',
-    googleMap: 'Google map',
-    charts: 'Chart',
-    map: 'Map',
-    line: 'Line',
-    pie: 'Pie',
+    baiduMap: "Baidu map",
+    aMap: "A map",
+    googleMap: "Google map",
+    charts: "Chart",
+    map: "Map",
+    line: "Line",
+    pie: "Pie",
   },
   comp: {
-    comp: 'Component',
-    basic: 'Basic',
-    transition: 'Animation',
-    countTo: 'Count To',
+    comp: "Component",
+    basic: "Basic",
+    transition: "Animation",
+    countTo: "Count To",
 
-    scroll: 'Scroll',
-    scrollBasic: 'Basic',
-    scrollAction: 'Scroll Function',
-    virtualScroll: 'Virtual Scroll',
+    scroll: "Scroll",
+    scrollBasic: "Basic",
+    scrollAction: "Scroll Function",
+    virtualScroll: "Virtual Scroll",
 
-    tree: 'Tree',
+    tree: "Tree",
 
-    treeBasic: 'Basic',
-    editTree: 'Searchable/toolbar',
-    actionTree: 'Function operation',
+    treeBasic: "Basic",
+    editTree: "Searchable/toolbar",
+    actionTree: "Function operation",
 
-    modal: 'Modal',
-    drawer: 'Drawer',
-    desc: 'Desc',
+    modal: "Modal",
+    drawer: "Drawer",
+    desc: "Desc",
 
-    lazy: 'Lazy',
-    lazyBasic: 'Basic',
-    lazyTransition: 'Animation',
+    lazy: "Lazy",
+    lazyBasic: "Basic",
+    lazyTransition: "Animation",
 
-    verify: 'Verify',
-    verifyDrag: 'Drag ',
-    verifyRotate: 'Picture Restore',
+    verify: "Verify",
+    verifyDrag: "Drag ",
+    verifyRotate: "Picture Restore",
 
-    qrcode: 'QR code',
-    strength: 'Password strength',
-    upload: 'Upload',
+    qrcode: "QR code",
+    strength: "Password strength",
+    upload: "Upload",
 
-    loading: 'Loading',
+    loading: "Loading",
 
-    time: 'Relative Time',
-    cropperImage: 'Cropper Image',
-    cardList: 'Card List',
+    time: "Relative Time",
+    cropperImage: "Cropper Image",
+    cardList: "Card List",
   },
   editor: {
-    editor: 'Editor',
-    jsonEditor: 'Json editor',
-    markdown: 'Markdown editor',
+    editor: "Editor",
+    jsonEditor: "Json editor",
+    markdown: "Markdown editor",
 
-    tinymce: 'Rich text',
-    tinymceBasic: 'Basic',
-    tinymceForm: 'embedded form',
+    tinymce: "Rich text",
+    tinymceBasic: "Basic",
+    tinymceForm: "embedded form",
   },
   excel: {
-    excel: 'Excel',
-    customExport: 'Select export format',
-    jsonExport: 'JSON data export',
-    arrayExport: 'Array data export',
-    importExcel: 'Import',
+    excel: "Excel",
+    customExport: "Select export format",
+    jsonExport: "JSON data export",
+    arrayExport: "Array data export",
+    importExcel: "Import",
   },
   feat: {
-    feat: 'Page Function',
-    icon: 'Icon',
-    tabs: 'Tabs',
-    tabDetail: 'Tab Detail',
-    sessionTimeout: 'Session Timeout',
-    print: 'Print',
-    contextMenu: 'Context Menu',
-    download: 'Download',
-    clickOutSide: 'ClickOutSide',
-    imgPreview: 'Picture Preview',
-    copy: 'Clipboard',
-    msg: 'Message prompt',
-    watermark: 'Watermark',
-    ripple: 'Ripple',
-    fullScreen: 'Full Screen',
-    errorLog: 'Error Log',
-    tab: 'Tab with parameters',
-    tab1: 'Tab with parameter 1',
-    tab2: 'Tab with parameter 2',
-    menu: 'Menu with parameters',
-    menu1: 'Menu with parameters 1',
-    menu2: 'Menu with parameters 2',
-
-    ws: 'Websocket test',
-
-    breadcrumb: 'Breadcrumbs',
-    breadcrumbFlat: 'Flat Mode',
-    breadcrumbFlatDetail: 'Flat mode details',
-
-    breadcrumbChildren: 'Level mode',
-    breadcrumbChildrenDetail: 'Level mode detail',
+    feat: "Page Function",
+    icon: "Icon",
+    tabs: "Tabs",
+    tabDetail: "Tab Detail",
+    sessionTimeout: "Session Timeout",
+    print: "Print",
+    contextMenu: "Context Menu",
+    download: "Download",
+    clickOutSide: "ClickOutSide",
+    imgPreview: "Picture Preview",
+    copy: "Clipboard",
+    msg: "Message prompt",
+    watermark: "Watermark",
+    ripple: "Ripple",
+    fullScreen: "Full Screen",
+    errorLog: "Error Log",
+    tab: "Tab with parameters",
+    tab1: "Tab with parameter 1",
+    tab2: "Tab with parameter 2",
+    menu: "Menu with parameters",
+    menu1: "Menu with parameters 1",
+    menu2: "Menu with parameters 2",
+
+    ws: "Websocket test",
+
+    breadcrumb: "Breadcrumbs",
+    breadcrumbFlat: "Flat Mode",
+    breadcrumbFlatDetail: "Flat mode details",
+    requestDemo: "Retry request demo",
+
+    breadcrumbChildren: "Level mode",
+    breadcrumbChildrenDetail: "Level mode detail",
   },
   flow: {
-    name: 'Graphics editor',
-    flowChart: 'FlowChart',
+    name: "Graphics editor",
+    flowChart: "FlowChart",
   },
   form: {
-    form: 'Form',
-    basic: 'Basic',
-    useForm: 'useForm',
-    refForm: 'RefForm',
-    advancedForm: 'Shrinkable',
-    ruleForm: 'Form validation',
-    dynamicForm: 'Dynamic',
-    customerForm: 'Custom',
-    appendForm: 'Append',
+    form: "Form",
+    basic: "Basic",
+    useForm: "useForm",
+    refForm: "RefForm",
+    advancedForm: "Shrinkable",
+    ruleForm: "Form validation",
+    dynamicForm: "Dynamic",
+    customerForm: "Custom",
+    appendForm: "Append",
+    tabsForm: "TabsForm",
   },
   iframe: {
-    frame: 'External',
-    antv: 'antVue doc (embedded)',
-    doc: 'Project doc (embedded)',
-    docExternal: 'Project doc (external)',
+    frame: "External",
+    antv: "antVue doc (embedded)",
+    doc: "Project doc (embedded)",
+    docExternal: "Project doc (external)",
   },
-  level: { level: 'MultiMenu' },
+  level: { level: "MultiMenu" },
   page: {
-    page: 'Page',
-
-    form: 'Form',
-    formBasic: 'Basic Form',
-    formStep: 'Step Form',
-    formHigh: 'Advanced Form',
-
-    desc: 'Details',
-    descBasic: 'Basic Details',
-    descHigh: 'Advanced Details',
-
-    result: 'Result',
-    resultSuccess: 'Success',
-    resultFail: 'Failed',
-
-    account: 'Personal',
-    accountCenter: 'Personal Center',
-    accountSetting: 'Personal Settings',
-
-    exception: 'Exception',
-    netWorkError: 'Network Error',
-    notData: 'No data',
-
-    list: 'List page',
-    listCard: 'Card list',
-    basic: 'Basic list',
-    listBasic: 'Basic list',
-    listSearch: 'Search list',
+    page: "Page",
+
+    form: "Form",
+    formBasic: "Basic Form",
+    formStep: "Step Form",
+    formHigh: "Advanced Form",
+
+    desc: "Details",
+    descBasic: "Basic Details",
+    descHigh: "Advanced Details",
+
+    result: "Result",
+    resultSuccess: "Success",
+    resultFail: "Failed",
+
+    account: "Personal",
+    accountCenter: "Personal Center",
+    accountSetting: "Personal Settings",
+
+    exception: "Exception",
+    netWorkError: "Network Error",
+    notData: "No data",
+
+    list: "List page",
+    listCard: "Card list",
+    basic: "Basic list",
+    listBasic: "Basic list",
+    listSearch: "Search list",
   },
   permission: {
-    permission: 'Permission',
+    permission: "Permission",
 
-    front: 'front-end',
-    frontPage: 'Page',
-    frontBtn: 'Button',
-    frontTestA: 'Test page A',
-    frontTestB: 'Test page B',
+    front: "front-end",
+    frontPage: "Page",
+    frontBtn: "Button",
+    frontTestA: "Test page A",
+    frontTestB: "Test page B",
 
-    back: 'background',
-    backPage: 'Page',
-    backBtn: 'Button',
+    back: "background",
+    backPage: "Page",
+    backBtn: "Button",
   },
   setup: {
-    page: 'Intro page',
+    page: "Intro page",
   },
   system: {
-    moduleName: 'System management',
+    moduleName: "System management",
 
-    account: 'Account management',
-    account_detail: 'Account detail',
-    password: 'Change password',
+    account: "Account management",
+    account_detail: "Account detail",
+    password: "Change password",
 
-    dept: 'Department management',
+    dept: "Department management",
 
-    menu: 'Menu management',
-    role: 'Role management',
+    menu: "Menu management",
+    role: "Role management",
   },
   table: {
-    table: 'Table',
-
-    basic: 'Basic',
-    treeTable: 'Tree',
-    fetchTable: 'Remote loading',
-    fixedColumn: 'Fixed column',
-    customerCell: 'Custom column',
-    formTable: 'Open search',
-    useTable: 'UseTable',
-    refTable: 'RefTable',
-    multipleHeader: 'MultiLevel header',
-    mergeHeader: 'Merge cells',
-    expandTable: 'Expandable table',
-    fixedHeight: 'Fixed height',
-    footerTable: 'Footer',
-    editCellTable: 'Editable cell',
-    editRowTable: 'Editable row',
-    authColumn: 'Auth column',
+    table: "Table",
+
+    basic: "Basic",
+    treeTable: "Tree",
+    fetchTable: "Remote loading",
+    fixedColumn: "Fixed column",
+    customerCell: "Custom column",
+    formTable: "Open search",
+    useTable: "UseTable",
+    refTable: "RefTable",
+    multipleHeader: "MultiLevel header",
+    mergeHeader: "Merge cells",
+    expandTable: "Expandable table",
+    fixedHeight: "Fixed height",
+    footerTable: "Footer",
+    editCellTable: "Editable cell",
+    editRowTable: "Editable row",
+    authColumn: "Auth column",
+    resizeParentHeightTable: "resizeParentHeightTable",
   },
 };
diff --git a/src/locales/lang/en/sys.ts b/src/locales/lang/en/sys.ts
index 3b29600753a925300d7b402cd80a6b94b927b87c..45c7e90519d8424d4adc3e8d2363a2b9b5ee7c17 100644
--- a/src/locales/lang/en/sys.ts
+++ b/src/locales/lang/en/sys.ts
@@ -1,104 +1,104 @@
 export default {
   api: {
-    operationFailed: 'Operation failed',
-    errorTip: 'Error Tip',
-    errorMessage: 'The operation failed, the system is abnormal!',
-    timeoutMessage: 'Login timed out, please log in again!',
-    apiTimeoutMessage: 'The interface request timed out, please refresh the page and try again!',
-    apiRequestFailed: 'The interface request failed, please try again later!',
-    networkException: 'network anomaly',
+    operationFailed: "Operation failed",
+    errorTip: "Error Tip",
+    errorMessage: "The operation failed, the system is abnormal!",
+    timeoutMessage: "Login timed out, please log in again!",
+    apiTimeoutMessage: "The interface request timed out, please refresh the page and try again!",
+    apiRequestFailed: "The interface request failed, please try again later!",
+    networkException: "network anomaly",
     networkExceptionMsg:
-      'Please check if your network connection is normal! The network is abnormal',
+      "Please check if your network connection is normal! The network is abnormal",
 
-    errMsg401: 'The user does not have permission (token, user name, password error)!',
-    errMsg403: 'The user is authorized, but access is forbidden!',
-    errMsg404: 'Network request error, the resource was not found!',
-    errMsg405: 'Network request error, request method not allowed!',
-    errMsg408: 'Network request timed out!',
-    errMsg500: 'Server error, please contact the administrator!',
-    errMsg501: 'The network is not implemented!',
-    errMsg502: 'Network Error!',
-    errMsg503: 'The service is unavailable, the server is temporarily overloaded or maintained!',
-    errMsg504: 'Network timeout!',
-    errMsg505: 'The http version does not support the request!',
+    errMsg401: "The user does not have permission (token, user name, password error)!",
+    errMsg403: "The user is authorized, but access is forbidden!",
+    errMsg404: "Network request error, the resource was not found!",
+    errMsg405: "Network request error, request method not allowed!",
+    errMsg408: "Network request timed out!",
+    errMsg500: "Server error, please contact the administrator!",
+    errMsg501: "The network is not implemented!",
+    errMsg502: "Network Error!",
+    errMsg503: "The service is unavailable, the server is temporarily overloaded or maintained!",
+    errMsg504: "Network timeout!",
+    errMsg505: "The http version does not support the request!",
   },
   app: {
-    logoutTip: 'Reminder',
-    logoutMessage: 'Confirm to exit the system?',
-    menuLoading: 'Menu loading...',
+    logoutTip: "Reminder",
+    logoutMessage: "Confirm to exit the system?",
+    menuLoading: "Menu loading...",
   },
   errorLog: {
-    tableTitle: 'Error log list',
-    tableColumnType: 'Type',
-    tableColumnDate: 'Time',
-    tableColumnFile: 'File',
-    tableColumnMsg: 'Error message',
-    tableColumnStackMsg: 'Stack info',
+    tableTitle: "Error log list",
+    tableColumnType: "Type",
+    tableColumnDate: "Time",
+    tableColumnFile: "File",
+    tableColumnMsg: "Error message",
+    tableColumnStackMsg: "Stack info",
 
-    tableActionDesc: 'Details',
+    tableActionDesc: "Details",
 
-    modalTitle: 'Error details',
+    modalTitle: "Error details",
 
-    fireVueError: 'Fire vue error',
-    fireResourceError: 'Fire resource error',
-    fireAjaxError: 'Fire ajax error',
+    fireVueError: "Fire vue error",
+    fireResourceError: "Fire resource error",
+    fireAjaxError: "Fire ajax error",
 
-    enableMessage: 'Only effective when useErrorHandle=true in `/src/settings/projectSetting.ts`.',
+    enableMessage: "Only effective when useErrorHandle=true in `/src/settings/projectSetting.ts`.",
   },
   exception: {
-    backLogin: 'Back Login',
-    backHome: 'Back Home',
+    backLogin: "Back Login",
+    backHome: "Back Home",
     subTitle403: "Sorry, you don't have access to this page.",
-    subTitle404: 'Sorry, the page you visited does not exist.',
-    subTitle500: 'Sorry, the server is reporting an error.',
-    noDataTitle: 'No data on the current page.',
-    networkErrorTitle: 'Network Error',
+    subTitle404: "Sorry, the page you visited does not exist.",
+    subTitle500: "Sorry, the server is reporting an error.",
+    noDataTitle: "No data on the current page.",
+    networkErrorTitle: "Network Error",
     networkErrorSubTitle:
-      'Sorry,Your network connection has been disconnected, please check your network!',
+      "Sorry,Your network connection has been disconnected, please check your network!",
   },
   lock: {
-    unlock: 'Click to unlock',
-    alert: 'Lock screen password error',
-    backToLogin: 'Back to login',
-    entry: 'Enter the system',
-    placeholder: 'Please enter the lock screen password or user password',
+    unlock: "Click to unlock",
+    alert: "Lock screen password error",
+    backToLogin: "Back to login",
+    entry: "Enter the system",
+    placeholder: "Please enter the lock screen password or user password",
   },
   login: {
-    backSignIn: 'Back sign in',
-    mobileSignInFormTitle: 'Mobile sign in',
-    qrSignInFormTitle: 'Qr code sign in',
-    signInFormTitle: 'Sign in',
-    signUpFormTitle: 'Sign up',
-    forgetFormTitle: 'Reset password',
+    backSignIn: "Back sign in",
+    mobileSignInFormTitle: "Mobile sign in",
+    qrSignInFormTitle: "Qr code sign in",
+    signInFormTitle: "Sign in",
+    signUpFormTitle: "Sign up",
+    forgetFormTitle: "Reset password",
 
-    signInTitle: 'Backstage management system',
-    signInDesc: 'Enter your personal details and get started!',
-    policy: 'I agree to the xxx Privacy Policy',
+    signInTitle: "Backstage management system",
+    signInDesc: "Enter your personal details and get started!",
+    policy: "I agree to the xxx Privacy Policy",
     scanSign: `scanning the code to complete the login`,
 
-    loginButton: 'Sign in',
-    registerButton: 'Sign up',
-    rememberMe: 'Remember me',
-    forgetPassword: 'Forget Password?',
-    otherSignIn: 'Sign in with',
+    loginButton: "Sign in",
+    registerButton: "Sign up",
+    rememberMe: "Remember me",
+    forgetPassword: "Forget Password?",
+    otherSignIn: "Sign in with",
 
     // notify
-    loginSuccessTitle: 'Login successful',
-    loginSuccessDesc: 'Welcome back',
+    loginSuccessTitle: "Login successful",
+    loginSuccessDesc: "Welcome back",
 
     // placeholder
-    accountPlaceholder: 'Please input username',
-    passwordPlaceholder: 'Please input password',
-    smsPlaceholder: 'Please input sms code',
-    mobilePlaceholder: 'Please input mobile',
-    policyPlaceholder: 'Register after checking',
-    diffPwd: 'The two passwords are inconsistent',
+    accountPlaceholder: "Please input username",
+    passwordPlaceholder: "Please input password",
+    smsPlaceholder: "Please input sms code",
+    mobilePlaceholder: "Please input mobile",
+    policyPlaceholder: "Register after checking",
+    diffPwd: "The two passwords are inconsistent",
 
-    userName: 'Username',
-    password: 'Password',
-    confirmPassword: 'Confirm Password',
-    email: 'Email',
-    smsCode: 'SMS code',
-    mobile: 'Mobile',
+    userName: "Username",
+    password: "Password",
+    confirmPassword: "Confirm Password",
+    email: "Email",
+    smsCode: "SMS code",
+    mobile: "Mobile",
   },
 };
diff --git a/src/locales/lang/zh-CN/antdLocale/DatePicker.ts b/src/locales/lang/zh-CN/antdLocale/DatePicker.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6e6bafac19ac31c279abf82c5b421554a2077d56
--- /dev/null
+++ b/src/locales/lang/zh-CN/antdLocale/DatePicker.ts
@@ -0,0 +1,19 @@
+export default {
+  lang: {
+    shortWeekDays: ["一", "二", "三", "四", "五", "六", "日"],
+    shortMonths: [
+      "1月",
+      "2月",
+      "3月",
+      "4月",
+      "5月",
+      "6月",
+      "7月",
+      "8月",
+      "9月",
+      "10月",
+      "11月",
+      "12月",
+    ],
+  },
+};
diff --git a/src/locales/lang/zh-CN/common.ts b/src/locales/lang/zh-CN/common.ts
index 478c6253662f2bc648916c8c24462c0ab374ef83..978b2b3a64f80317ce8007f1ada532c844c7a7b2 100644
--- a/src/locales/lang/zh-CN/common.ts
+++ b/src/locales/lang/zh-CN/common.ts
@@ -1,20 +1,20 @@
 export default {
-  okText: '确认',
-  closeText: '关闭',
-  cancelText: '取消',
-  loadingText: '加载中...',
-  saveText: '保存',
-  delText: '删除',
-  resetText: '重置',
-  searchText: '搜索',
-  queryText: '查询',
+  okText: "确认",
+  closeText: "关闭",
+  cancelText: "取消",
+  loadingText: "加载中...",
+  saveText: "保存",
+  delText: "删除",
+  resetText: "重置",
+  searchText: "搜索",
+  queryText: "查询",
 
-  inputText: '请输入',
-  chooseText: '请选择',
+  inputText: "请输入",
+  chooseText: "请选择",
 
-  redo: '刷新',
-  back: '返回',
+  redo: "刷新",
+  back: "返回",
 
-  light: '亮色主题',
-  dark: '黑暗主题',
+  light: "亮色主题",
+  dark: "黑暗主题",
 };
diff --git a/src/locales/lang/zh-CN/component.ts b/src/locales/lang/zh-CN/component.ts
index d9b54eb59edbd0112e8fce1500aba26677b53383..b5b53ce3689585d03494b075fd346de06a8453e3 100644
--- a/src/locales/lang/zh-CN/component.ts
+++ b/src/locales/lang/zh-CN/component.ts
@@ -1,134 +1,134 @@
 export default {
   app: {
-    searchNotData: '暂无搜索结果',
-    toSearch: '确认',
-    toNavigate: '切换',
+    searchNotData: "暂无搜索结果",
+    toSearch: "确认",
+    toNavigate: "切换",
   },
   countdown: {
-    normalText: '获取验证码',
-    sendText: '{0}秒后重新获取',
+    normalText: "获取验证码",
+    sendText: "{0}秒后重新获取",
   },
   cropper: {
-    selectImage: '选择图片',
-    uploadSuccess: '上传成功',
-    modalTitle: '头像上传',
-    okText: '确认并上传',
-    btn_reset: '重置',
-    btn_rotate_left: '逆时针旋转',
-    btn_rotate_right: '顺时针旋转',
-    btn_scale_x: '水平翻转',
-    btn_scale_y: '垂直翻转',
-    btn_zoom_in: '放大',
-    btn_zoom_out: '缩小',
-    preview: '预览',
+    selectImage: "选择图片",
+    uploadSuccess: "上传成功",
+    modalTitle: "头像上传",
+    okText: "确认并上传",
+    btn_reset: "重置",
+    btn_rotate_left: "逆时针旋转",
+    btn_rotate_right: "顺时针旋转",
+    btn_scale_x: "水平翻转",
+    btn_scale_y: "垂直翻转",
+    btn_zoom_in: "放大",
+    btn_zoom_out: "缩小",
+    preview: "预览",
   },
   drawer: {
-    loadingText: '加载中...',
-    cancelText: '关闭',
-    okText: '确认',
+    loadingText: "加载中...",
+    cancelText: "关闭",
+    okText: "确认",
   },
   excel: {
-    exportModalTitle: '导出数据',
-    fileType: '文件类型',
-    fileName: '文件名',
+    exportModalTitle: "导出数据",
+    fileType: "文件类型",
+    fileName: "文件名",
   },
   form: {
-    putAway: '收起',
-    unfold: '展开',
+    putAway: "收起",
+    unfold: "展开",
 
-    maxTip: '字符数应小于{0}位',
+    maxTip: "字符数应小于{0}位",
 
-    apiSelectNotFound: '请等待数据加载完成...',
+    apiSelectNotFound: "请等待数据加载完成...",
   },
   icon: {
-    placeholder: '点击选择图标',
-    search: '搜索图标',
-    copy: '复制图标成功!',
+    placeholder: "点击选择图标",
+    search: "搜索图标",
+    copy: "复制图标成功!",
   },
   menu: {
-    search: '菜单搜索',
+    search: "菜单搜索",
   },
   modal: {
-    cancelText: '关闭',
-    okText: '确认',
-    close: '关闭',
-    maximize: '最大化',
-    restore: '还原',
+    cancelText: "关闭",
+    okText: "确认",
+    close: "关闭",
+    maximize: "最大化",
+    restore: "还原",
   },
   table: {
-    settingDens: '密度',
-    settingDensDefault: '默认',
-    settingDensMiddle: '中等',
-    settingDensSmall: '紧凑',
-    settingColumn: '列设置',
-    settingColumnShow: '列展示',
-    settingIndexColumnShow: '序号列',
-    settingSelectColumnShow: '勾选列',
-    settingFixedLeft: '固定到左侧',
-    settingFixedRight: '固定到右侧',
-    settingFullScreen: '全屏',
+    settingDens: "密度",
+    settingDensDefault: "默认",
+    settingDensMiddle: "中等",
+    settingDensSmall: "紧凑",
+    settingColumn: "列设置",
+    settingColumnShow: "列展示",
+    settingIndexColumnShow: "序号列",
+    settingSelectColumnShow: "勾选列",
+    settingFixedLeft: "固定到左侧",
+    settingFixedRight: "固定到右侧",
+    settingFullScreen: "全屏",
 
-    index: '序号',
+    index: "序号",
 
-    total: '共 {total} 条数据',
+    total: "共 {total} 条数据",
   },
   time: {
-    before: '前',
-    after: '后',
-    just: '刚刚',
-    seconds: '秒',
-    minutes: '分钟',
-    hours: '小时',
-    days: '天',
+    before: "前",
+    after: "后",
+    just: "刚刚",
+    seconds: "秒",
+    minutes: "分钟",
+    hours: "小时",
+    days: "天",
   },
   tree: {
-    selectAll: '选择全部',
-    unSelectAll: '取消选择',
-    expandAll: '展开全部',
-    unExpandAll: '折叠全部',
-    checkStrictly: '层级关联',
-    checkUnStrictly: '层级独立',
+    selectAll: "选择全部",
+    unSelectAll: "取消选择",
+    expandAll: "展开全部",
+    unExpandAll: "折叠全部",
+    checkStrictly: "层级关联",
+    checkUnStrictly: "层级独立",
   },
   upload: {
-    save: '保存',
-    upload: '上传',
-    imgUpload: '图片上传',
-    uploaded: '已上传',
+    save: "保存",
+    upload: "上传",
+    imgUpload: "图片上传",
+    uploaded: "已上传",
 
-    operating: '操作',
-    del: '删除',
-    download: '下载',
-    saveWarn: '请等待文件上传后,保存!',
-    saveError: '没有上传成功的文件,无法保存!',
+    operating: "操作",
+    del: "删除",
+    download: "下载",
+    saveWarn: "请等待文件上传后,保存!",
+    saveError: "没有上传成功的文件,无法保存!",
 
-    preview: '预览',
-    choose: '选择文件',
+    preview: "预览",
+    choose: "选择文件",
 
-    accept: '支持{0}格式',
-    acceptUpload: '只能上传{0}格式文件',
-    maxSize: '单个文件不超过{0}MB',
-    maxSizeMultiple: '只能上传不超过{0}MB的文件!',
-    maxNumber: '最多只能上传{0}个文件',
+    accept: "支持{0}格式",
+    acceptUpload: "只能上传{0}格式文件",
+    maxSize: "单个文件不超过{0}MB",
+    maxSizeMultiple: "只能上传不超过{0}MB的文件!",
+    maxNumber: "最多只能上传{0}个文件",
 
-    legend: '略缩图',
-    fileName: '文件名',
-    fileSize: '文件大小',
-    fileStatue: '状态',
+    legend: "略缩图",
+    fileName: "文件名",
+    fileSize: "文件大小",
+    fileStatue: "状态",
 
-    startUpload: '开始上传',
-    uploadSuccess: '上传成功',
-    uploadError: '上传失败',
-    uploading: '上传中',
-    uploadWait: '请等待文件上传结束后操作',
-    reUploadFailed: '重新上传失败文件',
+    startUpload: "开始上传",
+    uploadSuccess: "上传成功",
+    uploadError: "上传失败",
+    uploading: "上传中",
+    uploadWait: "请等待文件上传结束后操作",
+    reUploadFailed: "重新上传失败文件",
   },
   verify: {
-    error: '验证失败!',
-    time: '验证校验成功,耗时{time}秒!',
+    error: "验证失败!",
+    time: "验证校验成功,耗时{time}秒!",
 
-    redoTip: '点击图片可刷新',
+    redoTip: "点击图片可刷新",
 
-    dragText: '请按住滑块拖动',
-    successText: '验证通过',
+    dragText: "请按住滑块拖动",
+    successText: "验证通过",
   },
 };
diff --git a/src/locales/lang/zh-CN/layout.ts b/src/locales/lang/zh-CN/layout.ts
index ed1f85372378ba8082b3c2835070a4fda0ad02a6..c4c6ece9b913c5f0f20c8b5c476a814b83bc0c12 100644
--- a/src/locales/lang/zh-CN/layout.ts
+++ b/src/locales/lang/zh-CN/layout.ts
@@ -1,115 +1,115 @@
 export default {
-  footer: { onlinePreview: '在线预览', onlineDocument: '在线文档' },
+  footer: { onlinePreview: "在线预览", onlineDocument: "在线文档" },
   header: {
     // user dropdown
-    dropdownItemDoc: '文档',
-    dropdownItemLoginOut: '退出系统',
+    dropdownItemDoc: "文档",
+    dropdownItemLoginOut: "退出系统",
 
     // tooltip
-    tooltipErrorLog: '错误日志',
-    tooltipLock: '锁定屏幕',
-    tooltipNotify: '消息通知',
+    tooltipErrorLog: "错误日志",
+    tooltipLock: "锁定屏幕",
+    tooltipNotify: "消息通知",
 
-    tooltipEntryFull: '全屏',
-    tooltipExitFull: '退出全屏',
+    tooltipEntryFull: "全屏",
+    tooltipExitFull: "退出全屏",
 
     // lock
-    lockScreenPassword: '锁屏密码',
-    lockScreen: '锁定屏幕',
-    lockScreenBtn: '锁定',
+    lockScreenPassword: "锁屏密码",
+    lockScreen: "锁定屏幕",
+    lockScreenBtn: "锁定",
 
-    home: '首页',
+    home: "首页",
   },
   multipleTab: {
-    reload: '重新加载',
-    close: '关闭标签页',
-    closeLeft: '关闭左侧标签页',
-    closeRight: '关闭右侧标签页',
-    closeOther: '关闭其它标签页',
-    closeAll: '关闭全部标签页',
+    reload: "重新加载",
+    close: "关闭标签页",
+    closeLeft: "关闭左侧标签页",
+    closeRight: "关闭右侧标签页",
+    closeOther: "关闭其它标签页",
+    closeAll: "关闭全部标签页",
   },
   setting: {
     // content mode
-    contentModeFull: '流式',
-    contentModeFixed: '定宽',
+    contentModeFull: "流式",
+    contentModeFixed: "定宽",
     // topMenu align
-    topMenuAlignLeft: '居左',
-    topMenuAlignRight: '居中',
-    topMenuAlignCenter: '居右',
+    topMenuAlignLeft: "居左",
+    topMenuAlignRight: "居中",
+    topMenuAlignCenter: "居右",
     // menu trigger
-    menuTriggerNone: '不显示',
-    menuTriggerBottom: '底部',
-    menuTriggerTop: '顶部',
+    menuTriggerNone: "不显示",
+    menuTriggerBottom: "底部",
+    menuTriggerTop: "顶部",
     // menu type
-    menuTypeSidebar: '左侧菜单模式',
-    menuTypeMixSidebar: '左侧菜单混合模式',
-    menuTypeMix: '顶部菜单混合模式',
-    menuTypeTopMenu: '顶部菜单模式',
-
-    on: '开',
-    off: '关',
-    minute: '分钟',
-
-    operatingTitle: '操作成功',
-    operatingContent: '复制成功,请到 src/settings/projectSetting.ts 中修改配置!',
-    resetSuccess: '重置成功!',
-
-    copyBtn: '拷贝',
-    clearBtn: '清空缓存并返回登录页',
-
-    drawerTitle: '项目配置',
-
-    darkMode: '主题',
-    navMode: '导航栏模式',
-    interfaceFunction: '界面功能',
-    interfaceDisplay: '界面显示',
-    animation: '动画',
-    splitMenu: '分割菜单',
-    closeMixSidebarOnChange: '切换页面关闭菜单',
-
-    sysTheme: '系统主题',
-    headerTheme: '顶栏主题',
-    sidebarTheme: '菜单主题',
-
-    menuDrag: '侧边菜单拖拽',
-    menuSearch: '菜单搜索',
-    menuAccordion: '侧边菜单手风琴模式',
-    menuCollapse: '折叠菜单',
-    collapseMenuDisplayName: '折叠菜单显示名称',
-    topMenuLayout: '顶部菜单布局',
-    menuCollapseButton: '菜单折叠按钮',
-    contentMode: '内容区域宽度',
-    expandedMenuWidth: '菜单展开宽度',
-
-    breadcrumb: '面包屑',
-    breadcrumbIcon: '面包屑图标',
-    tabs: '标签页',
-    tabDetail: '标签详情页',
-    tabsQuickBtn: '标签页快捷按钮',
-    tabsRedoBtn: '标签页刷新按钮',
-    tabsFoldBtn: '标签页折叠按钮',
-    sidebar: '左侧菜单',
-    header: '顶栏',
-    footer: '页脚',
-    fullContent: '全屏内容',
-    grayMode: '灰色模式',
-    colorWeak: '色弱模式',
-
-    progress: '顶部进度条',
-    switchLoading: '切换loading',
-    switchAnimation: '切换动画',
-    animationType: '动画类型',
-
-    autoScreenLock: '自动锁屏',
-    notAutoScreenLock: '不自动锁屏',
-
-    fixedHeader: '固定header',
-    fixedSideBar: '固定Sidebar',
-
-    mixSidebarTrigger: '混合菜单触发方式',
-    triggerHover: '悬停',
-    triggerClick: '点击',
-
-    mixSidebarFixed: '固定展开菜单',
+    menuTypeSidebar: "左侧菜单模式",
+    menuTypeMixSidebar: "左侧菜单混合模式",
+    menuTypeMix: "顶部菜单混合模式",
+    menuTypeTopMenu: "顶部菜单模式",
+
+    on: "开",
+    off: "关",
+    minute: "分钟",
+
+    operatingTitle: "操作成功",
+    operatingContent: "复制成功,请到 src/settings/projectSetting.ts 中修改配置!",
+    resetSuccess: "重置成功!",
+
+    copyBtn: "拷贝",
+    clearBtn: "清空缓存并返回登录页",
+
+    drawerTitle: "项目配置",
+
+    darkMode: "主题",
+    navMode: "导航栏模式",
+    interfaceFunction: "界面功能",
+    interfaceDisplay: "界面显示",
+    animation: "动画",
+    splitMenu: "分割菜单",
+    closeMixSidebarOnChange: "切换页面关闭菜单",
+
+    sysTheme: "系统主题",
+    headerTheme: "顶栏主题",
+    sidebarTheme: "菜单主题",
+
+    menuDrag: "侧边菜单拖拽",
+    menuSearch: "菜单搜索",
+    menuAccordion: "侧边菜单手风琴模式",
+    menuCollapse: "折叠菜单",
+    collapseMenuDisplayName: "折叠菜单显示名称",
+    topMenuLayout: "顶部菜单布局",
+    menuCollapseButton: "菜单折叠按钮",
+    contentMode: "内容区域宽度",
+    expandedMenuWidth: "菜单展开宽度",
+
+    breadcrumb: "面包屑",
+    breadcrumbIcon: "面包屑图标",
+    tabs: "标签页",
+    tabDetail: "标签详情页",
+    tabsQuickBtn: "标签页快捷按钮",
+    tabsRedoBtn: "标签页刷新按钮",
+    tabsFoldBtn: "标签页折叠按钮",
+    sidebar: "左侧菜单",
+    header: "顶栏",
+    footer: "页脚",
+    fullContent: "全屏内容",
+    grayMode: "灰色模式",
+    colorWeak: "色弱模式",
+
+    progress: "顶部进度条",
+    switchLoading: "切换loading",
+    switchAnimation: "切换动画",
+    animationType: "动画类型",
+
+    autoScreenLock: "自动锁屏",
+    notAutoScreenLock: "不自动锁屏",
+
+    fixedHeader: "固定header",
+    fixedSideBar: "固定Sidebar",
+
+    mixSidebarTrigger: "混合菜单触发方式",
+    triggerHover: "悬停",
+    triggerClick: "点击",
+
+    mixSidebarFixed: "固定展开菜单",
   },
 };
diff --git a/src/locales/lang/zh-CN/routes/basic.ts b/src/locales/lang/zh-CN/routes/basic.ts
index 3d03e8ef1f0edd9d278d8cc27cfd7fab33a3d93a..e92d1af0c6deee6942da10e10d0bee7ce1cdd2d4 100644
--- a/src/locales/lang/zh-CN/routes/basic.ts
+++ b/src/locales/lang/zh-CN/routes/basic.ts
@@ -1,4 +1,4 @@
 export default {
-  login: '登录',
-  errorLogList: '错误日志列表',
+  login: "登录",
+  errorLogList: "错误日志列表",
 };
diff --git a/src/locales/lang/zh-CN/routes/dashboard.ts b/src/locales/lang/zh-CN/routes/dashboard.ts
index 04b1b1978ee21a62cbab2347754259710a1456c4..aa52d22d16749ce6c38c1cf8f69a7426aeb04528 100644
--- a/src/locales/lang/zh-CN/routes/dashboard.ts
+++ b/src/locales/lang/zh-CN/routes/dashboard.ts
@@ -1,6 +1,6 @@
 export default {
-  dashboard: 'Dashboard',
-  about: '关于',
-  workbench: '工作台',
-  analysis: '分析页',
+  dashboard: "Dashboard",
+  about: "关于",
+  workbench: "工作台",
+  analysis: "分析页",
 };
diff --git a/src/locales/lang/zh-CN/routes/demo.ts b/src/locales/lang/zh-CN/routes/demo.ts
index 0c07976ba56cb2fd78c96ecb8571477fac7d0aa2..19f6d0141807d22166d2d781ed63e5a90014b3cc 100644
--- a/src/locales/lang/zh-CN/routes/demo.ts
+++ b/src/locales/lang/zh-CN/routes/demo.ts
@@ -1,190 +1,193 @@
 export default {
   charts: {
-    baiduMap: '百度地图',
-    aMap: '高德地图',
-    googleMap: '谷歌地图',
-    charts: '图表',
-    map: '地图',
-    line: '折线图',
-    pie: '饼图',
+    baiduMap: "百度地图",
+    aMap: "高德地图",
+    googleMap: "谷歌地图",
+    charts: "图表",
+    map: "地图",
+    line: "折线图",
+    pie: "饼图",
   },
   comp: {
-    comp: '组件',
-    basic: '基础组件',
-    transition: '动画组件',
-    countTo: '数字动画',
-
-    scroll: '滚动组件',
-    scrollBasic: '基础滚动',
-    scrollAction: '滚动函数',
-    virtualScroll: '虚拟滚动',
-
-    tree: 'Tree',
-    treeBasic: '基础树',
-    editTree: '可搜索/工具栏',
-    actionTree: '函数操作示例',
-
-    modal: '弹窗扩展',
-    drawer: '抽屉扩展',
-    desc: '详情组件',
-
-    lazy: '懒加载组件',
-    lazyBasic: '基础示例',
-    lazyTransition: '动画效果',
-
-    verify: '验证组件',
-    verifyDrag: '拖拽校验',
-    verifyRotate: '图片还原',
-
-    qrcode: '二维码组件',
-    strength: '密码强度组件',
-    upload: '上传组件',
-
-    loading: 'Loading',
-
-    time: '相对时间',
-    cropperImage: '图片裁剪',
-    cardList: '卡片列表',
+    comp: "组件",
+    basic: "基础组件",
+    transition: "动画组件",
+    countTo: "数字动画",
+
+    scroll: "滚动组件",
+    scrollBasic: "基础滚动",
+    scrollAction: "滚动函数",
+    virtualScroll: "虚拟滚动",
+
+    tree: "Tree",
+    treeBasic: "基础树",
+    editTree: "可搜索/工具栏",
+    actionTree: "函数操作示例",
+
+    modal: "弹窗扩展",
+    drawer: "抽屉扩展",
+    desc: "详情组件",
+
+    lazy: "懒加载组件",
+    lazyBasic: "基础示例",
+    lazyTransition: "动画效果",
+
+    verify: "验证组件",
+    verifyDrag: "拖拽校验",
+    verifyRotate: "图片还原",
+
+    qrcode: "二维码组件",
+    strength: "密码强度组件",
+    upload: "上传组件",
+
+    loading: "Loading",
+
+    time: "相对时间",
+    cropperImage: "图片裁剪",
+    cardList: "卡片列表",
   },
   editor: {
-    editor: '编辑器',
-    jsonEditor: 'Json编辑器',
-    markdown: 'markdown编辑器',
+    editor: "编辑器",
+    jsonEditor: "Json编辑器",
+    markdown: "markdown编辑器",
 
-    tinymce: '富文本',
-    tinymceBasic: '基础使用',
-    tinymceForm: '嵌入form',
+    tinymce: "富文本",
+    tinymceBasic: "基础使用",
+    tinymceForm: "嵌入form",
   },
   excel: {
-    excel: 'Excel',
-    customExport: '选择导出格式',
-    jsonExport: 'JSON数据导出',
-    arrayExport: 'Array数据导出',
-    importExcel: '导入',
+    excel: "Excel",
+    customExport: "选择导出格式",
+    jsonExport: "JSON数据导出",
+    arrayExport: "Array数据导出",
+    importExcel: "导入",
   },
   feat: {
-    feat: '功能',
-    icon: '图标',
-    sessionTimeout: '登录过期',
-    tabs: '标签页操作',
-    tabDetail: '标签详情页',
-    print: '打印',
-    contextMenu: '右键菜单',
-    download: '文件下载',
-    clickOutSide: 'ClickOutSide组件',
-    imgPreview: '图片预览',
-    copy: '剪切板',
-    msg: '消息提示',
-    watermark: '水印',
-    ripple: '水波纹',
-    fullScreen: '全屏',
-    errorLog: '错误日志',
-    tab: 'Tab带参',
-    tab1: 'Tab带参1',
-    tab2: 'Tab带参2',
-    menu: 'Menu带参',
-    menu1: 'Menu带参1',
-    menu2: 'Menu带参2',
-    ws: 'websocket测试',
-    breadcrumb: '面包屑导航',
-    breadcrumbFlat: '平级模式',
-    breadcrumbFlatDetail: '平级详情',
-    breadcrumbChildren: '层级模式',
-    breadcrumbChildrenDetail: '层级详情',
+    feat: "功能",
+    icon: "图标",
+    sessionTimeout: "登录过期",
+    tabs: "标签页操作",
+    tabDetail: "标签详情页",
+    print: "打印",
+    contextMenu: "右键菜单",
+    download: "文件下载",
+    clickOutSide: "ClickOutSide组件",
+    imgPreview: "图片预览",
+    copy: "剪切板",
+    msg: "消息提示",
+    watermark: "水印",
+    ripple: "水波纹",
+    fullScreen: "全屏",
+    errorLog: "错误日志",
+    tab: "Tab带参",
+    tab1: "Tab带参1",
+    tab2: "Tab带参2",
+    menu: "Menu带参",
+    menu1: "Menu带参1",
+    menu2: "Menu带参2",
+    ws: "websocket测试",
+    breadcrumb: "面包屑导航",
+    breadcrumbFlat: "平级模式",
+    requestDemo: "测试请求重试",
+    breadcrumbFlatDetail: "平级详情",
+    breadcrumbChildren: "层级模式",
+    breadcrumbChildrenDetail: "层级详情",
   },
   flow: {
-    name: '图形编辑器',
-    flowChart: '流程图',
+    name: "图形编辑器",
+    flowChart: "流程图",
   },
   form: {
-    form: 'Form',
-    basic: '基础表单',
-    useForm: 'useForm',
-    refForm: 'RefForm',
-    advancedForm: '可收缩表单',
-    ruleForm: '表单验证',
-    dynamicForm: '动态表单',
-    customerForm: '自定义组件',
-    appendForm: '表单增删示例',
+    form: "Form",
+    basic: "基础表单",
+    useForm: "useForm",
+    refForm: "RefForm",
+    advancedForm: "可收缩表单",
+    ruleForm: "表单验证",
+    dynamicForm: "动态表单",
+    customerForm: "自定义组件",
+    appendForm: "表单增删示例",
+    tabsForm: "标签页+多级field",
   },
   iframe: {
-    frame: '外部页面',
-    antv: 'antVue文档(内嵌)',
-    doc: '项目文档(内嵌)',
-    docExternal: '项目文档(外链)',
+    frame: "外部页面",
+    antv: "antVue文档(内嵌)",
+    doc: "项目文档(内嵌)",
+    docExternal: "项目文档(外链)",
   },
-  level: { level: '多级菜单' },
+  level: { level: "多级菜单" },
   page: {
-    page: '页面',
+    page: "页面",
 
-    form: '表单页',
-    formBasic: '基础表单',
-    formStep: '分步表单',
-    formHigh: '高级表单',
+    form: "表单页",
+    formBasic: "基础表单",
+    formStep: "分步表单",
+    formHigh: "高级表单",
 
-    desc: '详情页',
-    descBasic: '基础详情页',
-    descHigh: '高级详情页',
+    desc: "详情页",
+    descBasic: "基础详情页",
+    descHigh: "高级详情页",
 
-    result: '结果页',
-    resultSuccess: '成功页',
-    resultFail: '失败页',
+    result: "结果页",
+    resultSuccess: "成功页",
+    resultFail: "失败页",
 
-    account: '个人页',
-    accountCenter: '个人中心',
-    accountSetting: '个人设置',
+    account: "个人页",
+    accountCenter: "个人中心",
+    accountSetting: "个人设置",
 
-    exception: '异常页',
-    netWorkError: '网络错误',
-    notData: '无数据',
+    exception: "异常页",
+    netWorkError: "网络错误",
+    notData: "无数据",
 
-    list: '列表页',
-    listCard: '卡片列表',
-    listBasic: '标准列表',
-    listSearch: '搜索列表',
+    list: "列表页",
+    listCard: "卡片列表",
+    listBasic: "标准列表",
+    listSearch: "搜索列表",
   },
   permission: {
-    permission: '权限管理',
+    permission: "权限管理",
 
-    front: '基于前端权限',
-    frontPage: '页面权限',
-    frontBtn: '按钮权限',
-    frontTestA: '权限测试页A',
-    frontTestB: '权限测试页B',
+    front: "基于前端权限",
+    frontPage: "页面权限",
+    frontBtn: "按钮权限",
+    frontTestA: "权限测试页A",
+    frontTestB: "权限测试页B",
 
-    back: '基于后台权限',
-    backPage: '页面权限',
-    backBtn: '按钮权限',
+    back: "基于后台权限",
+    backPage: "页面权限",
+    backBtn: "按钮权限",
   },
   setup: {
-    page: '引导页',
+    page: "引导页",
   },
   system: {
-    moduleName: '系统管理',
-    account: '账号管理',
-    account_detail: '账号详情',
-    password: '修改密码',
-    dept: '部门管理',
-    menu: '菜单管理',
-    role: '角色管理',
+    moduleName: "系统管理",
+    account: "账号管理",
+    account_detail: "账号详情",
+    password: "修改密码",
+    dept: "部门管理",
+    menu: "菜单管理",
+    role: "角色管理",
   },
   table: {
-    table: 'Table',
-    basic: '基础表格',
-    treeTable: '树形表格',
-    fetchTable: '远程加载示例',
-    fixedColumn: '固定列',
-    customerCell: '自定义列',
-    formTable: '开启搜索区域',
-    useTable: 'UseTable',
-    refTable: 'RefTable',
-    multipleHeader: '多级表头',
-    mergeHeader: '合并单元格',
-    expandTable: '可展开表格',
-    fixedHeight: '定高/头部自定义',
-    footerTable: '表尾行合计',
-    editCellTable: '可编辑单元格',
-    editRowTable: '可编辑行',
-    authColumn: '权限列',
+    table: "Table",
+    basic: "基础表格",
+    treeTable: "树形表格",
+    fetchTable: "远程加载示例",
+    fixedColumn: "固定列",
+    customerCell: "自定义列",
+    formTable: "开启搜索区域",
+    useTable: "UseTable",
+    refTable: "RefTable",
+    multipleHeader: "多级表头",
+    mergeHeader: "合并单元格",
+    expandTable: "可展开表格",
+    fixedHeight: "定高/头部自定义",
+    footerTable: "表尾行合计",
+    editCellTable: "可编辑单元格",
+    editRowTable: "可编辑行",
+    authColumn: "权限列",
+    resizeParentHeightTable: "继承父元素高度",
   },
 };
diff --git a/src/locales/lang/zh-CN/routes/model.ts b/src/locales/lang/zh-CN/routes/model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a410ff2b0ba311b57375c01b58c37e776c585f4b
--- /dev/null
+++ b/src/locales/lang/zh-CN/routes/model.ts
@@ -0,0 +1,3 @@
+export default {
+  model: "模型",
+};
diff --git a/src/locales/lang/zh-CN/routes/practice.ts b/src/locales/lang/zh-CN/routes/practice.ts
new file mode 100644
index 0000000000000000000000000000000000000000..fec22e1e1559a606183a5f65853bec08d34b668a
--- /dev/null
+++ b/src/locales/lang/zh-CN/routes/practice.ts
@@ -0,0 +1,4 @@
+export default {
+  about: "实习",
+  record: "实习记录",
+};
diff --git a/src/locales/lang/zh-CN/sys.ts b/src/locales/lang/zh-CN/sys.ts
index 8dad1cf42f5f6ddce741b24b731bf9aed85c65c7..1090ed7a404e4ae3c9c80b2ead5b9ca09734a742 100644
--- a/src/locales/lang/zh-CN/sys.ts
+++ b/src/locales/lang/zh-CN/sys.ts
@@ -1,98 +1,98 @@
 export default {
   api: {
-    operationFailed: '操作失败',
-    errorTip: '错误提示',
-    errorMessage: '操作失败,系统异常!',
-    timeoutMessage: '登录超时,请重新登录!',
-    apiTimeoutMessage: '接口请求超时,请刷新页面重试!',
-    apiRequestFailed: '请求出错,请稍候重试',
-    networkException: '网络异常',
-    networkExceptionMsg: '网络异常,请检查您的网络连接是否正常!',
+    operationFailed: "操作失败",
+    errorTip: "错误提示",
+    errorMessage: "操作失败,系统异常!",
+    timeoutMessage: "登录超时,请重新登录!",
+    apiTimeoutMessage: "接口请求超时,请刷新页面重试!",
+    apiRequestFailed: "请求出错,请稍候重试",
+    networkException: "网络异常",
+    networkExceptionMsg: "网络异常,请检查您的网络连接是否正常!",
 
-    errMsg401: '用户没有权限(令牌、用户名、密码错误)!',
-    errMsg403: '用户得到授权,但是访问是被禁止的。!',
-    errMsg404: '网络请求错误,未找到该资源!',
-    errMsg405: '网络请求错误,请求方法未允许!',
-    errMsg408: '网络请求超时!',
-    errMsg500: '服务器错误,请联系管理员!',
-    errMsg501: '网络未实现!',
-    errMsg502: '网络错误!',
-    errMsg503: '服务不可用,服务器暂时过载或维护!',
-    errMsg504: '网络超时!',
-    errMsg505: 'http版本不支持该请求!',
+    errMsg401: "用户没有权限(令牌、用户名、密码错误)!",
+    errMsg403: "用户得到授权,但是访问是被禁止的。!",
+    errMsg404: "网络请求错误,未找到该资源!",
+    errMsg405: "网络请求错误,请求方法未允许!",
+    errMsg408: "网络请求超时!",
+    errMsg500: "服务器错误,请联系管理员!",
+    errMsg501: "网络未实现!",
+    errMsg502: "网络错误!",
+    errMsg503: "服务不可用,服务器暂时过载或维护!",
+    errMsg504: "网络超时!",
+    errMsg505: "http版本不支持该请求!",
   },
-  app: { logoutTip: '温馨提醒', logoutMessage: '是否确认退出系统?', menuLoading: '菜单加载中...' },
+  app: { logoutTip: "温馨提醒", logoutMessage: "是否确认退出系统?", menuLoading: "菜单加载中..." },
   errorLog: {
-    tableTitle: '错误日志列表',
-    tableColumnType: '类型',
-    tableColumnDate: '时间',
-    tableColumnFile: '文件',
-    tableColumnMsg: '错误信息',
-    tableColumnStackMsg: 'stack信息',
+    tableTitle: "错误日志列表",
+    tableColumnType: "类型",
+    tableColumnDate: "时间",
+    tableColumnFile: "文件",
+    tableColumnMsg: "错误信息",
+    tableColumnStackMsg: "stack信息",
 
-    tableActionDesc: '详情',
+    tableActionDesc: "详情",
 
-    modalTitle: '错误详情',
+    modalTitle: "错误详情",
 
-    fireVueError: '点击触发vue错误',
-    fireResourceError: '点击触发资源加载错误',
-    fireAjaxError: '点击触发ajax错误',
+    fireVueError: "点击触发vue错误",
+    fireResourceError: "点击触发资源加载错误",
+    fireAjaxError: "点击触发ajax错误",
 
-    enableMessage: '只在`/src/settings/projectSetting.ts` 内的useErrorHandle=true时生效.',
+    enableMessage: "只在`/src/settings/projectSetting.ts` 内的useErrorHandle=true时生效.",
   },
   exception: {
-    backLogin: '返回登录',
-    backHome: '返回首页',
-    subTitle403: '抱歉,您无权访问此页面。',
-    subTitle404: '抱歉,您访问的页面不存在。',
-    subTitle500: '抱歉,服务器报告错误。',
-    noDataTitle: '当前页无数据',
-    networkErrorTitle: '网络错误',
-    networkErrorSubTitle: '抱歉,您的网络连接已断开,请检查您的网络!',
+    backLogin: "返回登录",
+    backHome: "返回首页",
+    subTitle403: "抱歉,您无权访问此页面。",
+    subTitle404: "抱歉,您访问的页面不存在。",
+    subTitle500: "抱歉,服务器报告错误。",
+    noDataTitle: "当前页无数据",
+    networkErrorTitle: "网络错误",
+    networkErrorSubTitle: "抱歉,您的网络连接已断开,请检查您的网络!",
   },
   lock: {
-    unlock: '点击解锁',
-    alert: '锁屏密码错误',
-    backToLogin: '返回登录',
-    entry: '进入系统',
-    placeholder: '请输入锁屏密码或者用户密码',
+    unlock: "点击解锁",
+    alert: "锁屏密码错误",
+    backToLogin: "返回登录",
+    entry: "进入系统",
+    placeholder: "请输入锁屏密码或者用户密码",
   },
   login: {
-    backSignIn: '返回',
-    signInFormTitle: '登录',
-    mobileSignInFormTitle: '手机登录',
-    qrSignInFormTitle: '二维码登录',
-    signUpFormTitle: '注册',
-    forgetFormTitle: '重置密码',
+    backSignIn: "返回",
+    signInFormTitle: "登录",
+    mobileSignInFormTitle: "手机登录",
+    qrSignInFormTitle: "二维码登录",
+    signUpFormTitle: "注册",
+    forgetFormTitle: "重置密码",
 
-    signInTitle: '开箱即用的中后台管理系统',
-    signInDesc: '输入您的个人详细信息开始使用!',
-    policy: '我同意xxx隐私政策',
+    signInTitle: "开箱即用的中后台管理系统",
+    signInDesc: "输入您的个人详细信息开始使用!",
+    policy: "我同意xxx隐私政策",
     scanSign: `扫码后点击"确认",即可完成登录`,
 
-    loginButton: '登录',
-    registerButton: '注册',
-    rememberMe: '记住我',
-    forgetPassword: '忘记密码?',
-    otherSignIn: '其他登录方式',
+    loginButton: "登录",
+    registerButton: "注册",
+    rememberMe: "记住我",
+    forgetPassword: "忘记密码?",
+    otherSignIn: "其他登录方式",
 
     // notify
-    loginSuccessTitle: '登录成功',
-    loginSuccessDesc: '欢迎回来',
+    loginSuccessTitle: "登录成功",
+    loginSuccessDesc: "欢迎回来",
 
     // placeholder
-    accountPlaceholder: '请输入账号',
-    passwordPlaceholder: '请输入密码',
-    smsPlaceholder: '请输入验证码',
-    mobilePlaceholder: '请输入手机号码',
-    policyPlaceholder: '勾选后才能注册',
-    diffPwd: '两次输入密码不一致',
+    accountPlaceholder: "请输入账号",
+    passwordPlaceholder: "请输入密码",
+    smsPlaceholder: "请输入验证码",
+    mobilePlaceholder: "请输入手机号码",
+    policyPlaceholder: "勾选后才能注册",
+    diffPwd: "两次输入密码不一致",
 
-    userName: '账号',
-    password: '密码',
-    confirmPassword: '确认密码',
-    email: '邮箱',
-    smsCode: '短信验证码',
-    mobile: '手机号码',
+    userName: "账号",
+    password: "密码",
+    confirmPassword: "确认密码",
+    email: "邮箱",
+    smsCode: "短信验证码",
+    mobile: "手机号码",
   },
 };
diff --git a/src/locales/lang/zh_CN.ts b/src/locales/lang/zh_CN.ts
index 1cb1565c083d3df1f92cc849875399d0a7391c7a..9050bace47fb919b574376d65ddbbaa3f441b17e 100644
--- a/src/locales/lang/zh_CN.ts
+++ b/src/locales/lang/zh_CN.ts
@@ -1,13 +1,10 @@
-import { genMessage } from '../helper';
-import antdLocale from 'ant-design-vue/es/locale/zh_CN';
-import momentLocale from 'moment/dist/locale/zh-cn';
+import { genMessage } from "../helper";
+import antdLocale from "ant-design-vue/es/locale/zh_CN";
 
-const modules = import.meta.globEager('./zh-CN/**/*.ts');
+const modules = import.meta.globEager("./zh-CN/**/*.ts");
 export default {
   message: {
-    ...genMessage(modules, 'zh-CN'),
+    ...genMessage(modules, "zh-CN"),
     antdLocale,
   },
-  momentLocale,
-  momentLocaleName: 'zh-cn',
 };
diff --git a/src/locales/setupI18n.ts b/src/locales/setupI18n.ts
index 405fb0c28f0413931df769957be71f5c08008270..e776fe85551ad67261f5a46d680dad4954d08328 100644
--- a/src/locales/setupI18n.ts
+++ b/src/locales/setupI18n.ts
@@ -1,10 +1,10 @@
-import type { App } from 'vue';
-import type { I18n, I18nOptions } from 'vue-i18n';
+import type { App } from "vue";
+import type { I18n, I18nOptions } from "vue-i18n";
 
-import { createI18n } from 'vue-i18n';
-import { setHtmlPageLang, setLoadLocalePool } from './helper';
-import { localeSetting } from '/@/settings/localeSetting';
-import { useLocaleStoreWithOut } from '/@/store/modules/locale';
+import { createI18n } from "vue-i18n";
+import { setHtmlPageLang, setLoadLocalePool } from "./helper";
+import { localeSetting } from "/@/settings/localeSetting";
+import { useLocaleStoreWithOut } from "/@/store/modules/locale";
 
 const { fallback, availableLocales } = localeSetting;
 
diff --git a/src/locales/useLocale.ts b/src/locales/useLocale.ts
index 19fff0768ac26fddcf7d25aadcb3a6bb755d9605..c29aec57767cfc4faa15041b129913b7c5c0a11c 100644
--- a/src/locales/useLocale.ts
+++ b/src/locales/useLocale.ts
@@ -1,25 +1,23 @@
 /**
  * Multi-language related operations
  */
-import type { LocaleType } from '/#/config';
+import type { LocaleType } from "/#/config";
 
-import moment from 'moment';
-
-import { i18n } from './setupI18n';
-import { useLocaleStoreWithOut } from '/@/store/modules/locale';
-import { unref, computed } from 'vue';
-import { loadLocalePool, setHtmlPageLang } from './helper';
+import { i18n } from "./setupI18n";
+import { useLocaleStoreWithOut } from "/@/store/modules/locale";
+import { unref, computed } from "vue";
+import { loadLocalePool, setHtmlPageLang } from "./helper";
 
 interface LangModule {
   message: Recordable;
-  momentLocale: Recordable;
-  momentLocaleName: string;
+  dateLocale: Recordable;
+  dateLocaleName: string;
 }
 
 function setI18nLanguage(locale: LocaleType) {
   const localeStore = useLocaleStoreWithOut();
 
-  if (i18n.mode === 'legacy') {
+  if (i18n.mode === "legacy") {
     i18n.global.locale = locale;
   } else {
     (i18n.global.locale as any).value = locale;
@@ -53,10 +51,9 @@ export function useLocale() {
     const langModule = ((await import(`./lang/${locale}.ts`)) as any).default as LangModule;
     if (!langModule) return;
 
-    const { message, momentLocale, momentLocaleName } = langModule;
+    const { message } = langModule;
 
     globalI18n.setLocaleMessage(locale, message);
-    moment.updateLocale(momentLocaleName, momentLocale);
     loadLocalePool.push(locale);
 
     setI18nLanguage(locale);
diff --git a/src/logics/error-handle/index.ts b/src/logics/error-handle/index.ts
index e04c0098092d2db3c93ee564686f30a37bf85a55..7df77237c27b4c764dea7282f887382201702187 100644
--- a/src/logics/error-handle/index.ts
+++ b/src/logics/error-handle/index.ts
@@ -2,13 +2,13 @@
  * Used to configure the global error handling function, which can monitor vue errors, script errors, static resource errors and Promise errors
  */
 
-import type { ErrorLogInfo } from '/#/store';
+import type { ErrorLogInfo } from "/#/store";
 
-import { useErrorLogStoreWithOut } from '/@/store/modules/errorLog';
+import { useErrorLogStoreWithOut } from "/@/store/modules/errorLog";
 
-import { ErrorTypeEnum } from '/@/enums/exceptionEnum';
-import { App } from 'vue';
-import projectSetting from '/@/settings/projectSetting';
+import { ErrorTypeEnum } from "/@/enums/exceptionEnum";
+import { App } from "vue";
+import projectSetting from "/@/settings/projectSetting";
 
 /**
  * Handling error stack information
@@ -16,19 +16,19 @@ import projectSetting from '/@/settings/projectSetting';
  */
 function processStackMsg(error: Error) {
   if (!error.stack) {
-    return '';
+    return "";
   }
   let stack = error.stack
-    .replace(/\n/gi, '') // Remove line breaks to save the size of the transmitted content
-    .replace(/\bat\b/gi, '@') // At in chrome, @ in ff
-    .split('@') // Split information with @
+    .replace(/\n/gi, "") // Remove line breaks to save the size of the transmitted content
+    .replace(/\bat\b/gi, "@") // At in chrome, @ in ff
+    .split("@") // Split information with @
     .slice(0, 9) // The maximum stack length (Error.stackTraceLimit = 10), so only take the first 10
-    .map((v) => v.replace(/^\s*|\s*$/g, '')) // Remove extra spaces
-    .join('~') // Manually add separators for later display
-    .replace(/\?[^:]+/gi, ''); // Remove redundant parameters of js file links (?x=1 and the like)
+    .map((v) => v.replace(/^\s*|\s*$/g, "")) // Remove extra spaces
+    .join("~") // Manually add separators for later display
+    .replace(/\?[^:]+/gi, ""); // Remove redundant parameters of js file links (?x=1 and the like)
   const msg = error.toString();
   if (stack.indexOf(msg) < 0) {
-    stack = msg + '@' + stack;
+    stack = msg + "@" + stack;
   }
   return stack;
 }
@@ -40,16 +40,16 @@ function processStackMsg(error: Error) {
 function formatComponentName(vm: any) {
   if (vm.$root === vm) {
     return {
-      name: 'root',
-      path: 'root',
+      name: "root",
+      path: "root",
     };
   }
 
   const options = vm.$options as any;
   if (!options) {
     return {
-      name: 'anonymous',
-      path: 'anonymous',
+      name: "anonymous",
+      path: "anonymous",
     };
   }
   const name = options.name || options._componentTag;
@@ -87,7 +87,7 @@ export function scriptErrorHandler(
   colno?: number,
   error?: Error,
 ) {
-  if (event === 'Script error.' && !source) {
+  if (event === "Script error." && !source) {
     return false;
   }
   const errorInfo: Partial<ErrorLogInfo> = {};
@@ -96,17 +96,17 @@ export function scriptErrorHandler(
   if (error?.stack) {
     errorInfo.stack = error.stack;
   } else {
-    errorInfo.stack = '';
+    errorInfo.stack = "";
   }
-  const name = source ? source.substr(source.lastIndexOf('/') + 1) : 'script';
+  const name = source ? source.substr(source.lastIndexOf("/") + 1) : "script";
   const errorLogStore = useErrorLogStoreWithOut();
   errorLogStore.addErrorLogInfo({
     type: ErrorTypeEnum.SCRIPT,
     name: name,
     file: source as string,
-    detail: 'lineno' + lineno,
+    detail: "lineno" + lineno,
     url: window.location.href,
-    ...(errorInfo as Pick<ErrorLogInfo, 'message' | 'stack'>),
+    ...(errorInfo as Pick<ErrorLogInfo, "message" | "stack">),
   });
   return true;
 }
@@ -116,16 +116,16 @@ export function scriptErrorHandler(
  */
 function registerPromiseErrorHandler() {
   window.addEventListener(
-    'unhandledrejection',
+    "unhandledrejection",
     function (event) {
       const errorLogStore = useErrorLogStoreWithOut();
       errorLogStore.addErrorLogInfo({
         type: ErrorTypeEnum.PROMISE,
-        name: 'Promise Error!',
-        file: 'none',
-        detail: 'promise error!',
+        name: "Promise Error!",
+        file: "none",
+        detail: "promise error!",
         url: window.location.href,
-        stack: 'promise error!',
+        stack: "promise error!",
         message: event.reason,
       });
     },
@@ -139,13 +139,13 @@ function registerPromiseErrorHandler() {
 function registerResourceErrorHandler() {
   // Monitoring resource loading error(img,script,css,and jsonp)
   window.addEventListener(
-    'error',
+    "error",
     function (e: Event) {
       const target = e.target ? e.target : (e.srcElement as any);
       const errorLogStore = useErrorLogStoreWithOut();
       errorLogStore.addErrorLogInfo({
         type: ErrorTypeEnum.RESOURCE,
-        name: 'Resource Error!',
+        name: "Resource Error!",
         file: (e.target || ({} as any)).currentSrc,
         detail: JSON.stringify({
           tagName: target.localName,
@@ -153,8 +153,8 @@ function registerResourceErrorHandler() {
           type: e.type,
         }),
         url: window.location.href,
-        stack: 'resource is not found',
-        message: (e.target || ({} as any)).localName + ' is load error',
+        stack: "resource is not found",
+        message: (e.target || ({} as any)).localName + " is load error",
       });
     },
     true,
diff --git a/src/logics/initAppConfig.ts b/src/logics/initAppConfig.ts
index a1864506651ada8021452a7049ee4b5b1d547653..4c5d6751d4f15f9229b69861b1f477c61fefe9d6 100644
--- a/src/logics/initAppConfig.ts
+++ b/src/logics/initAppConfig.ts
@@ -1,26 +1,26 @@
 /**
  * Application configuration
  */
-import type { ProjectConfig } from '/#/config';
+import type { ProjectConfig } from "/#/config";
 
-import { PROJ_CFG_KEY } from '/@/enums/cacheEnum';
-import projectSetting from '/@/settings/projectSetting';
+import { PROJ_CFG_KEY } from "/@/enums/cacheEnum";
+import projectSetting from "/@/settings/projectSetting";
 
-import { updateHeaderBgColor, updateSidebarBgColor } from '/@/logics/theme/updateBackground';
-import { updateColorWeak } from '/@/logics/theme/updateColorWeak';
-import { updateGrayMode } from '/@/logics/theme/updateGrayMode';
-import { updateDarkTheme } from '/@/logics/theme/dark';
-import { changeTheme } from '/@/logics/theme';
+import { updateHeaderBgColor, updateSidebarBgColor } from "/@/logics/theme/updateBackground";
+import { updateColorWeak } from "/@/logics/theme/updateColorWeak";
+import { updateGrayMode } from "/@/logics/theme/updateGrayMode";
+import { updateDarkTheme } from "/@/logics/theme/dark";
+import { changeTheme } from "/@/logics/theme";
 
-import { useAppStore } from '/@/store/modules/app';
-import { useLocaleStore } from '/@/store/modules/locale';
+import { useAppStore } from "/@/store/modules/app";
+import { useLocaleStore } from "/@/store/modules/locale";
 
-import { getCommonStoragePrefix, getStorageShortName } from '/@/utils/env';
+import { getCommonStoragePrefix, getStorageShortName } from "/@/utils/env";
 
-import { primaryColor } from '../../build/config/themeConfig';
-import { Persistent } from '/@/utils/cache/persistent';
-import { deepMerge } from '/@/utils';
-import { ThemeEnum } from '/@/enums/appEnum';
+import { primaryColor } from "../../build/config/themeConfig";
+import { Persistent } from "/@/utils/cache/persistent";
+import { deepMerge } from "/@/utils";
+import { ThemeEnum } from "/@/enums/appEnum";
 
 // Initial project configuration
 export function initAppConfigStore() {
diff --git a/src/logics/mitt/routeChange.ts b/src/logics/mitt/routeChange.ts
index 864828e29c86826954a36596472a26d2cf1b4f5e..91a18f1344ad29217f6df4cdadf0c3678a489480 100644
--- a/src/logics/mitt/routeChange.ts
+++ b/src/logics/mitt/routeChange.ts
@@ -2,9 +2,9 @@
  * Used to monitor routing changes to change the status of menus and tabs. There is no need to monitor the route, because the route status change is affected by the page rendering time, which will be slow
  */
 
-import mitt from '/@/utils/mitt';
-import type { RouteLocationNormalized } from 'vue-router';
-import { getRawRoute } from '/@/utils';
+import mitt from "/@/utils/mitt";
+import type { RouteLocationNormalized } from "vue-router";
+import { getRawRoute } from "/@/utils";
 
 const emitter = mitt();
 
diff --git a/src/logics/theme/dark.ts b/src/logics/theme/dark.ts
index 7069826b85bce0f96b288fb636c4b2fa94edb8e3..9aaf684dcda1af2cbc390f357049392e1949947c 100644
--- a/src/logics/theme/dark.ts
+++ b/src/logics/theme/dark.ts
@@ -1,24 +1,24 @@
-import { darkCssIsReady, loadDarkThemeCss } from 'vite-plugin-theme/es/client';
-import { addClass, hasClass, removeClass } from '/@/utils/domUtils';
+import { darkCssIsReady, loadDarkThemeCss } from "vite-plugin-theme/es/client";
+import { addClass, hasClass, removeClass } from "/@/utils/domUtils";
 
-export async function updateDarkTheme(mode: string | null = 'light') {
-  const htmlRoot = document.getElementById('htmlRoot');
+export async function updateDarkTheme(mode: string | null = "light") {
+  const htmlRoot = document.getElementById("htmlRoot");
   if (!htmlRoot) {
     return;
   }
-  const hasDarkClass = hasClass(htmlRoot, 'dark');
-  if (mode === 'dark') {
+  const hasDarkClass = hasClass(htmlRoot, "dark");
+  if (mode === "dark") {
     if (import.meta.env.PROD && !darkCssIsReady) {
       await loadDarkThemeCss();
     }
-    htmlRoot.setAttribute('data-theme', 'dark');
+    htmlRoot.setAttribute("data-theme", "dark");
     if (!hasDarkClass) {
-      addClass(htmlRoot, 'dark');
+      addClass(htmlRoot, "dark");
     }
   } else {
-    htmlRoot.setAttribute('data-theme', 'light');
+    htmlRoot.setAttribute("data-theme", "light");
     if (hasDarkClass) {
-      removeClass(htmlRoot, 'dark');
+      removeClass(htmlRoot, "dark");
     }
   }
 }
diff --git a/src/logics/theme/index.ts b/src/logics/theme/index.ts
index 5635a604bb4315d3179827afe6ceb403148ace1a..fe39c98523f1e97f3789c66c7d48446d0ef2835e 100644
--- a/src/logics/theme/index.ts
+++ b/src/logics/theme/index.ts
@@ -1,7 +1,7 @@
-import { getThemeColors, generateColors } from '../../../build/config/themeConfig';
+import { getThemeColors, generateColors } from "../../../build/config/themeConfig";
 
-import { replaceStyleVariables } from 'vite-plugin-theme/es/client';
-import { mixLighten, mixDarken, tinycolor } from 'vite-plugin-theme/es/colorUtils';
+import { replaceStyleVariables } from "vite-plugin-theme/es/client";
+import { mixLighten, mixDarken, tinycolor } from "vite-plugin-theme/es/colorUtils";
 
 export async function changeTheme(color: string) {
   const colors = generateColors({
diff --git a/src/logics/theme/updateBackground.ts b/src/logics/theme/updateBackground.ts
index 3f15c9052f6b6bd347e64f6522227dc27d062811..918c052da940a93030ff2f7b4974ce0161f42056 100644
--- a/src/logics/theme/updateBackground.ts
+++ b/src/logics/theme/updateBackground.ts
@@ -1,15 +1,15 @@
-import { colorIsDark, lighten, darken } from '/@/utils/color';
-import { useAppStore } from '/@/store/modules/app';
-import { ThemeEnum } from '/@/enums/appEnum';
-import { setCssVar } from './util';
+import { colorIsDark, lighten, darken } from "/@/utils/color";
+import { useAppStore } from "/@/store/modules/app";
+import { ThemeEnum } from "/@/enums/appEnum";
+import { setCssVar } from "./util";
 
-const HEADER_BG_COLOR_VAR = '--header-bg-color';
-const HEADER_BG_HOVER_COLOR_VAR = '--header-bg-hover-color';
-const HEADER_MENU_ACTIVE_BG_COLOR_VAR = '--header-active-menu-bg-color';
+const HEADER_BG_COLOR_VAR = "--header-bg-color";
+const HEADER_BG_HOVER_COLOR_VAR = "--header-bg-hover-color";
+const HEADER_MENU_ACTIVE_BG_COLOR_VAR = "--header-active-menu-bg-color";
 
-const SIDER_DARK_BG_COLOR = '--sider-dark-bg-color';
-const SIDER_DARK_DARKEN_BG_COLOR = '--sider-dark-darken-bg-color';
-const SIDER_LIGHTEN_BG_COLOR = '--sider-dark-lighten-bg-color';
+const SIDER_DARK_BG_COLOR = "--sider-dark-bg-color";
+const SIDER_DARK_DARKEN_BG_COLOR = "--sider-dark-darken-bg-color";
+const SIDER_LIGHTEN_BG_COLOR = "--sider-dark-lighten-bg-color";
 
 /**
  * Change the background color of the top header
@@ -20,7 +20,7 @@ export function updateHeaderBgColor(color?: string) {
   const darkMode = appStore.getDarkMode === ThemeEnum.DARK;
   if (!color) {
     if (darkMode) {
-      color = '#151515';
+      color = "#151515";
     } else {
       color = appStore.getHeaderSetting.bgColor;
     }
@@ -54,7 +54,7 @@ export function updateSidebarBgColor(color?: string) {
   const darkMode = appStore.getDarkMode === ThemeEnum.DARK;
   if (!color) {
     if (darkMode) {
-      color = '#212121';
+      color = "#212121";
     } else {
       color = appStore.getMenuSetting.bgColor;
     }
@@ -65,7 +65,7 @@ export function updateSidebarBgColor(color?: string) {
 
   // only #ffffff is light
   // Only when the background color is #fff, the theme of the menu will be changed to light
-  const isLight = ['#fff', '#ffffff'].includes(color!.toLowerCase());
+  const isLight = ["#fff", "#ffffff"].includes(color!.toLowerCase());
 
   appStore.setProjectConfig({
     menuSetting: {
diff --git a/src/logics/theme/updateColorWeak.ts b/src/logics/theme/updateColorWeak.ts
index 8a0e64a279a302248e31fa975f8dbca831924d7d..0322c5a25bf207f336b944e1c8383443386564ff 100644
--- a/src/logics/theme/updateColorWeak.ts
+++ b/src/logics/theme/updateColorWeak.ts
@@ -1,9 +1,9 @@
-import { toggleClass } from './util';
+import { toggleClass } from "./util";
 
 /**
  * Change the status of the project's color weakness mode
  * @param colorWeak
  */
 export function updateColorWeak(colorWeak: boolean) {
-  toggleClass(colorWeak, 'color-weak', document.documentElement);
+  toggleClass(colorWeak, "color-weak", document.documentElement);
 }
diff --git a/src/logics/theme/updateGrayMode.ts b/src/logics/theme/updateGrayMode.ts
index 0fd16fe697718b5e01b1f52282a7c4b52955d848..7926f9c459c3bc6509acdda784c8d6cd69803d11 100644
--- a/src/logics/theme/updateGrayMode.ts
+++ b/src/logics/theme/updateGrayMode.ts
@@ -1,9 +1,9 @@
-import { toggleClass } from './util';
+import { toggleClass } from "./util";
 
 /**
  * Change project gray mode status
  * @param gray
  */
 export function updateGrayMode(gray: boolean) {
-  toggleClass(gray, 'gray-mode', document.documentElement);
+  toggleClass(gray, "gray-mode", document.documentElement);
 }
diff --git a/src/logics/theme/util.ts b/src/logics/theme/util.ts
index 30aef3701875c5bf6b79b1247ea79b18b9d2e6a6..6a0cb52b0739d5a953695301e2758a91bc231607 100644
--- a/src/logics/theme/util.ts
+++ b/src/logics/theme/util.ts
@@ -2,7 +2,7 @@ const docEle = document.documentElement;
 export function toggleClass(flag: boolean, clsName: string, target?: HTMLElement) {
   const targetEl = target || document.body;
   let { className } = targetEl;
-  className = className.replace(clsName, '');
+  className = className.replace(clsName, "");
   targetEl.className = flag ? `${className} ${clsName} ` : className;
 }
 
diff --git a/src/main.ts b/src/main.ts
index d24c80aef2cafa88c17eec3aea36fce3cf3b3096..6aa3e397e4e77f341315e988d053758af869f918 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -1,59 +1,61 @@
-import '/@/design/index.less';
-import 'virtual:windi-base.css';
-import 'virtual:windi-components.css';
-import 'virtual:windi-utilities.css';
+import "virtual:windi-base.css";
+import "virtual:windi-components.css";
+import "/@/design/index.less";
+import "virtual:windi-utilities.css";
 // Register icon sprite
-import 'virtual:svg-icons-register';
-import App from './App.vue';
-import { createApp } from 'vue';
-import { initAppConfigStore } from '/@/logics/initAppConfig';
-import { setupErrorHandle } from '/@/logics/error-handle';
-import { router, setupRouter } from '/@/router';
-import { setupRouterGuard } from '/@/router/guard';
-import { setupStore } from '/@/store';
-import { setupGlobDirectives } from '/@/directives';
-import { setupI18n } from '/@/locales/setupI18n';
-import { registerGlobComp } from '/@/components/registerGlobComp';
-
-// Importing on demand in local development will increase the number of browser requests by around 20%.
-// This may slow down the browser refresh speed.
-// Therefore, only enable on-demand importing in production environments .
-if (import.meta.env.DEV) {
-  import('ant-design-vue/dist/antd.less');
-}
+import "virtual:svg-icons-register";
+import App from "./App.vue";
+import { createApp } from "vue";
+import { initAppConfigStore } from "/@/logics/initAppConfig";
+import { setupErrorHandle } from "/@/logics/error-handle";
+import { router, setupRouter } from "/@/router";
+import { setupRouterGuard } from "/@/router/guard";
+import { setupStore } from "/@/store";
+import { setupGlobDirectives } from "/@/directives";
+import { setupI18n } from "/@/locales/setupI18n";
+import { registerGlobComp } from "/@/components/registerGlobComp";
 
 async function bootstrap() {
   const app = createApp(App);
 
   // Configure store
+  // 配置 store
   setupStore(app);
 
   // Initialize internal system configuration
+  // 初始化内部系统配置
   initAppConfigStore();
 
   // Register global components
+  // 注册全局组件
   registerGlobComp(app);
 
   // Multilingual configuration
+  // 多语言配置
   // Asynchronous case: language files may be obtained from the server side
+  // 异步案例:语言文件可能从服务器端获取
   await setupI18n(app);
 
   // Configure routing
+  // 配置路由
   setupRouter(app);
 
   // router-guard
+  // 路由守卫
   setupRouterGuard(router);
 
   // Register global directive
+  // 注册全局指令
   setupGlobDirectives(app);
 
   // Configure global error handling
+  // 配置全局错误处理
   setupErrorHandle(app);
 
   // https://next.router.vuejs.org/api/#isready
   // await router.isReady();
 
-  app.mount('#app');
+  app.mount("#app");
 }
 
 bootstrap();
diff --git a/src/router/constant.ts b/src/router/constant.ts
index d39a67e565005881c93573ab464e071e1fac40b2..b17445ac2ba538e674a0f6541ed345da6a5336ac 100644
--- a/src/router/constant.ts
+++ b/src/router/constant.ts
@@ -1,15 +1,15 @@
-export const REDIRECT_NAME = 'Redirect';
+export const REDIRECT_NAME = "Redirect";
 
-export const PARENT_LAYOUT_NAME = 'ParentLayout';
+export const PARENT_LAYOUT_NAME = "ParentLayout";
 
-export const PAGE_NOT_FOUND_NAME = 'PageNotFound';
+export const PAGE_NOT_FOUND_NAME = "PageNotFound";
 
-export const EXCEPTION_COMPONENT = () => import('/@/views/sys/exception/Exception.vue');
+export const EXCEPTION_COMPONENT = () => import("/@/views/sys/exception/Exception.vue");
 
 /**
  * @description: default layout
  */
-export const LAYOUT = () => import('/@/layouts/default/index.vue');
+export const LAYOUT = () => import("/@/layouts/default/index.vue");
 
 /**
  * @description: parent-layout
diff --git a/src/router/guard/index.ts b/src/router/guard/index.ts
index c5677499a5c00a158c72a732a876719aa6ef2940..640a379e3291769e18f3d4e35373f7ae5d282680 100644
--- a/src/router/guard/index.ts
+++ b/src/router/guard/index.ts
@@ -1,17 +1,17 @@
-import type { Router, RouteLocationNormalized } from 'vue-router';
-import { useAppStoreWithOut } from '/@/store/modules/app';
-import { useUserStoreWithOut } from '/@/store/modules/user';
-import { useTransitionSetting } from '/@/hooks/setting/useTransitionSetting';
-import { AxiosCanceler } from '/@/utils/http/axios/axiosCancel';
-import { Modal, notification } from 'ant-design-vue';
-import { warn } from '/@/utils/log';
-import { unref } from 'vue';
-import { setRouteChange } from '/@/logics/mitt/routeChange';
-import { createPermissionGuard } from './permissionGuard';
-import { createStateGuard } from './stateGuard';
-import nProgress from 'nprogress';
-import projectSetting from '/@/settings/projectSetting';
-import { createParamMenuGuard } from './paramMenuGuard';
+import type { Router, RouteLocationNormalized } from "vue-router";
+import { useAppStoreWithOut } from "/@/store/modules/app";
+import { useUserStoreWithOut } from "/@/store/modules/user";
+import { useTransitionSetting } from "/@/hooks/setting/useTransitionSetting";
+import { AxiosCanceler } from "/@/utils/http/axios/axiosCancel";
+import { Modal, notification } from "ant-design-vue";
+import { warn } from "/@/utils/log";
+import { unref } from "vue";
+import { setRouteChange } from "/@/logics/mitt/routeChange";
+import { createPermissionGuard } from "./permissionGuard";
+import { createStateGuard } from "./stateGuard";
+import nProgress from "nprogress";
+import projectSetting from "/@/settings/projectSetting";
+import { createParamMenuGuard } from "./paramMenuGuard";
 
 // Don't change the order of creation
 export function setupRouterGuard(router: Router) {
@@ -124,7 +124,7 @@ export function createMessageGuard(router: Router) {
         notification.destroy();
       }
     } catch (error) {
-      warn('message guard error:' + error);
+      warn("message guard error:" + error);
     }
     return true;
   });
diff --git a/src/router/guard/paramMenuGuard.ts b/src/router/guard/paramMenuGuard.ts
index 1c75157ba40167efaaa82f98f4540e6759286ded..04edc4b3c64b5206be9ac56dc5add0e35677bec5 100644
--- a/src/router/guard/paramMenuGuard.ts
+++ b/src/router/guard/paramMenuGuard.ts
@@ -1,10 +1,10 @@
-import type { Router } from 'vue-router';
-import { configureDynamicParamsMenu } from '../helper/menuHelper';
-import { Menu } from '../types';
-import { PermissionModeEnum } from '/@/enums/appEnum';
-import { useAppStoreWithOut } from '/@/store/modules/app';
+import type { Router } from "vue-router";
+import { configureDynamicParamsMenu } from "../helper/menuHelper";
+import { Menu } from "../types";
+import { PermissionModeEnum } from "/@/enums/appEnum";
+import { useAppStoreWithOut } from "/@/store/modules/app";
 
-import { usePermissionStoreWithOut } from '/@/store/modules/permission';
+import { usePermissionStoreWithOut } from "/@/store/modules/permission";
 
 export function createParamMenuGuard(router: Router) {
   const permissionStore = usePermissionStoreWithOut();
diff --git a/src/router/guard/permissionGuard.ts b/src/router/guard/permissionGuard.ts
index 4d3941427889600deb02713da2cb491fc34804bf..185ac8f4162f16342a09a8678bbfd62aa4b761ff 100644
--- a/src/router/guard/permissionGuard.ts
+++ b/src/router/guard/permissionGuard.ts
@@ -1,13 +1,13 @@
-import type { Router, RouteRecordRaw } from 'vue-router';
+import type { Router, RouteRecordRaw } from "vue-router";
 
-import { usePermissionStoreWithOut } from '/@/store/modules/permission';
+import { usePermissionStoreWithOut } from "/@/store/modules/permission";
 
-import { PageEnum } from '/@/enums/pageEnum';
-import { useUserStoreWithOut } from '/@/store/modules/user';
+import { PageEnum } from "/@/enums/pageEnum";
+import { useUserStoreWithOut } from "/@/store/modules/user";
 
-import { PAGE_NOT_FOUND_ROUTE } from '/@/router/routes/basic';
+import { PAGE_NOT_FOUND_ROUTE } from "/@/router/routes/basic";
 
-import { RootRoute } from '/@/router/routes';
+import { RootRoute } from "/@/router/routes";
 
 const LOGIN_PATH = PageEnum.BASE_LOGIN;
 
@@ -38,7 +38,7 @@ export function createPermissionGuard(router: Router) {
         try {
           await userStore.afterLoginAction();
           if (!isSessionTimeout) {
-            next((to.query?.redirect as string) || '/');
+            next((to.query?.redirect as string) || "/");
             return;
           }
         } catch {}
diff --git a/src/router/guard/stateGuard.ts b/src/router/guard/stateGuard.ts
index c34513cc441c3eded2d9f5186c0060acaf52bf72..bd31661fecd64e32fcac97c6f3ea30487c465e23 100644
--- a/src/router/guard/stateGuard.ts
+++ b/src/router/guard/stateGuard.ts
@@ -1,10 +1,10 @@
-import type { Router } from 'vue-router';
-import { useAppStore } from '/@/store/modules/app';
-import { useMultipleTabStore } from '/@/store/modules/multipleTab';
-import { useUserStore } from '/@/store/modules/user';
-import { usePermissionStore } from '/@/store/modules/permission';
-import { PageEnum } from '/@/enums/pageEnum';
-import { removeTabChangeListener } from '/@/logics/mitt/routeChange';
+import type { Router } from "vue-router";
+import { useAppStore } from "/@/store/modules/app";
+import { useMultipleTabStore } from "/@/store/modules/multipleTab";
+import { useUserStore } from "/@/store/modules/user";
+import { usePermissionStore } from "/@/store/modules/permission";
+import { PageEnum } from "/@/enums/pageEnum";
+import { removeTabChangeListener } from "/@/logics/mitt/routeChange";
 
 export function createStateGuard(router: Router) {
   router.afterEach((to) => {
diff --git a/src/router/helper/menuHelper.ts b/src/router/helper/menuHelper.ts
index a1307124d7da714b93a4b287f6e00a967d1ede75..7db7619e52059716146be1b7a90eedc4dfded7b6 100644
--- a/src/router/helper/menuHelper.ts
+++ b/src/router/helper/menuHelper.ts
@@ -1,24 +1,28 @@
-import { AppRouteModule } from '/@/router/types';
-import type { MenuModule, Menu, AppRouteRecordRaw } from '/@/router/types';
-import { findPath, treeMap } from '/@/utils/helper/treeHelper';
-import { cloneDeep } from 'lodash-es';
-import { isUrl } from '/@/utils/is';
-import { RouteParams } from 'vue-router';
-import { toRaw } from 'vue';
+import { AppRouteModule } from "/@/router/types";
+import type { MenuModule, Menu, AppRouteRecordRaw } from "/@/router/types";
+import { findPath, treeMap } from "/@/utils/helper/treeHelper";
+import { cloneDeep } from "lodash-es";
+import { isUrl } from "/@/utils/is";
+import { RouteParams } from "vue-router";
+import { toRaw } from "vue";
 
 export function getAllParentPath<T = Recordable>(treeData: T[], path: string) {
   const menuList = findPath(treeData, (n) => n.path === path) as Menu[];
   return (menuList || []).map((item) => item.path);
 }
 
-function joinParentPath(menus: Menu[], parentPath = '') {
+// 路径处理
+function joinParentPath(menus: Menu[], parentPath = "") {
   for (let index = 0; index < menus.length; index++) {
     const menu = menus[index];
     // https://next.router.vuejs.org/guide/essentials/nested-routes.html
     // Note that nested paths that start with / will be treated as a root path.
+    // 请注意,以 / 开头的嵌套路径将被视为根路径。
     // This allows you to leverage the component nesting without having to use a nested URL.
-    if (!(menu.path.startsWith('/') || isUrl(menu.path))) {
+    // 这允许你利用组件嵌套,而无需使用嵌套 URL。
+    if (!(menu.path.startsWith("/") || isUrl(menu.path))) {
       // path doesn't start with /, nor is it a url, join parent path
+      // 路径不以 / 开头,也不是 url,加入父路径
       menu.path = `${parentPath}/${menu.path}`;
     }
     if (menu?.children?.length) {
@@ -37,14 +41,18 @@ export function transformMenuModule(menuModule: MenuModule): Menu {
   return menuList[0];
 }
 
+// 将路由转换成菜单
 export function transformRouteToMenu(routeModList: AppRouteModule[], routerMapping = false) {
+  // 借助 lodash 深拷贝
   const cloneRouteModList = cloneDeep(routeModList);
   const routeList: AppRouteRecordRaw[] = [];
 
+  // 对路由项进行修改
   cloneRouteModList.forEach((item) => {
-    if (routerMapping && item.meta.hideChildrenInMenu && typeof item.redirect === 'string') {
+    if (routerMapping && item.meta.hideChildrenInMenu && typeof item.redirect === "string") {
       item.path = item.redirect;
     }
+
     if (item.meta?.single) {
       const realItem = item?.children?.[0];
       realItem && routeList.push(realItem);
@@ -52,6 +60,7 @@ export function transformRouteToMenu(routeModList: AppRouteModule[], routerMappi
       routeList.push(item);
     }
   });
+  // 提取树指定结构
   const list = treeMap(routeList, {
     conversion: (node: AppRouteRecordRaw) => {
       const { meta: { title, hideMenu = false } = {} } = node;
@@ -66,6 +75,7 @@ export function transformRouteToMenu(routeModList: AppRouteModule[], routerMappi
       };
     },
   });
+  // 路径处理
   joinParentPath(list);
   return cloneDeep(list);
 }
@@ -74,6 +84,7 @@ export function transformRouteToMenu(routeModList: AppRouteModule[], routerMappi
  * config menu with given params
  */
 const menuParamRegex = /(?::)([\s\S]+?)((?=\/)|$)/g;
+
 export function configureDynamicParamsMenu(menu: Menu, params: RouteParams) {
   const { path, paramPath } = toRaw(menu);
   let realPath = paramPath ? paramPath : path;
diff --git a/src/router/helper/routeHelper.ts b/src/router/helper/routeHelper.ts
index d1ff3bb1545faf7f75727eb367189f7ad585ac2c..5f4efddb22e2b98a88fc2dc312bf11b2fd42f8a7 100644
--- a/src/router/helper/routeHelper.ts
+++ b/src/router/helper/routeHelper.ts
@@ -1,28 +1,28 @@
-import type { AppRouteModule, AppRouteRecordRaw } from '/@/router/types';
-import type { Router, RouteRecordNormalized } from 'vue-router';
+import type { AppRouteModule, AppRouteRecordRaw } from "/@/router/types";
+import type { Router, RouteRecordNormalized } from "vue-router";
 
-import { getParentLayout, LAYOUT, EXCEPTION_COMPONENT } from '/@/router/constant';
-import { cloneDeep, omit } from 'lodash-es';
-import { warn } from '/@/utils/log';
-import { createRouter, createWebHashHistory } from 'vue-router';
+import { getParentLayout, LAYOUT, EXCEPTION_COMPONENT } from "/@/router/constant";
+import { cloneDeep, omit } from "lodash-es";
+import { warn } from "/@/utils/log";
+import { createRouter, createWebHashHistory } from "vue-router";
 
-export type LayoutMapKey = 'LAYOUT';
-const IFRAME = () => import('/@/views/sys/iframe/FrameBlank.vue');
+export type LayoutMapKey = "LAYOUT";
+const IFRAME = () => import("/@/views/sys/iframe/FrameBlank.vue");
 
-const LayoutMap = new Map<string, () => Promise<typeof import('*.vue')>>();
+const LayoutMap = new Map<string, () => Promise<typeof import("*.vue")>>();
 
-LayoutMap.set('LAYOUT', LAYOUT);
-LayoutMap.set('IFRAME', IFRAME);
+LayoutMap.set("LAYOUT", LAYOUT);
+LayoutMap.set("IFRAME", IFRAME);
 
 let dynamicViewsModules: Record<string, () => Promise<Recordable>>;
 
 // Dynamic introduction
 function asyncImportRoute(routes: AppRouteRecordRaw[] | undefined) {
-  dynamicViewsModules = dynamicViewsModules || import.meta.glob('../../views/**/*.{vue,tsx}');
+  dynamicViewsModules = dynamicViewsModules || import.meta.glob("../../views/**/*.{vue,tsx}");
   if (!routes) return;
   routes.forEach((item) => {
     if (!item.component && item.meta?.frameSrc) {
-      item.component = 'IFRAME';
+      item.component = "IFRAME";
     }
     const { component, name } = item;
     const { children } = item;
@@ -46,11 +46,11 @@ function dynamicImport(
 ) {
   const keys = Object.keys(dynamicViewsModules);
   const matchKeys = keys.filter((key) => {
-    const k = key.replace('../../views', '');
-    const startFlag = component.startsWith('/');
-    const endFlag = component.endsWith('.vue') || component.endsWith('.tsx');
+    const k = key.replace("../../views", "");
+    const startFlag = component.startsWith("/");
+    const endFlag = component.endsWith(".vue") || component.endsWith(".tsx");
     const startIndex = startFlag ? 0 : 1;
-    const lastIndex = endFlag ? k.length : k.lastIndexOf('.');
+    const lastIndex = endFlag ? k.length : k.lastIndexOf(".");
     return k.substring(startIndex, lastIndex) === component;
   });
   if (matchKeys?.length === 1) {
@@ -58,34 +58,35 @@ function dynamicImport(
     return dynamicViewsModules[matchKey];
   } else if (matchKeys?.length > 1) {
     warn(
-      'Please do not create `.vue` and `.TSX` files with the same file name in the same hierarchical directory under the views folder. This will cause dynamic introduction failure',
+      "Please do not create `.vue` and `.TSX` files with the same file name in the same hierarchical directory under the views folder. This will cause dynamic introduction failure",
     );
     return;
   } else {
-    warn('在src/views/下找不到`' + component + '.vue` 或 `' + component + '.tsx`, 请自行创建!');
+    warn("在src/views/下找不到`" + component + ".vue` 或 `" + component + ".tsx`, 请自行创建!");
     return EXCEPTION_COMPONENT;
   }
 }
 
 // Turn background objects into routing objects
+// 将背景对象变成路由对象
 export function transformObjToRoute<T = AppRouteModule>(routeList: AppRouteModule[]): T[] {
   routeList.forEach((route) => {
     const component = route.component as string;
     if (component) {
-      if (component.toUpperCase() === 'LAYOUT') {
+      if (component.toUpperCase() === "LAYOUT") {
         route.component = LayoutMap.get(component.toUpperCase());
       } else {
         route.children = [cloneDeep(route)];
         route.component = LAYOUT;
         route.name = `${route.name}Parent`;
-        route.path = '';
+        route.path = "";
         const meta = route.meta || {};
         meta.single = true;
         meta.affix = false;
         route.meta = meta;
       }
     } else {
-      warn('请正确配置路由:' + route?.name + '的component属性');
+      warn("请正确配置路由:" + route?.name + "的component属性");
     }
     route.children && asyncImportRoute(route.children);
   });
@@ -94,35 +95,46 @@ export function transformObjToRoute<T = AppRouteModule>(routeList: AppRouteModul
 
 /**
  * Convert multi-level routing to level 2 routing
+ * 将多级路由转换为 2 级路由
  */
 export function flatMultiLevelRoutes(routeModules: AppRouteModule[]) {
   const modules: AppRouteModule[] = cloneDeep(routeModules);
+
   for (let index = 0; index < modules.length; index++) {
     const routeModule = modules[index];
+    // 判断级别是否 多级 路由
     if (!isMultipleRoute(routeModule)) {
+      // 声明终止当前循环, 即跳过此次循环,进行下一轮
       continue;
     }
+    // 路由等级提升
     promoteRouteLevel(routeModule);
   }
   return modules;
 }
 
 // Routing level upgrade
+// 路由等级提升
 function promoteRouteLevel(routeModule: AppRouteModule) {
   // Use vue-router to splice menus
+  // 使用vue-router拼接菜单
+  // createRouter 创建一个可以被 Vue 应用程序使用的路由实例
   let router: Router | null = createRouter({
     routes: [routeModule as unknown as RouteRecordNormalized],
     history: createWebHashHistory(),
   });
-
+  // getRoutes: 获取所有 路由记录的完整列表。
   const routes = router.getRoutes();
+  // 将所有子路由添加到二级路由
   addToChildren(routes, routeModule.children || [], routeModule);
   router = null;
 
-  routeModule.children = routeModule.children?.map((item) => omit(item, 'children'));
+  // omit lodash的函数 对传入的item对象的children进行删除
+  routeModule.children = routeModule.children?.map((item) => omit(item, "children"));
 }
 
 // Add all sub-routes to the secondary route
+// 将所有子路由添加到二级路由
 function addToChildren(
   routes: RouteRecordNormalized[],
   children: AppRouteRecordRaw[],
@@ -145,8 +157,10 @@ function addToChildren(
 }
 
 // Determine whether the level exceeds 2 levels
+// 判断级别是否超过2级
 function isMultipleRoute(routeModule: AppRouteModule) {
-  if (!routeModule || !Reflect.has(routeModule, 'children') || !routeModule.children?.length) {
+  // Reflect.has 与 in 操作符 相同, 用于检查一个对象(包括它原型链上)是否拥有某个属性
+  if (!routeModule || !Reflect.has(routeModule, "children") || !routeModule.children?.length) {
     return false;
   }
 
diff --git a/src/router/index.ts b/src/router/index.ts
index c349151543c4545b611220a191aac6a169c87e1e..893cb02c6b0ed3c34c79fc16c9edd4692f224437 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -1,8 +1,8 @@
-import type { RouteRecordRaw } from 'vue-router';
-import type { App } from 'vue';
+import type { RouteRecordRaw } from "vue-router";
+import type { App } from "vue";
 
-import { createRouter, createWebHashHistory } from 'vue-router';
-import { basicRoutes } from './routes';
+import { createRouter, createWebHashHistory } from "vue-router";
+import { basicRoutes } from "./routes";
 
 // 白名单应该包含基本静态路由
 const WHITE_NAME_LIST: string[] = [];
@@ -14,9 +14,13 @@ const getRouteNames = (array: any[]) =>
 getRouteNames(basicRoutes);
 
 // app router
+// 创建一个可以被 Vue 应用程序使用的路由实例
 export const router = createRouter({
+  // 创建一个 hash 历史记录。
   history: createWebHashHistory(import.meta.env.VITE_PUBLIC_PATH),
+  // 应该添加到路由的初始路由列表。
   routes: basicRoutes as unknown as RouteRecordRaw[],
+  // 是否应该禁止尾部斜杠。默认为假
   strict: true,
   scrollBehavior: () => ({ left: 0, top: 0 }),
 });
@@ -32,6 +36,7 @@ export function resetRouter() {
 }
 
 // config router
+// 配置路由器
 export function setupRouter(app: App<Element>) {
   app.use(router);
 }
diff --git a/src/router/menus/index.ts b/src/router/menus/index.ts
index bf677214ddbe50969e18536f02c3a2d1bd85bb5c..4df7b8a07af6fb9fca2c3f10829fa90ab90e50ce 100644
--- a/src/router/menus/index.ts
+++ b/src/router/menus/index.ts
@@ -1,16 +1,16 @@
-import type { Menu, MenuModule } from '/@/router/types';
-import type { RouteRecordNormalized } from 'vue-router';
-
-import { useAppStoreWithOut } from '/@/store/modules/app';
-import { usePermissionStore } from '/@/store/modules/permission';
-import { transformMenuModule, getAllParentPath } from '/@/router/helper/menuHelper';
-import { filter } from '/@/utils/helper/treeHelper';
-import { isUrl } from '/@/utils/is';
-import { router } from '/@/router';
-import { PermissionModeEnum } from '/@/enums/appEnum';
-import { pathToRegexp } from 'path-to-regexp';
-
-const modules = import.meta.globEager('./modules/**/*.ts');
+import type { Menu, MenuModule } from "/@/router/types";
+import type { RouteRecordNormalized } from "vue-router";
+
+import { useAppStoreWithOut } from "/@/store/modules/app";
+import { usePermissionStore } from "/@/store/modules/permission";
+import { transformMenuModule, getAllParentPath } from "/@/router/helper/menuHelper";
+import { filter } from "/@/utils/helper/treeHelper";
+import { isUrl } from "/@/utils/is";
+import { router } from "/@/router";
+import { PermissionModeEnum } from "/@/enums/appEnum";
+import { pathToRegexp } from "path-to-regexp";
+
+const modules = import.meta.globEager("./modules/**/*.ts");
 
 const menuModules: MenuModule[] = [];
 
diff --git a/src/router/routes/basic.ts b/src/router/routes/basic.ts
index 58db49448d48cbe4edc1f2bb5d2824e42aa1cd4c..a370740ee84bf24b0844e77f9ef71174ff9d004a 100644
--- a/src/router/routes/basic.ts
+++ b/src/router/routes/basic.ts
@@ -1,29 +1,29 @@
-import type { AppRouteRecordRaw } from '/@/router/types';
-import { t } from '/@/hooks/web/useI18n';
+import type { AppRouteRecordRaw } from "/@/router/types";
+import { t } from "/@/hooks/web/useI18n";
 import {
   REDIRECT_NAME,
   LAYOUT,
   EXCEPTION_COMPONENT,
   PAGE_NOT_FOUND_NAME,
-} from '/@/router/constant';
+} from "/@/router/constant";
 
 // 404 on a page
 export const PAGE_NOT_FOUND_ROUTE: AppRouteRecordRaw = {
-  path: '/:path(.*)*',
+  path: "/:path(.*)*",
   name: PAGE_NOT_FOUND_NAME,
   component: LAYOUT,
   meta: {
-    title: 'ErrorPage',
+    title: "ErrorPage",
     hideBreadcrumb: true,
     hideMenu: true,
   },
   children: [
     {
-      path: '/:path(.*)*',
+      path: "/:path(.*)*",
       name: PAGE_NOT_FOUND_NAME,
       component: EXCEPTION_COMPONENT,
       meta: {
-        title: 'ErrorPage',
+        title: "ErrorPage",
         hideBreadcrumb: true,
         hideMenu: true,
       },
@@ -32,9 +32,9 @@ export const PAGE_NOT_FOUND_ROUTE: AppRouteRecordRaw = {
 };
 
 export const REDIRECT_ROUTE: AppRouteRecordRaw = {
-  path: '/redirect',
+  path: "/redirect",
   component: LAYOUT,
-  name: 'RedirectTo',
+  name: "RedirectTo",
   meta: {
     title: REDIRECT_NAME,
     hideBreadcrumb: true,
@@ -42,9 +42,9 @@ export const REDIRECT_ROUTE: AppRouteRecordRaw = {
   },
   children: [
     {
-      path: '/redirect/:path(.*)',
+      path: "/redirect/:path(.*)",
       name: REDIRECT_NAME,
-      component: () => import('/@/views/sys/redirect/index.vue'),
+      component: () => import("/@/views/sys/redirect/index.vue"),
       meta: {
         title: REDIRECT_NAME,
         hideBreadcrumb: true,
@@ -54,24 +54,24 @@ export const REDIRECT_ROUTE: AppRouteRecordRaw = {
 };
 
 export const ERROR_LOG_ROUTE: AppRouteRecordRaw = {
-  path: '/error-log',
-  name: 'ErrorLog',
+  path: "/error-log",
+  name: "ErrorLog",
   component: LAYOUT,
-  redirect: '/error-log/list',
+  redirect: "/error-log/list",
   meta: {
-    title: 'ErrorLog',
+    title: "ErrorLog",
     hideBreadcrumb: true,
     hideChildrenInMenu: true,
   },
   children: [
     {
-      path: 'list',
-      name: 'ErrorLogList',
-      component: () => import('/@/views/sys/error-log/index.vue'),
+      path: "list",
+      name: "ErrorLogList",
+      component: () => import("/@/views/sys/error-log/index.vue"),
       meta: {
-        title: t('routes.basic.errorLogList'),
+        title: t("routes.basic.errorLogList"),
         hideBreadcrumb: true,
-        currentActiveMenu: '/error-log',
+        currentActiveMenu: "/error-log",
       },
     },
   ],
diff --git a/src/router/routes/index.ts b/src/router/routes/index.ts
index 149ec42a0d9ba49eef207ac4fe43b01b98c26bd7..7e68704f732823e142bc683ce712b95a83ed831f 100644
--- a/src/router/routes/index.ts
+++ b/src/router/routes/index.ts
@@ -1,15 +1,15 @@
-import type { AppRouteRecordRaw, AppRouteModule } from '/@/router/types';
+import type { AppRouteRecordRaw, AppRouteModule } from "/@/router/types";
 
-import { PAGE_NOT_FOUND_ROUTE, REDIRECT_ROUTE } from '/@/router/routes/basic';
+import { PAGE_NOT_FOUND_ROUTE, REDIRECT_ROUTE } from "/@/router/routes/basic";
 
-import { mainOutRoutes } from './mainOut';
-import { PageEnum } from '/@/enums/pageEnum';
-import { t } from '/@/hooks/web/useI18n';
-
-const modules = import.meta.globEager('./modules/**/*.ts');
+import { PageEnum } from "/@/enums/pageEnum";
+import { t } from "/@/hooks/web/useI18n";
 
+// import.meta.globEager() 直接引入所有的模块 Vite 独有的功能
+const modules = import.meta.globEager("./modules/**/*.ts");
 const routeModuleList: AppRouteModule[] = [];
 
+// 加入到路由集合中
 Object.keys(modules).forEach((key) => {
   const mod = modules[key].default || {};
   const modList = Array.isArray(mod) ? [...mod] : [mod];
@@ -18,29 +18,25 @@ Object.keys(modules).forEach((key) => {
 
 export const asyncRoutes = [PAGE_NOT_FOUND_ROUTE, ...routeModuleList];
 
+// 根路由
 export const RootRoute: AppRouteRecordRaw = {
-  path: '/',
-  name: 'Root',
+  path: "/",
+  name: "Root",
   redirect: PageEnum.BASE_HOME,
   meta: {
-    title: 'Root',
+    title: "Root",
   },
 };
 
 export const LoginRoute: AppRouteRecordRaw = {
-  path: '/login',
-  name: 'Login',
-  component: () => import('/@/views/sys/login/Login.vue'),
+  path: "/login",
+  name: "Login",
+  component: () => import("/@/views/sys/login/Login.vue"),
   meta: {
-    title: t('routes.basic.login'),
+    title: t("routes.basic.login"),
   },
 };
 
 // Basic routing without permission
-export const basicRoutes = [
-  LoginRoute,
-  RootRoute,
-  ...mainOutRoutes,
-  REDIRECT_ROUTE,
-  PAGE_NOT_FOUND_ROUTE,
-];
+// 未经许可的基本路由
+export const basicRoutes = [LoginRoute, RootRoute, REDIRECT_ROUTE, PAGE_NOT_FOUND_ROUTE];
diff --git a/src/router/routes/mainOut.ts b/src/router/routes/mainOut.ts
deleted file mode 100644
index b0798292f32b8f24e6a91f2f4a57154068d73db8..0000000000000000000000000000000000000000
--- a/src/router/routes/mainOut.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-/**
-The routing of this file will not show the layout.
-It is an independent new page.
-the contents of the file still need to log in to access
- */
-import type { AppRouteModule } from '/@/router/types';
-
-// test
-// http:ip:port/main-out
-export const mainOutRoutes: AppRouteModule[] = [];
-
-export const mainOutRouteNames = mainOutRoutes.map((item) => item.name);
diff --git a/src/router/routes/modules/about.ts b/src/router/routes/modules/about.ts
index d32c4f547bf84c966a06acc8071501e153326dbc..3bf500098bcaf1f292a11d3c099463ed42cfcf76 100644
--- a/src/router/routes/modules/about.ts
+++ b/src/router/routes/modules/about.ts
@@ -1,31 +1,31 @@
-import type { AppRouteModule } from '/@/router/types';
+import type { AppRouteModule } from "/@/router/types";
 
-import { LAYOUT } from '/@/router/constant';
-import { t } from '/@/hooks/web/useI18n';
+import { LAYOUT } from "/@/router/constant";
+import { t } from "/@/hooks/web/useI18n";
 
-const dashboard: AppRouteModule = {
-  path: '/about',
-  name: 'About',
+const about: AppRouteModule = {
+  path: "/about",
+  name: "About",
   component: LAYOUT,
-  redirect: '/about/index',
+  redirect: "/about/index",
   meta: {
     hideChildrenInMenu: true,
-    icon: 'simple-icons:about-dot-me',
-    title: t('routes.dashboard.about'),
+    icon: "simple-icons:about-dot-me",
+    title: t("routes.dashboard.about"),
     orderNo: 100000,
   },
   children: [
     {
-      path: 'index',
-      name: 'AboutPage',
-      component: () => import('/@/views/sys/about/index.vue'),
+      path: "index",
+      name: "AboutPage",
+      component: () => import("/@/views/sys/about/index.vue"),
       meta: {
-        title: t('routes.dashboard.about'),
-        icon: 'simple-icons:about-dot-me',
+        title: t("routes.dashboard.about"),
+        icon: "simple-icons:about-dot-me",
         hideMenu: true,
       },
     },
   ],
 };
 
-export default dashboard;
+export default about;
diff --git a/src/router/routes/modules/dashboard.ts b/src/router/routes/modules/dashboard.ts
index f532ec74f143d61d55dbb2f8050c730dbad130e0..bab6880dc58826246f245048ee6cc5dd4a320a4f 100644
--- a/src/router/routes/modules/dashboard.ts
+++ b/src/router/routes/modules/dashboard.ts
@@ -1,34 +1,34 @@
-import type { AppRouteModule } from '/@/router/types';
+import type { AppRouteModule } from "/@/router/types";
 
-import { LAYOUT } from '/@/router/constant';
-import { t } from '/@/hooks/web/useI18n';
+import { LAYOUT } from "/@/router/constant";
+import { t } from "/@/hooks/web/useI18n";
 
 const dashboard: AppRouteModule = {
-  path: '/dashboard',
-  name: 'Dashboard',
+  path: "/dashboard",
+  name: "Dashboard",
   component: LAYOUT,
-  redirect: '/dashboard/analysis',
+  redirect: "/dashboard/analysis",
   meta: {
     orderNo: 10,
-    icon: 'ion:grid-outline',
-    title: t('routes.dashboard.dashboard'),
+    icon: "ion:grid-outline",
+    title: t("routes.dashboard.dashboard"),
   },
   children: [
     {
-      path: 'analysis',
-      name: 'Analysis',
-      component: () => import('/@/views/dashboard/analysis/index.vue'),
+      path: "analysis",
+      name: "Analysis",
+      component: () => import("/@/views/dashboard/analysis/index.vue"),
       meta: {
         // affix: true,
-        title: t('routes.dashboard.analysis'),
+        title: t("routes.dashboard.analysis"),
       },
     },
     {
-      path: 'workbench',
-      name: 'Workbench',
-      component: () => import('/@/views/dashboard/workbench/index.vue'),
+      path: "workbench",
+      name: "Workbench",
+      component: () => import("/@/views/dashboard/workbench/index.vue"),
       meta: {
-        title: t('routes.dashboard.workbench'),
+        title: t("routes.dashboard.workbench"),
       },
     },
   ],
diff --git a/src/router/routes/modules/student/practice.ts b/src/router/routes/modules/student/practice.ts
new file mode 100644
index 0000000000000000000000000000000000000000..12422b93ae1c4df35be1e96fa2d3a450317608fe
--- /dev/null
+++ b/src/router/routes/modules/student/practice.ts
@@ -0,0 +1,28 @@
+import type { AppRouteModule } from "/@/router/types";
+
+import { LAYOUT } from "/@/router/constant";
+import { t } from "/@/hooks/web/useI18n";
+
+const practice: AppRouteModule = {
+  path: "/practice",
+  name: "practice",
+  component: LAYOUT,
+  meta: {
+    icon: "simple-icons:about-dot-me",
+    title: t("routes.practice.about"),
+  },
+  children: [
+    {
+      path: "record",
+      name: "practiceRecord",
+      component: () => import("/@/views/student/practice/practice-record/index.vue"),
+      meta: {
+        title: t("routes.practice.record"),
+        icon: "simple-icons:about-dot-me",
+        hideChildrenInMenu: true,
+      },
+    },
+  ],
+};
+
+export default practice;
diff --git a/src/router/types.ts b/src/router/types.ts
index 082d20840330b3a5c5820d78bec4ad389d4729a7..e3977253054b6c0208ffc5fb02e1fdc24b1c8ac4 100644
--- a/src/router/types.ts
+++ b/src/router/types.ts
@@ -1,14 +1,14 @@
-import type { RouteRecordRaw, RouteMeta } from 'vue-router';
-import { RoleEnum } from '/@/enums/roleEnum';
-import { defineComponent } from 'vue';
+import type { RouteRecordRaw, RouteMeta } from "vue-router";
+import { RoleEnum } from "/@/enums/roleEnum";
+import { defineComponent } from "vue";
 
 export type Component<T = any> =
   | ReturnType<typeof defineComponent>
-  | (() => Promise<typeof import('*.vue')>)
+  | (() => Promise<typeof import("*.vue")>)
   | (() => Promise<T>);
 
 // @ts-ignore
-export interface AppRouteRecordRaw extends Omit<RouteRecordRaw, 'meta'> {
+export interface AppRouteRecordRaw extends Omit<RouteRecordRaw, "meta"> {
   name: string;
   meta: RouteMeta;
   component?: Component | string;
@@ -19,7 +19,7 @@ export interface AppRouteRecordRaw extends Omit<RouteRecordRaw, 'meta'> {
 }
 
 export interface MenuTag {
-  type?: 'primary' | 'error' | 'warn' | 'success';
+  type?: "primary" | "error" | "warn" | "success";
   content?: string;
   dot?: boolean;
 }
diff --git a/src/settings/componentSetting.ts b/src/settings/componentSetting.ts
index b2479b7b0027e3343e134ee1d68e762c8f2c6fa4..2c4de90c06f2db62bf13606e32c1ca1511efa4cc 100644
--- a/src/settings/componentSetting.ts
+++ b/src/settings/componentSetting.ts
@@ -1,6 +1,6 @@
 // Used to configure the general configuration of some components without modifying the components
 
-import type { SorterResult } from '../components/Table';
+import type { SorterResult } from "../components/Table";
 
 export default {
   // basic-table setting
@@ -9,20 +9,20 @@ export default {
     // support xxx.xxx.xxx
     fetchSetting: {
       // The field name of the current page passed to the background
-      pageField: 'page',
+      pageField: "page",
       // The number field name of each page displayed in the background
-      sizeField: 'pageSize',
+      sizeField: "pageSize",
       // Field name of the form data returned by the interface
-      listField: 'items',
+      listField: "items",
       // Total number of tables returned by the interface field name
-      totalField: 'total',
+      totalField: "total",
     },
     // Number of pages that can be selected
-    pageSizeOptions: ['10', '50', '80', '100'],
+    pageSizeOptions: ["10", "50", "80", "100"],
     // Default display quantity on one page
     defaultPageSize: 10,
     // Default Size
-    defaultSize: 'middle',
+    defaultSize: "middle",
     // Custom general sort function
     defaultSortFn: (sortInfo: SorterResult) => {
       const { field, order } = sortInfo;
diff --git a/src/settings/designSetting.ts b/src/settings/designSetting.ts
index a81b5767b885d06d27f729fdfb8a12ade7375a71..32c4372bd42c00e25c3211889d23c412e95dbe13 100644
--- a/src/settings/designSetting.ts
+++ b/src/settings/designSetting.ts
@@ -1,48 +1,48 @@
-import { ThemeEnum } from '../enums/appEnum';
+import { ThemeEnum } from "../enums/appEnum";
 
-export const prefixCls = 'vben';
+export const prefixCls = "vben";
 
 export const darkMode = ThemeEnum.LIGHT;
 
 // app theme preset color
 export const APP_PRESET_COLOR_LIST: string[] = [
-  '#0960bd',
-  '#0084f4',
-  '#009688',
-  '#536dfe',
-  '#ff5c93',
-  '#ee4f12',
-  '#0096c7',
-  '#9c27b0',
-  '#ff9800',
+  "#0960bd",
+  "#0084f4",
+  "#009688",
+  "#536dfe",
+  "#ff5c93",
+  "#ee4f12",
+  "#0096c7",
+  "#9c27b0",
+  "#ff9800",
 ];
 
 // header preset color
 export const HEADER_PRESET_BG_COLOR_LIST: string[] = [
-  '#ffffff',
-  '#151515',
-  '#009688',
-  '#5172DC',
-  '#018ffb',
-  '#409eff',
-  '#e74c3c',
-  '#24292e',
-  '#394664',
-  '#001529',
-  '#383f45',
+  "#ffffff",
+  "#151515",
+  "#009688",
+  "#5172DC",
+  "#018ffb",
+  "#409eff",
+  "#e74c3c",
+  "#24292e",
+  "#394664",
+  "#001529",
+  "#383f45",
 ];
 
 // sider preset color
 export const SIDE_BAR_BG_COLOR_LIST: string[] = [
-  '#001529',
-  '#212121',
-  '#273352',
-  '#ffffff',
-  '#191b24',
-  '#191a23',
-  '#304156',
-  '#001628',
-  '#28333E',
-  '#344058',
-  '#383f45',
+  "#001529",
+  "#212121",
+  "#273352",
+  "#ffffff",
+  "#191b24",
+  "#191a23",
+  "#304156",
+  "#001628",
+  "#28333E",
+  "#344058",
+  "#383f45",
 ];
diff --git a/src/settings/encryptionSetting.ts b/src/settings/encryptionSetting.ts
index 3d617768436cf2341ea6da432e575db65a8e11f2..42c9eedd54a9075e7da717350686fba3b0df6a3c 100644
--- a/src/settings/encryptionSetting.ts
+++ b/src/settings/encryptionSetting.ts
@@ -1,12 +1,12 @@
-import { isDevMode } from '/@/utils/env';
+import { isDevMode } from "/@/utils/env";
 
 // System default cache time, in seconds
 export const DEFAULT_CACHE_TIME = 60 * 60 * 24 * 7;
 
 // aes encryption key
 export const cacheCipher = {
-  key: '_11111000001111@',
-  iv: '@11111000001111_',
+  key: "_11111000001111@",
+  iv: "@11111000001111_",
 };
 
 // Whether the system cache is encrypted using aes
diff --git a/src/settings/localeSetting.ts b/src/settings/localeSetting.ts
index 5452568d49546b7fe05f912b0878695d7809e9a3..20bdf40ee995db0c7540e2cb66e81085ac4c063e 100644
--- a/src/settings/localeSetting.ts
+++ b/src/settings/localeSetting.ts
@@ -1,9 +1,9 @@
-import type { DropMenu } from '../components/Dropdown';
-import type { LocaleSetting, LocaleType } from '/#/config';
+import type { DropMenu } from "../components/Dropdown";
+import type { LocaleSetting, LocaleType } from "/#/config";
 
 export const LOCALE: { [key: string]: LocaleType } = {
-  ZH_CN: 'zh_CN',
-  EN_US: 'en',
+  ZH_CN: "zh_CN",
+  EN_US: "en",
 };
 
 export const localeSetting: LocaleSetting = {
@@ -19,11 +19,11 @@ export const localeSetting: LocaleSetting = {
 // locale list
 export const localeList: DropMenu[] = [
   {
-    text: '简体中文',
+    text: "简体中文",
     event: LOCALE.ZH_CN,
   },
   {
-    text: 'English',
+    text: "English",
     event: LOCALE.EN_US,
   },
 ];
diff --git a/src/settings/projectSetting.ts b/src/settings/projectSetting.ts
index 0d4415b89d864bebcd62f3dbb99fb2ab8a2ac386..9df9299378d298342153b2a51a6cdc8bd945cc2e 100644
--- a/src/settings/projectSetting.ts
+++ b/src/settings/projectSetting.ts
@@ -1,6 +1,6 @@
-import type { ProjectConfig } from '/#/config';
-import { MenuTypeEnum, MenuModeEnum, TriggerEnum, MixSidebarTriggerEnum } from '/@/enums/menuEnum';
-import { CacheTypeEnum } from '/@/enums/cacheEnum';
+import type { ProjectConfig } from "/#/config";
+import { MenuTypeEnum, MenuModeEnum, TriggerEnum, MixSidebarTriggerEnum } from "/@/enums/menuEnum";
+import { CacheTypeEnum } from "/@/enums/cacheEnum";
 import {
   ContentEnum,
   PermissionModeEnum,
@@ -8,9 +8,9 @@ import {
   RouterTransitionEnum,
   SettingButtonPositionEnum,
   SessionTimeoutProcessingEnum,
-} from '/@/enums/appEnum';
-import { SIDE_BAR_BG_COLOR_LIST, HEADER_PRESET_BG_COLOR_LIST } from './designSetting';
-import { primaryColor } from '../../build/config/themeConfig';
+} from "/@/enums/appEnum";
+import { SIDE_BAR_BG_COLOR_LIST, HEADER_PRESET_BG_COLOR_LIST } from "./designSetting";
+import { primaryColor } from "../../build/config/themeConfig";
 
 // ! You need to clear the browser cache after the change
 const setting: ProjectConfig = {
@@ -83,6 +83,8 @@ const setting: ProjectConfig = {
     fixed: true,
     // Menu collapse
     collapsed: false,
+    // When sider hide because of the responsive layout
+    siderHidden: false,
     // Whether to display the menu name when folding the menu
     collapsedShowTitle: false,
     // Whether it can be dragged
@@ -103,7 +105,7 @@ const setting: ProjectConfig = {
     // Split menu
     split: false,
     // Top menu layout
-    topMenuAlign: 'center',
+    topMenuAlign: "center",
     // Fold trigger position
     trigger: TriggerEnum.HEADER,
     // Turn on accordion mode, only show a menu
@@ -134,7 +136,7 @@ const setting: ProjectConfig = {
   // Transition Setting
   transitionSetting: {
     //  Whether to open the page switching animation
-    // The disabled state will also disable pageLoadinng
+    // The disabled state will also disable pageLoading
     enable: true,
 
     // Route basic switching animation
diff --git a/src/settings/siteSetting.ts b/src/settings/siteSetting.ts
index b6ed211825c50349e229bc2fad3bbc8e7dbd66a8..33e9b4a0733e069200cf7a898b394696df226d03 100644
--- a/src/settings/siteSetting.ts
+++ b/src/settings/siteSetting.ts
@@ -1,8 +1,8 @@
 // github repo url
-export const GITHUB_URL = 'https://github.com/anncwb/vue-vben-admin';
+export const GITHUB_URL = "https://github.com/anncwb/vue-vben-admin";
 
 // vue-vben-admin-next-doc
-export const DOC_URL = 'https://vvbin.cn/doc-next/';
+export const DOC_URL = "https://vvbin.cn/doc-next/";
 
 // site url
-export const SITE_URL = 'https://vvbin.cn/next/';
+export const SITE_URL = "https://vvbin.cn/next/";
diff --git a/src/store/index.ts b/src/store/index.ts
index efaf6c970a92c9d5c914d22776e6e4d9e1992a28..96a63bace88f4aaaa29ffed9ec0afa8fe665d373 100644
--- a/src/store/index.ts
+++ b/src/store/index.ts
@@ -1,5 +1,5 @@
-import type { App } from 'vue';
-import { createPinia } from 'pinia';
+import type { App } from "vue";
+import { createPinia } from "pinia";
 
 const store = createPinia();
 
diff --git a/src/store/modules/app.ts b/src/store/modules/app.ts
index 72f9bf6c3cdb7cadedb3305fad6ff89eeaae0cd6..0c9ba03fe2d636eb139316df8b0926045f983a21 100644
--- a/src/store/modules/app.ts
+++ b/src/store/modules/app.ts
@@ -4,18 +4,18 @@ import type {
   MenuSetting,
   TransitionSetting,
   MultiTabsSetting,
-} from '/#/config';
-import type { BeforeMiniState } from '/#/store';
+} from "/#/config";
+import type { BeforeMiniState } from "/#/store";
 
-import { defineStore } from 'pinia';
-import { store } from '/@/store';
+import { defineStore } from "pinia";
+import { store } from "/@/store";
 
-import { ThemeEnum } from '/@/enums/appEnum';
-import { APP_DARK_MODE_KEY_, PROJ_CFG_KEY } from '/@/enums/cacheEnum';
-import { Persistent } from '/@/utils/cache/persistent';
-import { darkMode } from '/@/settings/designSetting';
-import { resetRouter } from '/@/router';
-import { deepMerge } from '/@/utils';
+import { ThemeEnum } from "/@/enums/appEnum";
+import { APP_DARK_MODE_KEY_, PROJ_CFG_KEY } from "/@/enums/cacheEnum";
+import { Persistent } from "/@/utils/cache/persistent";
+import { darkMode } from "/@/settings/designSetting";
+import { resetRouter } from "/@/router";
+import { deepMerge } from "/@/utils";
 
 interface AppState {
   darkMode?: ThemeEnum;
@@ -28,7 +28,7 @@ interface AppState {
 }
 let timeId: TimeoutHandle;
 export const useAppStore = defineStore({
-  id: 'app',
+  id: "app",
   state: (): AppState => ({
     darkMode: undefined,
     pageLoading: false,
@@ -39,7 +39,7 @@ export const useAppStore = defineStore({
     getPageLoading(): boolean {
       return this.pageLoading;
     },
-    getDarkMode(): 'light' | 'dark' | string {
+    getDarkMode(): "light" | "dark" | string {
       return this.darkMode || localStorage.getItem(APP_DARK_MODE_KEY_) || darkMode;
     },
 
diff --git a/src/store/modules/errorLog.ts b/src/store/modules/errorLog.ts
index a4b0b8c513bb8c488c879a6c07f4e85fd8e83c36..32317e091637e152081cf1a371e8d0921b367b93 100644
--- a/src/store/modules/errorLog.ts
+++ b/src/store/modules/errorLog.ts
@@ -1,12 +1,12 @@
-import type { ErrorLogInfo } from '/#/store';
+import type { ErrorLogInfo } from "/#/store";
 
-import { defineStore } from 'pinia';
-import { store } from '/@/store';
+import { defineStore } from "pinia";
+import { store } from "/@/store";
 
-import { formatToDateTime } from '/@/utils/dateUtil';
-import projectSetting from '/@/settings/projectSetting';
+import { formatToDateTime } from "/@/utils/dateUtil";
+import projectSetting from "/@/settings/projectSetting";
 
-import { ErrorTypeEnum } from '/@/enums/exceptionEnum';
+import { ErrorTypeEnum } from "/@/enums/exceptionEnum";
 
 export interface ErrorLogState {
   errorLogInfoList: Nullable<ErrorLogInfo[]>;
@@ -14,7 +14,7 @@ export interface ErrorLogState {
 }
 
 export const useErrorLogStore = defineStore({
-  id: 'app-error-log',
+  id: "app-error-log",
   state: (): ErrorLogState => ({
     errorLogInfoList: null,
     errorLogListCount: 0,
@@ -57,12 +57,12 @@ export const useErrorLogStore = defineStore({
       };
       if (error.response) {
         const {
-          config: { url = '', data: params = '', method = 'get', headers = {} } = {},
+          config: { url = "", data: params = "", method = "get", headers = {} } = {},
           data = {},
         } = error.response;
         errInfo.url = url;
-        errInfo.name = 'Ajax Error!';
-        errInfo.file = '-';
+        errInfo.name = "Ajax Error!";
+        errInfo.file = "-";
         errInfo.stack = JSON.stringify(data);
         errInfo.detail = JSON.stringify({ params, method, headers });
       }
diff --git a/src/store/modules/locale.ts b/src/store/modules/locale.ts
index 8d72ffc79cc0ab40e6b34519b52dc2dca1753426..d27f4e0aadf1d5ebee272e5cbf5ba72af737cea2 100644
--- a/src/store/modules/locale.ts
+++ b/src/store/modules/locale.ts
@@ -1,11 +1,11 @@
-import type { LocaleSetting, LocaleType } from '/#/config';
+import type { LocaleSetting, LocaleType } from "/#/config";
 
-import { defineStore } from 'pinia';
-import { store } from '/@/store';
+import { defineStore } from "pinia";
+import { store } from "/@/store";
 
-import { LOCALE_KEY } from '/@/enums/cacheEnum';
-import { createLocalStorage } from '/@/utils/cache';
-import { localeSetting } from '/@/settings/localeSetting';
+import { LOCALE_KEY } from "/@/enums/cacheEnum";
+import { createLocalStorage } from "/@/utils/cache";
+import { localeSetting } from "/@/settings/localeSetting";
 
 const ls = createLocalStorage();
 
@@ -16,7 +16,7 @@ interface LocaleState {
 }
 
 export const useLocaleStore = defineStore({
-  id: 'app-locale',
+  id: "app-locale",
   state: (): LocaleState => ({
     localInfo: lsLocaleSetting,
   }),
@@ -25,7 +25,7 @@ export const useLocaleStore = defineStore({
       return !!this.localInfo?.showPicker;
     },
     getLocale(): LocaleType {
-      return this.localInfo?.locale ?? 'zh_CN';
+      return this.localInfo?.locale ?? "zh_CN";
     },
   },
   actions: {
diff --git a/src/store/modules/lock.ts b/src/store/modules/lock.ts
index 6c22dbd10373556ca8c1cbdb5b9be56c62086fda..05d7e964c7c9b3b2ae874068ac164c9fceed7da7 100644
--- a/src/store/modules/lock.ts
+++ b/src/store/modules/lock.ts
@@ -1,17 +1,17 @@
-import type { LockInfo } from '/#/store';
+import type { LockInfo } from "/#/store";
 
-import { defineStore } from 'pinia';
+import { defineStore } from "pinia";
 
-import { LOCK_INFO_KEY } from '/@/enums/cacheEnum';
-import { Persistent } from '/@/utils/cache/persistent';
-import { useUserStore } from './user';
+import { LOCK_INFO_KEY } from "/@/enums/cacheEnum";
+import { Persistent } from "/@/utils/cache/persistent";
+import { useUserStore } from "./user";
 
 interface LockState {
   lockInfo: Nullable<LockInfo>;
 }
 
 export const useLockStore = defineStore({
-  id: 'app-lock',
+  id: "app-lock",
   state: (): LockState => ({
     lockInfo: Persistent.getLocal(LOCK_INFO_KEY),
   }),
@@ -43,7 +43,7 @@ export const useLockStore = defineStore({
             username,
             password: password!,
             goHome: false,
-            mode: 'none',
+            mode: "none",
           });
           if (res) {
             this.resetLockInfo();
diff --git a/src/store/modules/multipleTab.ts b/src/store/modules/multipleTab.ts
index 023e876656de92146ed25e8024a5c6f43540dcaf..afcc41bc290bb171b464352c504d82e5b5d5a6d4 100644
--- a/src/store/modules/multipleTab.ts
+++ b/src/store/modules/multipleTab.ts
@@ -1,19 +1,19 @@
-import type { RouteLocationNormalized, RouteLocationRaw, Router } from 'vue-router';
+import type { RouteLocationNormalized, RouteLocationRaw, Router } from "vue-router";
 
-import { toRaw, unref } from 'vue';
-import { defineStore } from 'pinia';
-import { store } from '/@/store';
+import { toRaw, unref } from "vue";
+import { defineStore } from "pinia";
+import { store } from "/@/store";
 
-import { useGo, useRedo } from '/@/hooks/web/usePage';
-import { Persistent } from '/@/utils/cache/persistent';
+import { useGo, useRedo } from "/@/hooks/web/usePage";
+import { Persistent } from "/@/utils/cache/persistent";
 
-import { PageEnum } from '/@/enums/pageEnum';
-import { PAGE_NOT_FOUND_ROUTE, REDIRECT_ROUTE } from '/@/router/routes/basic';
-import { getRawRoute } from '/@/utils';
-import { MULTIPLE_TABS_KEY } from '/@/enums/cacheEnum';
+import { PageEnum } from "/@/enums/pageEnum";
+import { PAGE_NOT_FOUND_ROUTE, REDIRECT_ROUTE } from "/@/router/routes/basic";
+import { getRawRoute } from "/@/utils";
+import { MULTIPLE_TABS_KEY } from "/@/enums/cacheEnum";
 
-import projectSetting from '/@/settings/projectSetting';
-import { useUserStore } from '/@/store/modules/user';
+import projectSetting from "/@/settings/projectSetting";
+import { useUserStore } from "/@/store/modules/user";
 
 export interface MultipleTabState {
   cacheTabList: Set<string>;
@@ -38,7 +38,7 @@ const getToTarget = (tabItem: RouteLocationNormalized) => {
 const cacheTab = projectSetting.multiTabsSetting.cache;
 
 export const useMultipleTabStore = defineStore({
-  id: 'app-multiple-tab',
+  id: "app-multiple-tab",
   state: (): MultipleTabState => ({
     // Tabs that need to be cached
     cacheTabList: new Set(),
@@ -155,10 +155,10 @@ export const useMultipleTabStore = defineStore({
           // 如果动态路由层级大于 0 了,那么就要限制该路由的打开数限制了
           // 首先获取到真实的路由,使用配置方式减少计算开销.
           // const realName: string = path.match(/(\S*)\//)![1];
-          const realPath = meta?.realPath ?? '';
+          const realPath = meta?.realPath ?? "";
           // 获取到已经打开的动态路由数, 判断是否大于某一个值
           if (
-            this.tabList.filter((e) => e.meta?.realPath ?? '' === realPath).length >= dynamicLevel
+            this.tabList.filter((e) => e.meta?.realPath ?? "" === realPath).length >= dynamicLevel
           ) {
             // 关闭第一个
             const index = this.tabList.findIndex((item) => item.meta.realPath === realPath);
diff --git a/src/store/modules/permission.ts b/src/store/modules/permission.ts
index aa9d0f4f776d86a0b05e28c48c39b31e8799db50..942b2ae834c72b2d95bd4d825be8ab967e13e197 100644
--- a/src/store/modules/permission.ts
+++ b/src/store/modules/permission.ts
@@ -1,51 +1,62 @@
-import type { AppRouteRecordRaw, Menu } from '/@/router/types';
+import type { AppRouteRecordRaw, Menu } from "/@/router/types";
 
-import { defineStore } from 'pinia';
-import { store } from '/@/store';
-import { useI18n } from '/@/hooks/web/useI18n';
-import { useUserStore } from './user';
-import { useAppStoreWithOut } from './app';
-import { toRaw } from 'vue';
-import { transformObjToRoute, flatMultiLevelRoutes } from '/@/router/helper/routeHelper';
-import { transformRouteToMenu } from '/@/router/helper/menuHelper';
+import { defineStore } from "pinia";
+import { store } from "/@/store";
+import { useI18n } from "/@/hooks/web/useI18n";
+import { useUserStore } from "./user";
+import { useAppStoreWithOut } from "./app";
+import { toRaw } from "vue";
+import { transformObjToRoute, flatMultiLevelRoutes } from "/@/router/helper/routeHelper";
+import { transformRouteToMenu } from "/@/router/helper/menuHelper";
 
-import projectSetting from '/@/settings/projectSetting';
+import projectSetting from "/@/settings/projectSetting";
 
-import { PermissionModeEnum } from '/@/enums/appEnum';
+import { PermissionModeEnum } from "/@/enums/appEnum";
 
-import { asyncRoutes } from '/@/router/routes';
-import { ERROR_LOG_ROUTE, PAGE_NOT_FOUND_ROUTE } from '/@/router/routes/basic';
+import { asyncRoutes } from "/@/router/routes";
+import { ERROR_LOG_ROUTE, PAGE_NOT_FOUND_ROUTE } from "/@/router/routes/basic";
 
-import { filter } from '/@/utils/helper/treeHelper';
+import { filter } from "/@/utils/helper/treeHelper";
 
-import { getMenuList } from '/@/api/sys/menu';
-import { getPermCode } from '/@/api/sys/user';
+import { getMenuList } from "/@/api/sys/menu";
+import { getPermCode } from "/@/api/sys/user";
 
-import { useMessage } from '/@/hooks/web/useMessage';
-import { PageEnum } from '/@/enums/pageEnum';
+import { useMessage } from "/@/hooks/web/useMessage";
+import { PageEnum } from "/@/enums/pageEnum";
 
 interface PermissionState {
   // Permission code list
+  // 权限代码列表
   permCodeList: string[] | number[];
   // Whether the route has been dynamically added
+  // 路由是否动态添加
   isDynamicAddedRoute: boolean;
   // To trigger a menu update
+  // 触发菜单更新
   lastBuildMenuTime: number;
   // Backstage menu list
+  // 后台菜单列表
   backMenuList: Menu[];
+  // 菜单列表
   frontMenuList: Menu[];
 }
+
 export const usePermissionStore = defineStore({
-  id: 'app-permission',
+  id: "app-permission",
   state: (): PermissionState => ({
+    // 权限代码列表
     permCodeList: [],
     // Whether the route has been dynamically added
+    // 路由是否动态添加
     isDynamicAddedRoute: false,
     // To trigger a menu update
+    // 触发菜单更新
     lastBuildMenuTime: 0,
     // Backstage menu list
+    // 后台菜单列表
     backMenuList: [],
     // menu List
+    // 菜单列表
     frontMenuList: [],
   }),
   getters: {
@@ -96,6 +107,8 @@ export const usePermissionStore = defineStore({
       const codeList = await getPermCode();
       this.setPermCodeList(codeList);
     },
+
+    // 构建路由
     async buildRoutesAction(): Promise<AppRouteRecordRaw[]> {
       const { t } = useI18n();
       const userStore = useUserStore();
@@ -105,16 +118,21 @@ export const usePermissionStore = defineStore({
       const roleList = toRaw(userStore.getRoleList) || [];
       const { permissionMode = projectSetting.permissionMode } = appStore.getProjectConfig;
 
+      // 路由过滤器 在 函数filter 作为回调传入遍历使用
       const routeFilter = (route: AppRouteRecordRaw) => {
         const { meta } = route;
+        // 抽出角色
         const { roles } = meta || {};
         if (!roles) return true;
+        // 进行角色权限判断
         return roleList.some((role) => roles.includes(role));
       };
 
       const routeRemoveIgnoreFilter = (route: AppRouteRecordRaw) => {
         const { meta } = route;
+        // ignoreRoute 为true 则路由仅用于菜单生成,不会在实际的路由表中出现
         const { ignoreRoute } = meta || {};
+        // arr.filter 返回 true 表示该元素通过测试
         return !ignoreRoute;
       };
 
@@ -124,22 +142,24 @@ export const usePermissionStore = defineStore({
       const patchHomeAffix = (routes: AppRouteRecordRaw[]) => {
         if (!routes || routes.length === 0) return;
         let homePath: string = userStore.getUserInfo.homePath || PageEnum.BASE_HOME;
-        function patcher(routes: AppRouteRecordRaw[], parentPath = '') {
-          if (parentPath) parentPath = parentPath + '/';
+
+        function patcher(routes: AppRouteRecordRaw[], parentPath = "") {
+          if (parentPath) parentPath = parentPath + "/";
           routes.forEach((route: AppRouteRecordRaw) => {
             const { path, children, redirect } = route;
-            const currentPath = path.startsWith('/') ? path : parentPath + path;
+            const currentPath = path.startsWith("/") ? path : parentPath + path;
             if (currentPath === homePath) {
               if (redirect) {
                 homePath = route.redirect! as string;
               } else {
                 route.meta = Object.assign({}, route.meta, { affix: true });
-                throw new Error('end');
+                throw new Error("end");
               }
             }
             children && children.length > 0 && patcher(children, currentPath);
           });
         }
+
         try {
           patcher(routes);
         } catch (e) {
@@ -149,55 +169,75 @@ export const usePermissionStore = defineStore({
       };
 
       switch (permissionMode) {
+        // 角色权限
         case PermissionModeEnum.ROLE:
+          // 对非一级路由进行过滤
           routes = filter(asyncRoutes, routeFilter);
+          // 对一级路由根据角色权限过滤
           routes = routes.filter(routeFilter);
           // Convert multi-level routing to level 2 routing
+          // 将多级路由转换为 2 级路由
           routes = flatMultiLevelRoutes(routes);
           break;
 
+        // 路由映射, 默认进入该case
         case PermissionModeEnum.ROUTE_MAPPING:
+          // 对非一级路由进行过滤
           routes = filter(asyncRoutes, routeFilter);
+          // 对一级路由再次根据角色权限过滤
           routes = routes.filter(routeFilter);
+          // 将路由转换成菜单
           const menuList = transformRouteToMenu(routes, true);
+          // 移除掉 ignoreRoute: true 的路由 非一级路由
           routes = filter(routes, routeRemoveIgnoreFilter);
+          // 移除掉 ignoreRoute: true 的路由 一级路由;
           routes = routes.filter(routeRemoveIgnoreFilter);
+          // 对菜单进行排序
           menuList.sort((a, b) => {
             return (a.meta?.orderNo || 0) - (b.meta?.orderNo || 0);
           });
 
+          // 设置菜单列表
           this.setFrontMenuList(menuList);
+
           // Convert multi-level routing to level 2 routing
+          // 将多级路由转换为 2 级路由
           routes = flatMultiLevelRoutes(routes);
           break;
 
         //  If you are sure that you do not need to do background dynamic permissions, please comment the entire judgment below
+        //  如果确定不需要做后台动态权限,请在下方评论整个判断
         case PermissionModeEnum.BACK:
           const { createMessage } = useMessage();
 
           createMessage.loading({
-            content: t('sys.app.menuLoading'),
+            content: t("sys.app.menuLoading"),
             duration: 1,
           });
 
           // !Simulate to obtain permission codes from the background,
+          // 模拟从后台获取权限码,
           // this function may only need to be executed once, and the actual project can be put at the right time by itself
+          // 这个功能可能只需要执行一次,实际项目可以自己放在合适的时间
           let routeList: AppRouteRecordRaw[] = [];
           try {
-            this.changePermissionCode();
+            await this.changePermissionCode();
             routeList = (await getMenuList()) as AppRouteRecordRaw[];
           } catch (error) {
             console.error(error);
           }
 
           // Dynamically introduce components
+          // 动态引入组件
           routeList = transformObjToRoute(routeList);
 
           //  Background routing to menu structure
+          //  后台路由到菜单结构
           const backMenuList = transformRouteToMenu(routeList);
           this.setBackMenuList(backMenuList);
 
           // remove meta.ignoreRoute item
+          // 删除 meta.ignoreRoute 项
           routeList = filter(routeList, routeRemoveIgnoreFilter);
           routeList = routeList.filter(routeRemoveIgnoreFilter);
 
@@ -214,6 +254,7 @@ export const usePermissionStore = defineStore({
 });
 
 // Need to be used outside the setup
+// 需要在设置之外使用
 export function usePermissionStoreWithOut() {
   return usePermissionStore(store);
 }
diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts
index 8461efdcbf460268230dadcbef1b8209c9dad2bb..6f162083ca108f99785f2ba4e8c6d0ddd4f16530 100644
--- a/src/store/modules/user.ts
+++ b/src/store/modules/user.ts
@@ -1,21 +1,21 @@
-import type { UserInfo } from '/#/store';
-import type { ErrorMessageMode } from '/#/axios';
-import { defineStore } from 'pinia';
-import { store } from '/@/store';
-import { RoleEnum } from '/@/enums/roleEnum';
-import { PageEnum } from '/@/enums/pageEnum';
-import { ROLES_KEY, TOKEN_KEY, USER_INFO_KEY } from '/@/enums/cacheEnum';
-import { getAuthCache, setAuthCache } from '/@/utils/auth';
-import { GetUserInfoModel, LoginParams } from '/@/api/sys/model/userModel';
-import { doLogout, getUserInfo, loginApi } from '/@/api/sys/user';
-import { useI18n } from '/@/hooks/web/useI18n';
-import { useMessage } from '/@/hooks/web/useMessage';
-import { router } from '/@/router';
-import { usePermissionStore } from '/@/store/modules/permission';
-import { RouteRecordRaw } from 'vue-router';
-import { PAGE_NOT_FOUND_ROUTE } from '/@/router/routes/basic';
-import { isArray } from '/@/utils/is';
-import { h } from 'vue';
+import type { UserInfo } from "/#/store";
+import type { ErrorMessageMode } from "/#/axios";
+import { defineStore } from "pinia";
+import { store } from "/@/store";
+import { RoleEnum } from "/@/enums/roleEnum";
+import { PageEnum } from "/@/enums/pageEnum";
+import { ROLES_KEY, TOKEN_KEY, USER_INFO_KEY } from "/@/enums/cacheEnum";
+import { getAuthCache, setAuthCache } from "/@/utils/auth";
+import { GetUserInfoModel, LoginParams } from "/@/api/sys/model/userModel";
+import { doLogout, getUserInfo, loginApi } from "/@/api/sys/user";
+import { useI18n } from "/@/hooks/web/useI18n";
+import { useMessage } from "/@/hooks/web/useMessage";
+import { router } from "/@/router";
+import { usePermissionStore } from "/@/store/modules/permission";
+import { RouteRecordRaw } from "vue-router";
+import { PAGE_NOT_FOUND_ROUTE } from "/@/router/routes/basic";
+import { isArray } from "/@/utils/is";
+import { h } from "vue";
 
 interface UserState {
   userInfo: Nullable<UserInfo>;
@@ -26,7 +26,7 @@ interface UserState {
 }
 
 export const useUserStore = defineStore({
-  id: 'app-user',
+  id: "app-user",
   state: (): UserState => ({
     // user info
     userInfo: null,
@@ -58,7 +58,7 @@ export const useUserStore = defineStore({
   },
   actions: {
     setToken(info: string | undefined) {
-      this.token = info ? info : ''; // for null or undefined value
+      this.token = info ? info : ""; // for null or undefined value
       setAuthCache(TOKEN_KEY, info);
     },
     setRoleList(roleList: RoleEnum[]) {
@@ -75,7 +75,7 @@ export const useUserStore = defineStore({
     },
     resetState() {
       this.userInfo = null;
-      this.token = '';
+      this.token = "";
       this.roleList = [];
       this.sessionTimeout = false;
     },
@@ -144,7 +144,7 @@ export const useUserStore = defineStore({
         try {
           await doLogout();
         } catch {
-          console.log('注销Token失败');
+          console.log("注销Token失败");
         }
       }
       this.setToken(undefined);
@@ -160,9 +160,9 @@ export const useUserStore = defineStore({
       const { createConfirm } = useMessage();
       const { t } = useI18n();
       createConfirm({
-        iconType: 'warning',
-        title: () => h('span', t('sys.app.logoutTip')),
-        content: () => h('span', t('sys.app.logoutMessage')),
+        iconType: "warning",
+        title: () => h("span", t("sys.app.logoutTip")),
+        content: () => h("span", t("sys.app.logoutMessage")),
         onOk: async () => {
           await this.logout(true);
         },
diff --git a/src/utils/auth/index.ts b/src/utils/auth/index.ts
index fdec83621b122b06fbb04ce19b9f22e0c27c93e6..15c2c2396c3de03e213f2c970c5e1a6d1a496344 100644
--- a/src/utils/auth/index.ts
+++ b/src/utils/auth/index.ts
@@ -1,7 +1,7 @@
-import { Persistent, BasicKeys } from '/@/utils/cache/persistent';
-import { CacheTypeEnum } from '/@/enums/cacheEnum';
-import projectSetting from '/@/settings/projectSetting';
-import { TOKEN_KEY } from '/@/enums/cacheEnum';
+import { Persistent, BasicKeys } from "/@/utils/cache/persistent";
+import { CacheTypeEnum } from "/@/enums/cacheEnum";
+import projectSetting from "/@/settings/projectSetting";
+import { TOKEN_KEY } from "/@/enums/cacheEnum";
 
 const { permissionCacheType } = projectSetting;
 const isLocal = permissionCacheType === CacheTypeEnum.LOCAL;
diff --git a/src/utils/bem.ts b/src/utils/bem.ts
new file mode 100644
index 0000000000000000000000000000000000000000..059815e644a92e76a17be9e3f9748b66b8e8c4e1
--- /dev/null
+++ b/src/utils/bem.ts
@@ -0,0 +1,52 @@
+import { prefixCls } from "/@/settings/designSetting";
+
+type Mod = string | { [key: string]: any };
+type Mods = Mod | Mod[];
+
+export type BEM = ReturnType<typeof createBEM>;
+
+function genBem(name: string, mods?: Mods): string {
+  if (!mods) {
+    return "";
+  }
+
+  if (typeof mods === "string") {
+    return ` ${name}--${mods}`;
+  }
+
+  if (Array.isArray(mods)) {
+    return mods.reduce<string>((ret, item) => ret + genBem(name, item), "");
+  }
+
+  return Object.keys(mods).reduce((ret, key) => ret + (mods[key] ? genBem(name, key) : ""), "");
+}
+
+/**
+ * bem helper
+ * b() // 'button'
+ * b('text') // 'button__text'
+ * b({ disabled }) // 'button button--disabled'
+ * b('text', { disabled }) // 'button__text button__text--disabled'
+ * b(['disabled', 'primary']) // 'button button--disabled button--primary'
+ */
+export function buildBEM(name: string) {
+  return (el?: Mods, mods?: Mods): Mods => {
+    if (el && typeof el !== "string") {
+      mods = el;
+      el = "";
+    }
+
+    el = el ? `${name}__${el}` : name;
+
+    return `${el}${genBem(el, mods)}`;
+  };
+}
+
+export function createBEM(name: string) {
+  return [buildBEM(`${prefixCls}-${name}`)];
+}
+
+export function createNamespace(name: string) {
+  const prefixedName = `${prefixCls}-${name}`;
+  return [prefixedName, buildBEM(prefixedName)] as const;
+}
diff --git a/src/utils/cache/index.ts b/src/utils/cache/index.ts
index 2004c66395b0a41156786572cc94803f644bb249..ef1cad4d7464d7d27916f87acf81859a8324589b 100644
--- a/src/utils/cache/index.ts
+++ b/src/utils/cache/index.ts
@@ -1,7 +1,7 @@
-import { getStorageShortName } from '/@/utils/env';
-import { createStorage as create, CreateStorageParams } from './storageCache';
-import { enableStorageEncryption } from '/@/settings/encryptionSetting';
-import { DEFAULT_CACHE_TIME } from '/@/settings/encryptionSetting';
+import { getStorageShortName } from "/@/utils/env";
+import { createStorage as create, CreateStorageParams } from "./storageCache";
+import { enableStorageEncryption } from "/@/settings/encryptionSetting";
+import { DEFAULT_CACHE_TIME } from "/@/settings/encryptionSetting";
 
 export type Options = Partial<CreateStorageParams>;
 
diff --git a/src/utils/cache/memory.ts b/src/utils/cache/memory.ts
index 76e30a92187b3d15541b3d2958b65b4ec65fa568..08a0a6470cc5a9bd086e1762cf467da4735c8906 100644
--- a/src/utils/cache/memory.ts
+++ b/src/utils/cache/memory.ts
@@ -58,7 +58,12 @@ export class Memory<T = any, V = any> {
       return value;
     }
     const now = new Date().getTime();
-    item.time = now + this.alive;
+    /**
+     * Prevent overflow of the setTimeout Maximum delay value
+     * Maximum delay value 2,147,483,647 ms
+     * https://developer.mozilla.org/en-US/docs/Web/API/setTimeout#maximum_delay_value
+     */
+    item.time = expires > now ? expires : now + expires;
     item.timeoutId = setTimeout(
       () => {
         this.remove(key);
diff --git a/src/utils/cache/persistent.ts b/src/utils/cache/persistent.ts
index cd68a366b683828e8296835ff32f4fe31ac0d563..ac001c2fb70ac37c156e7b965416886c887e51c6 100644
--- a/src/utils/cache/persistent.ts
+++ b/src/utils/cache/persistent.ts
@@ -1,9 +1,9 @@
-import type { LockInfo, UserInfo } from '/#/store';
-import type { ProjectConfig } from '/#/config';
-import type { RouteLocationNormalized } from 'vue-router';
+import type { LockInfo, UserInfo } from "/#/store";
+import type { ProjectConfig } from "/#/config";
+import type { RouteLocationNormalized } from "vue-router";
 
-import { createLocalStorage, createSessionStorage } from '/@/utils/cache';
-import { Memory } from './memory';
+import { createLocalStorage, createSessionStorage } from "/@/utils/cache";
+import { Memory } from "./memory";
 import {
   TOKEN_KEY,
   USER_INFO_KEY,
@@ -13,10 +13,10 @@ import {
   APP_LOCAL_CACHE_KEY,
   APP_SESSION_CACHE_KEY,
   MULTIPLE_TABS_KEY,
-} from '/@/enums/cacheEnum';
-import { DEFAULT_CACHE_TIME } from '/@/settings/encryptionSetting';
-import { toRaw } from 'vue';
-import { pick, omit } from 'lodash-es';
+} from "/@/enums/cacheEnum";
+import { DEFAULT_CACHE_TIME } from "/@/settings/encryptionSetting";
+import { toRaw } from "vue";
+import { pick, omit } from "lodash-es";
 
 interface BasicStore {
   [TOKEN_KEY]: string | number | null | undefined;
@@ -96,7 +96,7 @@ export class Persistent {
   }
 }
 
-window.addEventListener('beforeunload', function () {
+window.addEventListener("beforeunload", function () {
   // TOKEN_KEY 在登录或注销时已经写入到storage了,此处为了解决同时打开多个窗口时token不同步的问题
   // LOCK_INFO_KEY 在锁屏和解锁时写入,此处也不应修改
   ls.set(APP_LOCAL_CACHE_KEY, {
@@ -127,6 +127,6 @@ function storageChange(e: any) {
   }
 }
 
-window.addEventListener('storage', storageChange);
+window.addEventListener("storage", storageChange);
 
 initPersistentMemory();
diff --git a/src/utils/cache/storageCache.ts b/src/utils/cache/storageCache.ts
index 8562665a92b5c5bba2616d047dec43c68b62dce4..b3cdc6fa50b62737b8029c11c9b4ae43bc9f6ccd 100644
--- a/src/utils/cache/storageCache.ts
+++ b/src/utils/cache/storageCache.ts
@@ -1,10 +1,7 @@
-import { cacheCipher } from '/@/settings/encryptionSetting';
-
-import type { EncryptionParams } from '/@/utils/cipher';
-
-import { AesEncryption } from '/@/utils/cipher';
-
-import { isNullOrUnDef } from '/@/utils/is';
+import { cacheCipher } from "/@/settings/encryptionSetting";
+import type { EncryptionParams } from "/@/utils/cipher";
+import { AesEncryption } from "/@/utils/cipher";
+import { isNullOrUnDef } from "/@/utils/is";
 
 export interface CreateStorageParams extends EncryptionParams {
   prefixKey: string;
@@ -13,7 +10,7 @@ export interface CreateStorageParams extends EncryptionParams {
   timeout?: Nullable<number>;
 }
 export const createStorage = ({
-  prefixKey = '',
+  prefixKey = "",
   storage = sessionStorage,
   key = cacheCipher.key,
   iv = cacheCipher.iv,
@@ -21,14 +18,14 @@ export const createStorage = ({
   hasEncrypt = true,
 }: Partial<CreateStorageParams> = {}) => {
   if (hasEncrypt && [key.length, iv.length].some((item) => item !== 16)) {
-    throw new Error('When hasEncrypt is true, the key or iv must be 16 bits!');
+    throw new Error("When hasEncrypt is true, the key or iv must be 16 bits!");
   }
 
   const encryption = new AesEncryption({ key, iv });
 
   /**
-   *Cache class
-   *Construction parameters can be passed into sessionStorage, localStorage,
+   * Cache class
+   * Construction parameters can be passed into sessionStorage, localStorage,
    * @class Cache
    * @example
    */
@@ -53,11 +50,10 @@ export const createStorage = ({
     }
 
     /**
-     *
-     *  Set cache
+     * Set cache
      * @param {string} key
      * @param {*} value
-     * @expire Expiration time in seconds
+     * @param {*} expire Expiration time in seconds
      * @memberof Cache
      */
     set(key: string, value: any, expire: number | null = timeout) {
@@ -73,8 +69,9 @@ export const createStorage = ({
     }
 
     /**
-     *Read cache
+     * Read cache
      * @param {string} key
+     * @param {*} def
      * @memberof Cache
      */
     get(key: string, def: any = null): any {
diff --git a/src/utils/cipher.ts b/src/utils/cipher.ts
index 9a8a89a91d2633e563fd9a966bcfafb39da31a42..7e28edebe79e6e15c8079f52e8083bcd99a4d7e3 100644
--- a/src/utils/cipher.ts
+++ b/src/utils/cipher.ts
@@ -1,10 +1,10 @@
-import { encrypt, decrypt } from 'crypto-js/aes';
-import { parse } from 'crypto-js/enc-utf8';
-import pkcs7 from 'crypto-js/pad-pkcs7';
-import ECB from 'crypto-js/mode-ecb';
-import md5 from 'crypto-js/md5';
-import UTF8 from 'crypto-js/enc-utf8';
-import Base64 from 'crypto-js/enc-base64';
+import { encrypt, decrypt } from "crypto-js/aes";
+import { parse } from "crypto-js/enc-utf8";
+import pkcs7 from "crypto-js/pad-pkcs7";
+import ECB from "crypto-js/mode-ecb";
+import md5 from "crypto-js/md5";
+import UTF8 from "crypto-js/enc-utf8";
+import Base64 from "crypto-js/enc-base64";
 
 export interface EncryptionParams {
   key: string;
diff --git a/src/utils/color.ts b/src/utils/color.ts
index 67a6b5624eb32accc455f042c14b5c4bf71b4c51..5d1a59ebb590d4718a172c47c35dd605dd065b1e 100644
--- a/src/utils/color.ts
+++ b/src/utils/color.ts
@@ -22,7 +22,7 @@ export function isHexColor(color: string) {
 export function rgbToHex(r: number, g: number, b: number) {
   // tslint:disable-next-line:no-bitwise
   const hex = ((r << 16) | (g << 8) | b).toString(16);
-  return '#' + new Array(Math.abs(hex.length - 7)).join('0') + hex;
+  return "#" + new Array(Math.abs(hex.length - 7)).join("0") + hex;
 }
 
 /**
@@ -34,7 +34,7 @@ export function hexToRGB(hex: string) {
   let sHex = hex.toLowerCase();
   if (isHexColor(hex)) {
     if (sHex.length === 4) {
-      let sColorNew = '#';
+      let sColorNew = "#";
       for (let i = 1; i < 4; i += 1) {
         sColorNew += sHex.slice(i, i + 1).concat(sHex.slice(i, i + 1));
       }
@@ -42,9 +42,9 @@ export function hexToRGB(hex: string) {
     }
     const sColorChange: number[] = [];
     for (let i = 1; i < 7; i += 2) {
-      sColorChange.push(parseInt('0x' + sHex.slice(i, i + 2)));
+      sColorChange.push(parseInt("0x" + sHex.slice(i, i + 2)));
     }
-    return 'RGB(' + sColorChange.join(',') + ')';
+    return "RGB(" + sColorChange.join(",") + ")";
   }
   return sHex;
 }
@@ -52,8 +52,8 @@ export function hexToRGB(hex: string) {
 export function colorIsDark(color: string) {
   if (!isHexColor(color)) return;
   const [r, g, b] = hexToRGB(color)
-    .replace(/(?:\(|\)|rgb|RGB)*/g, '')
-    .split(',')
+    .replace(/(?:\(|\)|rgb|RGB)*/g, "")
+    .split(",")
     .map((item) => Number(item));
   return r * 0.299 + g * 0.578 + b * 0.114 < 192;
 }
@@ -65,7 +65,7 @@ export function colorIsDark(color: string) {
  * @returns {string} The HEX representation of the processed color
  */
 export function darken(color: string, amount: number) {
-  color = color.indexOf('#') >= 0 ? color.substring(1, color.length) : color;
+  color = color.indexOf("#") >= 0 ? color.substring(1, color.length) : color;
   amount = Math.trunc((255 * amount) / 100);
   return `#${subtractLight(color.substring(0, 2), amount)}${subtractLight(
     color.substring(2, 4),
@@ -80,7 +80,7 @@ export function darken(color: string, amount: number) {
  * @returns {string} The processed color represented as HEX
  */
 export function lighten(color: string, amount: number) {
-  color = color.indexOf('#') >= 0 ? color.substring(1, color.length) : color;
+  color = color.indexOf("#") >= 0 ? color.substring(1, color.length) : color;
   amount = Math.trunc((255 * amount) / 100);
   return `#${addLight(color.substring(0, 2), amount)}${addLight(
     color.substring(2, 4),
@@ -133,9 +133,9 @@ function contrast(rgb1: string[], rgb2: number[]) {
  */
 export function calculateBestTextColor(hexColor: string) {
   const rgbColor = hexToRGB(hexColor.substring(1));
-  const contrastWithBlack = contrast(rgbColor.split(','), [0, 0, 0]);
+  const contrastWithBlack = contrast(rgbColor.split(","), [0, 0, 0]);
 
-  return contrastWithBlack >= 12 ? '#000000' : '#FFFFFF';
+  return contrastWithBlack >= 12 ? "#000000" : "#FFFFFF";
 }
 
 /**
diff --git a/src/utils/dateUtil.ts b/src/utils/dateUtil.ts
index 1ea9724990d0d616c0611dfe0d495e750d0ddb37..33a185e729049114d9de55a8aeba40c6a85fd783 100644
--- a/src/utils/dateUtil.ts
+++ b/src/utils/dateUtil.ts
@@ -1,20 +1,23 @@
 /**
  * Independent time operation tool to facilitate subsequent switch to dayjs
  */
-import moment from 'moment';
+import dayjs from "dayjs";
 
-const DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm:ss';
-const DATE_FORMAT = 'YYYY-MM-DD ';
+const DATE_TIME_FORMAT = "YYYY-MM-DD HH:mm:ss";
+const DATE_FORMAT = "YYYY-MM-DD";
 
 export function formatToDateTime(
-  date: moment.MomentInput = undefined,
+  date: dayjs.Dayjs | undefined = undefined,
   format = DATE_TIME_FORMAT,
 ): string {
-  return moment(date).format(format);
+  return dayjs(date).format(format);
 }
 
-export function formatToDate(date: moment.MomentInput = undefined, format = DATE_FORMAT): string {
-  return moment(date).format(format);
+export function formatToDate(
+  date: dayjs.Dayjs | undefined = undefined,
+  format = DATE_FORMAT,
+): string {
+  return dayjs(date).format(format);
 }
 
-export const dateUtil = moment;
+export const dateUtil = dayjs;
diff --git a/src/utils/domUtils.ts b/src/utils/domUtils.ts
index 7efe9cb8883c629e1cc12f40d157b7605a3e9efd..15a069f994d707d6862c5f76ebc0ea672e7cfb94 100644
--- a/src/utils/domUtils.ts
+++ b/src/utils/domUtils.ts
@@ -1,5 +1,5 @@
-import type { FunctionArgs } from '@vueuse/core';
-import { upperFirst } from 'lodash-es';
+import type { FunctionArgs } from "@vueuse/core";
+import { upperFirst } from "lodash-es";
 
 export interface ViewportOffsetResult {
   left: number;
@@ -18,17 +18,17 @@ export function getBoundingClientRect(element: Element): DOMRect | number {
 }
 
 function trim(string: string) {
-  return (string || '').replace(/^[\s\uFEFF]+|[\s\uFEFF]+$/g, '');
+  return (string || "").replace(/^[\s\uFEFF]+|[\s\uFEFF]+$/g, "");
 }
 
 /* istanbul ignore next */
 export function hasClass(el: Element, cls: string) {
   if (!el || !cls) return false;
-  if (cls.indexOf(' ') !== -1) throw new Error('className should not contain space.');
+  if (cls.indexOf(" ") !== -1) throw new Error("className should not contain space.");
   if (el.classList) {
     return el.classList.contains(cls);
   } else {
-    return (' ' + el.className + ' ').indexOf(' ' + cls + ' ') > -1;
+    return (" " + el.className + " ").indexOf(" " + cls + " ") > -1;
   }
 }
 
@@ -36,7 +36,7 @@ export function hasClass(el: Element, cls: string) {
 export function addClass(el: Element, cls: string) {
   if (!el) return;
   let curClass = el.className;
-  const classes = (cls || '').split(' ');
+  const classes = (cls || "").split(" ");
 
   for (let i = 0, j = classes.length; i < j; i++) {
     const clsName = classes[i];
@@ -45,7 +45,7 @@ export function addClass(el: Element, cls: string) {
     if (el.classList) {
       el.classList.add(clsName);
     } else if (!hasClass(el, clsName)) {
-      curClass += ' ' + clsName;
+      curClass += " " + clsName;
     }
   }
   if (!el.classList) {
@@ -56,8 +56,8 @@ export function addClass(el: Element, cls: string) {
 /* istanbul ignore next */
 export function removeClass(el: Element, cls: string) {
   if (!el || !cls) return;
-  const classes = cls.split(' ');
-  let curClass = ' ' + el.className + ' ';
+  const classes = cls.split(" ");
+  let curClass = " " + el.className + " ";
 
   for (let i = 0, j = classes.length; i < j; i++) {
     const clsName = classes[i];
@@ -66,7 +66,7 @@ export function removeClass(el: Element, cls: string) {
     if (el.classList) {
       el.classList.remove(clsName);
     } else if (hasClass(el, clsName)) {
-      curClass = curClass.replace(' ' + clsName + ' ', ' ');
+      curClass = curClass.replace(" " + clsName + " ", " ");
     }
   }
   if (!el.classList) {
@@ -120,7 +120,7 @@ export function getViewportOffset(element: Element): ViewportOffsetResult {
 }
 
 export function hackCss(attr: string, value: string) {
-  const prefix: string[] = ['webkit', 'Moz', 'ms', 'OT'];
+  const prefix: string[] = ["webkit", "Moz", "ms", "OT"];
 
   const styleObj: any = {};
   prefix.forEach((item) => {
diff --git a/src/utils/env.ts b/src/utils/env.ts
index 408398a632b656f18c32cfe2456d3abffdeb1976..29ebeaf5ae13088ef36ec0b218f8f31af2bbe8db 100644
--- a/src/utils/env.ts
+++ b/src/utils/env.ts
@@ -1,8 +1,8 @@
-import type { GlobEnvConfig } from '/#/config';
+import type { GlobEnvConfig } from "/#/config";
 
-import { warn } from '/@/utils/log';
-import pkg from '../../package.json';
-import { getConfigFileName } from '../../build/getConfigFileName';
+import { warn } from "/@/utils/log";
+import pkg from "../../package.json";
+import { getConfigFileName } from "../../build/getConfigFileName";
 
 export function getCommonStoragePrefix() {
   const { VITE_GLOB_APP_SHORT_NAME } = getAppEnvConfig();
@@ -48,12 +48,12 @@ export function getAppEnvConfig() {
 /**
  * @description: Development mode
  */
-export const devMode = 'development';
+export const devMode = "development";
 
 /**
  * @description: Production mode
  */
-export const prodMode = 'production';
+export const prodMode = "production";
 
 /**
  * @description: Get environment variables
diff --git a/src/utils/event/index.ts b/src/utils/event/index.ts
index 3a60d7cdc08663166196cbca7582d7cf76c52965..9234c0fa4599637f89dde05b6df1ac662237f874 100644
--- a/src/utils/event/index.ts
+++ b/src/utils/event/index.ts
@@ -1,6 +1,6 @@
-import ResizeObserver from 'resize-observer-polyfill';
+import ResizeObserver from "resize-observer-polyfill";
 
-const isServer = typeof window === 'undefined';
+const isServer = typeof window === "undefined";
 
 /* istanbul ignore next */
 function resizeHandler(entries: any[]) {
@@ -35,8 +35,8 @@ export function removeResizeListener(element: any, fn: () => any) {
 }
 
 export function triggerWindowResize() {
-  const event = document.createEvent('HTMLEvents');
-  event.initEvent('resize', true, true);
-  (event as any).eventType = 'message';
+  const event = document.createEvent("HTMLEvents");
+  event.initEvent("resize", true, true);
+  (event as any).eventType = "message";
   window.dispatchEvent(event);
 }
diff --git a/src/utils/factory/createAsyncComponent.tsx b/src/utils/factory/createAsyncComponent.tsx
index 4f668adee1ac7928924a3184340c4e205614f075..fba03dbcfe1d4a51cdc2c7fc34008cdc091a75ea 100644
--- a/src/utils/factory/createAsyncComponent.tsx
+++ b/src/utils/factory/createAsyncComponent.tsx
@@ -1,9 +1,9 @@
 import {
   defineAsyncComponent,
   // FunctionalComponent, CSSProperties
-} from 'vue';
-import { Spin } from 'ant-design-vue';
-import { noop } from '/@/utils/index';
+} from "vue";
+import { Spin } from "ant-design-vue";
+import { noop } from "/@/utils";
 
 // const Loading: FunctionalComponent<{ size: 'small' | 'default' | 'large' }> = (props) => {
 //   const style: CSSProperties = {
@@ -20,7 +20,7 @@ import { noop } from '/@/utils/index';
 // };
 
 interface Options {
-  size?: 'default' | 'small' | 'large';
+  size?: "default" | "small" | "large";
   delay?: number;
   timeout?: number;
   loading?: boolean;
@@ -28,7 +28,7 @@ interface Options {
 }
 
 export function createAsyncComponent(loader: Fn, options: Options = {}) {
-  const { size = 'small', delay = 100, timeout = 30000, loading = false, retry = true } = options;
+  const { size = "small", delay = 100, timeout = 30000, loading = false, retry = true } = options;
   return defineAsyncComponent({
     loader,
     loadingComponent: loading ? <Spin spinning={true} size={size} /> : undefined,
diff --git a/src/utils/file/base64Conver.ts b/src/utils/file/base64Conver.ts
index d77618a0aa3d0e7593160156377f291d765a2280..94433d64e956c8aef93ea892ef5a0b1192b292c0 100644
--- a/src/utils/file/base64Conver.ts
+++ b/src/utils/file/base64Conver.ts
@@ -2,10 +2,10 @@
  * @description: base64 to blob
  */
 export function dataURLtoBlob(base64Buf: string): Blob {
-  const arr = base64Buf.split(',');
+  const arr = base64Buf.split(",");
   const typeItem = arr[0];
   const mime = typeItem.match(/:(.*?);/)![1];
-  const bstr = atob(arr[1]);
+  const bstr = window.atob(arr[1]);
   let n = bstr.length;
   const u8arr = new Uint8Array(n);
   while (n--) {
@@ -20,11 +20,11 @@ export function dataURLtoBlob(base64Buf: string): Blob {
  */
 export function urlToBase64(url: string, mineType?: string): Promise<string> {
   return new Promise((resolve, reject) => {
-    let canvas = document.createElement('CANVAS') as Nullable<HTMLCanvasElement>;
-    const ctx = canvas!.getContext('2d');
+    let canvas = document.createElement("CANVAS") as Nullable<HTMLCanvasElement>;
+    const ctx = canvas!.getContext("2d");
 
     const img = new Image();
-    img.crossOrigin = '';
+    img.crossOrigin = "";
     img.onload = function () {
       if (!canvas || !ctx) {
         return reject();
@@ -32,7 +32,7 @@ export function urlToBase64(url: string, mineType?: string): Promise<string> {
       canvas.height = img.height;
       canvas.width = img.width;
       ctx.drawImage(img, 0, 0);
-      const dataURL = canvas.toDataURL(mineType || 'image/png');
+      const dataURL = canvas.toDataURL(mineType || "image/png");
       canvas = null;
       resolve(dataURL);
     };
diff --git a/src/utils/file/download.ts b/src/utils/file/download.ts
index 6af9ab461fad988319dc465c5b56c70ee6e3a091..0f4f8fa896955a0d0dbcaf2f7bc998a1c693849d 100644
--- a/src/utils/file/download.ts
+++ b/src/utils/file/download.ts
@@ -1,5 +1,5 @@
-import { openWindow } from '..';
-import { dataURLtoBlob, urlToBase64 } from './base64Conver';
+import { openWindow } from "..";
+import { dataURLtoBlob, urlToBase64 } from "./base64Conver";
 
 /**
  * Download online pictures
@@ -34,16 +34,16 @@ export function downloadByBase64(buf: string, filename: string, mime?: string, b
  * @param {*} bom
  */
 export function downloadByData(data: BlobPart, filename: string, mime?: string, bom?: BlobPart) {
-  const blobData = typeof bom !== 'undefined' ? [bom, data] : [data];
-  const blob = new Blob(blobData, { type: mime || 'application/octet-stream' });
+  const blobData = typeof bom !== "undefined" ? [bom, data] : [data];
+  const blob = new Blob(blobData, { type: mime || "application/octet-stream" });
 
   const blobURL = window.URL.createObjectURL(blob);
-  const tempLink = document.createElement('a');
-  tempLink.style.display = 'none';
+  const tempLink = document.createElement("a");
+  tempLink.style.display = "none";
   tempLink.href = blobURL;
-  tempLink.setAttribute('download', filename);
-  if (typeof tempLink.download === 'undefined') {
-    tempLink.setAttribute('target', '_blank');
+  tempLink.setAttribute("download", filename);
+  if (typeof tempLink.download === "undefined") {
+    tempLink.setAttribute("target", "_blank");
   }
   document.body.appendChild(tempLink);
   tempLink.click();
@@ -57,38 +57,38 @@ export function downloadByData(data: BlobPart, filename: string, mime?: string,
  */
 export function downloadByUrl({
   url,
-  target = '_blank',
+  target = "_blank",
   fileName,
 }: {
   url: string;
   target?: TargetContext;
   fileName?: string;
 }): boolean {
-  const isChrome = window.navigator.userAgent.toLowerCase().indexOf('chrome') > -1;
-  const isSafari = window.navigator.userAgent.toLowerCase().indexOf('safari') > -1;
+  const isChrome = window.navigator.userAgent.toLowerCase().indexOf("chrome") > -1;
+  const isSafari = window.navigator.userAgent.toLowerCase().indexOf("safari") > -1;
 
   if (/(iP)/g.test(window.navigator.userAgent)) {
-    console.error('Your browser does not support download!');
+    console.error("Your browser does not support download!");
     return false;
   }
   if (isChrome || isSafari) {
-    const link = document.createElement('a');
+    const link = document.createElement("a");
     link.href = url;
     link.target = target;
 
     if (link.download !== undefined) {
-      link.download = fileName || url.substring(url.lastIndexOf('/') + 1, url.length);
+      link.download = fileName || url.substring(url.lastIndexOf("/") + 1, url.length);
     }
 
     if (document.createEvent) {
-      const e = document.createEvent('MouseEvents');
-      e.initEvent('click', true, true);
+      const e = document.createEvent("MouseEvents");
+      e.initEvent("click", true, true);
       link.dispatchEvent(e);
       return true;
     }
   }
-  if (url.indexOf('?') === -1) {
-    url += '?download';
+  if (url.indexOf("?") === -1) {
+    url += "?download";
   }
 
   openWindow(url, { target });
diff --git a/src/utils/helper/treeHelper.ts b/src/utils/helper/treeHelper.ts
index 0535af7babd56713ae6be0be328e2aa1ec37a357..562c65322a9e84fa558446776d86fddc392fa358 100644
--- a/src/utils/helper/treeHelper.ts
+++ b/src/utils/helper/treeHelper.ts
@@ -3,15 +3,19 @@ interface TreeHelperConfig {
   children: string;
   pid: string;
 }
+
+// 默认配置
 const DEFAULT_CONFIG: TreeHelperConfig = {
-  id: 'id',
-  children: 'children',
-  pid: 'pid',
+  id: "id",
+  children: "children",
+  pid: "pid",
 };
 
+// 获取配置。  Object.assign 从一个或多个源对象复制到目标对象
 const getConfig = (config: Partial<TreeHelperConfig>) => Object.assign({}, DEFAULT_CONFIG, config);
 
 // tree from list
+// 列表中的树
 export function listToTree<T = any>(list: any[], config: Partial<TreeHelperConfig> = {}): T[] {
   const conf = getConfig(config) as TreeHelperConfig;
   const nodeMap = new Map();
@@ -24,7 +28,7 @@ export function listToTree<T = any>(list: any[], config: Partial<TreeHelperConfi
   }
   for (const node of list) {
     const parent = nodeMap.get(node[pid]);
-    (parent ? parent.children : result).push(node);
+    (parent ? parent[children] : result).push(node);
   }
   return result;
 }
@@ -123,18 +127,24 @@ export function findPathAll(tree: any, func: Fn, config: Partial<TreeHelperConfi
 export function filter<T = any>(
   tree: T[],
   func: (n: T) => boolean,
+  // Partial 将 T 中的所有属性设为可选
   config: Partial<TreeHelperConfig> = {},
 ): T[] {
+  // 获取配置
   config = getConfig(config);
   const children = config.children as string;
+
   function listFilter(list: T[]) {
     return list
       .map((node: any) => ({ ...node }))
       .filter((node) => {
+        // 递归调用 对含有children项  进行再次调用自身函数 listFilter
         node[children] = node[children] && listFilter(node[children]);
+        // 执行传入的回调 func 进行过滤
         return func(node) || (node[children] && node[children].length);
       });
   }
+
   return listFilter(tree);
 }
 
@@ -157,6 +167,7 @@ export function forEach<T = any>(
 
 /**
  * @description: Extract tree specified structure
+ * @description: 提取树指定结构
  */
 export function treeMap<T = any>(treeData: T[], opt: { children?: string; conversion: Fn }): T[] {
   return treeData.map((item) => treeMapEach(item, opt));
@@ -164,10 +175,11 @@ export function treeMap<T = any>(treeData: T[], opt: { children?: string; conver
 
 /**
  * @description: Extract tree specified structure
+ * @description: 提取树指定结构
  */
 export function treeMapEach(
   data: any,
-  { children = 'children', conversion }: { children?: string; conversion: Fn },
+  { children = "children", conversion }: { children?: string; conversion: Fn },
 ) {
   const haveChildren = Array.isArray(data[children]) && data[children].length > 0;
   const conversionData = conversion(data) || {};
@@ -187,3 +199,18 @@ export function treeMapEach(
     };
   }
 }
+
+/**
+ * 递归遍历树结构
+ * @param treeDatas 树
+ * @param callBack 回调
+ * @param parentNode 父节点
+ */
+export function eachTree(treeDatas: any[], callBack: Fn, parentNode = {}) {
+  treeDatas.forEach((element) => {
+    const newNode = callBack(element, parentNode) || element;
+    if (element.children) {
+      eachTree(element.children, callBack, newNode);
+    }
+  });
+}
diff --git a/src/utils/helper/tsxHelper.tsx b/src/utils/helper/tsxHelper.tsx
index 46e00012e39444908cfc82407ed7d165d50283da..66f371f0fc2cc0f700d74c3269cdbc0b9b3a46fd 100644
--- a/src/utils/helper/tsxHelper.tsx
+++ b/src/utils/helper/tsxHelper.tsx
@@ -1,10 +1,10 @@
-import { Slots } from 'vue';
-import { isFunction } from '/@/utils/is';
+import { Slots } from "vue";
+import { isFunction } from "/@/utils/is";
 
 /**
  * @description:  Get slot to prevent empty error
  */
-export function getSlot(slots: Slots, slot = 'default', data?: any) {
+export function getSlot(slots: Slots, slot = "default", data?: any) {
   if (!slots || !Reflect.has(slots, slot)) {
     return null;
   }
@@ -29,7 +29,7 @@ export function extendSlots(slots: Slots, excludeKeys: string[] = []) {
     if (excludeKeys.includes(key)) {
       return null;
     }
-    ret[key] = () => getSlot(slots, key);
+    ret[key] = (data?: any) => getSlot(slots, key, data);
   });
   return ret;
 }
diff --git a/src/utils/http/axios/Axios.ts b/src/utils/http/axios/Axios.ts
index 0f71956984fcd480a0c16df08515908f3f7da897..d2f0c270d1454a8718695d860c1590938374ffed 100644
--- a/src/utils/http/axios/Axios.ts
+++ b/src/utils/http/axios/Axios.ts
@@ -1,15 +1,15 @@
-import type { AxiosRequestConfig, AxiosInstance, AxiosResponse, AxiosError } from 'axios';
-import type { RequestOptions, Result, UploadFileParams } from '/#/axios';
-import type { CreateAxiosOptions } from './axiosTransform';
-import axios from 'axios';
-import qs from 'qs';
-import { AxiosCanceler } from './axiosCancel';
-import { isFunction } from '/@/utils/is';
-import { cloneDeep } from 'lodash-es';
-import { ContentTypeEnum } from '/@/enums/httpEnum';
-import { RequestEnum } from '/@/enums/httpEnum';
-
-export * from './axiosTransform';
+import type { AxiosRequestConfig, AxiosInstance, AxiosResponse, AxiosError } from "axios";
+import type { RequestOptions, Result, UploadFileParams } from "/#/axios";
+import type { CreateAxiosOptions } from "./axiosTransform";
+import axios from "axios";
+import qs from "qs";
+import { AxiosCanceler } from "./axiosCancel";
+import { isFunction } from "/@/utils/is";
+import { cloneDeep } from "lodash-es";
+import { ContentTypeEnum } from "/@/enums/httpEnum";
+import { RequestEnum } from "/@/enums/httpEnum";
+
+export * from "./axiosTransform";
 
 /**
  * @description:  axios module
@@ -61,7 +61,7 @@ export class VAxios {
   }
 
   /**
-   * @description: Interceptor configuration
+   * @description: Interceptor configuration 拦截器配置
    */
   private setupInterceptors() {
     const transform = this.getTransform();
@@ -80,11 +80,8 @@ export class VAxios {
     // Request interceptor configuration processing
     this.axiosInstance.interceptors.request.use((config: AxiosRequestConfig) => {
       // If cancel repeat request is turned on, then cancel repeat request is prohibited
-      const {
-        // @ts-ignore
-        headers: { ignoreCancelToken },
-      } = config;
-
+      // @ts-ignore
+      const { ignoreCancelToken } = config.requestOptions;
       const ignoreCancel =
         ignoreCancelToken !== undefined
           ? ignoreCancelToken
@@ -114,7 +111,10 @@ export class VAxios {
     // Response result interceptor error capture
     responseInterceptorsCatch &&
       isFunction(responseInterceptorsCatch) &&
-      this.axiosInstance.interceptors.response.use(undefined, responseInterceptorsCatch);
+      this.axiosInstance.interceptors.response.use(undefined, (error) => {
+        // @ts-ignore
+        return responseInterceptorsCatch(this.axiosInstance, error);
+      });
   }
 
   /**
@@ -122,7 +122,7 @@ export class VAxios {
    */
   uploadFile<T = any>(config: AxiosRequestConfig, params: UploadFileParams) {
     const formData = new window.FormData();
-    const customFilename = params.name || 'file';
+    const customFilename = params.name || "file";
 
     if (params.filename) {
       formData.append(customFilename, params.file, params.filename);
@@ -146,10 +146,10 @@ export class VAxios {
 
     return this.axiosInstance.request<T>({
       ...config,
-      method: 'POST',
+      method: "POST",
       data: formData,
       headers: {
-        'Content-type': ContentTypeEnum.FORM_DATA,
+        "Content-type": ContentTypeEnum.FORM_DATA,
         // @ts-ignore
         ignoreCancelToken: true,
       },
@@ -159,11 +159,11 @@ export class VAxios {
   // support form-data
   supportFormData(config: AxiosRequestConfig) {
     const headers = config.headers || this.options.headers;
-    const contentType = headers?.['Content-Type'] || headers?.['content-type'];
+    const contentType = headers?.["Content-Type"] || headers?.["content-type"];
 
     if (
       contentType !== ContentTypeEnum.FORM_URLENCODED ||
-      !Reflect.has(config, 'data') ||
+      !Reflect.has(config, "data") ||
       config.method?.toUpperCase() === RequestEnum.GET
     ) {
       return config;
@@ -171,24 +171,24 @@ export class VAxios {
 
     return {
       ...config,
-      data: qs.stringify(config.data, { arrayFormat: 'brackets' }),
+      data: qs.stringify(config.data, { arrayFormat: "brackets" }),
     };
   }
 
   get<T = any>(config: AxiosRequestConfig, options?: RequestOptions): Promise<T> {
-    return this.request({ ...config, method: 'GET' }, options);
+    return this.request({ ...config, method: "GET" }, options);
   }
 
   post<T = any>(config: AxiosRequestConfig, options?: RequestOptions): Promise<T> {
-    return this.request({ ...config, method: 'POST' }, options);
+    return this.request({ ...config, method: "POST" }, options);
   }
 
   put<T = any>(config: AxiosRequestConfig, options?: RequestOptions): Promise<T> {
-    return this.request({ ...config, method: 'PUT' }, options);
+    return this.request({ ...config, method: "PUT" }, options);
   }
 
   delete<T = any>(config: AxiosRequestConfig, options?: RequestOptions): Promise<T> {
-    return this.request({ ...config, method: 'DELETE' }, options);
+    return this.request({ ...config, method: "DELETE" }, options);
   }
 
   request<T = any>(config: AxiosRequestConfig, options?: RequestOptions): Promise<T> {
@@ -199,7 +199,7 @@ export class VAxios {
 
     const opt: RequestOptions = Object.assign({}, requestOptions, options);
 
-    const { beforeRequestHook, requestCatchHook, transformRequestHook } = transform || {};
+    const { beforeRequestHook, requestCatchHook, transformResponseHook } = transform || {};
     if (beforeRequestHook && isFunction(beforeRequestHook)) {
       conf = beforeRequestHook(conf, opt);
     }
@@ -211,12 +211,12 @@ export class VAxios {
       this.axiosInstance
         .request<any, AxiosResponse<Result>>(conf)
         .then((res: AxiosResponse<Result>) => {
-          if (transformRequestHook && isFunction(transformRequestHook)) {
+          if (transformResponseHook && isFunction(transformResponseHook)) {
             try {
-              const ret = transformRequestHook(res, opt);
+              const ret = transformResponseHook(res, opt);
               resolve(ret);
             } catch (err) {
-              reject(err || new Error('request error!'));
+              reject(err || new Error("request error!"));
             }
             return;
           }
diff --git a/src/utils/http/axios/axiosCancel.ts b/src/utils/http/axios/axiosCancel.ts
index 081233eaa853b7765435823b563dc0dc892f3664..29e3ac7dee05d2c3e599bebe522d3f9e55802199 100644
--- a/src/utils/http/axios/axiosCancel.ts
+++ b/src/utils/http/axios/axiosCancel.ts
@@ -1,11 +1,11 @@
-import type { AxiosRequestConfig, Canceler } from 'axios';
-import axios from 'axios';
-import { isFunction } from '/@/utils/is';
+import type { AxiosRequestConfig, Canceler } from "axios";
+import axios from "axios";
+import { isFunction } from "/@/utils/is";
 
 // Used to store the identification and cancellation function of each request
 let pendingMap = new Map<string, Canceler>();
 
-export const getPendingUrl = (config: AxiosRequestConfig) => [config.method, config.url].join('&');
+export const getPendingUrl = (config: AxiosRequestConfig) => [config.method, config.url].join("&");
 
 export class AxiosCanceler {
   /**
diff --git a/src/utils/http/axios/axiosRetry.ts b/src/utils/http/axios/axiosRetry.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c80a8d4c76b023a95ecd424ad3038f0816631e41
--- /dev/null
+++ b/src/utils/http/axios/axiosRetry.ts
@@ -0,0 +1,28 @@
+import { AxiosError, AxiosInstance } from "axios";
+/**
+ *  请求重试机制
+ */
+
+export class AxiosRetry {
+  /**
+   * 重试
+   */
+  retry(AxiosInstance: AxiosInstance, error: AxiosError) {
+    // @ts-ignore
+    const { config } = error.response;
+    const { waitTime, count } = config?.requestOptions?.retryRequest;
+    config.__retryCount = config.__retryCount || 0;
+    if (config.__retryCount >= count) {
+      return Promise.reject(error);
+    }
+    config.__retryCount += 1;
+    return this.delay(waitTime).then(() => AxiosInstance(config));
+  }
+
+  /**
+   * 延迟
+   */
+  private delay(waitTime: number) {
+    return new Promise((resolve) => setTimeout(resolve, waitTime));
+  }
+}
diff --git a/src/utils/http/axios/axiosTransform.ts b/src/utils/http/axios/axiosTransform.ts
index f6cbc80af2d0f67c866d8e39961ad9c002b460c0..6fc6227fd0ae6af48822b6259befe0a4112ec04c 100644
--- a/src/utils/http/axios/axiosTransform.ts
+++ b/src/utils/http/axios/axiosTransform.ts
@@ -1,8 +1,8 @@
 /**
  * Data processing class, can be configured according to the project
  */
-import type { AxiosRequestConfig, AxiosResponse } from 'axios';
-import type { RequestOptions, Result } from '/#/axios';
+import type { AxiosRequestConfig, AxiosResponse } from "axios";
+import type { RequestOptions, Result } from "/#/axios";
 
 export interface CreateAxiosOptions extends AxiosRequestConfig {
   authenticationScheme?: string;
@@ -18,9 +18,9 @@ export abstract class AxiosTransform {
   beforeRequestHook?: (config: AxiosRequestConfig, options: RequestOptions) => AxiosRequestConfig;
 
   /**
-   * @description: Request successfully processed
+   * @description: 处理响应数据
    */
-  transformRequestHook?: (res: AxiosResponse<Result>, options: RequestOptions) => any;
+  transformResponseHook?: (res: AxiosResponse<Result>, options: RequestOptions) => any;
 
   /**
    * @description: 请求失败处理
@@ -48,5 +48,5 @@ export abstract class AxiosTransform {
   /**
    * @description: 请求之后的拦截器错误处理
    */
-  responseInterceptorsCatch?: (error: Error) => void;
+  responseInterceptorsCatch?: (axiosInstance: AxiosResponse, error: Error) => void;
 }
diff --git a/src/utils/http/axios/checkStatus.ts b/src/utils/http/axios/checkStatus.ts
index acadffaa14f0f755df5988943fb1c2abd91d24f7..9e6a1154a80e62fdcd88cfaec2235ef36a5b2953 100644
--- a/src/utils/http/axios/checkStatus.ts
+++ b/src/utils/http/axios/checkStatus.ts
@@ -1,11 +1,11 @@
-import type { ErrorMessageMode } from '/#/axios';
-import { useMessage } from '/@/hooks/web/useMessage';
-import { useI18n } from '/@/hooks/web/useI18n';
+import type { ErrorMessageMode } from "/#/axios";
+import { useMessage } from "/@/hooks/web/useMessage";
+import { useI18n } from "/@/hooks/web/useI18n";
 // import router from '/@/router';
 // import { PageEnum } from '/@/enums/pageEnum';
-import { useUserStoreWithOut } from '/@/store/modules/user';
-import projectSetting from '/@/settings/projectSetting';
-import { SessionTimeoutProcessingEnum } from '/@/enums/appEnum';
+import { useUserStoreWithOut } from "/@/store/modules/user";
+import projectSetting from "/@/settings/projectSetting";
+import { SessionTimeoutProcessingEnum } from "/@/enums/appEnum";
 
 const { createMessage, createErrorModal } = useMessage();
 const error = createMessage.error!;
@@ -14,11 +14,11 @@ const stp = projectSetting.sessionTimeoutProcessing;
 export function checkStatus(
   status: number,
   msg: string,
-  errorMessageMode: ErrorMessageMode = 'message',
+  errorMessageMode: ErrorMessageMode = "message",
 ): void {
   const { t } = useI18n();
   const userStore = useUserStoreWithOut();
-  let errMessage = '';
+  let errMessage = "";
 
   switch (status) {
     case 400:
@@ -29,7 +29,7 @@ export function checkStatus(
     // Return to the current page after successful login. This step needs to be operated on the login page.
     case 401:
       userStore.setToken(undefined);
-      errMessage = msg || t('sys.api.errMsg401');
+      errMessage = msg || t("sys.api.errMsg401");
       if (stp === SessionTimeoutProcessingEnum.PAGE_COVERAGE) {
         userStore.setSessionTimeout(true);
       } else {
@@ -37,43 +37,43 @@ export function checkStatus(
       }
       break;
     case 403:
-      errMessage = t('sys.api.errMsg403');
+      errMessage = t("sys.api.errMsg403");
       break;
     // 404请求不存在
     case 404:
-      errMessage = t('sys.api.errMsg404');
+      errMessage = t("sys.api.errMsg404");
       break;
     case 405:
-      errMessage = t('sys.api.errMsg405');
+      errMessage = t("sys.api.errMsg405");
       break;
     case 408:
-      errMessage = t('sys.api.errMsg408');
+      errMessage = t("sys.api.errMsg408");
       break;
     case 500:
-      errMessage = t('sys.api.errMsg500');
+      errMessage = t("sys.api.errMsg500");
       break;
     case 501:
-      errMessage = t('sys.api.errMsg501');
+      errMessage = t("sys.api.errMsg501");
       break;
     case 502:
-      errMessage = t('sys.api.errMsg502');
+      errMessage = t("sys.api.errMsg502");
       break;
     case 503:
-      errMessage = t('sys.api.errMsg503');
+      errMessage = t("sys.api.errMsg503");
       break;
     case 504:
-      errMessage = t('sys.api.errMsg504');
+      errMessage = t("sys.api.errMsg504");
       break;
     case 505:
-      errMessage = t('sys.api.errMsg505');
+      errMessage = t("sys.api.errMsg505");
       break;
     default:
   }
 
   if (errMessage) {
-    if (errorMessageMode === 'modal') {
-      createErrorModal({ title: t('sys.api.errorTip'), content: errMessage });
-    } else if (errorMessageMode === 'message') {
+    if (errorMessageMode === "modal") {
+      createErrorModal({ title: t("sys.api.errorTip"), content: errMessage });
+    } else if (errorMessageMode === "message") {
       error({ content: errMessage, key: `global_error_message_status_${status}` });
     }
   }
diff --git a/src/utils/http/axios/helper.ts b/src/utils/http/axios/helper.ts
index ffbe08b5ea08b4a681ea9648b94547079f80685c..d79227f9dff33fd20eef1f38989788c5204c73a6 100644
--- a/src/utils/http/axios/helper.ts
+++ b/src/utils/http/axios/helper.ts
@@ -1,6 +1,6 @@
-import { isObject, isString } from '/@/utils/is';
+import { isObject, isString } from "/@/utils/is";
 
-const DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm:ss';
+const DATE_TIME_FORMAT = "YYYY-MM-DD HH:mm:ss";
 
 export function joinTimestamp<T extends boolean>(
   join: boolean,
@@ -9,7 +9,7 @@ export function joinTimestamp<T extends boolean>(
 
 export function joinTimestamp(join: boolean, restful = false): string | object {
   if (!join) {
-    return restful ? '' : {};
+    return restful ? "" : {};
   }
   const now = new Date().getTime();
   if (restful) {
@@ -22,12 +22,13 @@ export function joinTimestamp(join: boolean, restful = false): string | object {
  * @description: Format request parameter time
  */
 export function formatRequestDate(params: Recordable) {
-  if (Object.prototype.toString.call(params) !== '[object Object]') {
+  if (Object.prototype.toString.call(params) !== "[object Object]") {
     return;
   }
 
   for (const key in params) {
-    if (params[key] && params[key]._isAMomentObject) {
+    const format = params[key]?.format ?? null;
+    if (format && typeof format === "function") {
       params[key] = params[key].format(DATE_TIME_FORMAT);
     }
     if (isString(key)) {
diff --git a/src/utils/http/axios/index.ts b/src/utils/http/axios/index.ts
index c73af07f3b3b77657d827b5b0bbc22562be08a5e..a3271acb2cedab5f648ec9076f88424f69a107f6 100644
--- a/src/utils/http/axios/index.ts
+++ b/src/utils/http/axios/index.ts
@@ -1,21 +1,23 @@
 // axios配置  可自行根据项目进行更改,只需更改该文件即可,其他文件可以不动
 // The axios configuration can be changed according to the project, just change the file, other files can be left unchanged
 
-import type { AxiosResponse } from 'axios';
-import type { RequestOptions, Result } from '/#/axios';
-import type { AxiosTransform, CreateAxiosOptions } from './axiosTransform';
-import { VAxios } from './Axios';
-import { checkStatus } from './checkStatus';
-import { useGlobSetting } from '/@/hooks/setting';
-import { useMessage } from '/@/hooks/web/useMessage';
-import { RequestEnum, ResultEnum, ContentTypeEnum } from '/@/enums/httpEnum';
-import { isString } from '/@/utils/is';
-import { getToken } from '/@/utils/auth';
-import { setObjToUrlParams, deepMerge } from '/@/utils';
-import { useErrorLogStoreWithOut } from '/@/store/modules/errorLog';
-import { useI18n } from '/@/hooks/web/useI18n';
-import { joinTimestamp, formatRequestDate } from './helper';
-import { useUserStoreWithOut } from '/@/store/modules/user';
+import type { AxiosResponse } from "axios";
+import { clone } from "lodash-es";
+import type { RequestOptions, Result } from "/#/axios";
+import type { AxiosTransform, CreateAxiosOptions } from "./axiosTransform";
+import { VAxios } from "./Axios";
+import { checkStatus } from "./checkStatus";
+import { useGlobSetting } from "/@/hooks/setting";
+import { useMessage } from "/@/hooks/web/useMessage";
+import { RequestEnum, ResultEnum, ContentTypeEnum } from "/@/enums/httpEnum";
+import { isString } from "/@/utils/is";
+import { getToken } from "/@/utils/auth";
+import { setObjToUrlParams, deepMerge } from "/@/utils";
+import { useErrorLogStoreWithOut } from "/@/store/modules/errorLog";
+import { useI18n } from "/@/hooks/web/useI18n";
+import { joinTimestamp, formatRequestDate } from "./helper";
+import { useUserStoreWithOut } from "/@/store/modules/user";
+import { AxiosRetry } from "/@/utils/http/axios/axiosRetry";
 
 const globSetting = useGlobSetting();
 const urlPrefix = globSetting.urlPrefix;
@@ -26,9 +28,9 @@ const { createMessage, createErrorModal } = useMessage();
  */
 const transform: AxiosTransform = {
   /**
-   * @description: 处理请求数据。如果数据不是预期格式,可直接抛出错误
+   * @description: 处理响应数据。如果数据不是预期格式,可直接抛出错误
    */
-  transformRequestHook: (res: AxiosResponse<Result>, options: RequestOptions) => {
+  transformResponseHook: (res: AxiosResponse<Result>, options: RequestOptions) => {
     const { t } = useI18n();
     const { isTransformResponse, isReturnNativeResponse } = options;
     // 是否返回原生响应头 比如:需要获取响应头时使用该属性
@@ -42,26 +44,26 @@ const transform: AxiosTransform = {
     }
     // 错误的时候返回
 
-    const { data } = res;
-    if (!data) {
+    const { data: axiosData } = res;
+    if (!axiosData) {
       // return '[HTTP] Request has no return value';
-      throw new Error(t('sys.api.apiRequestFailed'));
+      throw new Error(t("sys.api.apiRequestFailed"));
     }
     //  这里 code,result,message为 后台统一的字段,需要在 types.ts内修改为项目自己的接口返回格式
-    const { code, result, message } = data;
+    const { code, data, message } = axiosData;
 
     // 这里逻辑可以根据项目进行修改
-    const hasSuccess = data && Reflect.has(data, 'code') && code === ResultEnum.SUCCESS;
+    const hasSuccess = Reflect.has(axiosData, "code") && code === ResultEnum.SUCCESS;
     if (hasSuccess) {
-      return result;
+      return data;
     }
 
     // 在此处根据自己项目的实际情况对不同的code执行不同的操作
     // 如果不希望中断当前请求,请return数据,否则直接抛出异常即可
-    let timeoutMsg = '';
+    let timeoutMsg = "";
     switch (code) {
       case ResultEnum.TIMEOUT:
-        timeoutMsg = t('sys.api.timeoutMessage');
+        timeoutMsg = t("sys.api.timeoutMessage");
         const userStore = useUserStoreWithOut();
         userStore.setToken(undefined);
         userStore.logout(true);
@@ -74,13 +76,13 @@ const transform: AxiosTransform = {
 
     // errorMessageMode=‘modal’的时候会显示modal错误弹窗,而不是消息提示,用于一些比较重要的错误
     // errorMessageMode='none' 一般是调用时明确表示不希望自动弹出错误提示
-    if (options.errorMessageMode === 'modal') {
-      createErrorModal({ title: t('sys.api.errorTip'), content: timeoutMsg });
-    } else if (options.errorMessageMode === 'message') {
+    if (options.errorMessageMode === "modal") {
+      createErrorModal({ title: t("sys.api.errorTip"), content: timeoutMsg });
+    } else if (options.errorMessageMode === "message") {
       createMessage.error(timeoutMsg);
     }
 
-    throw new Error(timeoutMsg || t('sys.api.apiRequestFailed'));
+    throw new Error(timeoutMsg || t("sys.api.apiRequestFailed"));
   },
 
   // 请求之前处理config
@@ -109,7 +111,11 @@ const transform: AxiosTransform = {
     } else {
       if (!isString(params)) {
         formatDate && formatRequestDate(params);
-        if (Reflect.has(config, 'data') && config.data && Object.keys(config.data).length > 0) {
+        if (
+          Reflect.has(config, "data") &&
+          config.data &&
+          (Object.keys(config.data).length > 0 || config.data instanceof FormData)
+        ) {
           config.data = data;
           config.params = params;
         } else {
@@ -157,28 +163,28 @@ const transform: AxiosTransform = {
   /**
    * @description: 响应错误处理
    */
-  responseInterceptorsCatch: (error: any) => {
+  responseInterceptorsCatch: (axiosInstance: AxiosResponse, error: any) => {
     const { t } = useI18n();
     const errorLogStore = useErrorLogStoreWithOut();
     errorLogStore.addAjaxErrorInfo(error);
     const { response, code, message, config } = error || {};
-    const errorMessageMode = config?.requestOptions?.errorMessageMode || 'none';
-    const msg: string = response?.data?.error?.message ?? '';
-    const err: string = error?.toString?.() ?? '';
-    let errMessage = '';
+    const errorMessageMode = config?.requestOptions?.errorMessageMode || "none";
+    const msg: string = response?.data?.error?.message ?? "";
+    const err: string = error?.toString?.() ?? "";
+    let errMessage = "";
 
     try {
-      if (code === 'ECONNABORTED' && message.indexOf('timeout') !== -1) {
-        errMessage = t('sys.api.apiTimeoutMessage');
+      if (code === "ECONNABORTED" && message.indexOf("timeout") !== -1) {
+        errMessage = t("sys.api.apiTimeoutMessage");
       }
-      if (err?.includes('Network Error')) {
-        errMessage = t('sys.api.networkExceptionMsg');
+      if (err?.includes("Network Error")) {
+        errMessage = t("sys.api.networkExceptionMsg");
       }
 
       if (errMessage) {
-        if (errorMessageMode === 'modal') {
-          createErrorModal({ title: t('sys.api.errorTip'), content: errMessage });
-        } else if (errorMessageMode === 'message') {
+        if (errorMessageMode === "modal") {
+          createErrorModal({ title: t("sys.api.errorTip"), content: errMessage });
+        } else if (errorMessageMode === "message") {
           createMessage.error(errMessage);
         }
         return Promise.reject(error);
@@ -188,27 +194,36 @@ const transform: AxiosTransform = {
     }
 
     checkStatus(error?.response?.status, msg, errorMessageMode);
+
+    // 添加自动重试机制 保险起见 只针对GET请求
+    const retryRequest = new AxiosRetry();
+    const { isOpenRetry } = config.requestOptions.retryRequest;
+    config.method?.toUpperCase() === RequestEnum.GET &&
+      isOpenRetry &&
+      // @ts-ignore
+      retryRequest.retry(axiosInstance, error);
     return Promise.reject(error);
   },
 };
 
 function createAxios(opt?: Partial<CreateAxiosOptions>) {
   return new VAxios(
+    // 深度合并
     deepMerge(
       {
         // See https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication#authentication_schemes
         // authentication schemes,e.g: Bearer
         // authenticationScheme: 'Bearer',
-        authenticationScheme: '',
+        authenticationScheme: "",
         timeout: 10 * 1000,
         // 基础接口地址
         // baseURL: globSetting.apiUrl,
 
-        headers: { 'Content-Type': ContentTypeEnum.JSON },
+        headers: { "Content-Type": ContentTypeEnum.JSON },
         // 如果是form-data格式
         // headers: { 'Content-Type': ContentTypeEnum.FORM_URLENCODED },
         // 数据处理方式
-        transform,
+        transform: clone(transform),
         // 配置项,下面的选项都可以在独立的接口请求中覆盖
         requestOptions: {
           // 默认将prefix 添加到url
@@ -222,7 +237,7 @@ function createAxios(opt?: Partial<CreateAxiosOptions>) {
           // 格式化提交参数时间
           formatDate: true,
           // 消息提示类型
-          errorMessageMode: 'message',
+          errorMessageMode: "message",
           // 接口地址
           apiUrl: globSetting.apiUrl,
           // 接口拼接地址
@@ -233,6 +248,11 @@ function createAxios(opt?: Partial<CreateAxiosOptions>) {
           ignoreCancelToken: true,
           // 是否携带token
           withToken: true,
+          retryRequest: {
+            isOpenRetry: true,
+            count: 5,
+            waitTime: 100,
+          },
         },
       },
       opt || {},
diff --git a/src/utils/index.ts b/src/utils/index.ts
index 112c3af44748cb82ce2fbd209c2a666f78d10072..d303989c046423702d0c281c654119c91e8b98af 100644
--- a/src/utils/index.ts
+++ b/src/utils/index.ts
@@ -1,8 +1,8 @@
-import type { RouteLocationNormalized, RouteRecordNormalized } from 'vue-router';
-import type { App, Plugin } from 'vue';
+import type { RouteLocationNormalized, RouteRecordNormalized } from "vue-router";
+import type { App, Plugin } from "vue";
 
-import { unref } from 'vue';
-import { isObject } from '/@/utils/is';
+import { unref } from "vue";
+import { isObject } from "/@/utils/is";
 
 export const noop = () => {};
 
@@ -24,14 +24,15 @@ export function getPopupContainer(node?: HTMLElement): HTMLElement {
  *  ==>www.baidu.com?a=3&b=4
  */
 export function setObjToUrlParams(baseUrl: string, obj: any): string {
-  let parameters = '';
+  let parameters = "";
   for (const key in obj) {
-    parameters += key + '=' + encodeURIComponent(obj[key]) + '&';
+    parameters += key + "=" + encodeURIComponent(obj[key]) + "&";
   }
-  parameters = parameters.replace(/&$/, '');
-  return /\?$/.test(baseUrl) ? baseUrl + parameters : baseUrl.replace(/\/?$/, '?') + parameters;
+  parameters = parameters.replace(/&$/, "");
+  return /\?$/.test(baseUrl) ? baseUrl + parameters : baseUrl.replace(/\/?$/, "?") + parameters;
 }
 
+// 深度合并
 export function deepMerge<T = any>(src: any = {}, target: any = {}): T {
   let key: string;
   for (key in target) {
@@ -44,13 +45,13 @@ export function openWindow(
   url: string,
   opt?: { target?: TargetContext | string; noopener?: boolean; noreferrer?: boolean },
 ) {
-  const { target = '__blank', noopener = true, noreferrer = true } = opt || {};
+  const { target = "__blank", noopener = true, noreferrer = true } = opt || {};
   const feature: string[] = [];
 
-  noopener && feature.push('noopener=yes');
-  noreferrer && feature.push('noreferrer=yes');
+  noopener && feature.push("noopener=yes");
+  noreferrer && feature.push("noreferrer=yes");
 
-  window.open(url, target, feature.join(','));
+  window.open(url, target, feature.join(","));
 }
 
 // dynamic use hook props
diff --git a/src/utils/is.ts b/src/utils/is.ts
index d71fd9b65ad8bba270638153ec27d526a7a6f231..3ad717bc32d5d2b9f5b5f7f1f015b6737d2d3e19 100644
--- a/src/utils/is.ts
+++ b/src/utils/is.ts
@@ -5,7 +5,7 @@ export function is(val: unknown, type: string) {
 }
 
 export function isDef<T = unknown>(val?: T): val is T {
-  return typeof val !== 'undefined';
+  return typeof val !== "undefined";
 }
 
 export function isUnDef<T = unknown>(val?: T): val is T {
@@ -13,7 +13,7 @@ export function isUnDef<T = unknown>(val?: T): val is T {
 }
 
 export function isObject(val: any): val is Record<any, any> {
-  return val !== null && is(val, 'Object');
+  return val !== null && is(val, "Object");
 }
 
 export function isEmpty<T = unknown>(val: T): val is T {
@@ -33,7 +33,7 @@ export function isEmpty<T = unknown>(val: T): val is T {
 }
 
 export function isDate(val: unknown): val is Date {
-  return is(val, 'Date');
+  return is(val, "Date");
 }
 
 export function isNull(val: unknown): val is null {
@@ -49,27 +49,27 @@ export function isNullOrUnDef(val: unknown): val is null | undefined {
 }
 
 export function isNumber(val: unknown): val is number {
-  return is(val, 'Number');
+  return is(val, "Number");
 }
 
 export function isPromise<T = any>(val: unknown): val is Promise<T> {
-  return is(val, 'Promise') && isObject(val) && isFunction(val.then) && isFunction(val.catch);
+  return is(val, "Promise") && isObject(val) && isFunction(val.then) && isFunction(val.catch);
 }
 
 export function isString(val: unknown): val is string {
-  return is(val, 'String');
+  return is(val, "String");
 }
 
 export function isFunction(val: unknown): val is Function {
-  return typeof val === 'function';
+  return typeof val === "function";
 }
 
 export function isBoolean(val: unknown): val is boolean {
-  return is(val, 'Boolean');
+  return is(val, "Boolean");
 }
 
 export function isRegExp(val: unknown): val is RegExp {
-  return is(val, 'RegExp');
+  return is(val, "RegExp");
 }
 
 export function isArray(val: any): val is Array<any> {
@@ -77,7 +77,7 @@ export function isArray(val: any): val is Array<any> {
 }
 
 export function isWindow(val: any): val is Window {
-  return typeof window !== 'undefined' && is(val, 'Window');
+  return typeof window !== "undefined" && is(val, "Window");
 }
 
 export function isElement(val: unknown): val is Element {
@@ -85,15 +85,15 @@ export function isElement(val: unknown): val is Element {
 }
 
 export function isMap(val: unknown): val is Map<any, any> {
-  return is(val, 'Map');
+  return is(val, "Map");
 }
 
-export const isServer = typeof window === 'undefined';
+export const isServer = typeof window === "undefined";
 
 export const isClient = !isServer;
 
 export function isUrl(path: string): boolean {
   const reg =
-    /(((^https?:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(?::\d+)?|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)$/;
+    /^(((^https?:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(?::\d+)?|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?(\/#\/)?(?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)$/;
   return reg.test(path);
 }
diff --git a/src/utils/lib/echarts.ts b/src/utils/lib/echarts.ts
index 1b9f27309c81347c7c4e01224690e33160f9bc4f..878021db766963d5a2a3260b4836f9059d8259d2 100644
--- a/src/utils/lib/echarts.ts
+++ b/src/utils/lib/echarts.ts
@@ -1,4 +1,4 @@
-import * as echarts from 'echarts/core';
+import * as echarts from "echarts/core";
 
 import {
   BarChart,
@@ -7,7 +7,8 @@ import {
   MapChart,
   PictorialBarChart,
   RadarChart,
-} from 'echarts/charts';
+  ScatterChart,
+} from "echarts/charts";
 
 import {
   TitleComponent,
@@ -24,9 +25,9 @@ import {
   TimelineComponent,
   CalendarComponent,
   GraphicComponent,
-} from 'echarts/components';
+} from "echarts/components";
 
-import { SVGRenderer } from 'echarts/renderers';
+import { SVGRenderer } from "echarts/renderers";
 
 echarts.use([
   LegendComponent,
@@ -50,6 +51,7 @@ echarts.use([
   TimelineComponent,
   CalendarComponent,
   GraphicComponent,
+  ScatterChart,
 ]);
 
 export default echarts;
diff --git a/src/utils/mitt.ts b/src/utils/mitt.ts
index 4b15bbabeac88d2f62454f1dd2d101838f6b3703..67b3b2632715a42d2dc1c4ba446ae31a69bf0e39 100644
--- a/src/utils/mitt.ts
+++ b/src/utils/mitt.ts
@@ -21,13 +21,13 @@ export interface Emitter {
   all: EventHandlerMap;
 
   on<T = any>(type: EventType, handler: Handler<T>): void;
-  on(type: '*', handler: WildcardHandler): void;
+  on(type: "*", handler: WildcardHandler): void;
 
   off<T = any>(type: EventType, handler: Handler<T>): void;
-  off(type: '*', handler: WildcardHandler): void;
+  off(type: "*", handler: WildcardHandler): void;
 
   emit<T = any>(type: EventType, event?: T): void;
-  emit(type: '*', event?: any): void;
+  emit(type: "*", event?: any): void;
   clear(): void;
 }
 
@@ -86,7 +86,7 @@ export default function mitt(all?: EventHandlerMap): Emitter {
       ((all?.get(type) || []) as EventHandlerList).slice().map((handler) => {
         handler(evt);
       });
-      ((all?.get('*') || []) as WildCardEventHandlerList).slice().map((handler) => {
+      ((all?.get("*") || []) as WildCardEventHandlerList).slice().map((handler) => {
         handler(type, evt);
       });
     },
diff --git a/src/utils/propTypes.ts b/src/utils/propTypes.ts
index a5b0a47a4254663939399f4cdedbd2e06dede514..aca724e69df994e88ac079471aab2af7ed009d85 100644
--- a/src/utils/propTypes.ts
+++ b/src/utils/propTypes.ts
@@ -1,5 +1,5 @@
-import { CSSProperties, VNodeChild } from 'vue';
-import { createTypes, VueTypeValidableDef, VueTypesInterface } from 'vue-types';
+import { CSSProperties, VNodeChild } from "vue";
+import { createTypes, VueTypeValidableDef, VueTypesInterface } from "vue-types";
 
 export type VueNode = VNodeChild | JSX.Element;
 
@@ -20,13 +20,13 @@ const propTypes = createTypes({
 
 propTypes.extend([
   {
-    name: 'style',
+    name: "style",
     getter: true,
     type: [String, Object],
     default: undefined,
   },
   {
-    name: 'VNodeChild',
+    name: "VNodeChild",
     getter: true,
     type: undefined,
   },
diff --git a/src/utils/props.ts b/src/utils/props.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b623e85555e3222b5a0db202dcd74b4a05021bbd
--- /dev/null
+++ b/src/utils/props.ts
@@ -0,0 +1,185 @@
+// copy from element-plus
+
+import { warn } from "vue";
+import { isObject } from "@vue/shared";
+import { fromPairs } from "lodash-es";
+import type { ExtractPropTypes, PropType } from "@vue/runtime-core";
+import type { Mutable } from "./types";
+
+const wrapperKey = Symbol();
+export type PropWrapper<T> = { [wrapperKey]: T };
+
+export const propKey = Symbol();
+
+type ResolveProp<T> = ExtractPropTypes<{
+  key: { type: T; required: true };
+}>["key"];
+type ResolvePropType<T> = ResolveProp<T> extends { type: infer V } ? V : ResolveProp<T>;
+type ResolvePropTypeWithReadonly<T> = Readonly<T> extends Readonly<Array<infer A>>
+  ? ResolvePropType<A[]>
+  : ResolvePropType<T>;
+
+type IfUnknown<T, V> = [unknown] extends [T] ? V : T;
+
+export type BuildPropOption<T, D extends BuildPropType<T, V, C>, R, V, C> = {
+  type?: T;
+  values?: readonly V[];
+  required?: R;
+  default?: R extends true
+    ? never
+    : D extends Record<string, unknown> | Array<any>
+    ? () => D
+    : (() => D) | D;
+  validator?: ((val: any) => val is C) | ((val: any) => boolean);
+};
+
+type _BuildPropType<T, V, C> =
+  | (T extends PropWrapper<unknown>
+      ? T[typeof wrapperKey]
+      : [V] extends [never]
+      ? ResolvePropTypeWithReadonly<T>
+      : never)
+  | V
+  | C;
+export type BuildPropType<T, V, C> = _BuildPropType<
+  IfUnknown<T, never>,
+  IfUnknown<V, never>,
+  IfUnknown<C, never>
+>;
+
+type _BuildPropDefault<T, D> = [T] extends [
+  // eslint-disable-next-line @typescript-eslint/ban-types
+  Record<string, unknown> | Array<any> | Function,
+]
+  ? D
+  : D extends () => T
+  ? ReturnType<D>
+  : D;
+
+export type BuildPropDefault<T, D, R> = R extends true
+  ? { readonly default?: undefined }
+  : {
+      readonly default: Exclude<D, undefined> extends never
+        ? undefined
+        : Exclude<_BuildPropDefault<T, D>, undefined>;
+    };
+export type BuildPropReturn<T, D, R, V, C> = {
+  readonly type: PropType<BuildPropType<T, V, C>>;
+  readonly required: IfUnknown<R, false>;
+  readonly validator: ((val: unknown) => boolean) | undefined;
+  [propKey]: true;
+} & BuildPropDefault<BuildPropType<T, V, C>, IfUnknown<D, never>, IfUnknown<R, false>>;
+
+/**
+ * @description Build prop. It can better optimize prop types
+ * @description 生成 prop,能更好地优化类型
+ * @example
+  // limited options
+  // the type will be PropType<'light' | 'dark'>
+  buildProp({
+    type: String,
+    values: ['light', 'dark'],
+  } as const)
+  * @example
+  // limited options and other types
+  // the type will be PropType<'small' | 'medium' | number>
+  buildProp({
+    type: [String, Number],
+    values: ['small', 'medium'],
+    validator: (val: unknown): val is number => typeof val === 'number',
+  } as const)
+  @link see more: https://github.com/element-plus/element-plus/pull/3341
+ */
+export function buildProp<
+  T = never,
+  D extends BuildPropType<T, V, C> = never,
+  R extends boolean = false,
+  V = never,
+  C = never,
+>(option: BuildPropOption<T, D, R, V, C>, key?: string): BuildPropReturn<T, D, R, V, C> {
+  // filter native prop type and nested prop, e.g `null`, `undefined` (from `buildProps`)
+  if (!isObject(option) || !!option[propKey]) return option as any;
+
+  const { values, required, default: defaultValue, type, validator } = option;
+
+  const _validator =
+    values || validator
+      ? (val: unknown) => {
+          let valid = false;
+          let allowedValues: unknown[] = [];
+
+          if (values) {
+            allowedValues = [...values, defaultValue];
+            valid ||= allowedValues.includes(val);
+          }
+          if (validator) valid ||= validator(val);
+
+          if (!valid && allowedValues.length > 0) {
+            const allowValuesText = [...new Set(allowedValues)]
+              .map((value) => JSON.stringify(value))
+              .join(", ");
+            warn(
+              `Invalid prop: validation failed${
+                key ? ` for prop "${key}"` : ""
+              }. Expected one of [${allowValuesText}], got value ${JSON.stringify(val)}.`,
+            );
+          }
+          return valid;
+        }
+      : undefined;
+
+  return {
+    type:
+      typeof type === "object" && Object.getOwnPropertySymbols(type).includes(wrapperKey)
+        ? type[wrapperKey]
+        : type,
+    required: !!required,
+    default: defaultValue,
+    validator: _validator,
+    [propKey]: true,
+  } as unknown as BuildPropReturn<T, D, R, V, C>;
+}
+
+type NativePropType = [((...args: any) => any) | { new (...args: any): any } | undefined | null];
+
+export const buildProps = <
+  O extends {
+    [K in keyof O]: O[K] extends BuildPropReturn<any, any, any, any, any>
+      ? O[K]
+      : [O[K]] extends NativePropType
+      ? O[K]
+      : O[K] extends BuildPropOption<infer T, infer D, infer R, infer V, infer C>
+      ? D extends BuildPropType<T, V, C>
+        ? BuildPropOption<T, D, R, V, C>
+        : never
+      : never;
+  },
+>(
+  props: O,
+) =>
+  fromPairs(
+    Object.entries(props).map(([key, option]) => [key, buildProp(option as any, key)]),
+  ) as unknown as {
+    [K in keyof O]: O[K] extends { [propKey]: boolean }
+      ? O[K]
+      : [O[K]] extends NativePropType
+      ? O[K]
+      : O[K] extends BuildPropOption<
+          infer T,
+          // eslint-disable-next-line @typescript-eslint/no-unused-vars
+          infer _D,
+          infer R,
+          infer V,
+          infer C
+        >
+      ? BuildPropReturn<T, O[K]["default"], R, V, C>
+      : never;
+  };
+
+export const definePropType = <T>(val: any) => ({ [wrapperKey]: val } as PropWrapper<T>);
+
+export const keyOf = <T>(arr: T) => Object.keys(arr) as Array<keyof T>;
+export const mutable = <T extends readonly any[] | Record<string, unknown>>(val: T) =>
+  val as Mutable<typeof val>;
+
+export const componentSize = ["large", "medium", "small", "mini"] as const;
diff --git a/src/utils/types.ts b/src/utils/types.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7778cceade77d5bff8869a06e422af4a61c9d2d2
--- /dev/null
+++ b/src/utils/types.ts
@@ -0,0 +1,42 @@
+// copy from element-plus
+
+import type { CSSProperties, Plugin } from "vue";
+
+type OptionalKeys<T extends Record<string, unknown>> = {
+  [K in keyof T]: T extends Record<K, T[K]> ? never : K;
+}[keyof T];
+
+type RequiredKeys<T extends Record<string, unknown>> = Exclude<keyof T, OptionalKeys<T>>;
+
+type MonoArgEmitter<T, Keys extends keyof T> = <K extends Keys>(evt: K, arg?: T[K]) => void;
+
+type BiArgEmitter<T, Keys extends keyof T> = <K extends Keys>(evt: K, arg: T[K]) => void;
+
+export type EventEmitter<T extends Record<string, unknown>> = MonoArgEmitter<T, OptionalKeys<T>> &
+  BiArgEmitter<T, RequiredKeys<T>>;
+
+export type AnyFunction<T> = (...args: any[]) => T;
+
+export type PartialReturnType<T extends (...args: unknown[]) => unknown> = Partial<ReturnType<T>>;
+
+export type SFCWithInstall<T> = T & Plugin;
+
+export type Nullable<T> = T | null;
+
+export type RefElement = Nullable<HTMLElement>;
+
+export type CustomizedHTMLElement<T> = HTMLElement & T;
+
+export type Indexable<T> = {
+  [key: string]: T;
+};
+
+export type Hash<T> = Indexable<T>;
+
+export type TimeoutHandle = ReturnType<typeof global.setTimeout>;
+
+export type ComponentSize = "large" | "medium" | "small" | "mini";
+
+export type StyleValue = string | CSSProperties | Array<StyleValue>;
+
+export type Mutable<T> = { -readonly [P in keyof T]: T[P] };
diff --git a/src/utils/uuid.ts b/src/utils/uuid.ts
index 548bcf39807853bbc29d768b424dfa4c3f09bd79..2e49b3f3fb90195f02d690e941822eea0c48d52f 100644
--- a/src/utils/uuid.ts
+++ b/src/utils/uuid.ts
@@ -4,10 +4,10 @@ for (let i = 0; i <= 15; i++) {
 }
 
 export function buildUUID(): string {
-  let uuid = '';
+  let uuid = "";
   for (let i = 1; i <= 36; i++) {
     if (i === 9 || i === 14 || i === 19 || i === 24) {
-      uuid += '-';
+      uuid += "-";
     } else if (i === 15) {
       uuid += 4;
     } else if (i === 20) {
@@ -16,13 +16,13 @@ export function buildUUID(): string {
       uuid += hexList[(Math.random() * 16) | 0];
     }
   }
-  return uuid.replace(/-/g, '');
+  return uuid.replace(/-/g, "");
 }
 
 let unique = 0;
-export function buildShortUUID(prefix = ''): string {
+export function buildShortUUID(prefix = ""): string {
   const time = Date.now();
   const random = Math.floor(Math.random() * 1000000000);
   unique++;
-  return prefix + '_' + random + unique + String(time);
+  return prefix + "_" + random + unique + String(time);
 }
diff --git a/src/views/dashboard/analysis/components/GrowCard.vue b/src/views/dashboard/analysis/components/GrowCard.vue
index af3eb60f3888cef63a51742cfe6624c8aaaaf30e..bef44088f42e4dbe09e91b53a3c6ccda5693b396 100644
--- a/src/views/dashboard/analysis/components/GrowCard.vue
+++ b/src/views/dashboard/analysis/components/GrowCard.vue
@@ -5,15 +5,14 @@
         size="small"
         :loading="loading"
         :title="item.title"
-        class="md:w-1/4 w-full !md:mt-0 !mt-4"
-        :class="[index + 1 < 4 && '!md:mr-4']"
-        :canExpan="false"
+        class="md:w-1/4 w-full !md:mt-0"
+        :class="{ '!md:mr-4': index + 1 < 4, '!mt-4': index > 0 }"
       >
         <template #extra>
           <Tag :color="item.color">{{ item.action }}</Tag>
         </template>
 
-        <div class="py-4 px-4 flex justify-between">
+        <div class="py-4 px-4 flex justify-between items-center">
           <CountTo prefix="$" :startVal="1" :endVal="item.value" class="text-2xl" />
           <Icon :icon="item.icon" :size="40" />
         </div>
@@ -27,10 +26,10 @@
   </div>
 </template>
 <script lang="ts" setup>
-  import { CountTo } from '/@/components/CountTo/index';
-  import { Icon } from '/@/components/Icon';
-  import { Tag, Card } from 'ant-design-vue';
-  import { growCardList } from '../data';
+  import { CountTo } from "/@/components/CountTo/index";
+  import { Icon } from "/@/components/Icon";
+  import { Tag, Card } from "ant-design-vue";
+  import { growCardList } from "../data";
 
   defineProps({
     loading: {
diff --git a/src/views/dashboard/analysis/components/SalesProductPie.vue b/src/views/dashboard/analysis/components/SalesProductPie.vue
index 7142526d6797fed8da5fdde44e03b8a44f8eda2f..7014bc322c5cc5d9f82627b389ff6c37f54f8fe6 100644
--- a/src/views/dashboard/analysis/components/SalesProductPie.vue
+++ b/src/views/dashboard/analysis/components/SalesProductPie.vue
@@ -4,24 +4,25 @@
   </Card>
 </template>
 <script lang="ts" setup>
-  import { Ref, ref, watch } from 'vue';
-  import { Card } from 'ant-design-vue';
-  import { useECharts } from '/@/hooks/web/useECharts';
+  import { Ref, ref, watch } from "vue";
+  import { Card } from "ant-design-vue";
+  import { useECharts } from "/@/hooks/web/useECharts";
 
   const props = defineProps({
     loading: Boolean,
     width: {
       type: String as PropType<string>,
-      default: '100%',
+      default: "100%",
     },
     height: {
       type: String as PropType<string>,
-      default: '300px',
+      default: "300px",
     },
   });
 
   const chartRef = ref<HTMLDivElement | null>(null);
   const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);
+
   watch(
     () => props.loading,
     () => {
@@ -30,27 +31,27 @@
       }
       setOptions({
         tooltip: {
-          trigger: 'item',
+          trigger: "item",
         },
 
         series: [
           {
-            name: '访问来源',
-            type: 'pie',
-            radius: '80%',
-            center: ['50%', '50%'],
-            color: ['#5ab1ef', '#b6a2de', '#67e0e3', '#2ec7c9'],
+            name: "访问来源",
+            type: "pie",
+            radius: "80%",
+            center: ["50%", "50%"],
+            color: ["#5ab1ef", "#b6a2de", "#67e0e3", "#2ec7c9"],
             data: [
-              { value: 500, name: '电子产品' },
-              { value: 310, name: '服装' },
-              { value: 274, name: '化妆品' },
-              { value: 400, name: '家居' },
+              { value: 500, name: "电子产品" },
+              { value: 310, name: "服装" },
+              { value: 274, name: "化妆品" },
+              { value: 400, name: "家居" },
             ].sort(function (a, b) {
               return a.value - b.value;
             }),
-            roseType: 'radius',
-            animationType: 'scale',
-            animationEasing: 'exponentialInOut',
+            roseType: "radius",
+            animationType: "scale",
+            animationEasing: "exponentialInOut",
             animationDelay: function () {
               return Math.random() * 400;
             },
diff --git a/src/views/dashboard/analysis/components/SiteAnalysis.vue b/src/views/dashboard/analysis/components/SiteAnalysis.vue
index de0ebcf9812546461a3da2746bf6106d9a0d49d1..2b20ad9dafee30461e6b7370d6d4e8fa5ad41c85 100644
--- a/src/views/dashboard/analysis/components/SiteAnalysis.vue
+++ b/src/views/dashboard/analysis/components/SiteAnalysis.vue
@@ -3,7 +3,7 @@
     :tab-list="tabListTitle"
     v-bind="$attrs"
     :active-tab-key="activeKey"
-    @tabChange="onTabChange"
+    @tab-change="onTabChange"
   >
     <p v-if="activeKey === 'tab1'">
       <VisitAnalysis />
@@ -14,21 +14,21 @@
   </Card>
 </template>
 <script lang="ts" setup>
-  import { ref } from 'vue';
-  import { Card } from 'ant-design-vue';
-  import VisitAnalysis from './VisitAnalysis.vue';
-  import VisitAnalysisBar from './VisitAnalysisBar.vue';
+  import { ref } from "vue";
+  import { Card } from "ant-design-vue";
+  import VisitAnalysis from "./VisitAnalysis.vue";
+  import VisitAnalysisBar from "./VisitAnalysisBar.vue";
 
-  const activeKey = ref('tab1');
+  const activeKey = ref("tab1");
 
   const tabListTitle = [
     {
-      key: 'tab1',
-      tab: '流量趋势',
+      key: "tab1",
+      tab: "流量趋势",
     },
     {
-      key: 'tab2',
-      tab: '访问量',
+      key: "tab2",
+      tab: "访问量",
     },
   ];
 
diff --git a/src/views/dashboard/analysis/components/VisitAnalysis.vue b/src/views/dashboard/analysis/components/VisitAnalysis.vue
index 1429166729f0c2b64b88b4c74e524a7dd89574e6..97eae8aea6b0fa777de99066e1109b4661e644b5 100644
--- a/src/views/dashboard/analysis/components/VisitAnalysis.vue
+++ b/src/views/dashboard/analysis/components/VisitAnalysis.vue
@@ -1,10 +1,12 @@
 <template>
   <div ref="chartRef" :style="{ height, width }"></div>
 </template>
+<script lang="ts">
+  import { basicProps } from "./props";
+</script>
 <script lang="ts" setup>
-  import { onMounted, ref, Ref } from 'vue';
-  import { useECharts } from '/@/hooks/web/useECharts';
-  import { basicProps } from './props';
+  import { onMounted, ref, Ref } from "vue";
+  import { useECharts } from "/@/hooks/web/useECharts";
 
   defineProps({
     ...basicProps,
@@ -15,43 +17,24 @@
   onMounted(() => {
     setOptions({
       tooltip: {
-        trigger: 'axis',
+        trigger: "axis",
         axisPointer: {
           lineStyle: {
             width: 1,
-            color: '#019680',
+            color: "#019680",
           },
         },
       },
       xAxis: {
-        type: 'category',
+        type: "category",
         boundaryGap: false,
-        data: [
-          '6:00',
-          '7:00',
-          '8:00',
-          '9:00',
-          '10:00',
-          '11:00',
-          '12:00',
-          '13:00',
-          '14:00',
-          '15:00',
-          '16:00',
-          '17:00',
-          '18:00',
-          '19:00',
-          '20:00',
-          '21:00',
-          '22:00',
-          '23:00',
-        ],
+        data: [...new Array(18)].map((_item, index) => `${index + 6}:00`),
         splitLine: {
           show: true,
           lineStyle: {
             width: 1,
-            type: 'solid',
-            color: 'rgba(226,226,226,0.5)',
+            type: "solid",
+            color: "rgba(226,226,226,0.5)",
           },
         },
         axisTick: {
@@ -60,7 +43,7 @@
       },
       yAxis: [
         {
-          type: 'value',
+          type: "value",
           max: 80000,
           splitNumber: 4,
           axisTick: {
@@ -69,12 +52,12 @@
           splitArea: {
             show: true,
             areaStyle: {
-              color: ['rgba(255,255,255,0.2)', 'rgba(226,226,226,0.2)'],
+              color: ["rgba(255,255,255,0.2)", "rgba(226,226,226,0.2)"],
             },
           },
         },
       ],
-      grid: { left: '1%', right: '1%', top: '2  %', bottom: 0, containLabel: true },
+      grid: { left: "1%", right: "1%", top: "2  %", bottom: 0, containLabel: true },
       series: [
         {
           smooth: true,
@@ -82,10 +65,10 @@
             111, 222, 4000, 18000, 33333, 55555, 66666, 33333, 14000, 36000, 66666, 44444, 22222,
             11111, 4000, 2000, 500, 333, 222, 111,
           ],
-          type: 'line',
+          type: "line",
           areaStyle: {},
           itemStyle: {
-            color: '#5ab1ef',
+            color: "#5ab1ef",
           },
         },
         {
@@ -94,10 +77,10 @@
             33, 66, 88, 333, 3333, 5000, 18000, 3000, 1200, 13000, 22000, 11000, 2221, 1201, 390,
             198, 60, 30, 22, 11,
           ],
-          type: 'line',
+          type: "line",
           areaStyle: {},
           itemStyle: {
-            color: '#019680',
+            color: "#019680",
           },
         },
       ],
diff --git a/src/views/dashboard/analysis/components/VisitAnalysisBar.vue b/src/views/dashboard/analysis/components/VisitAnalysisBar.vue
index 4883d87856a69a08769905476120a3b89cb3bb11..5c350f43610c7fb00e27d3e9102b228b0b145881 100644
--- a/src/views/dashboard/analysis/components/VisitAnalysisBar.vue
+++ b/src/views/dashboard/analysis/components/VisitAnalysisBar.vue
@@ -1,10 +1,12 @@
 <template>
   <div ref="chartRef" :style="{ height, width }"></div>
 </template>
+<script lang="ts">
+  import { basicProps } from "./props";
+</script>
 <script lang="ts" setup>
-  import { onMounted, ref, Ref } from 'vue';
-  import { useECharts } from '/@/hooks/web/useECharts';
-  import { basicProps } from './props';
+  import { onMounted, ref, Ref } from "vue";
+  import { useECharts } from "/@/hooks/web/useECharts";
 
   defineProps({
     ...basicProps,
@@ -15,41 +17,28 @@
   onMounted(() => {
     setOptions({
       tooltip: {
-        trigger: 'axis',
+        trigger: "axis",
         axisPointer: {
           lineStyle: {
             width: 1,
-            color: '#019680',
+            color: "#019680",
           },
         },
       },
-      grid: { left: '1%', right: '1%', top: '2  %', bottom: 0, containLabel: true },
+      grid: { left: "1%", right: "1%", top: "2  %", bottom: 0, containLabel: true },
       xAxis: {
-        type: 'category',
-        data: [
-          '1月',
-          '2月',
-          '3月',
-          '4月',
-          '5月',
-          '6月',
-          '7月',
-          '8月',
-          '9月',
-          '10月',
-          '11月',
-          '12月',
-        ],
+        type: "category",
+        data: [...new Array(12)].map((_item, index) => `${index + 1}月`),
       },
       yAxis: {
-        type: 'value',
+        type: "value",
         max: 8000,
         splitNumber: 4,
       },
       series: [
         {
           data: [3000, 2000, 3333, 5000, 3200, 4200, 3200, 2100, 3000, 5100, 6000, 3200, 4800],
-          type: 'bar',
+          type: "bar",
           barMaxWidth: 80,
         },
       ],
diff --git a/src/views/dashboard/analysis/components/VisitRadar.vue b/src/views/dashboard/analysis/components/VisitRadar.vue
index 8f7ed03b4be78ede0d63518f127f75a79b15b966..94d5ec95e77447ed8ee6d8a2d7bfd9e7f972f492 100644
--- a/src/views/dashboard/analysis/components/VisitRadar.vue
+++ b/src/views/dashboard/analysis/components/VisitRadar.vue
@@ -4,24 +4,24 @@
   </Card>
 </template>
 <script lang="ts" setup>
-  import { Ref, ref, watch } from 'vue';
-  import { Card } from 'ant-design-vue';
-  import { useECharts } from '/@/hooks/web/useECharts';
+  import { Ref, ref, watch } from "vue";
+  import { Card } from "ant-design-vue";
+  import { useECharts } from "/@/hooks/web/useECharts";
 
   const props = defineProps({
     loading: Boolean,
     width: {
       type: String as PropType<string>,
-      default: '100%',
+      default: "100%",
     },
     height: {
       type: String as PropType<string>,
-      default: '300px',
+      default: "300px",
     },
   });
-
   const chartRef = ref<HTMLDivElement | null>(null);
   const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);
+
   watch(
     () => props.loading,
     () => {
@@ -31,46 +31,40 @@
       setOptions({
         legend: {
           bottom: 0,
-          data: ['访问', '购买'],
+          data: ["访问", "购买"],
         },
         tooltip: {},
         radar: {
-          radius: '60%',
+          radius: "60%",
           splitNumber: 8,
           indicator: [
             {
-              text: '电脑',
-              max: 100,
+              name: "电脑",
             },
             {
-              text: '充电器',
-              max: 100,
+              name: "充电器",
             },
             {
-              text: '耳机',
-              max: 100,
+              name: "耳机",
             },
             {
-              text: '手机',
-              max: 100,
+              name: "手机",
             },
             {
-              text: 'Ipad',
-              max: 100,
+              name: "Ipad",
             },
             {
-              text: '耳机',
-              max: 100,
+              name: "耳机",
             },
           ],
         },
         series: [
           {
-            type: 'radar',
+            type: "radar",
             symbolSize: 0,
             areaStyle: {
               shadowBlur: 0,
-              shadowColor: 'rgba(0,0,0,.2)',
+              shadowColor: "rgba(0,0,0,.2)",
               shadowOffsetX: 0,
               shadowOffsetY: 10,
               opacity: 1,
@@ -78,16 +72,16 @@
             data: [
               {
                 value: [90, 50, 86, 40, 50, 20],
-                name: '访问',
+                name: "访问",
                 itemStyle: {
-                  color: '#b6a2de',
+                  color: "#b6a2de",
                 },
               },
               {
                 value: [70, 75, 70, 76, 20, 85],
-                name: '购买',
+                name: "购买",
                 itemStyle: {
-                  color: '#5ab1ef',
+                  color: "#5ab1ef",
                 },
               },
             ],
diff --git a/src/views/dashboard/analysis/components/VisitSource.vue b/src/views/dashboard/analysis/components/VisitSource.vue
index 411ba0d7450e74e2637e13ea044eaf129192800f..8191e2b874b85da7f44f218c49092369af49884b 100644
--- a/src/views/dashboard/analysis/components/VisitSource.vue
+++ b/src/views/dashboard/analysis/components/VisitSource.vue
@@ -4,22 +4,23 @@
   </Card>
 </template>
 <script lang="ts" setup>
-  import { Ref, ref, watch } from 'vue';
-  import { Card } from 'ant-design-vue';
-  import { useECharts } from '/@/hooks/web/useECharts';
+  import { Ref, ref, watch } from "vue";
+  import { Card } from "ant-design-vue";
+  import { useECharts } from "/@/hooks/web/useECharts";
   const props = defineProps({
     loading: Boolean,
     width: {
       type: String as PropType<string>,
-      default: '100%',
+      default: "100%",
     },
     height: {
       type: String as PropType<string>,
-      default: '300px',
+      default: "300px",
     },
   });
   const chartRef = ref<HTMLDivElement | null>(null);
   const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);
+
   watch(
     () => props.loading,
     () => {
@@ -28,46 +29,46 @@
       }
       setOptions({
         tooltip: {
-          trigger: 'item',
+          trigger: "item",
         },
         legend: {
-          bottom: '1%',
-          left: 'center',
+          bottom: "1%",
+          left: "center",
         },
         series: [
           {
-            color: ['#5ab1ef', '#b6a2de', '#67e0e3', '#2ec7c9'],
-            name: '访问来源',
-            type: 'pie',
-            radius: ['40%', '70%'],
+            color: ["#5ab1ef", "#b6a2de", "#67e0e3", "#2ec7c9"],
+            name: "访问来源",
+            type: "pie",
+            radius: ["40%", "70%"],
             avoidLabelOverlap: false,
             itemStyle: {
               borderRadius: 10,
-              borderColor: '#fff',
+              borderColor: "#fff",
               borderWidth: 2,
             },
             label: {
               show: false,
-              position: 'center',
+              position: "center",
             },
             emphasis: {
               label: {
                 show: true,
-                fontSize: '12',
-                fontWeight: 'bold',
+                fontSize: "12",
+                fontWeight: "bold",
               },
             },
             labelLine: {
               show: false,
             },
             data: [
-              { value: 1048, name: '搜索引擎' },
-              { value: 735, name: '直接访问' },
-              { value: 580, name: '邮件营销' },
-              { value: 484, name: '联盟广告' },
+              { value: 1048, name: "搜索引擎" },
+              { value: 735, name: "直接访问" },
+              { value: 580, name: "邮件营销" },
+              { value: 484, name: "联盟广告" },
             ],
-            animationType: 'scale',
-            animationEasing: 'exponentialInOut',
+            animationType: "scale",
+            animationEasing: "exponentialInOut",
             animationDelay: function () {
               return Math.random() * 100;
             },
diff --git a/src/views/dashboard/analysis/components/props.ts b/src/views/dashboard/analysis/components/props.ts
index 86436506c1ebee9ec4aac29766f5b0d8a5644690..daeb7de9ffc70d4a2fd8bf0e917c288223d8084a 100644
--- a/src/views/dashboard/analysis/components/props.ts
+++ b/src/views/dashboard/analysis/components/props.ts
@@ -1,4 +1,4 @@
-import { PropType } from 'vue';
+import { PropType } from "vue";
 
 export interface BasicProps {
   width: string;
@@ -7,10 +7,10 @@ export interface BasicProps {
 export const basicProps = {
   width: {
     type: String as PropType<string>,
-    default: '100%',
+    default: "100%",
   },
   height: {
     type: String as PropType<string>,
-    default: '280px',
+    default: "280px",
   },
 };
diff --git a/src/views/dashboard/analysis/data.ts b/src/views/dashboard/analysis/data.ts
index c5c28dd5fd2b7947e1e9b452369d675ac44231b1..061c8465e4db1e9103169b81b7169aff339ec609 100644
--- a/src/views/dashboard/analysis/data.ts
+++ b/src/views/dashboard/analysis/data.ts
@@ -9,35 +9,35 @@ export interface GrowCardItem {
 
 export const growCardList: GrowCardItem[] = [
   {
-    title: '访问数',
-    icon: 'visit-count|svg',
+    title: "访问数",
+    icon: "visit-count|svg",
     value: 2000,
     total: 120000,
-    color: 'green',
-    action: '月',
+    color: "green",
+    action: "月",
   },
   {
-    title: '成交额',
-    icon: 'total-sales|svg',
+    title: "成交额",
+    icon: "total-sales|svg",
     value: 20000,
     total: 500000,
-    color: 'blue',
-    action: '月',
+    color: "blue",
+    action: "月",
   },
   {
-    title: '下载数',
-    icon: 'download-count|svg',
+    title: "下载数",
+    icon: "download-count|svg",
     value: 8000,
     total: 120000,
-    color: 'orange',
-    action: '周',
+    color: "orange",
+    action: "周",
   },
   {
-    title: '成交数',
-    icon: 'transaction|svg',
+    title: "成交数",
+    icon: "transaction|svg",
     value: 5000,
     total: 50000,
-    color: 'purple',
-    action: '年',
+    color: "purple",
+    action: "年",
   },
 ];
diff --git a/src/views/dashboard/analysis/index.vue b/src/views/dashboard/analysis/index.vue
index c35fa69035715bc7b725f376041a2e4d9f73b774..6ed14b86905968582cd089ff891592bef4249df2 100644
--- a/src/views/dashboard/analysis/index.vue
+++ b/src/views/dashboard/analysis/index.vue
@@ -10,12 +10,12 @@
   </div>
 </template>
 <script lang="ts" setup>
-  import { ref } from 'vue';
-  import GrowCard from './components/GrowCard.vue';
-  import SiteAnalysis from './components/SiteAnalysis.vue';
-  import VisitSource from './components/VisitSource.vue';
-  import VisitRadar from './components/VisitRadar.vue';
-  import SalesProductPie from './components/SalesProductPie.vue';
+  import { ref } from "vue";
+  import GrowCard from "./components/GrowCard.vue";
+  import SiteAnalysis from "./components/SiteAnalysis.vue";
+  import VisitSource from "./components/VisitSource.vue";
+  import VisitRadar from "./components/VisitRadar.vue";
+  import SalesProductPie from "./components/SalesProductPie.vue";
 
   const loading = ref(true);
 
diff --git a/src/views/dashboard/workbench/components/DynamicInfo.vue b/src/views/dashboard/workbench/components/DynamicInfo.vue
index 4be8f1ff82029837f88287c681c4fcb8d26e3183..49f811c030fc079edf1b15614880a3b6b6a48721 100644
--- a/src/views/dashboard/workbench/components/DynamicInfo.vue
+++ b/src/views/dashboard/workbench/components/DynamicInfo.vue
@@ -22,9 +22,9 @@
   </Card>
 </template>
 <script lang="ts" setup>
-  import { Card, List } from 'ant-design-vue';
-  import { dynamicInfoItems } from './data';
-  import { Icon } from '/@/components/Icon';
+  import { Card, List } from "ant-design-vue";
+  import { dynamicInfoItems } from "./data";
+  import { Icon } from "/@/components/Icon";
 
   const ListItem = List.Item;
   const ListItemMeta = List.Item.Meta;
diff --git a/src/views/dashboard/workbench/components/ProjectCard.vue b/src/views/dashboard/workbench/components/ProjectCard.vue
index 9fa4ac635c0d799f294df697e179799b500a93da..04ebc980591719e52e23361c3d1d68b76641324d 100644
--- a/src/views/dashboard/workbench/components/ProjectCard.vue
+++ b/src/views/dashboard/workbench/components/ProjectCard.vue
@@ -4,26 +4,24 @@
       <a-button type="link" size="small">更多</a-button>
     </template>
 
-    <template v-for="item in items" :key="item">
-      <CardGrid class="!md:w-1/3 !w-full">
-        <span class="flex">
-          <Icon :icon="item.icon" :color="item.color" size="30" />
-          <span class="text-lg ml-4">{{ item.title }}</span>
-        </span>
-        <div class="flex mt-2 h-10 text-secondary">{{ item.desc }}</div>
-        <div class="flex justify-between text-secondary">
-          <span>{{ item.group }}</span>
-          <span>{{ item.date }}</span>
-        </div>
-      </CardGrid>
-    </template>
+    <CardGrid v-for="item in items" :key="item" class="!md:w-1/3 !w-full">
+      <span class="flex">
+        <Icon :icon="item.icon" :color="item.color" size="30" />
+        <span class="text-lg ml-4">{{ item.title }}</span>
+      </span>
+      <div class="flex mt-2 h-10 text-secondary">{{ item.desc }}</div>
+      <div class="flex justify-between text-secondary">
+        <span>{{ item.group }}</span>
+        <span>{{ item.date }}</span>
+      </div>
+    </CardGrid>
   </Card>
 </template>
 <script lang="ts">
-  import { defineComponent } from 'vue';
-  import { Card } from 'ant-design-vue';
-  import { Icon } from '/@/components/Icon';
-  import { groupItems } from './data';
+  import { defineComponent } from "vue";
+  import { Card } from "ant-design-vue";
+  import { Icon } from "/@/components/Icon";
+  import { groupItems } from "./data";
 
   export default defineComponent({
     components: { Card, CardGrid: Card.Grid, Icon },
diff --git a/src/views/dashboard/workbench/components/QuickNav.vue b/src/views/dashboard/workbench/components/QuickNav.vue
index 4e004d177038ba83c56e40b78cdb5f5c4705873f..65d3b677135815fc5b43260d135f733d6e132016 100644
--- a/src/views/dashboard/workbench/components/QuickNav.vue
+++ b/src/views/dashboard/workbench/components/QuickNav.vue
@@ -1,19 +1,17 @@
 <template>
   <Card title="快捷导航" v-bind="$attrs">
-    <template v-for="item in navItems" :key="item">
-      <CardGrid>
-        <span class="flex flex-col items-center">
-          <Icon :icon="item.icon" :color="item.color" size="20" />
-          <span class="text-md mt-2">{{ item.title }}</span>
-        </span>
-      </CardGrid>
-    </template>
+    <CardGrid v-for="item in navItems" :key="item">
+      <span class="flex flex-col items-center">
+        <Icon :icon="item.icon" :color="item.color" size="20" />
+        <span class="text-md mt-2">{{ item.title }}</span>
+      </span>
+    </CardGrid>
   </Card>
 </template>
 <script lang="ts" setup>
-  import { Card } from 'ant-design-vue';
-  import { navItems } from './data';
-  import { Icon } from '/@/components/Icon';
+  import { Card } from "ant-design-vue";
+  import { navItems } from "./data";
+  import { Icon } from "/@/components/Icon";
 
   const CardGrid = Card.Grid;
 </script>
diff --git a/src/views/dashboard/workbench/components/SaleRadar.vue b/src/views/dashboard/workbench/components/SaleRadar.vue
index 38fdd37e01223abd5ce59ff4d491fc496be2f0ab..e01dcf77982251789983eef0c067bf4e2dde55b8 100644
--- a/src/views/dashboard/workbench/components/SaleRadar.vue
+++ b/src/views/dashboard/workbench/components/SaleRadar.vue
@@ -4,19 +4,19 @@
   </Card>
 </template>
 <script lang="ts" setup>
-  import { Ref, ref, watch } from 'vue';
-  import { Card } from 'ant-design-vue';
-  import { useECharts } from '/@/hooks/web/useECharts';
+  import { Ref, ref, watch } from "vue";
+  import { Card } from "ant-design-vue";
+  import { useECharts } from "/@/hooks/web/useECharts";
 
   const props = defineProps({
     loading: Boolean,
     width: {
       type: String as PropType<string>,
-      default: '100%',
+      default: "100%",
     },
     height: {
       type: String as PropType<string>,
-      default: '400px',
+      default: "400px",
     },
   });
 
@@ -31,46 +31,40 @@
       setOptions({
         legend: {
           bottom: 0,
-          data: ['Visits', 'Sales'],
+          data: ["Visits", "Sales"],
         },
         tooltip: {},
         radar: {
-          radius: '60%',
+          radius: "60%",
           splitNumber: 8,
           indicator: [
             {
-              text: '2017',
-              max: 100,
+              name: "2017",
             },
             {
-              text: '2017',
-              max: 100,
+              name: "2017",
             },
             {
-              text: '2018',
-              max: 100,
+              name: "2018",
             },
             {
-              text: '2019',
-              max: 100,
+              name: "2019",
             },
             {
-              text: '2020',
-              max: 100,
+              name: "2020",
             },
             {
-              text: '2021',
-              max: 100,
+              name: "2021",
             },
           ],
         },
         series: [
           {
-            type: 'radar',
+            type: "radar",
             symbolSize: 0,
             areaStyle: {
               shadowBlur: 0,
-              shadowColor: 'rgba(0,0,0,.2)',
+              shadowColor: "rgba(0,0,0,.2)",
               shadowOffsetX: 0,
               shadowOffsetY: 10,
               opacity: 1,
@@ -78,16 +72,16 @@
             data: [
               {
                 value: [90, 50, 86, 40, 50, 20],
-                name: 'Visits',
+                name: "Visits",
                 itemStyle: {
-                  color: '#b6a2de',
+                  color: "#b6a2de",
                 },
               },
               {
                 value: [70, 75, 70, 76, 20, 85],
-                name: 'Sales',
+                name: "Sales",
                 itemStyle: {
-                  color: '#67e0e3',
+                  color: "#67e0e3",
                 },
               },
             ],
diff --git a/src/views/dashboard/workbench/components/WorkbenchHeader.vue b/src/views/dashboard/workbench/components/WorkbenchHeader.vue
index ef4d90d79438aa0eb9315291b1ee8e8d6dc35f74..f1ef0e293071afc795e7bdcfa0a53b0a11ee9079 100644
--- a/src/views/dashboard/workbench/components/WorkbenchHeader.vue
+++ b/src/views/dashboard/workbench/components/WorkbenchHeader.vue
@@ -23,10 +23,10 @@
   </div>
 </template>
 <script lang="ts" setup>
-  import { computed } from 'vue';
-  import { Avatar } from 'ant-design-vue';
-  import { useUserStore } from '/@/store/modules/user';
-  import headerImg from '/@/assets/images/header.jpg';
+  import { computed } from "vue";
+  import { Avatar } from "ant-design-vue";
+  import { useUserStore } from "/@/store/modules/user";
+  import headerImg from "/@/assets/images/header.jpg";
 
   const userStore = useUserStore();
   const userinfo = computed(() => userStore.getUserInfo);
diff --git a/src/views/dashboard/workbench/components/data.ts b/src/views/dashboard/workbench/components/data.ts
index c7172c3ccbc9c1882ec2a059aeb6a54c3be42f10..6072b50ad7bc55d1a18a616e516ce0f271243a0a 100644
--- a/src/views/dashboard/workbench/components/data.ts
+++ b/src/views/dashboard/workbench/components/data.ts
@@ -22,135 +22,135 @@ interface DynamicInfoItem {
 
 export const navItems: NavItem[] = [
   {
-    title: '首页',
-    icon: 'ion:home-outline',
-    color: '#1fdaca',
+    title: "首页",
+    icon: "ion:home-outline",
+    color: "#1fdaca",
   },
   {
-    title: '仪表盘',
-    icon: 'ion:grid-outline',
-    color: '#bf0c2c',
+    title: "仪表盘",
+    icon: "ion:grid-outline",
+    color: "#bf0c2c",
   },
   {
-    title: '组件',
-    icon: 'ion:layers-outline',
-    color: '#e18525',
+    title: "组件",
+    icon: "ion:layers-outline",
+    color: "#e18525",
   },
   {
-    title: '系统管理',
-    icon: 'ion:settings-outline',
-    color: '#3fb27f',
+    title: "系统管理",
+    icon: "ion:settings-outline",
+    color: "#3fb27f",
   },
   {
-    title: '权限管理',
-    icon: 'ion:key-outline',
-    color: '#4daf1bc9',
+    title: "权限管理",
+    icon: "ion:key-outline",
+    color: "#4daf1bc9",
   },
   {
-    title: '图表',
-    icon: 'ion:bar-chart-outline',
-    color: '#00d8ff',
+    title: "图表",
+    icon: "ion:bar-chart-outline",
+    color: "#00d8ff",
   },
 ];
 
 export const dynamicInfoItems: DynamicInfoItem[] = [
   {
-    avatar: 'dynamic-avatar-1|svg',
-    name: '威廉',
-    date: '刚刚',
+    avatar: "dynamic-avatar-1|svg",
+    name: "威廉",
+    date: "刚刚",
     desc: `在 <a>开源组</a> 创建了项目 <a>Vue</a>`,
   },
   {
-    avatar: 'dynamic-avatar-2|svg',
-    name: '艾文',
-    date: '1个小时前',
+    avatar: "dynamic-avatar-2|svg",
+    name: "艾文",
+    date: "1个小时前",
     desc: `关注了 <a>威廉</a> `,
   },
   {
-    avatar: 'dynamic-avatar-3|svg',
-    name: '克里斯',
-    date: '1天前',
+    avatar: "dynamic-avatar-3|svg",
+    name: "克里斯",
+    date: "1天前",
     desc: `发布了 <a>个人动态</a> `,
   },
   {
-    avatar: 'dynamic-avatar-4|svg',
-    name: 'Vben',
-    date: '2天前',
+    avatar: "dynamic-avatar-4|svg",
+    name: "Vben",
+    date: "2天前",
     desc: `发表文章 <a>如何编写一个Vite插件</a> `,
   },
   {
-    avatar: 'dynamic-avatar-5|svg',
-    name: '皮特',
-    date: '3天前',
+    avatar: "dynamic-avatar-5|svg",
+    name: "皮特",
+    date: "3天前",
     desc: `回复了 <a>杰克</a> 的问题 <a>如何进行项目优化?</a>`,
   },
   {
-    avatar: 'dynamic-avatar-6|svg',
-    name: '杰克',
-    date: '1周前',
+    avatar: "dynamic-avatar-6|svg",
+    name: "杰克",
+    date: "1周前",
     desc: `关闭了问题 <a>如何运行项目</a> `,
   },
   {
-    avatar: 'dynamic-avatar-1|svg',
-    name: '威廉',
-    date: '1周前',
+    avatar: "dynamic-avatar-1|svg",
+    name: "威廉",
+    date: "1周前",
     desc: `发布了 <a>个人动态</a> `,
   },
   {
-    avatar: 'dynamic-avatar-1|svg',
-    name: '威廉',
-    date: '2021-04-01 20:00',
+    avatar: "dynamic-avatar-1|svg",
+    name: "威廉",
+    date: "2021-04-01 20:00",
     desc: `推送了代码到 <a>Github</a>`,
   },
 ];
 
 export const groupItems: GroupItem[] = [
   {
-    title: 'Github',
-    icon: 'carbon:logo-github',
-    color: '',
-    desc: '不要等待机会,而要创造机会。',
-    group: '开源组',
-    date: '2021-04-01',
+    title: "Github",
+    icon: "carbon:logo-github",
+    color: "",
+    desc: "不要等待机会,而要创造机会。",
+    group: "开源组",
+    date: "2021-04-01",
   },
   {
-    title: 'Vue',
-    icon: 'ion:logo-vue',
-    color: '#3fb27f',
-    desc: '现在的你决定将来的你。',
-    group: '算法组',
-    date: '2021-04-01',
+    title: "Vue",
+    icon: "ion:logo-vue",
+    color: "#3fb27f",
+    desc: "现在的你决定将来的你。",
+    group: "算法组",
+    date: "2021-04-01",
   },
   {
-    title: 'Html5',
-    icon: 'ion:logo-html5',
-    color: '#e18525',
-    desc: '没有什么才能比努力更重要。',
-    group: '上班摸鱼',
-    date: '2021-04-01',
+    title: "Html5",
+    icon: "ion:logo-html5",
+    color: "#e18525",
+    desc: "没有什么才能比努力更重要。",
+    group: "上班摸鱼",
+    date: "2021-04-01",
   },
   {
-    title: 'Angular',
-    icon: 'ion:logo-angular',
-    color: '#bf0c2c',
-    desc: '热情和欲望可以突破一切难关。',
-    group: 'UI',
-    date: '2021-04-01',
+    title: "Angular",
+    icon: "ion:logo-angular",
+    color: "#bf0c2c",
+    desc: "热情和欲望可以突破一切难关。",
+    group: "UI",
+    date: "2021-04-01",
   },
   {
-    title: 'React',
-    icon: 'bx:bxl-react',
-    color: '#00d8ff',
-    desc: '健康的身体是实目标的基石。',
-    group: '技术牛',
-    date: '2021-04-01',
+    title: "React",
+    icon: "bx:bxl-react",
+    color: "#00d8ff",
+    desc: "健康的身体是实目标的基石。",
+    group: "技术牛",
+    date: "2021-04-01",
   },
   {
-    title: 'Js',
-    icon: 'ion:logo-javascript',
-    color: '#4daf1bc9',
-    desc: '路是走出来的,而不是空想出来的。',
-    group: '架构组',
-    date: '2021-04-01',
+    title: "Js",
+    icon: "ion:logo-javascript",
+    color: "#4daf1bc9",
+    desc: "路是走出来的,而不是空想出来的。",
+    group: "架构组",
+    date: "2021-04-01",
   },
 ];
diff --git a/src/views/dashboard/workbench/index.vue b/src/views/dashboard/workbench/index.vue
index 5ee292e2204aa7295b5853c96673c3c37af69853..fcaca0253a64cd1fe858f0403d942d719dc1fd51 100644
--- a/src/views/dashboard/workbench/index.vue
+++ b/src/views/dashboard/workbench/index.vue
@@ -19,14 +19,14 @@
   </PageWrapper>
 </template>
 <script lang="ts" setup>
-  import { ref } from 'vue';
-  import { Card } from 'ant-design-vue';
-  import { PageWrapper } from '/@/components/Page';
-  import WorkbenchHeader from './components/WorkbenchHeader.vue';
-  import ProjectCard from './components/ProjectCard.vue';
-  import QuickNav from './components/QuickNav.vue';
-  import DynamicInfo from './components/DynamicInfo.vue';
-  import SaleRadar from './components/SaleRadar.vue';
+  import { ref } from "vue";
+  import { Card } from "ant-design-vue";
+  import { PageWrapper } from "/@/components/Page";
+  import WorkbenchHeader from "./components/WorkbenchHeader.vue";
+  import ProjectCard from "./components/ProjectCard.vue";
+  import QuickNav from "./components/QuickNav.vue";
+  import DynamicInfo from "./components/DynamicInfo.vue";
+  import SaleRadar from "./components/SaleRadar.vue";
 
   const loading = ref(true);
 
diff --git a/src/views/student/practice/practice-record/index.vue b/src/views/student/practice/practice-record/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..eee0c668d0735fdda062501e7753aeba8f9e92ed
--- /dev/null
+++ b/src/views/student/practice/practice-record/index.vue
@@ -0,0 +1,32 @@
+<template>
+  <div class="b-6">
+    <Tabs type="card" :centered="true">
+      <TabPane key="1" tab="实习听课记录">
+        <PracticeLectureNote />
+      </TabPane>
+      <TabPane key="2" tab="教育实习教案" force-render>
+        <PracticeLessonPlan />
+      </TabPane>
+      <TabPane key="3" tab="教研活动心得">
+        <TeachingStudySummary />
+      </TabPane>
+    </Tabs>
+  </div>
+</template>
+<script lang="ts">
+  import { Tabs, TabPane } from "ant-design-vue";
+  import { defineComponent } from "vue";
+  import PracticeLectureNote from "/@/views/student/practice/practice-record/practice-lecture-record/index.vue";
+  import PracticeLessonPlan from "/@/views/student/practice/practice-record/practice-lesson-plan/index.vue";
+  import TeachingStudySummary from "/@/views/student/practice/practice-record/teaching-study-summary/index.vue";
+  export default defineComponent({
+    name: "PracticeRecord",
+    components: {
+      Tabs,
+      TabPane,
+      PracticeLectureNote,
+      PracticeLessonPlan,
+      TeachingStudySummary,
+    },
+  });
+</script>
diff --git a/src/views/student/practice/practice-record/practice-lecture-record/description.vue b/src/views/student/practice/practice-record/practice-lecture-record/description.vue
new file mode 100644
index 0000000000000000000000000000000000000000..11501682c8b6563a0c7af7d55df33b69288c446c
--- /dev/null
+++ b/src/views/student/practice/practice-record/practice-lecture-record/description.vue
@@ -0,0 +1,105 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    title="详情"
+    @register="registerModal"
+    :minHeight="550"
+    width="1000px"
+    :showOkBtn="false"
+    cancelText="关闭"
+  >
+    <Description @register="registerDesc" :column="2" size="middle" />
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, h, ref } from "vue";
+  import { DescItem, Description, useDescription } from "/@/components/Description";
+  import { BasicModal, useModalInner } from "/@/components/Modal";
+
+  export default defineComponent({
+    name: "LectureNoteDescriptionModal",
+    components: {
+      Description,
+      BasicModal,
+    },
+    props: { userData: { type: Object } },
+    setup() {
+      const schema: DescItem[] = [
+        {
+          field: "startDate",
+          label: "听课时间",
+          labelMinWidth: 100,
+          contentMinWidth: 200,
+        },
+        {
+          field: "className",
+          label: "听课班级",
+          labelMinWidth: 100,
+        },
+        {
+          field: "lectureContent",
+          label: "听课内容",
+          labelMinWidth: 100,
+          contentMinWidth: 200,
+          span: 2,
+        },
+        {
+          field: "teacherName",
+          label: "任课教师",
+          labelMinWidth: 100,
+          contentMinWidth: 200,
+        },
+        {
+          field: "lectureType",
+          label: "课程类型",
+          labelMinWidth: 100,
+          contentMinWidth: 200,
+        },
+        {
+          field: "teachingProcess",
+          label: "教学过程",
+          span: 2,
+          labelMinWidth: 100,
+        },
+        {
+          field: "experience",
+          label: "听课体会与建议",
+          span: 2,
+          labelMinWidth: 100,
+        },
+        {
+          field: "personalSummary",
+          label: "个人反思与总结",
+          span: 2,
+        },
+        {
+          field: "groupEvaluation",
+          label: "小组评价",
+          span: 2,
+        },
+        {
+          field: "docLink",
+          label: "word文件",
+          render: (val) => {
+            if (val === "") {
+              return "无";
+            }
+            return h("a", { href: val, target: "_blank", text: "点击下载" });
+          },
+        },
+      ];
+      const userData = ref({});
+      const [registerModal] = useModalInner((data) => {
+        userData.value = data;
+      });
+      const [registerDesc] = useDescription({
+        schema,
+        data: userData,
+      });
+      return {
+        registerDesc,
+        registerModal,
+      };
+    },
+  });
+</script>
diff --git a/src/views/student/practice/practice-record/practice-lecture-record/edit.vue b/src/views/student/practice/practice-record/practice-lecture-record/edit.vue
new file mode 100644
index 0000000000000000000000000000000000000000..ce6272e163a3a8a00f44958c527a28e211d5f990
--- /dev/null
+++ b/src/views/student/practice/practice-record/practice-lecture-record/edit.vue
@@ -0,0 +1,190 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    :title="operType === 'update' ? '编辑' : '添加'"
+    @register="registerModal"
+    :minHeight="650"
+    width="900px"
+    :showOkBtn="false"
+    :showCancelBtn="false"
+  >
+    <BasicForm @register="registerForm" :model="formData" @submit="handleSubmit" />
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, ref } from "vue";
+  import { BasicModal, useModalInner } from "/@/components/Modal";
+  import { BasicForm, FormSchema, useForm } from "/@/components/Form";
+  import { TableOperationTypeEnum } from "/@/enums/tableOperationTypeEnum";
+  import { uploadApi } from "/@/api/sys/upload";
+  import { saveLectureNote, updateLectureNote } from "/@/api/student/practice";
+
+  export default defineComponent({
+    name: "LectureNoteEditModal",
+    components: {
+      BasicForm,
+      BasicModal,
+    },
+    setup() {
+      const schemas: FormSchema[] = [
+        {
+          field: "noteId",
+          label: "id",
+          component: "Input",
+          show: false,
+        },
+        {
+          field: "startDate",
+          label: "听课时间",
+          component: "DatePicker",
+          required: true,
+          colProps: {
+            span: 12,
+          },
+        },
+        {
+          field: "className",
+          label: "听课班级",
+          component: "Input",
+          colProps: {
+            span: 12,
+          },
+        },
+        {
+          field: "lectureContent",
+          label: "听课内容",
+          component: "Input",
+          required: true,
+          colProps: {
+            span: 24,
+          },
+        },
+        {
+          field: "teacherName",
+          label: "任课教师",
+          component: "Input",
+          colProps: {
+            span: 12,
+          },
+        },
+        {
+          field: "lectureType",
+          label: "课程类型",
+          component: "Input",
+          colProps: {
+            span: 12,
+          },
+        },
+        {
+          field: "teachingProcess",
+          label: "教学过程",
+          component: "InputTextArea",
+          colProps: {
+            span: 24,
+          },
+          componentProps: {
+            rows: 10,
+          },
+        },
+        {
+          field: "experience",
+          label: "听课体会与建议",
+          component: "InputTextArea",
+          colProps: {
+            span: 24,
+          },
+          componentProps: {
+            rows: 10,
+          },
+        },
+        {
+          field: "personalSummary",
+          label: "个人反思与总结",
+          component: "InputTextArea",
+          colProps: {
+            span: 24,
+          },
+          componentProps: {
+            rows: 10,
+          },
+        },
+        {
+          field: "docLink",
+          label: "word文档",
+          component: "Upload",
+          colProps: {
+            span: 8,
+          },
+          componentProps: {
+            api: uploadApi,
+            multiple: false,
+            maxNumber: 1,
+            accept: ["doc,", "docx"],
+          },
+        },
+      ];
+      const empty = {
+        className: "",
+        docLink: [] as string[],
+        experience: "",
+        groupEvaluation: "",
+        lectureContent: "",
+        lectureType: "",
+        noteId: 0,
+        personalSummary: "",
+        startDate: "",
+        teacherName: "",
+        teachingProcess: "",
+      };
+      const formData = ref(empty);
+      const operType = ref("");
+      const [registerModal, { closeModal }] = useModalInner(({ note, operType: type }) => {
+        operType.value = type;
+        if (type == TableOperationTypeEnum.UPDATE) {
+          formData.value = note;
+          formData.value.docLink = note.docLink === "" ? [] : [note.docLink];
+        }
+      });
+
+      const [registerForm] = useForm({
+        labelWidth: 100,
+        labelAlign: "right",
+        showResetButton: false,
+        showSubmitButton: true,
+        submitButtonOptions: {
+          text: "提交",
+        },
+        schemas,
+        actionColOptions: {
+          span: 24,
+        },
+      });
+
+      function handleSubmit(value) {
+        if (operType.value === TableOperationTypeEnum.SAVE) {
+          return saveLectureNote({ ...value, docLink: value.docLink[0] }).then(() => closeModal());
+        } else if (operType.value === TableOperationTypeEnum.UPDATE) {
+          return updateLectureNote({ ...value, docLink: value.docLink[0] }).then(() =>
+            closeModal(),
+          );
+        }
+        return Promise.reject("未知操作");
+      }
+
+      function handleModalClose() {
+        formData.value = empty;
+        return Promise.resolve(true);
+      }
+
+      return {
+        uploadApi,
+        registerForm,
+        registerModal,
+        handleSubmit,
+        handleModalClose,
+        formData,
+        operType,
+      };
+    },
+  });
+</script>
diff --git a/src/views/student/practice/practice-record/practice-lecture-record/index.vue b/src/views/student/practice/practice-record/practice-lecture-record/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..851ed78eb73d2bb081af836622a7e1c8aa0fde07
--- /dev/null
+++ b/src/views/student/practice/practice-record/practice-lecture-record/index.vue
@@ -0,0 +1,139 @@
+<template>
+  <BasicTable @register="registerTable">
+    <template #toolbar>
+      <a-button type="primary" @click="handleSave"> 新增</a-button>
+      <a-button type="primary" @click="handleReloadCurrent"> 刷新</a-button>
+    </template>
+    <template #bodyCell="{ column, record }">
+      <template v-if="column.key === 'action'">
+        <TableAction
+          stopButtonPropagation
+          :actions="[
+            {
+              label: '详情',
+              icon: 'ant-design:info-circle-outlined',
+              onClick: handleDesc.bind(null, record),
+            },
+            {
+              label: '编辑',
+              icon: 'akar-icons:edit',
+              onClick: handleEdit.bind(null, record),
+            },
+            {
+              label: '删除',
+              icon: 'ic:outline-delete-outline',
+              popConfirm: {
+                title: '确认删除?',
+                okText: '确认',
+                cancelText: '取消',
+                confirm: handleDelete.bind(null, record),
+              },
+            },
+          ]"
+        />
+      </template>
+    </template>
+  </BasicTable>
+  <LectureNoteDescriptionModal @register="registerDescModal" />
+  <LectureNoteEditModal @register="registerEditModal" />
+</template>
+<script lang="ts">
+  import { defineComponent, ref } from "vue";
+  import { LectureNoteItemModel } from "/@/api/student/model/practice-model";
+  import { getLectureNotePage, removeLectureNote } from "/@/api/student/practice";
+  import { BasicColumn, TableAction, useTable } from "/@/components/Table";
+  import { BasicTable } from "/@/components/Table";
+  import LectureNoteDescriptionModal from "./description.vue";
+  import LectureNoteEditModal from "./edit.vue";
+  import { TableOperationTypeEnum } from "/@/enums/tableOperationTypeEnum";
+  import { useModal } from "/@/components/Modal";
+
+  export default defineComponent({
+    name: "PracticeLectureNote",
+    components: { BasicTable, TableAction, LectureNoteDescriptionModal, LectureNoteEditModal },
+    setup() {
+      const columns: BasicColumn[] = [
+        {
+          title: "Id",
+          dataIndex: "noteId",
+          defaultHidden: true,
+        },
+        {
+          title: "听课时间",
+          dataIndex: "startDate",
+          width: 150,
+          sorter: true,
+        },
+        {
+          title: "听课内容",
+          dataIndex: "lectureContent",
+          width: 150,
+        },
+        {
+          title: "听课班级",
+          dataIndex: "className",
+          width: 150,
+        },
+        {
+          title: "任课教师",
+          dataIndex: "teacherName",
+          width: 150,
+        },
+        {
+          title: "课程类型",
+          dataIndex: "lectureType",
+          width: 150,
+        },
+      ];
+      const [registerTable, { reload }] = useTable({
+        title: "实习听课记录",
+        api: getLectureNotePage,
+        columns,
+        rowKey: "recordId",
+        pagination: { pageSize: 10 },
+        actionColumn: {
+          title: "操作",
+          dataIndex: "action",
+          width: 240,
+          fixed: "right",
+        },
+      });
+      const userData = ref<any>(null);
+
+      function handleReloadCurrent() {
+        reload();
+      }
+
+      const [registerDescModal, { openModal: openDescModal }] = useModal();
+      const [registerEditModal, { openModal: openEditModal }] = useModal();
+
+      function handleDesc(note: LectureNoteItemModel) {
+        openDescModal(true, note);
+      }
+
+      function handleEdit(note: LectureNoteItemModel) {
+        openEditModal(true, { note, operType: TableOperationTypeEnum.UPDATE });
+      }
+
+      function handleSave() {
+        openEditModal(true, { operType: TableOperationTypeEnum.SAVE });
+      }
+
+      function handleDelete(note: LectureNoteItemModel) {
+        removeLectureNote(note.noteId);
+      }
+
+      return {
+        registerTable,
+        handleReloadCurrent,
+        handleDesc,
+        handleDelete,
+        handleEdit,
+        handleSave,
+        registerDescModal,
+        registerEditModal,
+        userData,
+      };
+    },
+  });
+</script>
diff --git a/src/views/student/practice/practice-record/practice-lesson-plan/description.vue b/src/views/student/practice/practice-record/practice-lesson-plan/description.vue
new file mode 100644
index 0000000000000000000000000000000000000000..e02320f3faaabde2b99c0bde27fa90e77646e753
--- /dev/null
+++ b/src/views/student/practice/practice-record/practice-lesson-plan/description.vue
@@ -0,0 +1,93 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    title="详情"
+    @register="registerModal"
+    :minHeight="550"
+    width="1000px"
+    :showOkBtn="false"
+    cancelText="关闭"
+  >
+    <Description @register="registerDesc" :column="2" size="middle" />
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, h, ref } from "vue";
+  import { DescItem, Description, useDescription } from "/@/components/Description";
+  import { BasicModal, useModalInner } from "/@/components/Modal";
+
+  export default defineComponent({
+    name: "LessonPlanDescriptionModal",
+    components: {
+      Description,
+      BasicModal,
+    },
+    props: { userData: { type: Object } },
+    setup() {
+      const schema: DescItem[] = [
+        {
+          field: "startDate",
+          label: "听课时间",
+          labelMinWidth: 100,
+          contentMinWidth: 200,
+        },
+        {
+          field: "subjectType",
+          label: "课程类型",
+          labelMinWidth: 100,
+        },
+        {
+          field: "subjectName",
+          label: "课题名称",
+          labelMinWidth: 100,
+          contentMinWidth: 200,
+          span: 2,
+        },
+        {
+          field: "teachingProcess",
+          label: "教学过程",
+          span: 2,
+          labelMinWidth: 100,
+        },
+        {
+          field: "designIdea",
+          label: "课程设计思路",
+          span: 2,
+          labelMinWidth: 100,
+        },
+        {
+          field: "personalSummary",
+          label: "个人反思与总结",
+          span: 2,
+        },
+        {
+          field: "groupEvaluation",
+          label: "小组评价",
+          span: 2,
+        },
+        {
+          field: "docLink",
+          label: "word文件",
+          render: (val) => {
+            if (val === "") {
+              return "无";
+            }
+            return h("a", { href: val, target: "_blank", text: "点击下载" });
+          },
+        },
+      ];
+      const userData = ref({});
+      const [registerModal] = useModalInner((data) => {
+        userData.value = data;
+      });
+      const [registerDesc] = useDescription({
+        schema,
+        data: userData,
+      });
+      return {
+        registerDesc,
+        registerModal,
+      };
+    },
+  });
+</script>
diff --git a/src/views/student/practice/practice-record/practice-lesson-plan/edit.vue b/src/views/student/practice/practice-record/practice-lesson-plan/edit.vue
new file mode 100644
index 0000000000000000000000000000000000000000..83e0d656465840c470a9f93cd0d8544c84ead835
--- /dev/null
+++ b/src/views/student/practice/practice-record/practice-lesson-plan/edit.vue
@@ -0,0 +1,174 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    :title="operType === 'update' ? '编辑' : '添加'"
+    @register="registerModal"
+    :minHeight="650"
+    width="900px"
+    :showOkBtn="false"
+    :showCancelBtn="false"
+    :closeFunc="handleModalClose"
+  >
+    <BasicForm @register="registerForm" :model="formData" @submit="handleSubmit" />
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, ref } from "vue";
+  import { BasicModal, useModalInner } from "/@/components/Modal";
+  import { BasicForm, FormSchema, useForm } from "/@/components/Form";
+  import { TableOperationTypeEnum } from "/@/enums/tableOperationTypeEnum";
+  import { uploadApi } from "/@/api/sys/upload";
+  import { saveLessonPlan, updateLessonPlan } from "/@/api/student/practice";
+  import { useMessage } from "/@/hooks/web/useMessage";
+
+  export default defineComponent({
+    name: "LessonPlanEditModal",
+    components: {
+      BasicForm,
+      BasicModal,
+    },
+    setup() {
+      const schemas: FormSchema[] = [
+        {
+          field: "planId",
+          label: "id",
+          component: "Input",
+          show: false,
+        },
+        {
+          field: "startDate",
+          label: "教案撰写时间",
+          component: "DatePicker",
+          required: true,
+          colProps: {
+            span: 12,
+          },
+        },
+        {
+          field: "subjectName",
+          label: "课题名称",
+          component: "Input",
+          required: true,
+          colProps: {
+            span: 12,
+          },
+        },
+        {
+          field: "subjectType",
+          label: "课题类型",
+          component: "Input",
+          colProps: {
+            span: 24,
+          },
+        },
+        {
+          field: "teachingProcess",
+          label: "教学过程",
+          component: "InputTextArea",
+          colProps: {
+            span: 24,
+          },
+          componentProps: {
+            rows: 10,
+          },
+        },
+        {
+          field: "designIdea",
+          label: "课程设计思路",
+          component: "InputTextArea",
+          colProps: {
+            span: 24,
+          },
+        },
+        {
+          field: "personalSummary",
+          label: "个人反思与总结",
+          component: "InputTextArea",
+          colProps: {
+            span: 24,
+          },
+          componentProps: {
+            rows: 10,
+          },
+        },
+        {
+          field: "docLink",
+          label: "word文档",
+          component: "Upload",
+          colProps: {
+            span: 8,
+          },
+          componentProps: {
+            api: uploadApi,
+            multiple: false,
+            maxNumber: 1,
+            accept: ["doc,", "docx"],
+          },
+        },
+      ];
+      const empty = {
+        subjectType: "",
+        designIdea: "",
+        docLink: [] as string[],
+        groupEvaluation: "",
+        personalSummary: "",
+        planId: 0,
+        startDate: "",
+        subjectName: "",
+        teachingProcess: "",
+      };
+      const formData = ref(empty);
+      const operType = ref("");
+      const [registerModal, { closeModal }] = useModalInner(({ plan, operType: type }) => {
+        operType.value = type;
+        if (type == TableOperationTypeEnum.UPDATE) {
+          formData.value = { ...plan, docLink: plan.docLink === "" ? [] : [plan.docLink] };
+        }
+      });
+
+      const [registerForm] = useForm({
+        labelWidth: 100,
+        labelAlign: "right",
+        showResetButton: false,
+        showSubmitButton: true,
+        submitButtonOptions: {
+          text: "提交",
+        },
+        schemas,
+        actionColOptions: {
+          span: 24,
+        },
+      });
+
+      const { createMessage } = useMessage();
+
+      function handleSubmit(value) {
+        if (operType.value === TableOperationTypeEnum.SAVE) {
+          return saveLessonPlan({ ...value, docLink: value.docLink[0] })
+            .then(() => closeModal())
+            .catch((reason) => createMessage.error("发生错误:" + reason + "请联系系统管理员"));
+        } else if (operType.value === TableOperationTypeEnum.UPDATE) {
+          return updateLessonPlan({ ...value, docLink: value.docLink[0] })
+            .then(() => closeModal())
+            .catch((reason) => createMessage.error("发生错误:" + reason + "请联系系统管理员"));
+        }
+        return Promise.reject("未知操作");
+      }
+
+      function handleModalClose() {
+        formData.value = empty;
+        return Promise.resolve(true);
+      }
+
+      return {
+        uploadApi,
+        registerForm,
+        registerModal,
+        handleSubmit,
+        handleModalClose,
+        formData,
+        operType,
+      };
+    },
+  });
+</script>
diff --git a/src/views/student/practice/practice-record/practice-lesson-plan/index.vue b/src/views/student/practice/practice-record/practice-lesson-plan/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..0f399f6abff59cfae0f87d46674a682855f4300d
--- /dev/null
+++ b/src/views/student/practice/practice-record/practice-lesson-plan/index.vue
@@ -0,0 +1,129 @@
+<template>
+  <BasicTable @register="registerTable">
+    <template #toolbar>
+      <a-button type="primary" @click="handleSave"> 新增</a-button>
+      <a-button type="primary" @click="handleReloadCurrent"> 刷新</a-button>
+    </template>
+    <template #bodyCell="{ column, record }">
+      <template v-if="column.key === 'action'">
+        <TableAction
+          stopButtonPropagation
+          :actions="[
+            {
+              label: '详情',
+              icon: 'ant-design:info-circle-outlined',
+              onClick: handleDesc.bind(null, record),
+            },
+            {
+              label: '编辑',
+              icon: 'akar-icons:edit',
+              onClick: handleEdit.bind(null, record),
+            },
+            {
+              label: '删除',
+              icon: 'ic:outline-delete-outline',
+              popConfirm: {
+                title: '确认删除?',
+                okText: '确认',
+                cancelText: '取消',
+                confirm: handleDelete.bind(null, record),
+              },
+            },
+          ]"
+        />
+      </template>
+    </template>
+  </BasicTable>
+  <LessonPlanDescriptionModal @register="registerDescModal" />
+  <LessonPlanEditModal @register="registerEditModal" />
+</template>
+<script lang="ts">
+  import { defineComponent, ref } from "vue";
+  import { LessonPlanItemModel } from "/@/api/student/model/practice-model";
+  import { getLessonPlanPage, removeLessonPlanById } from "/@/api/student/practice";
+  import { BasicColumn, TableAction, useTable } from "/@/components/Table";
+  import { BasicTable } from "/@/components/Table";
+  import LessonPlanDescriptionModal from "./description.vue";
+  import LessonPlanEditModal from "./edit.vue";
+  import { TableOperationTypeEnum } from "/@/enums/tableOperationTypeEnum";
+  import { useModal } from "/@/components/Modal";
+
+  export default defineComponent({
+    name: "PracticeLessonPlan",
+    components: { BasicTable, TableAction, LessonPlanDescriptionModal, LessonPlanEditModal },
+    setup() {
+      const columns: BasicColumn[] = [
+        {
+          title: "Id",
+          dataIndex: "planId",
+          defaultHidden: true,
+        },
+        {
+          title: "教案撰写时间",
+          dataIndex: "startDate",
+          width: 150,
+          sorter: true,
+        },
+        {
+          title: "课题名称",
+          dataIndex: "subjectName",
+          width: 150,
+        },
+        {
+          title: "课程类型",
+          dataIndex: "subjectType",
+          width: 150,
+        },
+      ];
+      const [registerTable, { reload }] = useTable({
+        title: "教育实习教案",
+        api: getLessonPlanPage,
+        columns,
+        rowKey: "planId",
+        pagination: { pageSize: 10 },
+        actionColumn: {
+          title: "操作",
+          dataIndex: "action",
+          width: 240,
+          fixed: "right",
+        },
+      });
+      const userData = ref<any>(null);
+
+      function handleReloadCurrent() {
+        reload();
+      }
+
+      const [registerDescModal, { openModal: openDescModal }] = useModal();
+      const [registerEditModal, { openModal: openEditModal }] = useModal();
+
+      function handleDesc(plan: LessonPlanItemModel) {
+        openDescModal(true, plan);
+      }
+
+      function handleEdit(plan: LessonPlanItemModel) {
+        openEditModal(true, { plan, operType: TableOperationTypeEnum.UPDATE });
+      }
+
+      function handleSave() {
+        openEditModal(true, { operType: TableOperationTypeEnum.SAVE });
+      }
+
+      function handleDelete(plan: LessonPlanItemModel) {
+        removeLessonPlanById(plan.planId);
+      }
+
+      return {
+        registerTable,
+        handleReloadCurrent,
+        handleDesc,
+        handleDelete,
+        handleEdit,
+        handleSave,
+        registerDescModal,
+        registerEditModal,
+        userData,
+      };
+    },
+  });
+</script>
diff --git a/src/views/student/practice/practice-record/teaching-study-summary/description.vue b/src/views/student/practice/practice-record/teaching-study-summary/description.vue
new file mode 100644
index 0000000000000000000000000000000000000000..cf2c30c6b95a90064c17fa91598a6503bbe89f86
--- /dev/null
+++ b/src/views/student/practice/practice-record/teaching-study-summary/description.vue
@@ -0,0 +1,93 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    title="详情"
+    @register="registerModal"
+    :minHeight="550"
+    width="1000px"
+    :showOkBtn="false"
+    cancelText="关闭"
+  >
+    <Description @register="registerDesc" :column="2" size="middle" />
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, h, ref } from "vue";
+  import { DescItem, Description, useDescription } from "/@/components/Description";
+  import { BasicModal, useModalInner } from "/@/components/Modal";
+
+  export default defineComponent({
+    name: "TeachingStudyDescriptionModal",
+    components: {
+      Description,
+      BasicModal,
+    },
+    props: { userData: { type: Object } },
+    setup() {
+      const schema: DescItem[] = [
+        {
+          field: "startDate",
+          label: "教研开始时间",
+          labelMinWidth: 100,
+          contentMinWidth: 200,
+        },
+        {
+          field: "type",
+          label: "教研方式",
+          labelMinWidth: 100,
+        },
+        {
+          field: "content",
+          label: "教研内容",
+          labelMinWidth: 100,
+          contentMinWidth: 200,
+          span: 2,
+        },
+        {
+          field: "teachingProcess",
+          label: "教研过程",
+          span: 2,
+          labelMinWidth: 100,
+        },
+        {
+          field: "designIdea",
+          label: "教研思路",
+          span: 2,
+          labelMinWidth: 100,
+        },
+        {
+          field: "personalSummary",
+          label: "个人反思与总结",
+          span: 2,
+        },
+        {
+          field: "groupEvaluation",
+          label: "小组评价",
+          span: 2,
+        },
+        {
+          field: "docLink",
+          label: "word文件",
+          render: (val) => {
+            if (val === "") {
+              return "无";
+            }
+            return h("a", { href: val, target: "_blank", text: "点击下载" });
+          },
+        },
+      ];
+      const userData = ref({});
+      const [registerModal] = useModalInner((data) => {
+        userData.value = data;
+      });
+      const [registerDesc] = useDescription({
+        schema,
+        data: userData,
+      });
+      return {
+        registerDesc,
+        registerModal,
+      };
+    },
+  });
+</script>
diff --git a/src/views/student/practice/practice-record/teaching-study-summary/edit.vue b/src/views/student/practice/practice-record/teaching-study-summary/edit.vue
new file mode 100644
index 0000000000000000000000000000000000000000..704f0f2fbae670a373b3a302529e036e7455aa18
--- /dev/null
+++ b/src/views/student/practice/practice-record/teaching-study-summary/edit.vue
@@ -0,0 +1,174 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    :title="operType === 'update' ? '编辑' : '添加'"
+    @register="registerModal"
+    :minHeight="650"
+    width="900px"
+    :showOkBtn="false"
+    :showCancelBtn="false"
+    :closeFunc="handleModalClose"
+  >
+    <BasicForm @register="registerForm" :model="formData" @submit="handleSubmit" />
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, ref } from "vue";
+  import { BasicModal, useModalInner } from "/@/components/Modal";
+  import { BasicForm, FormSchema, useForm } from "/@/components/Form";
+  import { TableOperationTypeEnum } from "/@/enums/tableOperationTypeEnum";
+  import { uploadApi } from "/@/api/sys/upload";
+  import { saveTeachingStudy, updateTeachingStudy } from "/@/api/student/practice";
+  import { useMessage } from "/@/hooks/web/useMessage";
+
+  export default defineComponent({
+    name: "LessonPlanEditModal",
+    components: {
+      BasicForm,
+      BasicModal,
+    },
+    setup() {
+      const schemas: FormSchema[] = [
+        {
+          field: "studyId",
+          label: "id",
+          component: "Input",
+          show: false,
+        },
+        {
+          field: "startDate",
+          label: "教研开始时间",
+          component: "DatePicker",
+          required: true,
+          colProps: {
+            span: 12,
+          },
+        },
+        {
+          field: "type",
+          label: "教研方式",
+          component: "Input",
+          colProps: {
+            span: 12,
+          },
+        },
+        {
+          field: "content",
+          label: "教研内容",
+          component: "Input",
+          required: true,
+          colProps: {
+            span: 24,
+          },
+        },
+        {
+          field: "teachingProcess",
+          label: "教学过程",
+          component: "InputTextArea",
+          colProps: {
+            span: 24,
+          },
+          componentProps: {
+            rows: 10,
+          },
+        },
+        {
+          field: "designIdea",
+          label: "教研思路",
+          component: "InputTextArea",
+          colProps: {
+            span: 24,
+          },
+        },
+        {
+          field: "personalSummary",
+          label: "个人反思与总结",
+          component: "InputTextArea",
+          colProps: {
+            span: 24,
+          },
+          componentProps: {
+            rows: 10,
+          },
+        },
+        {
+          field: "docLink",
+          label: "word文档",
+          component: "Upload",
+          colProps: {
+            span: 8,
+          },
+          componentProps: {
+            api: uploadApi,
+            multiple: false,
+            maxNumber: 1,
+            accept: ["doc,", "docx"],
+          },
+        },
+      ];
+      const empty = {
+        content: "",
+        designIdea: "",
+        docLink: [] as string[],
+        groupEvaluation: "",
+        personalSummary: "",
+        startDate: "",
+        studyId: 0,
+        teachingProcess: "",
+        type: "",
+      };
+      const formData = ref(empty);
+      const operType = ref("");
+      const [registerModal, { closeModal }] = useModalInner(({ study, operType: type }) => {
+        operType.value = type;
+        if (type == TableOperationTypeEnum.UPDATE) {
+          formData.value = { ...study, docLink: study.docLink === "" ? [] : [study.docLink] };
+        }
+      });
+
+      const [registerForm] = useForm({
+        labelWidth: 100,
+        labelAlign: "right",
+        showResetButton: false,
+        showSubmitButton: true,
+        submitButtonOptions: {
+          text: "提交",
+        },
+        schemas,
+        actionColOptions: {
+          span: 24,
+        },
+      });
+
+      const { createMessage } = useMessage();
+
+      function handleSubmit(value) {
+        if (operType.value === TableOperationTypeEnum.SAVE) {
+          return saveTeachingStudy({ ...value, docLink: value.docLink[0] })
+            .then(() => closeModal())
+            .catch((reason) => createMessage.error("发生错误:" + reason + "请联系系统管理员"));
+        } else if (operType.value === TableOperationTypeEnum.UPDATE) {
+          return updateTeachingStudy({ ...value, docLink: value.docLink[0] })
+            .then(() => closeModal())
+            .catch((reason) => createMessage.error("发生错误:" + reason + "请联系系统管理员"));
+        }
+        return Promise.reject("未知操作");
+      }
+
+      function handleModalClose() {
+        formData.value = empty;
+        return Promise.resolve(true);
+      }
+
+      return {
+        uploadApi,
+        registerForm,
+        registerModal,
+        handleSubmit,
+        handleModalClose,
+        formData,
+        operType,
+      };
+    },
+  });
+</script>
diff --git a/src/views/student/practice/practice-record/teaching-study-summary/index.vue b/src/views/student/practice/practice-record/teaching-study-summary/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..21f7e8ebab85052a81fb5783b2221251a40fde3b
--- /dev/null
+++ b/src/views/student/practice/practice-record/teaching-study-summary/index.vue
@@ -0,0 +1,129 @@
+<template>
+  <BasicTable @register="registerTable">
+    <template #toolbar>
+      <a-button type="primary" @click="handleSave"> 新增</a-button>
+      <a-button type="primary" @click="handleReloadCurrent"> 刷新</a-button>
+    </template>
+    <template #bodyCell="{ column, record }">
+      <template v-if="column.key === 'action'">
+        <TableAction
+          stopButtonPropagation
+          :actions="[
+            {
+              label: '详情',
+              icon: 'ant-design:info-circle-outlined',
+              onClick: handleDesc.bind(null, record),
+            },
+            {
+              label: '编辑',
+              icon: 'akar-icons:edit',
+              onClick: handleEdit.bind(null, record),
+            },
+            {
+              label: '删除',
+              icon: 'ic:outline-delete-outline',
+              popConfirm: {
+                title: '确认删除?',
+                okText: '确认',
+                cancelText: '取消',
+                confirm: handleDelete.bind(null, record),
+              },
+            },
+          ]"
+        />
+      </template>
+    </template>
+  </BasicTable>
+  <TeachingStudyDescriptionModal @register="registerDescModal" />
+  <TeachingStudyEditModal @register="registerEditModal" />
+</template>
+<script lang="ts">
+  import { defineComponent, ref } from "vue";
+  import { TeachingStudyItemModel } from "/@/api/student/model/practice-model";
+  import { getTeachingStudyPage, removeTeachingStudyById } from "/@/api/student/practice";
+  import { BasicColumn, TableAction, useTable } from "/@/components/Table";
+  import { BasicTable } from "/@/components/Table";
+  import TeachingStudyDescriptionModal from "./description.vue";
+  import TeachingStudyEditModal from "./edit.vue";
+  import { TableOperationTypeEnum } from "/@/enums/tableOperationTypeEnum";
+  import { useModal } from "/@/components/Modal";
+
+  export default defineComponent({
+    name: "PracticeLessonPlan",
+    components: { BasicTable, TableAction, TeachingStudyDescriptionModal, TeachingStudyEditModal },
+    setup() {
+      const columns: BasicColumn[] = [
+        {
+          title: "Id",
+          dataIndex: "studyId",
+          defaultHidden: true,
+        },
+        {
+          title: "教研开始时间",
+          dataIndex: "startDate",
+          width: 150,
+          sorter: true,
+        },
+        {
+          title: "教研内容",
+          dataIndex: "content",
+          width: 150,
+        },
+        {
+          title: "教研方式",
+          dataIndex: "type",
+          width: 150,
+        },
+      ];
+      const [registerTable, { reload }] = useTable({
+        title: "教研活动心得",
+        api: getTeachingStudyPage,
+        columns,
+        rowKey: "studyId",
+        pagination: { pageSize: 10 },
+        actionColumn: {
+          title: "操作",
+          dataIndex: "action",
+          width: 240,
+          fixed: "right",
+        },
+      });
+      const userData = ref<any>(null);
+
+      function handleReloadCurrent() {
+        reload();
+      }
+
+      const [registerDescModal, { openModal: openDescModal }] = useModal();
+      const [registerEditModal, { openModal: openEditModal }] = useModal();
+
+      function handleDesc(study: TeachingStudyItemModel) {
+        openDescModal(true, study);
+      }
+
+      function handleEdit(study: TeachingStudyItemModel) {
+        openEditModal(true, { study, operType: TableOperationTypeEnum.UPDATE });
+      }
+
+      function handleSave() {
+        openEditModal(true, { operType: TableOperationTypeEnum.SAVE });
+      }
+
+      function handleDelete(study: TeachingStudyItemModel) {
+        removeTeachingStudyById(study.studyId);
+      }
+
+      return {
+        registerTable,
+        handleReloadCurrent,
+        handleDesc,
+        handleDelete,
+        handleEdit,
+        handleSave,
+        registerDescModal,
+        registerEditModal,
+        userData,
+      };
+    },
+  });
+</script>
diff --git a/src/views/sys/about/index.vue b/src/views/sys/about/index.vue
index 1b2cf3725ca0d0a5a344a15b4b405405fa08eade..efce394de78bbcca29dddc8e64b36130f4b72045 100644
--- a/src/views/sys/about/index.vue
+++ b/src/views/sys/about/index.vue
@@ -15,11 +15,11 @@
   </PageWrapper>
 </template>
 <script lang="ts" setup>
-  import { h } from 'vue';
-  import { Tag } from 'ant-design-vue';
-  import { PageWrapper } from '/@/components/Page';
-  import { Description, DescItem, useDescription } from '/@/components/Description/index';
-  import { GITHUB_URL, SITE_URL, DOC_URL } from '/@/settings/siteSetting';
+  import { h } from "vue";
+  import { Tag } from "ant-design-vue";
+  import { PageWrapper } from "/@/components/Page";
+  import { Description, DescItem, useDescription } from "/@/components/Description/index";
+  import { GITHUB_URL, SITE_URL, DOC_URL } from "/@/settings/siteSetting";
 
   const { pkg, lastBuildTime } = __APP_INFO__;
 
@@ -29,33 +29,33 @@
   const devSchema: DescItem[] = [];
 
   const commonTagRender = (color: string) => (curVal) => h(Tag, { color }, () => curVal);
-  const commonLinkRender = (text: string) => (href) => h('a', { href, target: '_blank' }, text);
+  const commonLinkRender = (text: string) => (href) => h("a", { href, target: "_blank" }, text);
 
   const infoSchema: DescItem[] = [
     {
-      label: '版本',
-      field: 'version',
-      render: commonTagRender('blue'),
+      label: "版本",
+      field: "version",
+      render: commonTagRender("blue"),
     },
     {
-      label: '最后编译时间',
-      field: 'lastBuildTime',
-      render: commonTagRender('blue'),
+      label: "最后编译时间",
+      field: "lastBuildTime",
+      render: commonTagRender("blue"),
     },
     {
-      label: '文档地址',
-      field: 'doc',
-      render: commonLinkRender('文档地址'),
+      label: "文档地址",
+      field: "doc",
+      render: commonLinkRender("文档地址"),
     },
     {
-      label: '预览地址',
-      field: 'preview',
-      render: commonLinkRender('预览地址'),
+      label: "预览地址",
+      field: "preview",
+      render: commonLinkRender("预览地址"),
     },
     {
-      label: 'Github',
-      field: 'github',
-      render: commonLinkRender('Github'),
+      label: "Github",
+      field: "github",
+      render: commonLinkRender("Github"),
     },
   ];
 
@@ -76,21 +76,21 @@
   });
 
   const [register] = useDescription({
-    title: '生产环境依赖',
+    title: "生产环境依赖",
     data: dependencies,
     schema: schema,
     column: 3,
   });
 
   const [registerDev] = useDescription({
-    title: '开发环境依赖',
+    title: "开发环境依赖",
     data: devDependencies,
     schema: devSchema,
     column: 3,
   });
 
   const [infoRegister] = useDescription({
-    title: '项目信息',
+    title: "项目信息",
     data: infoData,
     schema: infoSchema,
     column: 2,
diff --git a/src/views/sys/error-log/DetailModal.vue b/src/views/sys/error-log/DetailModal.vue
index 2047707024fc9e7bbacc6da4058c10ef7e4fa88f..d153f8bea63d9a931cb5f6050caef585e4de50a9 100644
--- a/src/views/sys/error-log/DetailModal.vue
+++ b/src/views/sys/error-log/DetailModal.vue
@@ -4,12 +4,12 @@
   </BasicModal>
 </template>
 <script lang="ts" setup>
-  import type { PropType } from 'vue';
-  import type { ErrorLogInfo } from '/#/store';
-  import { BasicModal } from '/@/components/Modal/index';
-  import { Description, useDescription } from '/@/components/Description/index';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { getDescSchema } from './data';
+  import type { PropType } from "vue";
+  import type { ErrorLogInfo } from "/#/store";
+  import { BasicModal } from "/@/components/Modal/index";
+  import { Description, useDescription } from "/@/components/Description/index";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { getDescSchema } from "./data";
 
   defineProps({
     info: {
diff --git a/src/views/sys/error-log/data.tsx b/src/views/sys/error-log/data.tsx
index 3ffc2f453734f1f631f115415181e029c3ba7abb..e8b628f471c0e2885c971844f602787ce25b090a 100644
--- a/src/views/sys/error-log/data.tsx
+++ b/src/views/sys/error-log/data.tsx
@@ -1,58 +1,58 @@
-import { Tag } from 'ant-design-vue';
-import { BasicColumn } from '/@/components/Table/index';
-import { ErrorTypeEnum } from '/@/enums/exceptionEnum';
-import { useI18n } from '/@/hooks/web/useI18n';
+import { Tag } from "ant-design-vue";
+import { BasicColumn } from "/@/components/Table/index";
+import { ErrorTypeEnum } from "/@/enums/exceptionEnum";
+import { useI18n } from "/@/hooks/web/useI18n";
 
 const { t } = useI18n();
 
 export function getColumns(): BasicColumn[] {
   return [
     {
-      dataIndex: 'type',
-      title: t('sys.errorLog.tableColumnType'),
+      dataIndex: "type",
+      title: t("sys.errorLog.tableColumnType"),
       width: 80,
       customRender: ({ text }) => {
         const color =
           text === ErrorTypeEnum.VUE
-            ? 'green'
+            ? "green"
             : text === ErrorTypeEnum.RESOURCE
-            ? 'cyan'
+            ? "cyan"
             : text === ErrorTypeEnum.PROMISE
-            ? 'blue'
+            ? "blue"
             : ErrorTypeEnum.AJAX
-            ? 'red'
-            : 'purple';
+            ? "red"
+            : "purple";
         return <Tag color={color}>{() => text}</Tag>;
       },
     },
     {
-      dataIndex: 'url',
-      title: 'URL',
+      dataIndex: "url",
+      title: "URL",
       width: 200,
     },
     {
-      dataIndex: 'time',
-      title: t('sys.errorLog.tableColumnDate'),
+      dataIndex: "time",
+      title: t("sys.errorLog.tableColumnDate"),
       width: 160,
     },
     {
-      dataIndex: 'file',
-      title: t('sys.errorLog.tableColumnFile'),
+      dataIndex: "file",
+      title: t("sys.errorLog.tableColumnFile"),
       width: 200,
     },
     {
-      dataIndex: 'name',
-      title: 'Name',
+      dataIndex: "name",
+      title: "Name",
       width: 200,
     },
     {
-      dataIndex: 'message',
-      title: t('sys.errorLog.tableColumnMsg'),
+      dataIndex: "message",
+      title: t("sys.errorLog.tableColumnMsg"),
       width: 300,
     },
     {
-      dataIndex: 'stack',
-      title: t('sys.errorLog.tableColumnStackMsg'),
+      dataIndex: "stack",
+      title: t("sys.errorLog.tableColumnStackMsg"),
     },
   ];
 }
diff --git a/src/views/sys/error-log/index.vue b/src/views/sys/error-log/index.vue
index 69b77db151e0d3b6b0df3f010401c1140c3d4c00..fe912c7dc7b562ab3eee2e0b20a9b88992c9dc6c 100644
--- a/src/views/sys/error-log/index.vue
+++ b/src/views/sys/error-log/index.vue
@@ -1,44 +1,49 @@
 <template>
   <div class="p-4">
     <template v-for="src in imgList" :key="src">
-      <img :src="src" v-show="false" />
+      <img :src="src" v-show="false" alt="" />
     </template>
     <DetailModal :info="rowInfo" @register="registerModal" />
     <BasicTable @register="register" class="error-handle-table">
       <template #toolbar>
         <a-button @click="fireVueError" type="primary">
-          {{ t('sys.errorLog.fireVueError') }}
+          {{ t("sys.errorLog.fireVueError") }}
         </a-button>
         <a-button @click="fireResourceError" type="primary">
-          {{ t('sys.errorLog.fireResourceError') }}
+          {{ t("sys.errorLog.fireResourceError") }}
         </a-button>
         <a-button @click="fireAjaxError" type="primary">
-          {{ t('sys.errorLog.fireAjaxError') }}
+          {{ t("sys.errorLog.fireAjaxError") }}
         </a-button>
       </template>
-      <template #action="{ record }">
-        <TableAction
-          :actions="[
-            { label: t('sys.errorLog.tableActionDesc'), onClick: handleDetail.bind(null, record) },
-          ]"
-        />
+      <template #bodyCell="{ column, record }">
+        <template v-if="column.key === 'action'">
+          <TableAction
+            :actions="[
+              {
+                label: t('sys.errorLog.tableActionDesc'),
+                onClick: handleDetail.bind(null, record),
+              },
+            ]"
+          />
+        </template>
       </template>
     </BasicTable>
   </div>
 </template>
 
 <script lang="ts" setup>
-  import type { ErrorLogInfo } from '/#/store';
-  import { watch, ref, nextTick } from 'vue';
-  import DetailModal from './DetailModal.vue';
-  import { BasicTable, useTable, TableAction } from '/@/components/Table/index';
-  import { useModal } from '/@/components/Modal';
-  import { useMessage } from '/@/hooks/web/useMessage';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { useErrorLogStore } from '/@/store/modules/errorLog';
-  import { fireErrorApi } from '/@/api/demo/error';
-  import { getColumns } from './data';
-  import { cloneDeep } from 'lodash-es';
+  import type { ErrorLogInfo } from "/#/store";
+  import { watch, ref, nextTick } from "vue";
+  import DetailModal from "./DetailModal.vue";
+  import { BasicTable, useTable, TableAction } from "/@/components/Table/index";
+  import { useModal } from "/@/components/Modal";
+  import { useMessage } from "/@/hooks/web/useMessage";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { useErrorLogStore } from "/@/store/modules/errorLog";
+  import { fireErrorApi } from "/@/api/demo/error";
+  import { getColumns } from "./data";
+  import { cloneDeep } from "lodash-es";
 
   const rowInfo = ref<ErrorLogInfo>();
   const imgList = ref<string[]>([]);
@@ -46,13 +51,13 @@
   const { t } = useI18n();
   const errorLogStore = useErrorLogStore();
   const [register, { setTableData }] = useTable({
-    title: t('sys.errorLog.tableTitle'),
+    title: t("sys.errorLog.tableTitle"),
     columns: getColumns(),
     actionColumn: {
       width: 80,
-      title: 'Action',
-      dataIndex: 'action',
-      slots: { customRender: 'action' },
+      title: "Action",
+      dataIndex: "action",
+      // slots: { customRender: 'action' },
     },
   });
   const [registerModal, { openModal }] = useModal();
@@ -70,7 +75,7 @@
   );
   const { createMessage } = useMessage();
   if (import.meta.env.DEV) {
-    createMessage.info(t('sys.errorLog.enableMessage'));
+    createMessage.info(t("sys.errorLog.enableMessage"));
   }
   // 查看详情
   function handleDetail(row: ErrorLogInfo) {
@@ -79,7 +84,7 @@
   }
 
   function fireVueError() {
-    throw new Error('fire vue error!');
+    throw new Error("fire vue error!");
   }
 
   function fireResourceError() {
diff --git a/src/views/sys/exception/Exception.vue b/src/views/sys/exception/Exception.vue
index 6e56f086d90f333a6259411c8a1400e15e08382a..0060ea469bd27c49cdf78baea8288613d6786517 100644
--- a/src/views/sys/exception/Exception.vue
+++ b/src/views/sys/exception/Exception.vue
@@ -1,15 +1,15 @@
 <script lang="tsx">
-  import type { PropType } from 'vue';
-  import { Result, Button } from 'ant-design-vue';
-  import { defineComponent, ref, computed, unref } from 'vue';
-  import { ExceptionEnum } from '/@/enums/exceptionEnum';
-  import notDataSvg from '/@/assets/svg/no-data.svg';
-  import netWorkSvg from '/@/assets/svg/net-error.svg';
-  import { useRoute } from 'vue-router';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { useGo, useRedo } from '/@/hooks/web/usePage';
-  import { PageEnum } from '/@/enums/pageEnum';
+  import type { PropType } from "vue";
+  import { Result, Button } from "ant-design-vue";
+  import { defineComponent, ref, computed, unref } from "vue";
+  import { ExceptionEnum } from "/@/enums/exceptionEnum";
+  import notDataSvg from "/@/assets/svg/no-data.svg";
+  import netWorkSvg from "/@/assets/svg/net-error.svg";
+  import { useRoute } from "vue-router";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { useGo, useRedo } from "/@/hooks/web/usePage";
+  import { PageEnum } from "/@/enums/pageEnum";
 
   interface MapValue {
     title: string;
@@ -21,7 +21,7 @@
   }
 
   export default defineComponent({
-    name: 'ErrorPage',
+    name: "ErrorPage",
     props: {
       // 状态码
       status: {
@@ -31,12 +31,12 @@
 
       title: {
         type: String as PropType<string>,
-        default: '',
+        default: "",
       },
 
       subTitle: {
         type: String as PropType<string>,
-        default: '',
+        default: "",
       },
 
       full: {
@@ -51,7 +51,7 @@
       const go = useGo();
       const redo = useRedo();
       const { t } = useI18n();
-      const { prefixCls } = useDesign('app-exception-page');
+      const { prefixCls } = useDesign("app-exception-page");
 
       const getStatus = computed(() => {
         const { status: routeStatus } = query;
@@ -63,45 +63,45 @@
         return unref(statusMapRef).get(unref(getStatus)) as MapValue;
       });
 
-      const backLoginI18n = t('sys.exception.backLogin');
-      const backHomeI18n = t('sys.exception.backHome');
+      const backLoginI18n = t("sys.exception.backLogin");
+      const backHomeI18n = t("sys.exception.backHome");
 
       unref(statusMapRef).set(ExceptionEnum.PAGE_NOT_ACCESS, {
-        title: '403',
+        title: "403",
         status: `${ExceptionEnum.PAGE_NOT_ACCESS}`,
-        subTitle: t('sys.exception.subTitle403'),
+        subTitle: t("sys.exception.subTitle403"),
         btnText: props.full ? backLoginI18n : backHomeI18n,
         handler: () => (props.full ? go(PageEnum.BASE_LOGIN) : go()),
       });
 
       unref(statusMapRef).set(ExceptionEnum.PAGE_NOT_FOUND, {
-        title: '404',
+        title: "404",
         status: `${ExceptionEnum.PAGE_NOT_FOUND}`,
-        subTitle: t('sys.exception.subTitle404'),
+        subTitle: t("sys.exception.subTitle404"),
         btnText: props.full ? backLoginI18n : backHomeI18n,
         handler: () => (props.full ? go(PageEnum.BASE_LOGIN) : go()),
       });
 
       unref(statusMapRef).set(ExceptionEnum.ERROR, {
-        title: '500',
+        title: "500",
         status: `${ExceptionEnum.ERROR}`,
-        subTitle: t('sys.exception.subTitle500'),
+        subTitle: t("sys.exception.subTitle500"),
         btnText: backHomeI18n,
         handler: () => go(),
       });
 
       unref(statusMapRef).set(ExceptionEnum.PAGE_NOT_DATA, {
-        title: t('sys.exception.noDataTitle'),
-        subTitle: '',
-        btnText: t('common.redo'),
+        title: t("sys.exception.noDataTitle"),
+        subTitle: "",
+        btnText: t("common.redo"),
         handler: () => redo(),
         icon: notDataSvg,
       });
 
       unref(statusMapRef).set(ExceptionEnum.NET_WORK_ERROR, {
-        title: t('sys.exception.networkErrorTitle'),
-        subTitle: t('sys.exception.networkErrorSubTitle'),
-        btnText: t('common.redo'),
+        title: t("sys.exception.networkErrorTitle"),
+        subTitle: t("sys.exception.networkErrorSubTitle"),
+        btnText: t("common.redo"),
         handler: () => redo(),
         icon: netWorkSvg,
       });
@@ -131,7 +131,7 @@
   });
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-app-exception-page';
+  @prefix-cls: ~"@{namespace}-app-exception-page";
 
   .@{prefix-cls} {
     display: flex;
diff --git a/src/views/sys/exception/index.ts b/src/views/sys/exception/index.ts
index 5002c4acbf647fd08f471eb697d38c564bbacb21..3b7ce5977a87a496b84ba37138c8efae6e810a0e 100644
--- a/src/views/sys/exception/index.ts
+++ b/src/views/sys/exception/index.ts
@@ -1 +1 @@
-export { default as Exception } from './Exception.vue';
+export { default as Exception } from "./Exception.vue";
diff --git a/src/views/sys/iframe/FrameBlank.vue b/src/views/sys/iframe/FrameBlank.vue
index a8a61f50e926f891cf378f8608be3936889f6db4..a1d41108f4186fb66494b3b8436999248f793946 100644
--- a/src/views/sys/iframe/FrameBlank.vue
+++ b/src/views/sys/iframe/FrameBlank.vue
@@ -2,8 +2,8 @@
   <div></div>
 </template>
 <script lang="ts">
-  import { defineComponent } from 'vue';
+  import { defineComponent } from "vue";
   export default defineComponent({
-    name: 'FrameBlank',
+    name: "FrameBlank",
   });
 </script>
diff --git a/src/views/sys/iframe/index.vue b/src/views/sys/iframe/index.vue
index fea0e7eea6861e4e162df266238c83afe3fb4316..139ab1c9e4af910b768782d8b8f2149265050469 100644
--- a/src/views/sys/iframe/index.vue
+++ b/src/views/sys/iframe/index.vue
@@ -11,16 +11,16 @@
   </div>
 </template>
 <script lang="ts" setup>
-  import type { CSSProperties } from 'vue';
-  import { ref, unref, computed } from 'vue';
-  import { Spin } from 'ant-design-vue';
-  import { useWindowSizeFn } from '/@/hooks/event/useWindowSizeFn';
-  import { propTypes } from '/@/utils/propTypes';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useLayoutHeight } from '/@/layouts/default/content/useContentViewHeight';
+  import type { CSSProperties } from "vue";
+  import { ref, unref, computed } from "vue";
+  import { Spin } from "ant-design-vue";
+  import { useWindowSizeFn } from "/@/hooks/event/useWindowSizeFn";
+  import { propTypes } from "/@/utils/propTypes";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useLayoutHeight } from "/@/layouts/default/content/useContentViewHeight";
 
   defineProps({
-    frameSrc: propTypes.string.def(''),
+    frameSrc: propTypes.string.def(""),
   });
 
   const loading = ref(true);
@@ -29,7 +29,7 @@
   const frameRef = ref<HTMLFrameElement>();
   const { headerHeightRef } = useLayoutHeight();
 
-  const { prefixCls } = useDesign('iframe-page');
+  const { prefixCls } = useDesign("iframe-page");
   useWindowSizeFn(calcHeight, 150, { immediate: true });
 
   const getWrapStyle = computed((): CSSProperties => {
@@ -56,7 +56,7 @@
   }
 </script>
 <style lang="less" scoped>
-  @prefix-cls: ~'@{namespace}-iframe-page';
+  @prefix-cls: ~"@{namespace}-iframe-page";
 
   .@{prefix-cls} {
     .ant-spin-nested-loading {
diff --git a/src/views/sys/lock/LockPage.vue b/src/views/sys/lock/LockPage.vue
index 11037f9f8aa24ed19ed735f062f84e8e039cf2ba..fe2a45e4faa5a5546e3cfbeea7ebe195042b99b8 100644
--- a/src/views/sys/lock/LockPage.vue
+++ b/src/views/sys/lock/LockPage.vue
@@ -5,28 +5,12 @@
   >
     <div
       :class="`${prefixCls}__unlock`"
-      class="
-        absolute
-        top-0
-        left-1/2
-        flex
-        pt-5
-        h-16
-        items-center
-        justify-center
-        sm:text-md
-        xl:text-xl
-        text-white
-        flex-col
-        cursor-pointer
-        transform
-        translate-x-1/2
-      "
+      class="absolute top-0 left-1/2 flex pt-5 h-16 items-center justify-center sm:text-md xl:text-xl text-white flex-col cursor-pointer transform translate-x-1/2"
       @click="handleShowForm(false)"
       v-show="showDate"
     >
       <LockOutlined />
-      <span>{{ t('sys.lock.unlock') }}</span>
+      <span>{{ t("sys.lock.unlock") }}</span>
     </div>
 
     <div class="flex w-screen h-screen justify-center items-center">
@@ -55,7 +39,7 @@
             v-model:value="password"
           />
           <span :class="`${prefixCls}-entry__err-msg enter-x`" v-if="errMsg">
-            {{ t('sys.lock.alert') }}
+            {{ t("sys.lock.alert") }}
           </span>
           <div :class="`${prefixCls}-entry__footer enter-x`">
             <a-button
@@ -65,7 +49,7 @@
               :disabled="loading"
               @click="handleShowForm(true)"
             >
-              {{ t('common.back') }}
+              {{ t("common.back") }}
             </a-button>
             <a-button
               type="link"
@@ -74,10 +58,10 @@
               :disabled="loading"
               @click="goLogin"
             >
-              {{ t('sys.lock.backToLogin') }}
+              {{ t("sys.lock.backToLogin") }}
             </a-button>
             <a-button class="mt-2" type="link" size="small" @click="unLock()" :loading="loading">
-              {{ t('sys.lock.entry') }}
+              {{ t("sys.lock.entry") }}
             </a-button>
           </div>
         </div>
@@ -93,24 +77,24 @@
   </div>
 </template>
 <script lang="ts" setup>
-  import { ref, computed } from 'vue';
-  import { Input } from 'ant-design-vue';
-  import { useUserStore } from '/@/store/modules/user';
-  import { useLockStore } from '/@/store/modules/lock';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { useNow } from './useNow';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { LockOutlined } from '@ant-design/icons-vue';
-  import headerImg from '/@/assets/images/header.jpg';
+  import { ref, computed } from "vue";
+  import { Input } from "ant-design-vue";
+  import { useUserStore } from "/@/store/modules/user";
+  import { useLockStore } from "/@/store/modules/lock";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { useNow } from "./useNow";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { LockOutlined } from "@ant-design/icons-vue";
+  import headerImg from "/@/assets/images/header.jpg";
 
   const InputPassword = Input.Password;
 
-  const password = ref('');
+  const password = ref("");
   const loading = ref(false);
   const errMsg = ref(false);
   const showDate = ref(true);
 
-  const { prefixCls } = useDesign('lock-page');
+  const { prefixCls } = useDesign("lock-page");
   const lockStore = useLockStore();
   const userStore = useUserStore();
 
@@ -149,7 +133,7 @@
   }
 </script>
 <style lang="less" scoped>
-  @prefix-cls: ~'@{namespace}-lock-page';
+  @prefix-cls: ~"@{namespace}-lock-page";
 
   .@{prefix-cls} {
     z-index: @lock-page-z-index;
diff --git a/src/views/sys/lock/index.vue b/src/views/sys/lock/index.vue
index e8c4d5525c2aeeb6580a1762a92b39d758a0d28b..7bb86d4a29cc3593e2faf3413a34a0ddc86bd068 100644
--- a/src/views/sys/lock/index.vue
+++ b/src/views/sys/lock/index.vue
@@ -4,9 +4,9 @@
   </transition>
 </template>
 <script lang="ts" setup>
-  import { computed } from 'vue';
-  import LockPage from './LockPage.vue';
-  import { useLockStore } from '/@/store/modules/lock';
+  import { computed } from "vue";
+  import LockPage from "./LockPage.vue";
+  import { useLockStore } from "/@/store/modules/lock";
 
   const lockStore = useLockStore();
   const getIsLock = computed(() => lockStore?.getLockInfo?.isLock ?? false);
diff --git a/src/views/sys/lock/useNow.ts b/src/views/sys/lock/useNow.ts
index 2fac748da54c7c2ec7ec5e6f2c828b5f720b152b..708494f64fcc4b25d0a765fa0c4dc2cc4acf7219 100644
--- a/src/views/sys/lock/useNow.ts
+++ b/src/views/sys/lock/useNow.ts
@@ -1,40 +1,37 @@
-import { dateUtil } from '/@/utils/dateUtil';
-import { reactive, toRefs } from 'vue';
-import { useLocaleStore } from '/@/store/modules/locale';
-import { tryOnMounted, tryOnUnmounted } from '@vueuse/core';
+import { dateUtil } from "/@/utils/dateUtil";
+import { reactive, toRefs } from "vue";
+import { tryOnMounted, tryOnUnmounted } from "@vueuse/core";
 
 export function useNow(immediate = true) {
-  const localeStore = useLocaleStore();
-  const localData = dateUtil.localeData(localeStore.getLocale);
   let timer: IntervalHandle;
 
   const state = reactive({
     year: 0,
     month: 0,
-    week: '',
+    week: "",
     day: 0,
-    hour: '',
-    minute: '',
+    hour: "",
+    minute: "",
     second: 0,
-    meridiem: '',
+    meridiem: "",
   });
 
   const update = () => {
     const now = dateUtil();
 
-    const h = now.format('HH');
-    const m = now.format('mm');
-    const s = now.get('s');
+    const h = now.format("HH");
+    const m = now.format("mm");
+    const s = now.get("s");
 
-    state.year = now.get('y');
-    state.month = now.get('M') + 1;
-    state.week = localData.weekdays()[now.day()];
-    state.day = now.get('D');
+    state.year = now.get("y");
+    state.month = now.get("M") + 1;
+    state.week = "星期" + ["日", "一", "二", "三", "四", "五", "六"][now.day()];
+    state.day = now.get("date");
     state.hour = h;
     state.minute = m;
     state.second = s;
 
-    state.meridiem = localData.meridiem(Number(h), Number(h), true);
+    state.meridiem = now.format("A");
   };
 
   function start() {
diff --git a/src/views/sys/login/ForgetPasswordForm.vue b/src/views/sys/login/ForgetPasswordForm.vue
index aca24aa41753d00a1568c2a6be1893c33609dbdd..d8b92d679a7b612a9e29d5c7e4d6b82fe65f04b8 100644
--- a/src/views/sys/login/ForgetPasswordForm.vue
+++ b/src/views/sys/login/ForgetPasswordForm.vue
@@ -23,22 +23,22 @@
 
       <FormItem class="enter-x">
         <Button type="primary" size="large" block @click="handleReset" :loading="loading">
-          {{ t('common.resetText') }}
+          {{ t("common.resetText") }}
         </Button>
         <Button size="large" block class="mt-4" @click="handleBackLogin">
-          {{ t('sys.login.backSignIn') }}
+          {{ t("sys.login.backSignIn") }}
         </Button>
       </FormItem>
     </Form>
   </template>
 </template>
 <script lang="ts" setup>
-  import { reactive, ref, computed, unref } from 'vue';
-  import LoginFormTitle from './LoginFormTitle.vue';
-  import { Form, Input, Button } from 'ant-design-vue';
-  import { CountdownInput } from '/@/components/CountDown';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { useLoginState, useFormRules, LoginStateEnum } from './useLogin';
+  import { reactive, ref, computed, unref } from "vue";
+  import LoginFormTitle from "./LoginFormTitle.vue";
+  import { Form, Input, Button } from "ant-design-vue";
+  import { CountdownInput } from "/@/components/CountDown";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { useLoginState, useFormRules, LoginStateEnum } from "./useLogin";
 
   const FormItem = Form.Item;
   const { t } = useI18n();
@@ -49,9 +49,9 @@
   const loading = ref(false);
 
   const formData = reactive({
-    account: '',
-    mobile: '',
-    sms: '',
+    account: "",
+    mobile: "",
+    sms: "",
   });
 
   const getShow = computed(() => unref(getLoginState) === LoginStateEnum.RESET_PASSWORD);
diff --git a/src/views/sys/login/Login.vue b/src/views/sys/login/Login.vue
index 8c3bd4bb5d5ed0b700c8e25621a626ae9234423e..27f2fa359f3cf1d601eb5aaf3c37946b6e8dee66 100644
--- a/src/views/sys/login/Login.vue
+++ b/src/views/sys/login/Login.vue
@@ -1,11 +1,13 @@
 <template>
   <div :class="prefixCls" class="relative w-full h-full px-4">
-    <AppLocalePicker
-      class="absolute text-white top-4 right-4 enter-x xl:text-gray-600"
-      :showText="false"
-      v-if="!sessionTimeout && showLocale"
-    />
-    <AppDarkModeToggle class="absolute top-3 right-7 enter-x" v-if="!sessionTimeout" />
+    <div class="flex items-center absolute right-4 top-4">
+      <AppDarkModeToggle class="enter-x mr-2" v-if="!sessionTimeout" />
+      <AppLocalePicker
+        class="text-white enter-x xl:text-gray-600"
+        :show-text="false"
+        v-if="!sessionTimeout && showLocale"
+      />
+    </div>
 
     <span class="-enter-x xl:hidden">
       <AppLogo :alwaysShowTitle="true" />
@@ -22,33 +24,17 @@
               class="w-1/2 -mt-16 -enter-x"
             />
             <div class="mt-10 font-medium text-white -enter-x">
-              <span class="inline-block mt-4 text-3xl"> {{ t('sys.login.signInTitle') }}</span>
+              <span class="inline-block mt-4 text-3xl"> {{ t("sys.login.signInTitle") }}</span>
             </div>
-            <div class="mt-5 font-normal text-white text-md dark:text-gray-500 -enter-x">
-              {{ t('sys.login.signInDesc') }}
+            <div class="mt-5 font-normal text-white dark:text-gray-500 -enter-x">
+              {{ t("sys.login.signInDesc") }}
             </div>
           </div>
         </div>
         <div class="flex w-full h-full py-5 xl:h-auto xl:py-0 xl:my-0 xl:w-6/12">
           <div
             :class="`${prefixCls}-form`"
-            class="
-              relative
-              w-full
-              px-5
-              py-8
-              mx-auto
-              my-auto
-              rounded-md
-              shadow-md
-              xl:ml-16 xl:bg-transparent
-              sm:px-8
-              xl:p-4 xl:shadow-none
-              sm:w-3/4
-              lg:w-2/4
-              xl:w-auto
-              enter-x
-            "
+            class="relative w-full px-5 py-8 mx-auto my-auto rounded-md shadow-md xl:ml-16 xl:bg-transparent sm:px-8 xl:p-4 xl:shadow-none sm:w-3/4 lg:w-2/4 xl:w-auto enter-x"
           >
             <LoginForm />
             <ForgetPasswordForm />
@@ -62,18 +48,18 @@
   </div>
 </template>
 <script lang="ts" setup>
-  import { computed } from 'vue';
-  import { AppLogo } from '/@/components/Application';
-  import { AppLocalePicker, AppDarkModeToggle } from '/@/components/Application';
-  import LoginForm from './LoginForm.vue';
-  import ForgetPasswordForm from './ForgetPasswordForm.vue';
-  import RegisterForm from './RegisterForm.vue';
-  import MobileForm from './MobileForm.vue';
-  import QrCodeForm from './QrCodeForm.vue';
-  import { useGlobSetting } from '/@/hooks/setting';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useLocaleStore } from '/@/store/modules/locale';
+  import { computed } from "vue";
+  import { AppLogo } from "/@/components/Application";
+  import { AppLocalePicker, AppDarkModeToggle } from "/@/components/Application";
+  import LoginForm from "./LoginForm.vue";
+  import ForgetPasswordForm from "./ForgetPasswordForm.vue";
+  import RegisterForm from "./RegisterForm.vue";
+  import MobileForm from "./MobileForm.vue";
+  import QrCodeForm from "./QrCodeForm.vue";
+  import { useGlobSetting } from "/@/hooks/setting";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useLocaleStore } from "/@/store/modules/locale";
 
   defineProps({
     sessionTimeout: {
@@ -82,19 +68,19 @@
   });
 
   const globSetting = useGlobSetting();
-  const { prefixCls } = useDesign('login');
+  const { prefixCls } = useDesign("login");
   const { t } = useI18n();
   const localeStore = useLocaleStore();
   const showLocale = localeStore.getShowPicker;
-  const title = computed(() => globSetting?.title ?? '');
+  const title = computed(() => globSetting?.title ?? "");
 </script>
 <style lang="less">
-  @prefix-cls: ~'@{namespace}-login';
-  @logo-prefix-cls: ~'@{namespace}-app-logo';
-  @countdown-prefix-cls: ~'@{namespace}-countdown-input';
+  @prefix-cls: ~"@{namespace}-login";
+  @logo-prefix-cls: ~"@{namespace}-app-logo";
+  @countdown-prefix-cls: ~"@{namespace}-countdown-input";
   @dark-bg: #293146;
 
-  html[data-theme='dark'] {
+  html[data-theme="dark"] {
     .@{prefix-cls} {
       background-color: @dark-bg;
 
@@ -149,7 +135,7 @@
       background-position: 100%;
       background-repeat: no-repeat;
       background-size: auto 100%;
-      content: '';
+      content: "";
       @media (max-width: @screen-xl) {
         display: none;
       }
@@ -199,7 +185,7 @@
       }
     }
 
-    input:not([type='checkbox']) {
+    input:not([type="checkbox"]) {
       min-width: 360px;
 
       @media (max-width: @screen-xl) {
diff --git a/src/views/sys/login/LoginForm.vue b/src/views/sys/login/LoginForm.vue
index edc217394035f14d25f2525f83815f2ad2920dea..5a4de1dae05d3e0503c05380062deb3ecad13f1d 100644
--- a/src/views/sys/login/LoginForm.vue
+++ b/src/views/sys/login/LoginForm.vue
@@ -30,7 +30,7 @@
         <FormItem>
           <!-- No logic, you need to deal with it yourself -->
           <Checkbox v-model:checked="rememberMe" size="small">
-            {{ t('sys.login.rememberMe') }}
+            {{ t("sys.login.rememberMe") }}
           </Checkbox>
         </FormItem>
       </ACol>
@@ -38,7 +38,7 @@
         <FormItem :style="{ 'text-align': 'right' }">
           <!-- No logic, you need to deal with it yourself -->
           <Button type="link" size="small" @click="setLoginState(LoginStateEnum.RESET_PASSWORD)">
-            {{ t('sys.login.forgetPassword') }}
+            {{ t("sys.login.forgetPassword") }}
           </Button>
         </FormItem>
       </ACol>
@@ -46,7 +46,7 @@
 
     <FormItem class="enter-x">
       <Button type="primary" size="large" block @click="handleLogin" :loading="loading">
-        {{ t('sys.login.loginButton') }}
+        {{ t("sys.login.loginButton") }}
       </Button>
       <!-- <Button size="large" class="mt-4 enter-x" block @click="handleRegister">
         {{ t('sys.login.registerButton') }}
@@ -55,22 +55,22 @@
     <ARow class="enter-x">
       <ACol :md="8" :xs="24">
         <Button block @click="setLoginState(LoginStateEnum.MOBILE)">
-          {{ t('sys.login.mobileSignInFormTitle') }}
+          {{ t("sys.login.mobileSignInFormTitle") }}
         </Button>
       </ACol>
       <ACol :md="8" :xs="24" class="!my-2 !md:my-0 xs:mx-0 md:mx-2">
         <Button block @click="setLoginState(LoginStateEnum.QR_CODE)">
-          {{ t('sys.login.qrSignInFormTitle') }}
+          {{ t("sys.login.qrSignInFormTitle") }}
         </Button>
       </ACol>
-      <ACol :md="7" :xs="24">
+      <ACol :md="6" :xs="24">
         <Button block @click="setLoginState(LoginStateEnum.REGISTER)">
-          {{ t('sys.login.registerButton') }}
+          {{ t("sys.login.registerButton") }}
         </Button>
       </ACol>
     </ARow>
 
-    <Divider class="enter-x">{{ t('sys.login.otherSignIn') }}</Divider>
+    <Divider class="enter-x">{{ t("sys.login.otherSignIn") }}</Divider>
 
     <div class="flex justify-evenly enter-x" :class="`${prefixCls}-sign-in-way`">
       <GithubFilled />
@@ -82,24 +82,24 @@
   </Form>
 </template>
 <script lang="ts" setup>
-  import { reactive, ref, unref, computed } from 'vue';
+  import { reactive, ref, unref, computed } from "vue";
 
-  import { Checkbox, Form, Input, Row, Col, Button, Divider } from 'ant-design-vue';
+  import { Checkbox, Form, Input, Row, Col, Button, Divider } from "ant-design-vue";
   import {
     GithubFilled,
     WechatFilled,
     AlipayCircleFilled,
     GoogleCircleFilled,
     TwitterCircleFilled,
-  } from '@ant-design/icons-vue';
-  import LoginFormTitle from './LoginFormTitle.vue';
+  } from "@ant-design/icons-vue";
+  import LoginFormTitle from "./LoginFormTitle.vue";
 
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { useMessage } from '/@/hooks/web/useMessage';
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { useMessage } from "/@/hooks/web/useMessage";
 
-  import { useUserStore } from '/@/store/modules/user';
-  import { LoginStateEnum, useLoginState, useFormRules, useFormValid } from './useLogin';
-  import { useDesign } from '/@/hooks/web/useDesign';
+  import { useUserStore } from "/@/store/modules/user";
+  import { LoginStateEnum, useLoginState, useFormRules, useFormValid } from "./useLogin";
+  import { useDesign } from "/@/hooks/web/useDesign";
   //import { onKeyStroke } from '@vueuse/core';
 
   const ACol = Col;
@@ -108,7 +108,7 @@
   const InputPassword = Input.Password;
   const { t } = useI18n();
   const { notification, createErrorModal } = useMessage();
-  const { prefixCls } = useDesign('login');
+  const { prefixCls } = useDesign("login");
   const userStore = useUserStore();
 
   const { setLoginState, getLoginState } = useLoginState();
@@ -119,8 +119,8 @@
   const rememberMe = ref(false);
 
   const formData = reactive({
-    account: 'vben',
-    password: '123456',
+    account: "vben",
+    password: "123456",
   });
 
   const { validForm } = useFormValid(formRef);
@@ -137,19 +137,19 @@
       const userInfo = await userStore.login({
         password: data.password,
         username: data.account,
-        mode: 'none', //不要默认的错误提示
+        mode: "none", //不要默认的错误提示
       });
       if (userInfo) {
         notification.success({
-          message: t('sys.login.loginSuccessTitle'),
-          description: `${t('sys.login.loginSuccessDesc')}: ${userInfo.realName}`,
+          message: t("sys.login.loginSuccessTitle"),
+          description: `${t("sys.login.loginSuccessDesc")}: ${userInfo.realName}`,
           duration: 3,
         });
       }
     } catch (error) {
       createErrorModal({
-        title: t('sys.api.errorTip'),
-        content: (error as unknown as Error).message || t('sys.api.networkExceptionMsg'),
+        title: t("sys.api.errorTip"),
+        content: (error as unknown as Error).message || t("sys.api.networkExceptionMsg"),
         getContainer: () => document.body.querySelector(`.${prefixCls}`) || document.body,
       });
     } finally {
diff --git a/src/views/sys/login/LoginFormTitle.vue b/src/views/sys/login/LoginFormTitle.vue
index a673636e6cf0cf5ba92f012afd920c30d9115c86..e5ca0083d7ed86c93569ed44c4765b10731d55f5 100644
--- a/src/views/sys/login/LoginFormTitle.vue
+++ b/src/views/sys/login/LoginFormTitle.vue
@@ -4,9 +4,9 @@
   </h2>
 </template>
 <script lang="ts" setup>
-  import { computed, unref } from 'vue';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { LoginStateEnum, useLoginState } from './useLogin';
+  import { computed, unref } from "vue";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { LoginStateEnum, useLoginState } from "./useLogin";
 
   const { t } = useI18n();
 
@@ -14,11 +14,11 @@
 
   const getFormTitle = computed(() => {
     const titleObj = {
-      [LoginStateEnum.RESET_PASSWORD]: t('sys.login.forgetFormTitle'),
-      [LoginStateEnum.LOGIN]: t('sys.login.signInFormTitle'),
-      [LoginStateEnum.REGISTER]: t('sys.login.signUpFormTitle'),
-      [LoginStateEnum.MOBILE]: t('sys.login.mobileSignInFormTitle'),
-      [LoginStateEnum.QR_CODE]: t('sys.login.qrSignInFormTitle'),
+      [LoginStateEnum.RESET_PASSWORD]: t("sys.login.forgetFormTitle"),
+      [LoginStateEnum.LOGIN]: t("sys.login.signInFormTitle"),
+      [LoginStateEnum.REGISTER]: t("sys.login.signUpFormTitle"),
+      [LoginStateEnum.MOBILE]: t("sys.login.mobileSignInFormTitle"),
+      [LoginStateEnum.QR_CODE]: t("sys.login.qrSignInFormTitle"),
     };
     return titleObj[unref(getLoginState)];
   });
diff --git a/src/views/sys/login/MobileForm.vue b/src/views/sys/login/MobileForm.vue
index 88b9f82e5a6f5dbafb23a2652002f1ef3c6cc4be..8f3bbdbedc3dcefbb51516987cc2229f9615dab7 100644
--- a/src/views/sys/login/MobileForm.vue
+++ b/src/views/sys/login/MobileForm.vue
@@ -21,22 +21,22 @@
 
       <FormItem class="enter-x">
         <Button type="primary" size="large" block @click="handleLogin" :loading="loading">
-          {{ t('sys.login.loginButton') }}
+          {{ t("sys.login.loginButton") }}
         </Button>
         <Button size="large" block class="mt-4" @click="handleBackLogin">
-          {{ t('sys.login.backSignIn') }}
+          {{ t("sys.login.backSignIn") }}
         </Button>
       </FormItem>
     </Form>
   </template>
 </template>
 <script lang="ts" setup>
-  import { reactive, ref, computed, unref } from 'vue';
-  import { Form, Input, Button } from 'ant-design-vue';
-  import { CountdownInput } from '/@/components/CountDown';
-  import LoginFormTitle from './LoginFormTitle.vue';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { useLoginState, useFormRules, useFormValid, LoginStateEnum } from './useLogin';
+  import { reactive, ref, computed, unref } from "vue";
+  import { Form, Input, Button } from "ant-design-vue";
+  import { CountdownInput } from "/@/components/CountDown";
+  import LoginFormTitle from "./LoginFormTitle.vue";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { useLoginState, useFormRules, useFormValid, LoginStateEnum } from "./useLogin";
 
   const FormItem = Form.Item;
   const { t } = useI18n();
@@ -47,8 +47,8 @@
   const loading = ref(false);
 
   const formData = reactive({
-    mobile: '',
-    sms: '',
+    mobile: "",
+    sms: "",
   });
 
   const { validForm } = useFormValid(formRef);
diff --git a/src/views/sys/login/QrCodeForm.vue b/src/views/sys/login/QrCodeForm.vue
index 680c07caf9d2bd8e5fd62b3c79bd093752923504..c329745590808400eefcd38b8eaf71905489904c 100644
--- a/src/views/sys/login/QrCodeForm.vue
+++ b/src/views/sys/login/QrCodeForm.vue
@@ -7,22 +7,22 @@
         class="enter-x flex justify-center xl:justify-start"
         :width="280"
       />
-      <Divider class="enter-x">{{ t('sys.login.scanSign') }}</Divider>
+      <Divider class="enter-x">{{ t("sys.login.scanSign") }}</Divider>
       <Button size="large" block class="mt-4 enter-x" @click="handleBackLogin">
-        {{ t('sys.login.backSignIn') }}
+        {{ t("sys.login.backSignIn") }}
       </Button>
     </div>
   </template>
 </template>
 <script lang="ts" setup>
-  import { computed, unref } from 'vue';
-  import LoginFormTitle from './LoginFormTitle.vue';
-  import { Button, Divider } from 'ant-design-vue';
-  import { QrCode } from '/@/components/Qrcode/index';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { useLoginState, LoginStateEnum } from './useLogin';
+  import { computed, unref } from "vue";
+  import LoginFormTitle from "./LoginFormTitle.vue";
+  import { Button, Divider } from "ant-design-vue";
+  import { QrCode } from "/@/components/Qrcode/index";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { useLoginState, LoginStateEnum } from "./useLogin";
 
-  const qrCodeUrl = 'https://vvbin.cn/next/login';
+  const qrCodeUrl = "https://vvbin.cn/next/login";
 
   const { t } = useI18n();
   const { handleBackLogin, getLoginState } = useLoginState();
diff --git a/src/views/sys/login/RegisterForm.vue b/src/views/sys/login/RegisterForm.vue
index e70917e48756e9a2e3fd02fb76a63ca0842ef213..37084c56ab224d57eab06d01b715979c55274a7d 100644
--- a/src/views/sys/login/RegisterForm.vue
+++ b/src/views/sys/login/RegisterForm.vue
@@ -45,7 +45,7 @@
       <FormItem class="enter-x" name="policy">
         <!-- No logic, you need to deal with it yourself -->
         <Checkbox v-model:checked="formData.policy" size="small">
-          {{ t('sys.login.policy') }}
+          {{ t("sys.login.policy") }}
         </Checkbox>
       </FormItem>
 
@@ -57,22 +57,22 @@
         @click="handleRegister"
         :loading="loading"
       >
-        {{ t('sys.login.registerButton') }}
+        {{ t("sys.login.registerButton") }}
       </Button>
       <Button size="large" block class="mt-4 enter-x" @click="handleBackLogin">
-        {{ t('sys.login.backSignIn') }}
+        {{ t("sys.login.backSignIn") }}
       </Button>
     </Form>
   </template>
 </template>
 <script lang="ts" setup>
-  import { reactive, ref, unref, computed } from 'vue';
-  import LoginFormTitle from './LoginFormTitle.vue';
-  import { Form, Input, Button, Checkbox } from 'ant-design-vue';
-  import { StrengthMeter } from '/@/components/StrengthMeter';
-  import { CountdownInput } from '/@/components/CountDown';
-  import { useI18n } from '/@/hooks/web/useI18n';
-  import { useLoginState, useFormRules, useFormValid, LoginStateEnum } from './useLogin';
+  import { reactive, ref, unref, computed } from "vue";
+  import LoginFormTitle from "./LoginFormTitle.vue";
+  import { Form, Input, Button, Checkbox } from "ant-design-vue";
+  import { StrengthMeter } from "/@/components/StrengthMeter";
+  import { CountdownInput } from "/@/components/CountDown";
+  import { useI18n } from "/@/hooks/web/useI18n";
+  import { useLoginState, useFormRules, useFormValid, LoginStateEnum } from "./useLogin";
 
   const FormItem = Form.Item;
   const InputPassword = Input.Password;
@@ -83,11 +83,11 @@
   const loading = ref(false);
 
   const formData = reactive({
-    account: '',
-    password: '',
-    confirmPassword: '',
-    mobile: '',
-    sms: '',
+    account: "",
+    password: "",
+    confirmPassword: "",
+    mobile: "",
+    sms: "",
     policy: false,
   });
 
diff --git a/src/views/sys/login/SessionTimeoutLogin.vue b/src/views/sys/login/SessionTimeoutLogin.vue
index d1a2f34e52b828e5822621df63607417be8e79a9..401b48b5affe302afb52a42107c26dbd856e8bb1 100644
--- a/src/views/sys/login/SessionTimeoutLogin.vue
+++ b/src/views/sys/login/SessionTimeoutLogin.vue
@@ -6,15 +6,15 @@
   </transition>
 </template>
 <script lang="ts" setup>
-  import { onBeforeUnmount, onMounted, ref } from 'vue';
-  import Login from './Login.vue';
-  import { useDesign } from '/@/hooks/web/useDesign';
-  import { useUserStore } from '/@/store/modules/user';
-  import { usePermissionStore } from '/@/store/modules/permission';
-  import { useAppStore } from '/@/store/modules/app';
-  import { PermissionModeEnum } from '/@/enums/appEnum';
+  import { onBeforeUnmount, onMounted, ref } from "vue";
+  import Login from "./Login.vue";
+  import { useDesign } from "/@/hooks/web/useDesign";
+  import { useUserStore } from "/@/store/modules/user";
+  import { usePermissionStore } from "/@/store/modules/permission";
+  import { useAppStore } from "/@/store/modules/app";
+  import { PermissionModeEnum } from "/@/enums/appEnum";
 
-  const { prefixCls } = useDesign('st-login');
+  const { prefixCls } = useDesign("st-login");
   const userStore = useUserStore();
   const permissionStore = usePermissionStore();
   const appStore = useAppStore();
@@ -27,7 +27,7 @@
   onMounted(() => {
     // 记录当前的UserId
     userId.value = userStore.getUserInfo?.userId;
-    console.log('Mounted', userStore.getUserInfo);
+    console.log("Mounted", userStore.getUserInfo);
   });
 
   onBeforeUnmount(() => {
@@ -41,7 +41,7 @@
   });
 </script>
 <style lang="less" scoped>
-  @prefix-cls: ~'@{namespace}-st-login';
+  @prefix-cls: ~"@{namespace}-st-login";
 
   .@{prefix-cls} {
     position: fixed;
diff --git a/src/views/sys/login/useLogin.ts b/src/views/sys/login/useLogin.ts
index 78b73fc61c026f018d447d8c6c1a2f4d27074e05..7c4a82b4bb742866b8d93784a603a35c674ee75c 100644
--- a/src/views/sys/login/useLogin.ts
+++ b/src/views/sys/login/useLogin.ts
@@ -1,7 +1,7 @@
-import type { ValidationRule } from 'ant-design-vue/lib/form/Form';
-import type { RuleObject } from 'ant-design-vue/lib/form/interface';
-import { ref, computed, unref, Ref } from 'vue';
-import { useI18n } from '/@/hooks/web/useI18n';
+import type { ValidationRule } from "ant-design-vue/lib/form/Form";
+import type { RuleObject } from "ant-design-vue/lib/form/interface";
+import { ref, computed, unref, Ref } from "vue";
+import { useI18n } from "/@/hooks/web/useI18n";
 
 export enum LoginStateEnum {
   LOGIN,
@@ -41,22 +41,22 @@ export function useFormValid<T extends Object = any>(formRef: Ref<any>) {
 export function useFormRules(formData?: Recordable) {
   const { t } = useI18n();
 
-  const getAccountFormRule = computed(() => createRule(t('sys.login.accountPlaceholder')));
-  const getPasswordFormRule = computed(() => createRule(t('sys.login.passwordPlaceholder')));
-  const getSmsFormRule = computed(() => createRule(t('sys.login.smsPlaceholder')));
-  const getMobileFormRule = computed(() => createRule(t('sys.login.mobilePlaceholder')));
+  const getAccountFormRule = computed(() => createRule(t("sys.login.accountPlaceholder")));
+  const getPasswordFormRule = computed(() => createRule(t("sys.login.passwordPlaceholder")));
+  const getSmsFormRule = computed(() => createRule(t("sys.login.smsPlaceholder")));
+  const getMobileFormRule = computed(() => createRule(t("sys.login.mobilePlaceholder")));
 
   const validatePolicy = async (_: RuleObject, value: boolean) => {
-    return !value ? Promise.reject(t('sys.login.policyPlaceholder')) : Promise.resolve();
+    return !value ? Promise.reject(t("sys.login.policyPlaceholder")) : Promise.resolve();
   };
 
   const validateConfirmPassword = (password: string) => {
     return async (_: RuleObject, value: string) => {
       if (!value) {
-        return Promise.reject(t('sys.login.passwordPlaceholder'));
+        return Promise.reject(t("sys.login.passwordPlaceholder"));
       }
       if (value !== password) {
-        return Promise.reject(t('sys.login.diffPwd'));
+        return Promise.reject(t("sys.login.diffPwd"));
       }
       return Promise.resolve();
     };
@@ -79,9 +79,9 @@ export function useFormRules(formData?: Recordable) {
           account: accountFormRule,
           password: passwordFormRule,
           confirmPassword: [
-            { validator: validateConfirmPassword(formData?.password), trigger: 'change' },
+            { validator: validateConfirmPassword(formData?.password), trigger: "change" },
           ],
-          policy: [{ validator: validatePolicy, trigger: 'change' }],
+          policy: [{ validator: validatePolicy, trigger: "change" }],
           ...mobileRule,
         };
 
@@ -112,7 +112,7 @@ function createRule(message: string) {
     {
       required: true,
       message,
-      trigger: 'change',
+      trigger: "change",
     },
   ];
 }
diff --git a/src/views/sys/redirect/index.vue b/src/views/sys/redirect/index.vue
index 7aa54635fe34b1bf315ce94d7b7d28a80e165033..9673bf6fdb0eb171558ac936b4f20ad61afd6fa1 100644
--- a/src/views/sys/redirect/index.vue
+++ b/src/views/sys/redirect/index.vue
@@ -2,20 +2,20 @@
   <div></div>
 </template>
 <script lang="ts" setup>
-  import { unref } from 'vue';
-  import { useRouter } from 'vue-router';
+  import { unref } from "vue";
+  import { useRouter } from "vue-router";
 
   const { currentRoute, replace } = useRouter();
 
   const { params, query } = unref(currentRoute);
-  const { path, _redirect_type = 'path' } = params;
+  const { path, _redirect_type = "path" } = params;
 
-  Reflect.deleteProperty(params, '_redirect_type');
-  Reflect.deleteProperty(params, 'path');
+  Reflect.deleteProperty(params, "_redirect_type");
+  Reflect.deleteProperty(params, "path");
 
-  const _path = Array.isArray(path) ? path.join('/') : path;
+  const _path = Array.isArray(path) ? path.join("/") : path;
 
-  if (_redirect_type === 'name') {
+  if (_redirect_type === "name") {
     replace({
       name: _path,
       query,
@@ -23,7 +23,7 @@
     });
   } else {
     replace({
-      path: _path.startsWith('/') ? _path : '/' + _path,
+      path: _path.startsWith("/") ? _path : "/" + _path,
       query,
     });
   }
diff --git a/stylelint.config.js b/stylelint.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..af3e9073f1d2c3a9d07727e3c68b6f6d96f4d4b5
--- /dev/null
+++ b/stylelint.config.js
@@ -0,0 +1,100 @@
+module.exports = {
+  root: true,
+  plugins: ["stylelint-order"],
+  extends: ["stylelint-config-standard", "stylelint-config-prettier"],
+  customSyntax: "postcss-html",
+  rules: {
+    "function-no-unknown": null,
+    "selector-class-pattern": null,
+    "selector-pseudo-class-no-unknown": [
+      true,
+      {
+        ignorePseudoClasses: ["global"],
+      },
+    ],
+    "selector-pseudo-element-no-unknown": [
+      true,
+      {
+        ignorePseudoElements: ["v-deep"],
+      },
+    ],
+    "at-rule-no-unknown": [
+      true,
+      {
+        ignoreAtRules: [
+          "tailwind",
+          "apply",
+          "variants",
+          "responsive",
+          "screen",
+          "function",
+          "if",
+          "each",
+          "include",
+          "mixin",
+        ],
+      },
+    ],
+    "no-empty-source": null,
+    "string-quotes": null,
+    "named-grid-areas-no-invalid": null,
+    "unicode-bom": "never",
+    "no-descending-specificity": null,
+    "font-family-no-missing-generic-family-keyword": null,
+    "declaration-colon-space-after": "always-single-line",
+    "declaration-colon-space-before": "never",
+    // 'declaration-block-trailing-semicolon': 'always',
+    "rule-empty-line-before": [
+      "always",
+      {
+        ignore: ["after-comment", "first-nested"],
+      },
+    ],
+    "unit-no-unknown": [true, { ignoreUnits: ["rpx"] }],
+    "order/order": [
+      [
+        "dollar-variables",
+        "custom-properties",
+        "at-rules",
+        "declarations",
+        {
+          type: "at-rule",
+          name: "supports",
+        },
+        {
+          type: "at-rule",
+          name: "media",
+        },
+        "rules",
+      ],
+      { severity: "warning" },
+    ],
+  },
+  ignoreFiles: ["**/*.js", "**/*.jsx", "**/*.tsx", "**/*.ts"],
+  overrides: [
+    {
+      files: ["*.vue", "**/*.vue", "*.html", "**/*.html"],
+      extends: ["stylelint-config-recommended"],
+      rules: {
+        "keyframes-name-pattern": null,
+        "selector-pseudo-class-no-unknown": [
+          true,
+          {
+            ignorePseudoClasses: ["deep", "global"],
+          },
+        ],
+        "selector-pseudo-element-no-unknown": [
+          true,
+          {
+            ignorePseudoElements: ["v-deep", "v-global", "v-slotted"],
+          },
+        ],
+      },
+    },
+    {
+      files: ["*.less", "**/*.less"],
+      customSyntax: "postcss-less",
+      extends: ["stylelint-config-standard", "stylelint-config-recommended-vue"],
+    },
+  ],
+};
diff --git a/tests/server/README.md b/tests/server/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..14298dfc4b0fdb6b95cce634f9dc5ac35607e625
--- /dev/null
+++ b/tests/server/README.md
@@ -0,0 +1,15 @@
+# Test Server
+
+It is used to start the test interface service, which can test the upload, websocket, login and other interfaces.
+
+## Usage
+
+```bash
+
+cd ./test/server
+
+pnpm install
+
+pnpm run start
+
+```
diff --git a/tests/server/controller/FileController.ts b/tests/server/controller/FileController.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cf6d90d5bd4993dca5d5d25cf9f093b724397bfe
--- /dev/null
+++ b/tests/server/controller/FileController.ts
@@ -0,0 +1,18 @@
+import FileService from '../service/FileService';
+
+class FileController {
+  private service: FileService = new FileService();
+
+  upload = async (ctx) => {
+    const files = ctx.request.files.file;
+    console.log(files);
+
+    if (files.length === undefined) {
+      this.service.upload(ctx, files, false);
+    } else {
+      this.service.upload(ctx, files, true);
+    }
+  };
+}
+
+export default new FileController();
diff --git a/tests/server/controller/UserController.ts b/tests/server/controller/UserController.ts
new file mode 100644
index 0000000000000000000000000000000000000000..db815c2f25d67ebac530e10ac947fc4015b18349
--- /dev/null
+++ b/tests/server/controller/UserController.ts
@@ -0,0 +1,15 @@
+import UserService from '../service/UserService';
+
+class UserController {
+  private service: UserService = new UserService();
+
+  login = async (ctx) => {
+    ctx.body = await this.service.login();
+  };
+
+  getUserInfoById = async (ctx) => {
+    ctx.body = await this.service.getUserInfoById();
+  };
+}
+
+export default new UserController();
diff --git a/tests/server/ecosystem.config.js b/tests/server/ecosystem.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..a31e457e652c815c8db4207697612f999e6955d7
--- /dev/null
+++ b/tests/server/ecosystem.config.js
@@ -0,0 +1,18 @@
+const { name } = require('./package.json');
+const path = require('path');
+
+module.exports = {
+  apps: [
+    {
+      name,
+      script: path.resolve(__dirname, './dist/index.js'),
+      instances: require('os').cpus().length,
+      autorestart: true,
+      watch: true,
+      env_production: {
+        NODE_ENV: 'production',
+        PORT: 8080,
+      },
+    },
+  ],
+};
diff --git a/tests/server/index.ts b/tests/server/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ba8b6d80cbcdbb662164fd12fb1e0c2eece9a70f
--- /dev/null
+++ b/tests/server/index.ts
@@ -0,0 +1,63 @@
+import Koa from "koa";
+import path from "path";
+import Router from "koa-router";
+import body from "koa-body";
+import cors from "koa2-cors";
+import koaStatic from "koa-static";
+import websockify from "koa-websocket";
+import route from "koa-route";
+
+import AppRoutes from "./routes";
+
+const PORT = 8633;
+
+const app = websockify(new Koa());
+
+app.ws.use(function (ctx, next) {
+  ctx.websocket.send("connection succeeded!");
+  return next(ctx);
+});
+
+app.ws.use(
+  route.all("/test", function (ctx) {
+    // ctx.websocket.send('Hello World');
+    ctx.websocket.on("message", function (message) {
+      // do something with the message from client
+
+      if (message !== "ping") {
+        const data = JSON.stringify({
+          id: Math.ceil(Math.random() * 1000),
+          time: new Date().getTime(),
+          res: `${message}`,
+        });
+        ctx.websocket.send(data);
+      }
+      console.log(message);
+    });
+  }),
+);
+
+const router = new Router();
+
+// router
+AppRoutes.forEach((route) => router[route.method](route.path, route.action));
+
+app.use(cors());
+app.use(
+  body({
+    encoding: "gzip",
+    multipart: true,
+    formidable: {
+      // uploadDir: path.join(__dirname, '/upload/'), // 设置文件上传目录
+      keepExtensions: true,
+      maxFieldsSize: 20 * 1024 * 1024,
+    },
+  }),
+);
+app.use(router.routes());
+app.use(router.allowedMethods());
+app.use(koaStatic(path.join(__dirname)));
+
+app.listen(PORT, () => {
+  console.log(`Application started successfully: http://localhost:${PORT}`);
+});
diff --git a/tests/server/nodemon.json b/tests/server/nodemon.json
new file mode 100644
index 0000000000000000000000000000000000000000..59fa5afb02c193a9ba3b076574e6f5b2bda30d20
--- /dev/null
+++ b/tests/server/nodemon.json
@@ -0,0 +1,8 @@
+{
+  "watch": ["src"],
+  "ext": "ts",
+  "exec": "ts-node -r tsconfig-paths/register index.ts",
+  "events": {
+    "restart": "clear"
+  }
+}
diff --git a/tests/server/package.json b/tests/server/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..cce2442d2ff3c4a6b203a2cb9c6378da506f963e
--- /dev/null
+++ b/tests/server/package.json
@@ -0,0 +1,36 @@
+{
+  "name": "server",
+  "version": "1.0.0",
+  "license": "MIT",
+  "scripts": {
+    "start": "nodemon",
+    "build": "rimraf ./dist && tsup ./index.ts --dts --format cjs,esm  ",
+    "prod": "npx pm2 start ecosystem.config.js --env production",
+    "restart": "pm2 restart ecosystem.config.js --env production",
+    "stop": "npx pm2 stop ecosystem.config.js"
+  },
+  "dependencies": {
+    "fs-extra": "^10.0.1",
+    "koa": "^2.13.4",
+    "koa-body": "^4.2.0",
+    "koa-bodyparser": "^4.3.0",
+    "koa-route": "^3.2.0",
+    "koa-router": "^10.1.1",
+    "koa-static": "^5.0.0",
+    "koa-websocket": "^6.0.0",
+    "koa2-cors": "^2.0.6"
+  },
+  "devDependencies": {
+    "@types/koa": "^2.13.4",
+    "@types/koa-bodyparser": "^5.0.2",
+    "@types/koa-router": "^7.4.4",
+    "@types/node": "^17.0.21",
+    "nodemon": "^2.0.15",
+    "pm2": "^5.2.0",
+    "rimraf": "^3.0.2",
+    "ts-node": "^10.7.0",
+    "tsconfig-paths": "^3.14.0",
+    "tsup": "^5.12.1",
+    "typescript": "^4.6.2"
+  }
+}
diff --git a/tests/server/routes.ts b/tests/server/routes.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7fe64759832627c7f6123f4e0bec569ac77da953
--- /dev/null
+++ b/tests/server/routes.ts
@@ -0,0 +1,23 @@
+import UserController from './controller/UserController';
+import FileController from './controller/FileController';
+
+export default [
+  // user
+  {
+    path: '/login',
+    method: 'post',
+    action: UserController.login,
+  },
+  {
+    path: '/getUserInfoById',
+    method: 'get',
+    action: UserController.getUserInfoById,
+  },
+
+  // file
+  {
+    path: '/upload',
+    method: 'post',
+    action: FileController.upload,
+  },
+];
diff --git a/tests/server/service/FileService.ts b/tests/server/service/FileService.ts
new file mode 100644
index 0000000000000000000000000000000000000000..dfd378f7733d5c2070bf803344398019d815463a
--- /dev/null
+++ b/tests/server/service/FileService.ts
@@ -0,0 +1,54 @@
+import path from 'path';
+import fs from 'fs-extra';
+
+const uploadUrl = 'http://localhost:3300/static/upload';
+const filePath = path.join(__dirname, '../static/upload/');
+
+fs.ensureDir(filePath);
+export default class UserService {
+  async upload(ctx, files, isMultiple) {
+    let fileReader, fileResource, writeStream;
+
+    const fileFunc = function (file) {
+      fileReader = fs.createReadStream(file.path);
+      fileResource = filePath + `/${file.name}`;
+      console.log(fileResource);
+
+      writeStream = fs.createWriteStream(fileResource);
+      fileReader.pipe(writeStream);
+    };
+
+    const returnFunc = function (flag) {
+      if (flag) {
+        let url = '';
+        for (let i = 0; i < files.length; i++) {
+          url += uploadUrl + `/${files[i].name},`;
+        }
+        url = url.replace(/,$/gi, '');
+        ctx.body = {
+          url: url,
+          code: 0,
+          message: 'upload Success!',
+        };
+      } else {
+        ctx.body = {
+          url: uploadUrl + `/${files.name}`,
+          code: 0,
+          message: 'upload Success!',
+        };
+      }
+    };
+    console.log(isMultiple, files.length);
+
+    if (isMultiple) {
+      for (let i = 0; i < files.length; i++) {
+        const f1 = files[i];
+        fileFunc(f1);
+      }
+    } else {
+      fileFunc(files);
+    }
+    fs.ensureDir(filePath);
+    returnFunc(isMultiple);
+  }
+}
diff --git a/tests/server/service/UserService.ts b/tests/server/service/UserService.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0c395e52e7e661e1ed91c62dee12370355e57587
--- /dev/null
+++ b/tests/server/service/UserService.ts
@@ -0,0 +1,25 @@
+import { Result } from '../utils';
+
+const fakeUserInfo = {
+  userId: '1',
+  username: 'vben',
+  realName: 'Vben Admin',
+  desc: 'manager',
+  password: '123456',
+  token: 'fakeToken1',
+  roles: [
+    {
+      roleName: 'Super Admin',
+      value: 'super',
+    },
+  ],
+};
+export default class UserService {
+  async login() {
+    return Result.success(fakeUserInfo);
+  }
+
+  async getUserInfoById() {
+    return Result.success(fakeUserInfo);
+  }
+}
diff --git a/tests/server/tsconfig.json b/tests/server/tsconfig.json
new file mode 100644
index 0000000000000000000000000000000000000000..76203ed7d2cdf25f1141579c54e8d1d7708ddb19
--- /dev/null
+++ b/tests/server/tsconfig.json
@@ -0,0 +1,15 @@
+{
+  "compilerOptions": {
+    "module": "commonjs",
+    "declaration": false,
+    "removeComments": true,
+    "emitDecoratorMetadata": true,
+    "experimentalDecorators": true,
+    "target": "es6",
+    "sourceMap": false,
+    "esModuleInterop": true,
+    "outDir": "./dist",
+    "baseUrl": "./"
+  },
+  "exclude": ["node_modules"]
+}
diff --git a/tests/server/utils.ts b/tests/server/utils.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7fd0b3fadb919278df791fce6c322f8bc6a19ff5
--- /dev/null
+++ b/tests/server/utils.ts
@@ -0,0 +1,9 @@
+export class Result {
+  static success(data: any) {
+    return {
+      code: 0,
+      success: true,
+      result: data,
+    };
+  }
+}
diff --git a/tests/server/yarn.lock b/tests/server/yarn.lock
new file mode 100644
index 0000000000000000000000000000000000000000..27b8dbd61ad682e905ad340d872d89735fe89147
--- /dev/null
+++ b/tests/server/yarn.lock
@@ -0,0 +1,2745 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/code-frame@^7.0.0":
+  version "7.12.13"
+  resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658"
+  integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==
+  dependencies:
+    "@babel/highlight" "^7.12.13"
+
+"@babel/helper-validator-identifier@^7.14.0":
+  version "7.14.0"
+  resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288"
+  integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==
+
+"@babel/highlight@^7.12.13":
+  version "7.14.0"
+  resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf"
+  integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==
+  dependencies:
+    "@babel/helper-validator-identifier" "^7.14.0"
+    chalk "^2.0.0"
+    js-tokens "^4.0.0"
+
+"@cspotcode/source-map-support@^0.8.0":
+  version "0.8.1"
+  resolved "https://registry.npmmirror.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1"
+  integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==
+  dependencies:
+    "@jridgewell/trace-mapping" "0.3.9"
+
+"@esbuild/linux-loong64@0.14.54":
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028"
+  integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==
+
+"@jridgewell/resolve-uri@^3.0.3":
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
+  integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
+
+"@jridgewell/sourcemap-codec@^1.4.10":
+  version "1.4.14"
+  resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
+  integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
+
+"@jridgewell/trace-mapping@0.3.9":
+  version "0.3.9"
+  resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9"
+  integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==
+  dependencies:
+    "@jridgewell/resolve-uri" "^3.0.3"
+    "@jridgewell/sourcemap-codec" "^1.4.10"
+
+"@nodelib/fs.scandir@2.1.5":
+  version "2.1.5"
+  resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
+  integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
+  dependencies:
+    "@nodelib/fs.stat" "2.0.5"
+    run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
+  version "2.0.5"
+  resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
+  integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
+
+"@nodelib/fs.walk@^1.2.3":
+  version "1.2.7"
+  resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.7.tgz#94c23db18ee4653e129abd26fb06f870ac9e1ee2"
+  integrity sha512-BTIhocbPBSrRmHxOAJFtR18oLhxTtAFDAvL8hY1S3iU8k+E60W/YFs4jrixGzQjMpF4qPXxIQHcjVD9dz1C2QA==
+  dependencies:
+    "@nodelib/fs.scandir" "2.1.5"
+    fastq "^1.6.0"
+
+"@opencensus/core@0.0.9":
+  version "0.0.9"
+  resolved "https://registry.npmjs.org/@opencensus/core/-/core-0.0.9.tgz#b16f775435ee309433e4126af194d37313fc93b3"
+  integrity sha512-31Q4VWtbzXpVUd2m9JS6HEaPjlKvNMOiF7lWKNmXF84yUcgfAFL5re7/hjDmdyQbOp32oGc+RFV78jXIldVz6Q==
+  dependencies:
+    continuation-local-storage "^3.2.1"
+    log-driver "^1.2.7"
+    semver "^5.5.0"
+    shimmer "^1.2.0"
+    uuid "^3.2.1"
+
+"@opencensus/core@^0.0.8":
+  version "0.0.8"
+  resolved "https://registry.npmjs.org/@opencensus/core/-/core-0.0.8.tgz#df01f200c2d2fbfe14dae129a1a86fb87286db92"
+  integrity sha512-yUFT59SFhGMYQgX0PhoTR0LBff2BEhPrD9io1jWfF/VDbakRfs6Pq60rjv0Z7iaTav5gQlttJCX2+VPxFWCuoQ==
+  dependencies:
+    continuation-local-storage "^3.2.1"
+    log-driver "^1.2.7"
+    semver "^5.5.0"
+    shimmer "^1.2.0"
+    uuid "^3.2.1"
+
+"@opencensus/propagation-b3@0.0.8":
+  version "0.0.8"
+  resolved "https://registry.npmjs.org/@opencensus/propagation-b3/-/propagation-b3-0.0.8.tgz#0751e6fd75f09400d9d3c419001e9e15a0df68e9"
+  integrity sha512-PffXX2AL8Sh0VHQ52jJC4u3T0H6wDK6N/4bg7xh4ngMYOIi13aR1kzVvX1sVDBgfGwDOkMbl4c54Xm3tlPx/+A==
+  dependencies:
+    "@opencensus/core" "^0.0.8"
+    uuid "^3.2.1"
+
+"@pm2/agent@~2.0.0":
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/@pm2/agent/-/agent-2.0.1.tgz#0edffc54cd8ee2b12f90136264e7880f3f78c79d"
+  integrity sha512-QKHMm6yexcvdDfcNE7PL9D6uEjoQPGRi+8dh+rc4Hwtbpsbh5IAvZbz3BVGjcd4HaX6pt2xGpOohG7/Y2L4QLw==
+  dependencies:
+    async "~3.2.0"
+    chalk "~3.0.0"
+    dayjs "~1.8.24"
+    debug "~4.3.1"
+    eventemitter2 "~5.0.1"
+    fast-json-patch "^3.0.0-1"
+    fclone "~1.0.11"
+    nssocket "0.6.0"
+    pm2-axon "~4.0.1"
+    pm2-axon-rpc "~0.7.0"
+    proxy-agent "~5.0.0"
+    semver "~7.2.0"
+    ws "~7.4.0"
+
+"@pm2/io@~5.0.0":
+  version "5.0.0"
+  resolved "https://registry.npmjs.org/@pm2/io/-/io-5.0.0.tgz#623cbcaf6fe39375f20ac2e75497477a1b1ec5c5"
+  integrity sha512-3rToDVJaRoob5Lq8+7Q2TZFruoEkdORxwzFpZaqF4bmH6Bkd7kAbdPrI/z8X6k1Meq5rTtScM7MmDgppH6aLlw==
+  dependencies:
+    "@opencensus/core" "0.0.9"
+    "@opencensus/propagation-b3" "0.0.8"
+    async "~2.6.1"
+    debug "~4.3.1"
+    eventemitter2 "^6.3.1"
+    require-in-the-middle "^5.0.0"
+    semver "6.3.0"
+    shimmer "^1.2.0"
+    signal-exit "^3.0.3"
+    tslib "1.9.3"
+
+"@pm2/js-api@~0.6.7":
+  version "0.6.7"
+  resolved "https://registry.npmjs.org/@pm2/js-api/-/js-api-0.6.7.tgz#ed28c3b7b6d26f03f826318754fdc5468afa589f"
+  integrity sha512-jiJUhbdsK+5C4zhPZNnyA3wRI01dEc6a2GhcQ9qI38DyIk+S+C8iC3fGjcjUbt/viLYKPjlAaE+hcT2/JMQPXw==
+  dependencies:
+    async "^2.6.3"
+    axios "^0.21.0"
+    debug "~4.3.1"
+    eventemitter2 "^6.3.1"
+    ws "^7.0.0"
+
+"@pm2/pm2-version-check@latest":
+  version "1.0.4"
+  resolved "https://registry.npmjs.org/@pm2/pm2-version-check/-/pm2-version-check-1.0.4.tgz#cf97fbb14b0eca95430ca05eedccbd2683806e43"
+  integrity sha512-SXsM27SGH3yTWKc2fKR4SYNxsmnvuBQ9dd6QHtEWmiZ/VqaOYPAIlS8+vMcn27YLtAEBGvNRSh3TPNvtjZgfqA==
+  dependencies:
+    debug "^4.3.1"
+
+"@tootallnate/once@1":
+  version "1.1.2"
+  resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
+  integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==
+
+"@tsconfig/node10@^1.0.7":
+  version "1.0.7"
+  resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.7.tgz#1eb1de36c73478a2479cc661ef5af1c16d86d606"
+  integrity sha512-aBvUmXLQbayM4w3A8TrjwrXs4DZ8iduJnuJLLRGdkWlyakCf1q6uHZJBzXoRA/huAEknG5tcUyQxN3A+In5euQ==
+
+"@tsconfig/node12@^1.0.7":
+  version "1.0.7"
+  resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.7.tgz#677bd9117e8164dc319987dd6ff5fc1ba6fbf18b"
+  integrity sha512-dgasobK/Y0wVMswcipr3k0HpevxFJLijN03A8mYfEPvWvOs14v0ZlYTR4kIgMx8g4+fTyTFv8/jLCIfRqLDJ4A==
+
+"@tsconfig/node14@^1.0.0":
+  version "1.0.0"
+  resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.0.tgz#5bd046e508b1ee90bc091766758838741fdefd6e"
+  integrity sha512-RKkL8eTdPv6t5EHgFKIVQgsDapugbuOptNd9OOunN/HAkzmmTnZELx1kNCK0rSdUYGmiFMM3rRQMAWiyp023LQ==
+
+"@tsconfig/node16@^1.0.2":
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e"
+  integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==
+
+"@types/accepts@*":
+  version "1.3.5"
+  resolved "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz#c34bec115cfc746e04fe5a059df4ce7e7b391575"
+  integrity sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==
+  dependencies:
+    "@types/node" "*"
+
+"@types/body-parser@*":
+  version "1.19.0"
+  resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz#0685b3c47eb3006ffed117cdd55164b61f80538f"
+  integrity sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==
+  dependencies:
+    "@types/connect" "*"
+    "@types/node" "*"
+
+"@types/connect@*":
+  version "3.4.34"
+  resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz#170a40223a6d666006d93ca128af2beb1d9b1901"
+  integrity sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==
+  dependencies:
+    "@types/node" "*"
+
+"@types/content-disposition@*":
+  version "0.5.3"
+  resolved "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.3.tgz#0aa116701955c2faa0717fc69cd1596095e49d96"
+  integrity sha512-P1bffQfhD3O4LW0ioENXUhZ9OIa0Zn+P7M+pWgkCKaT53wVLSq0mrKksCID/FGHpFhRSxRGhgrQmfhRuzwtKdg==
+
+"@types/cookies@*":
+  version "0.7.6"
+  resolved "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.6.tgz#71212c5391a976d3bae57d4b09fac20fc6bda504"
+  integrity sha512-FK4U5Qyn7/Sc5ih233OuHO0qAkOpEcD/eG6584yEiLKizTFRny86qHLe/rej3HFQrkBuUjF4whFliAdODbVN/w==
+  dependencies:
+    "@types/connect" "*"
+    "@types/express" "*"
+    "@types/keygrip" "*"
+    "@types/node" "*"
+
+"@types/express-serve-static-core@^4.17.18":
+  version "4.17.21"
+  resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.21.tgz#a427278e106bca77b83ad85221eae709a3414d42"
+  integrity sha512-gwCiEZqW6f7EoR8TTEfalyEhb1zA5jQJnRngr97+3pzMaO1RKoI1w2bw07TK72renMUVWcWS5mLI6rk1NqN0nA==
+  dependencies:
+    "@types/node" "*"
+    "@types/qs" "*"
+    "@types/range-parser" "*"
+
+"@types/express@*":
+  version "4.17.12"
+  resolved "https://registry.npmjs.org/@types/express/-/express-4.17.12.tgz#4bc1bf3cd0cfe6d3f6f2853648b40db7d54de350"
+  integrity sha512-pTYas6FrP15B1Oa0bkN5tQMNqOcVXa9j4FTFtO8DWI9kppKib+6NJtfTOOLcwxuuYvcX2+dVG6et1SxW/Kc17Q==
+  dependencies:
+    "@types/body-parser" "*"
+    "@types/express-serve-static-core" "^4.17.18"
+    "@types/qs" "*"
+    "@types/serve-static" "*"
+
+"@types/formidable@^1.0.31":
+  version "1.2.2"
+  resolved "https://registry.npmjs.org/@types/formidable/-/formidable-1.2.2.tgz#e690d60732ee9d3f0a441bc572c17409785b283c"
+  integrity sha512-8RDAMnMHOh7QrY1xuQ7s6/Xre9pMvJ2zT2VgATiz5cIE71Q/6N3+P8sr3z/dNWNmvX5/aX9x8uJlG0MZiMZXoA==
+  dependencies:
+    "@types/node" "*"
+
+"@types/http-assert@*":
+  version "1.5.1"
+  resolved "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.1.tgz#d775e93630c2469c2f980fc27e3143240335db3b"
+  integrity sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ==
+
+"@types/http-errors@*":
+  version "1.8.0"
+  resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.0.tgz#682477dbbbd07cd032731cb3b0e7eaee3d026b69"
+  integrity sha512-2aoSC4UUbHDj2uCsCxcG/vRMXey/m17bC7UwitVm5hn22nI8O8Y9iDpA76Orc+DWkQ4zZrOKEshCqR/jSuXAHA==
+
+"@types/json5@^0.0.29":
+  version "0.0.29"
+  resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
+  integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4=
+
+"@types/keygrip@*":
+  version "1.0.2"
+  resolved "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72"
+  integrity sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==
+
+"@types/koa-bodyparser@^5.0.2":
+  version "5.0.2"
+  resolved "https://registry.npmmirror.com/@types/koa-bodyparser/-/koa-bodyparser-5.0.2.tgz#bb9236a8f82576c2f9be7bed7914bcf95632fa18"
+  integrity sha512-prJC/gtxnurTTOpYkSwMwzbkiZ6BCW7arIvjmNVbEziauhcndQeCewzsSphmtlI6wnwFnGGAAOznQR1OYrhhgw==
+  dependencies:
+    "@types/koa" "*"
+
+"@types/koa-compose@*":
+  version "3.2.5"
+  resolved "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz#85eb2e80ac50be95f37ccf8c407c09bbe3468e9d"
+  integrity sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==
+  dependencies:
+    "@types/koa" "*"
+
+"@types/koa-router@^7.4.4":
+  version "7.4.4"
+  resolved "https://registry.npmmirror.com/@types/koa-router/-/koa-router-7.4.4.tgz#db72bde3616365d74f00178d5f243c4fce7da572"
+  integrity sha512-3dHlZ6CkhgcWeF6wafEUvyyqjWYfKmev3vy1PtOmr0mBc3wpXPU5E8fBBd4YQo5bRpHPfmwC5yDaX7s4jhIN6A==
+  dependencies:
+    "@types/koa" "*"
+
+"@types/koa@*":
+  version "2.13.3"
+  resolved "https://registry.npmjs.org/@types/koa/-/koa-2.13.3.tgz#5b44c0956d7f7bf41f74ccfb530fec60fbed45ca"
+  integrity sha512-TaujBV+Dhe/FvmSMZJtCFBms+bqQacgUebk/M2C2tq8iGmHE/DDf4DcW2Hc7NqusVZmy5xzrWOjtdPKNP+fTfw==
+  dependencies:
+    "@types/accepts" "*"
+    "@types/content-disposition" "*"
+    "@types/cookies" "*"
+    "@types/http-assert" "*"
+    "@types/http-errors" "*"
+    "@types/keygrip" "*"
+    "@types/koa-compose" "*"
+    "@types/node" "*"
+
+"@types/koa@^2.13.4":
+  version "2.13.5"
+  resolved "https://registry.npmmirror.com/@types/koa/-/koa-2.13.5.tgz#64b3ca4d54e08c0062e89ec666c9f45443b21a61"
+  integrity sha512-HSUOdzKz3by4fnqagwthW/1w/yJspTgppyyalPVbgZf8jQWvdIXcVW5h2DGtw4zYntOaeRGx49r1hxoPWrD4aA==
+  dependencies:
+    "@types/accepts" "*"
+    "@types/content-disposition" "*"
+    "@types/cookies" "*"
+    "@types/http-assert" "*"
+    "@types/http-errors" "*"
+    "@types/keygrip" "*"
+    "@types/koa-compose" "*"
+    "@types/node" "*"
+
+"@types/mime@^1":
+  version "1.3.2"
+  resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a"
+  integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==
+
+"@types/node@*":
+  version "15.12.1"
+  resolved "https://registry.npmjs.org/@types/node/-/node-15.12.1.tgz#9b60797dee1895383a725f828a869c86c6caa5c2"
+  integrity sha512-zyxJM8I1c9q5sRMtVF+zdd13Jt6RU4r4qfhTd7lQubyThvLfx6yYekWSQjGCGV2Tkecgxnlpl/DNlb6Hg+dmEw==
+
+"@types/node@^17.0.21":
+  version "17.0.45"
+  resolved "https://registry.npmmirror.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190"
+  integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==
+
+"@types/parse-json@^4.0.0":
+  version "4.0.0"
+  resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
+  integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
+
+"@types/qs@*":
+  version "6.9.6"
+  resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz#df9c3c8b31a247ec315e6996566be3171df4b3b1"
+  integrity sha512-0/HnwIfW4ki2D8L8c9GVcG5I72s9jP5GSLVF0VIXDW00kmIpA6O33G7a8n59Tmh7Nz0WUC3rSb7PTY/sdW2JzA==
+
+"@types/range-parser@*":
+  version "1.2.3"
+  resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c"
+  integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==
+
+"@types/serve-static@*":
+  version "1.13.9"
+  resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz#aacf28a85a05ee29a11fb7c3ead935ac56f33e4e"
+  integrity sha512-ZFqF6qa48XsPdjXV5Gsz0Zqmux2PerNd3a/ktL45mHpa19cuMi/cL8tcxdAx497yRh+QtYPuofjT9oWw9P7nkA==
+  dependencies:
+    "@types/mime" "^1"
+    "@types/node" "*"
+
+abbrev@1:
+  version "1.1.1"
+  resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+  integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
+
+accepts@^1.3.5:
+  version "1.3.7"
+  resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
+  integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
+  dependencies:
+    mime-types "~2.1.24"
+    negotiator "0.6.2"
+
+acorn-walk@^8.1.1, acorn-walk@^8.2.0:
+  version "8.2.0"
+  resolved "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
+  integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
+
+acorn@^8.4.1, acorn@^8.7.0:
+  version "8.8.0"
+  resolved "https://registry.npmmirror.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8"
+  integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==
+
+agent-base@6, agent-base@^6.0.0:
+  version "6.0.2"
+  resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
+  integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
+  dependencies:
+    debug "4"
+
+amp-message@~0.1.1:
+  version "0.1.2"
+  resolved "https://registry.npmjs.org/amp-message/-/amp-message-0.1.2.tgz#a78f1c98995087ad36192a41298e4db49e3dfc45"
+  integrity sha1-p48cmJlQh602GSpBKY5NtJ49/EU=
+  dependencies:
+    amp "0.3.1"
+
+amp@0.3.1, amp@~0.3.1:
+  version "0.3.1"
+  resolved "https://registry.npmjs.org/amp/-/amp-0.3.1.tgz#6adf8d58a74f361e82c1fa8d389c079e139fc47d"
+  integrity sha1-at+NWKdPNh6CwfqNOJwHnhOfxH0=
+
+ansi-colors@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
+  integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
+
+ansi-styles@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+  integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+  dependencies:
+    color-convert "^1.9.0"
+
+ansi-styles@^4.1.0:
+  version "4.3.0"
+  resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+  integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+  dependencies:
+    color-convert "^2.0.1"
+
+any-promise@^1.0.0:
+  version "1.3.0"
+  resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
+  integrity sha1-q8av7tzqUugJzcA3au0845Y10X8=
+
+anymatch@~3.1.1, anymatch@~3.1.2:
+  version "3.1.2"
+  resolved "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
+  integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
+  dependencies:
+    normalize-path "^3.0.0"
+    picomatch "^2.0.4"
+
+arg@^4.1.0:
+  version "4.1.3"
+  resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
+  integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
+
+argparse@^1.0.7:
+  version "1.0.10"
+  resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+  integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+  dependencies:
+    sprintf-js "~1.0.2"
+
+array-union@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
+  integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+
+ast-types@^0.13.2:
+  version "0.13.4"
+  resolved "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782"
+  integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==
+  dependencies:
+    tslib "^2.0.1"
+
+async-listener@^0.6.0:
+  version "0.6.10"
+  resolved "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz#a7c97abe570ba602d782273c0de60a51e3e17cbc"
+  integrity sha512-gpuo6xOyF4D5DE5WvyqZdPA3NGhiT6Qf07l7DCB0wwDEsLvDIbCr6j9S5aj5Ch96dLace5tXVzWBZkxU/c5ohw==
+  dependencies:
+    semver "^5.3.0"
+    shimmer "^1.1.0"
+
+async@^2.6.3, async@~2.6.1:
+  version "2.6.3"
+  resolved "https://registry.npmjs.org/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
+  integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==
+  dependencies:
+    lodash "^4.17.14"
+
+async@^3.2.0:
+  version "3.2.4"
+  resolved "https://registry.npmmirror.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c"
+  integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==
+
+async@~3.2.0:
+  version "3.2.0"
+  resolved "https://registry.npmjs.org/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720"
+  integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==
+
+axios@^0.21.0:
+  version "0.21.1"
+  resolved "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8"
+  integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==
+  dependencies:
+    follow-redirects "^1.10.0"
+
+balanced-match@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+  integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+binary-extensions@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
+  integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+
+blessed@0.1.81:
+  version "0.1.81"
+  resolved "https://registry.npmjs.org/blessed/-/blessed-0.1.81.tgz#f962d687ec2c369570ae71af843256e6d0ca1129"
+  integrity sha1-+WLWh+wsNpVwrnGvhDJW5tDKESk=
+
+bodec@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.npmjs.org/bodec/-/bodec-0.1.0.tgz#bc851555430f23c9f7650a75ef64c6a94c3418cc"
+  integrity sha1-vIUVVUMPI8n3ZQp172TGqUw0GMw=
+
+brace-expansion@^1.1.7:
+  version "1.1.11"
+  resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+  integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+  dependencies:
+    balanced-match "^1.0.0"
+    concat-map "0.0.1"
+
+braces@^3.0.1, braces@~3.0.2:
+  version "3.0.2"
+  resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+  integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+  dependencies:
+    fill-range "^7.0.1"
+
+buffer-from@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+  integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
+
+bundle-require@^3.0.2:
+  version "3.0.4"
+  resolved "https://registry.npmmirror.com/bundle-require/-/bundle-require-3.0.4.tgz#2b52ba77d99c0a586b5854cd21d36954e63cc110"
+  integrity sha512-VXG6epB1yrLAvWVQpl92qF347/UXmncQj7J3U8kZEbdVZ1ZkQyr4hYeL/9RvcE8vVVdp53dY78Fd/3pqfRqI1A==
+  dependencies:
+    load-tsconfig "^0.2.0"
+
+bytes@3.1.0:
+  version "3.1.0"
+  resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
+  integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
+
+cac@^6.7.12:
+  version "6.7.12"
+  resolved "https://registry.npmmirror.com/cac/-/cac-6.7.12.tgz#6fb5ea2ff50bd01490dbda497f4ae75a99415193"
+  integrity sha512-rM7E2ygtMkJqD9c7WnFU6fruFcN3xe4FM5yUmgxhZzIKJk4uHl9U/fhwdajGFQbQuv43FAUo1Fe8gX/oIKDeSA==
+
+cache-content-type@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz#035cde2b08ee2129f4a8315ea8f00a00dba1453c"
+  integrity sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==
+  dependencies:
+    mime-types "^2.1.18"
+    ylru "^1.2.0"
+
+call-bind@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
+  integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
+  dependencies:
+    function-bind "^1.1.1"
+    get-intrinsic "^1.0.2"
+
+callsites@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+  integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+chalk@3.0.0, chalk@~3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
+  integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
+  dependencies:
+    ansi-styles "^4.1.0"
+    supports-color "^7.1.0"
+
+chalk@^2.0.0:
+  version "2.4.2"
+  resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+  integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+  dependencies:
+    ansi-styles "^3.2.1"
+    escape-string-regexp "^1.0.5"
+    supports-color "^5.3.0"
+
+charm@~0.1.1:
+  version "0.1.2"
+  resolved "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz#06c21eed1a1b06aeb67553cdc53e23274bac2296"
+  integrity sha1-BsIe7RobBq62dVPNxT4jJ0usIpY=
+
+chokidar@^3.5.1:
+  version "3.5.1"
+  resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a"
+  integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==
+  dependencies:
+    anymatch "~3.1.1"
+    braces "~3.0.2"
+    glob-parent "~5.1.0"
+    is-binary-path "~2.1.0"
+    is-glob "~4.0.1"
+    normalize-path "~3.0.0"
+    readdirp "~3.5.0"
+  optionalDependencies:
+    fsevents "~2.3.1"
+
+chokidar@^3.5.2:
+  version "3.5.3"
+  resolved "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
+  integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
+  dependencies:
+    anymatch "~3.1.2"
+    braces "~3.0.2"
+    glob-parent "~5.1.2"
+    is-binary-path "~2.1.0"
+    is-glob "~4.0.1"
+    normalize-path "~3.0.0"
+    readdirp "~3.6.0"
+  optionalDependencies:
+    fsevents "~2.3.2"
+
+cli-tableau@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.npmjs.org/cli-tableau/-/cli-tableau-2.0.1.tgz#baa78d83e08a2d7ab79b7dad9406f0254977053f"
+  integrity sha512-he+WTicka9cl0Fg/y+YyxcN6/bfQ/1O3QmgxRXDhABKqLzvoOSM4fMzp39uMyLBulAFuywD2N7UaoQE7WaADxQ==
+  dependencies:
+    chalk "3.0.0"
+
+co-body@^5.1.1:
+  version "5.2.0"
+  resolved "https://registry.npmjs.org/co-body/-/co-body-5.2.0.tgz#5a0a658c46029131e0e3a306f67647302f71c124"
+  integrity sha512-sX/LQ7LqUhgyaxzbe7IqwPeTr2yfpfUIQ/dgpKo6ZI4y4lpQA0YxAomWIY+7I7rHWcG02PG+OuPREzMW/5tszQ==
+  dependencies:
+    inflation "^2.0.0"
+    qs "^6.4.0"
+    raw-body "^2.2.0"
+    type-is "^1.6.14"
+
+co-body@^6.0.0:
+  version "6.1.0"
+  resolved "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz#d87a8efc3564f9bfe3aced8ef5cd04c7a8766547"
+  integrity sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==
+  dependencies:
+    inflation "^2.0.0"
+    qs "^6.5.2"
+    raw-body "^2.3.3"
+    type-is "^1.6.16"
+
+co@^4.4.0, co@^4.6.0:
+  version "4.6.0"
+  resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+  integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=
+
+color-convert@^1.9.0:
+  version "1.9.3"
+  resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+  integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+  dependencies:
+    color-name "1.1.3"
+
+color-convert@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+  integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+  dependencies:
+    color-name "~1.1.4"
+
+color-name@1.1.3:
+  version "1.1.3"
+  resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+  integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+
+color-name@~1.1.4:
+  version "1.1.4"
+  resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+  integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+commander@2.15.1:
+  version "2.15.1"
+  resolved "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
+  integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==
+
+commander@^4.0.0:
+  version "4.1.1"
+  resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
+  integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
+
+concat-map@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+  integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+
+content-disposition@~0.5.2:
+  version "0.5.3"
+  resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
+  integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
+  dependencies:
+    safe-buffer "5.1.2"
+
+content-type@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+  integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
+
+continuation-local-storage@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz#11f613f74e914fe9b34c92ad2d28fe6ae1db7ffb"
+  integrity sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==
+  dependencies:
+    async-listener "^0.6.0"
+    emitter-listener "^1.1.1"
+
+cookies@~0.8.0:
+  version "0.8.0"
+  resolved "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz#1293ce4b391740a8406e3c9870e828c4b54f3f90"
+  integrity sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==
+  dependencies:
+    depd "~2.0.0"
+    keygrip "~1.1.0"
+
+copy-to@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz#2680fbb8068a48d08656b6098092bdafc906f4a5"
+  integrity sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU=
+
+core-util-is@~1.0.0:
+  version "1.0.2"
+  resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+  integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+
+cosmiconfig@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3"
+  integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==
+  dependencies:
+    "@types/parse-json" "^4.0.0"
+    import-fresh "^3.2.1"
+    parse-json "^5.0.0"
+    path-type "^4.0.0"
+    yaml "^1.10.0"
+
+create-require@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
+  integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
+
+croner@~4.1.92:
+  version "4.1.97"
+  resolved "https://registry.npmmirror.com/croner/-/croner-4.1.97.tgz#6e373dc7bb3026fab2deb0d82685feef20796766"
+  integrity sha512-/f6gpQuxDaqXu+1kwQYSckUglPaOrHdbIlBAu0YuW8/Cdb45XwXYNUBXg3r/9Mo6n540Kn/smKcZWko5x99KrQ==
+
+cross-spawn@^7.0.3:
+  version "7.0.3"
+  resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+  integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+  dependencies:
+    path-key "^3.1.0"
+    shebang-command "^2.0.0"
+    which "^2.0.1"
+
+culvert@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.npmjs.org/culvert/-/culvert-0.1.2.tgz#9502f5f0154a2d5a22a023e79f71cc936fa6ef6f"
+  integrity sha1-lQL18BVKLVoioCPnn3HMk2+m728=
+
+data-uri-to-buffer@3:
+  version "3.0.1"
+  resolved "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636"
+  integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==
+
+dayjs@~1.8.24, dayjs@~1.8.25:
+  version "1.8.36"
+  resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.8.36.tgz#be36e248467afabf8f5a86bae0de0cdceecced50"
+  integrity sha512-3VmRXEtw7RZKAf+4Tv1Ym9AGeo8r8+CjDi26x+7SYQil1UqtqdaokhzoEJohqlzt0m5kacJSDhJQkG/LWhpRBw==
+
+debug@*, debug@4, debug@^4.0.1, debug@^4.1.1, debug@^4.3.1, debug@~4.3.1:
+  version "4.3.1"
+  resolved "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
+  integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
+  dependencies:
+    ms "2.1.2"
+
+debug@^3.1.0, debug@^3.2.6, debug@^3.2.7:
+  version "3.2.7"
+  resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
+  integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+  dependencies:
+    ms "^2.1.1"
+
+debug@^4.3.2:
+  version "4.3.4"
+  resolved "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
+  integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+  dependencies:
+    ms "2.1.2"
+
+deep-equal@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
+  integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=
+
+deep-is@~0.1.3:
+  version "0.1.3"
+  resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+  integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
+
+degenerator@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.npmmirror.com/degenerator/-/degenerator-3.0.2.tgz#6a61fcc42a702d6e50ff6023fe17bff435f68235"
+  integrity sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==
+  dependencies:
+    ast-types "^0.13.2"
+    escodegen "^1.8.1"
+    esprima "^4.0.0"
+    vm2 "^3.9.8"
+
+delegates@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+  integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
+
+depd@^2.0.0, depd@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
+  integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
+
+depd@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+  integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
+
+destroy@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+  integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
+
+diff@^4.0.1:
+  version "4.0.2"
+  resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
+  integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
+
+dir-glob@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
+  integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
+  dependencies:
+    path-type "^4.0.0"
+
+ee-first@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+  integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
+
+emitter-listener@^1.1.1:
+  version "1.1.2"
+  resolved "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz#56b140e8f6992375b3d7cb2cab1cc7432d9632e8"
+  integrity sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==
+  dependencies:
+    shimmer "^1.2.0"
+
+encodeurl@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+  integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
+
+enquirer@2.3.6:
+  version "2.3.6"
+  resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d"
+  integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==
+  dependencies:
+    ansi-colors "^4.1.1"
+
+error-ex@^1.3.1:
+  version "1.3.2"
+  resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+  integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+  dependencies:
+    is-arrayish "^0.2.1"
+
+esbuild-android-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be"
+  integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==
+
+esbuild-android-arm64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771"
+  integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==
+
+esbuild-darwin-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25"
+  integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==
+
+esbuild-darwin-arm64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73"
+  integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==
+
+esbuild-freebsd-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d"
+  integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==
+
+esbuild-freebsd-arm64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48"
+  integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==
+
+esbuild-linux-32@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5"
+  integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==
+
+esbuild-linux-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652"
+  integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==
+
+esbuild-linux-arm64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b"
+  integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==
+
+esbuild-linux-arm@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59"
+  integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==
+
+esbuild-linux-mips64le@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34"
+  integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==
+
+esbuild-linux-ppc64le@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e"
+  integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==
+
+esbuild-linux-riscv64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8"
+  integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==
+
+esbuild-linux-s390x@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6"
+  integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==
+
+esbuild-netbsd-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81"
+  integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==
+
+esbuild-openbsd-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b"
+  integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==
+
+esbuild-sunos-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da"
+  integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==
+
+esbuild-windows-32@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31"
+  integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==
+
+esbuild-windows-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4"
+  integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==
+
+esbuild-windows-arm64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982"
+  integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==
+
+esbuild@^0.14.25:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2"
+  integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==
+  optionalDependencies:
+    "@esbuild/linux-loong64" "0.14.54"
+    esbuild-android-64 "0.14.54"
+    esbuild-android-arm64 "0.14.54"
+    esbuild-darwin-64 "0.14.54"
+    esbuild-darwin-arm64 "0.14.54"
+    esbuild-freebsd-64 "0.14.54"
+    esbuild-freebsd-arm64 "0.14.54"
+    esbuild-linux-32 "0.14.54"
+    esbuild-linux-64 "0.14.54"
+    esbuild-linux-arm "0.14.54"
+    esbuild-linux-arm64 "0.14.54"
+    esbuild-linux-mips64le "0.14.54"
+    esbuild-linux-ppc64le "0.14.54"
+    esbuild-linux-riscv64 "0.14.54"
+    esbuild-linux-s390x "0.14.54"
+    esbuild-netbsd-64 "0.14.54"
+    esbuild-openbsd-64 "0.14.54"
+    esbuild-sunos-64 "0.14.54"
+    esbuild-windows-32 "0.14.54"
+    esbuild-windows-64 "0.14.54"
+    esbuild-windows-arm64 "0.14.54"
+
+escape-html@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+  integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
+
+escape-string-regexp@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+  integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+escape-string-regexp@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+  integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+escodegen@^1.8.1:
+  version "1.14.3"
+  resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503"
+  integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==
+  dependencies:
+    esprima "^4.0.1"
+    estraverse "^4.2.0"
+    esutils "^2.0.2"
+    optionator "^0.8.1"
+  optionalDependencies:
+    source-map "~0.6.1"
+
+esprima@^4.0.0, esprima@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+  integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+estraverse@^4.2.0:
+  version "4.3.0"
+  resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
+  integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
+
+esutils@^2.0.2:
+  version "2.0.3"
+  resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+  integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+eventemitter2@5.0.1, eventemitter2@~5.0.1:
+  version "5.0.1"
+  resolved "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz#6197a095d5fb6b57e8942f6fd7eaad63a09c9452"
+  integrity sha1-YZegldX7a1folC9v1+qtY6CclFI=
+
+eventemitter2@^6.3.1:
+  version "6.4.4"
+  resolved "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.4.tgz#aa96e8275c4dbeb017a5d0e03780c65612a1202b"
+  integrity sha512-HLU3NDY6wARrLCEwyGKRBvuWYyvW6mHYv72SJJAH3iJN3a6eVUvkjFkcxah1bcTgGVBBrFdIopBJPhCQFMLyXw==
+
+eventemitter2@~0.4.14:
+  version "0.4.14"
+  resolved "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz#8f61b75cde012b2e9eb284d4545583b5643b61ab"
+  integrity sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=
+
+execa@^5.0.0:
+  version "5.1.1"
+  resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
+  integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
+  dependencies:
+    cross-spawn "^7.0.3"
+    get-stream "^6.0.0"
+    human-signals "^2.1.0"
+    is-stream "^2.0.0"
+    merge-stream "^2.0.0"
+    npm-run-path "^4.0.1"
+    onetime "^5.1.2"
+    signal-exit "^3.0.3"
+    strip-final-newline "^2.0.0"
+
+fast-glob@^3.1.1:
+  version "3.2.5"
+  resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661"
+  integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==
+  dependencies:
+    "@nodelib/fs.stat" "^2.0.2"
+    "@nodelib/fs.walk" "^1.2.3"
+    glob-parent "^5.1.0"
+    merge2 "^1.3.0"
+    micromatch "^4.0.2"
+    picomatch "^2.2.1"
+
+fast-json-patch@^3.0.0-1:
+  version "3.1.1"
+  resolved "https://registry.npmmirror.com/fast-json-patch/-/fast-json-patch-3.1.1.tgz#85064ea1b1ebf97a3f7ad01e23f9337e72c66947"
+  integrity sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ==
+
+fast-levenshtein@~2.0.6:
+  version "2.0.6"
+  resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+  integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
+
+fastq@^1.6.0:
+  version "1.11.0"
+  resolved "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz#bb9fb955a07130a918eb63c1f5161cc32a5d0858"
+  integrity sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==
+  dependencies:
+    reusify "^1.0.4"
+
+fclone@1.0.11, fclone@~1.0.11:
+  version "1.0.11"
+  resolved "https://registry.npmjs.org/fclone/-/fclone-1.0.11.tgz#10e85da38bfea7fc599341c296ee1d77266ee640"
+  integrity sha1-EOhdo4v+p/xZk0HClu4ddyZu5kA=
+
+file-uri-to-path@2:
+  version "2.0.0"
+  resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz#7b415aeba227d575851e0a5b0c640d7656403fba"
+  integrity sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==
+
+fill-range@^7.0.1:
+  version "7.0.1"
+  resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+  integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+  dependencies:
+    to-regex-range "^5.0.1"
+
+follow-redirects@^1.10.0:
+  version "1.14.1"
+  resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43"
+  integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==
+
+formidable@^1.1.1:
+  version "1.2.2"
+  resolved "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz#bf69aea2972982675f00865342b982986f6b8dd9"
+  integrity sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==
+
+fresh@~0.5.2:
+  version "0.5.2"
+  resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+  integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
+
+fs-extra@^10.0.1:
+  version "10.1.0"
+  resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf"
+  integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==
+  dependencies:
+    graceful-fs "^4.2.0"
+    jsonfile "^6.0.1"
+    universalify "^2.0.0"
+
+fs-extra@^8.1.0:
+  version "8.1.0"
+  resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
+  integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
+  dependencies:
+    graceful-fs "^4.2.0"
+    jsonfile "^4.0.0"
+    universalify "^0.1.0"
+
+fs.realpath@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+  integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+fsevents@~2.3.1, fsevents@~2.3.2:
+  version "2.3.2"
+  resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+  integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
+ftp@^0.3.10:
+  version "0.3.10"
+  resolved "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d"
+  integrity sha1-kZfYYa2BQvPmPVqDv+TFn3MwiF0=
+  dependencies:
+    readable-stream "1.1.x"
+    xregexp "2.0.0"
+
+function-bind@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+  integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+get-intrinsic@^1.0.2:
+  version "1.1.1"
+  resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
+  integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==
+  dependencies:
+    function-bind "^1.1.1"
+    has "^1.0.3"
+    has-symbols "^1.0.1"
+
+get-stream@^6.0.0:
+  version "6.0.1"
+  resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
+  integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
+
+get-uri@3:
+  version "3.0.2"
+  resolved "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz#f0ef1356faabc70e1f9404fa3b66b2ba9bfc725c"
+  integrity sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==
+  dependencies:
+    "@tootallnate/once" "1"
+    data-uri-to-buffer "3"
+    debug "4"
+    file-uri-to-path "2"
+    fs-extra "^8.1.0"
+    ftp "^0.3.10"
+
+git-node-fs@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmjs.org/git-node-fs/-/git-node-fs-1.0.0.tgz#49b215e242ebe43aa4c7561bbba499521752080f"
+  integrity sha1-SbIV4kLr5Dqkx1Ybu6SZUhdSCA8=
+
+git-sha1@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.npmjs.org/git-sha1/-/git-sha1-0.1.2.tgz#599ac192b71875825e13a445f3a6e05118c2f745"
+  integrity sha1-WZrBkrcYdYJeE6RF86bgURjC90U=
+
+glob-parent@^5.1.0, glob-parent@~5.1.0, glob-parent@~5.1.2:
+  version "5.1.2"
+  resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+  integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+  dependencies:
+    is-glob "^4.0.1"
+
+glob@7.1.6:
+  version "7.1.6"
+  resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
+  integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.0.4"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+glob@^7.0.5, glob@^7.1.3:
+  version "7.1.7"
+  resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
+  integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.0.4"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+globby@^11.0.3:
+  version "11.0.3"
+  resolved "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb"
+  integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==
+  dependencies:
+    array-union "^2.1.0"
+    dir-glob "^3.0.1"
+    fast-glob "^3.1.1"
+    ignore "^5.1.4"
+    merge2 "^1.3.0"
+    slash "^3.0.0"
+
+graceful-fs@^4.1.6, graceful-fs@^4.2.0:
+  version "4.2.6"
+  resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee"
+  integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
+
+has-flag@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+  integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+has-flag@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+  integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-symbols@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423"
+  integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==
+
+has@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+  integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+  dependencies:
+    function-bind "^1.1.1"
+
+http-assert@^1.3.0:
+  version "1.4.1"
+  resolved "https://registry.npmjs.org/http-assert/-/http-assert-1.4.1.tgz#c5f725d677aa7e873ef736199b89686cceb37878"
+  integrity sha512-rdw7q6GTlibqVVbXr0CKelfV5iY8G2HqEUkhSk297BMbSpSL8crXC+9rjKoMcZZEsksX30le6f/4ul4E28gegw==
+  dependencies:
+    deep-equal "~1.0.1"
+    http-errors "~1.7.2"
+
+http-errors@1.7.3, http-errors@~1.7.2:
+  version "1.7.3"
+  resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
+  integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
+  dependencies:
+    depd "~1.1.2"
+    inherits "2.0.4"
+    setprototypeof "1.1.1"
+    statuses ">= 1.5.0 < 2"
+    toidentifier "1.0.0"
+
+http-errors@^1.6.3, http-errors@^1.7.3:
+  version "1.8.0"
+  resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz#75d1bbe497e1044f51e4ee9e704a62f28d336507"
+  integrity sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==
+  dependencies:
+    depd "~1.1.2"
+    inherits "2.0.4"
+    setprototypeof "1.2.0"
+    statuses ">= 1.5.0 < 2"
+    toidentifier "1.0.0"
+
+http-errors@~1.6.2:
+  version "1.6.3"
+  resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
+  integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=
+  dependencies:
+    depd "~1.1.2"
+    inherits "2.0.3"
+    setprototypeof "1.1.0"
+    statuses ">= 1.4.0 < 2"
+
+http-proxy-agent@^4.0.0, http-proxy-agent@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a"
+  integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==
+  dependencies:
+    "@tootallnate/once" "1"
+    agent-base "6"
+    debug "4"
+
+https-proxy-agent@5, https-proxy-agent@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
+  integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==
+  dependencies:
+    agent-base "6"
+    debug "4"
+
+human-signals@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
+  integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
+
+iconv-lite@0.4.24, iconv-lite@^0.4.4:
+  version "0.4.24"
+  resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+  integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+  dependencies:
+    safer-buffer ">= 2.1.2 < 3"
+
+ignore-by-default@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09"
+  integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk=
+
+ignore@^5.1.4:
+  version "5.1.8"
+  resolved "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
+  integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
+
+import-cwd@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz#20845547718015126ea9b3676b7592fb8bd4cf92"
+  integrity sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==
+  dependencies:
+    import-from "^3.0.0"
+
+import-fresh@^3.2.1:
+  version "3.3.0"
+  resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
+  integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
+  dependencies:
+    parent-module "^1.0.0"
+    resolve-from "^4.0.0"
+
+import-from@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966"
+  integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==
+  dependencies:
+    resolve-from "^5.0.0"
+
+inflation@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz#8b417e47c28f925a45133d914ca1fd389107f30f"
+  integrity sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8=
+
+inflight@^1.0.4:
+  version "1.0.6"
+  resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+  integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+  dependencies:
+    once "^1.3.0"
+    wrappy "1"
+
+inherits@2, inherits@2.0.4, inherits@~2.0.1:
+  version "2.0.4"
+  resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+  integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+inherits@2.0.3:
+  version "2.0.3"
+  resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+  integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
+
+ini@^1.3.5:
+  version "1.3.8"
+  resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
+  integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
+
+ip@^1.1.5:
+  version "1.1.5"
+  resolved "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
+  integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=
+
+is-arrayish@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+  integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
+
+is-binary-path@~2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+  integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+  dependencies:
+    binary-extensions "^2.0.0"
+
+is-core-module@^2.2.0:
+  version "2.4.0"
+  resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1"
+  integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==
+  dependencies:
+    has "^1.0.3"
+
+is-extglob@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+  integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
+
+is-generator-function@^1.0.7:
+  version "1.0.9"
+  resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.9.tgz#e5f82c2323673e7fcad3d12858c83c4039f6399c"
+  integrity sha512-ZJ34p1uvIfptHCN7sFTjGibB9/oBg17sHqzDLfuwhvmN/qLVvIQXRQ8licZQ35WJ8KuEQt/etnnzQFI9C9Ue/A==
+
+is-glob@^4.0.1, is-glob@~4.0.1:
+  version "4.0.1"
+  resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
+  integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
+  dependencies:
+    is-extglob "^2.1.1"
+
+is-number@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+  integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-stream@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3"
+  integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==
+
+isarray@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+  integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
+
+isexe@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+  integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+
+joycon@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.npmjs.org/joycon/-/joycon-3.0.1.tgz#9074c9b08ccf37a6726ff74a18485f85efcaddaf"
+  integrity sha512-SJcJNBg32dGgxhPtM0wQqxqV0ax9k/9TaUskGDSJkSFSQOEWWvQ3zzWdGQRIUry2j1zA5+ReH13t0Mf3StuVZA==
+
+js-git@^0.7.8:
+  version "0.7.8"
+  resolved "https://registry.npmjs.org/js-git/-/js-git-0.7.8.tgz#52fa655ab61877d6f1079efc6534b554f31e5444"
+  integrity sha1-UvplWrYYd9bxB578ZTS1VPMeVEQ=
+  dependencies:
+    bodec "^0.1.0"
+    culvert "^0.1.2"
+    git-sha1 "^0.1.2"
+    pako "^0.2.5"
+
+js-tokens@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+  integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+json-parse-even-better-errors@^2.3.0:
+  version "2.3.1"
+  resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
+  integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
+
+json-stringify-safe@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+  integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==
+
+json5@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
+  integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
+  dependencies:
+    minimist "^1.2.0"
+
+jsonfile@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+  integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
+  optionalDependencies:
+    graceful-fs "^4.1.6"
+
+jsonfile@^6.0.1:
+  version "6.1.0"
+  resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
+  integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
+  dependencies:
+    universalify "^2.0.0"
+  optionalDependencies:
+    graceful-fs "^4.1.6"
+
+keygrip@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226"
+  integrity sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==
+  dependencies:
+    tsscmp "1.0.6"
+
+koa-body@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.npmjs.org/koa-body/-/koa-body-4.2.0.tgz#37229208b820761aca5822d14c5fc55cee31b26f"
+  integrity sha512-wdGu7b9amk4Fnk/ytH8GuWwfs4fsB5iNkY8kZPpgQVb04QZSv85T0M8reb+cJmvLE8cjPYvBzRikD3s6qz8OoA==
+  dependencies:
+    "@types/formidable" "^1.0.31"
+    co-body "^5.1.1"
+    formidable "^1.1.1"
+
+koa-bodyparser@^4.3.0:
+  version "4.3.0"
+  resolved "https://registry.npmmirror.com/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz#274c778555ff48fa221ee7f36a9fbdbace22759a"
+  integrity sha512-uyV8G29KAGwZc4q/0WUAjH+Tsmuv9ImfBUF2oZVyZtaeo0husInagyn/JH85xMSxM0hEk/mbCII5ubLDuqW/Rw==
+  dependencies:
+    co-body "^6.0.0"
+    copy-to "^2.0.1"
+
+koa-compose@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877"
+  integrity sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==
+
+koa-convert@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/koa-convert/-/koa-convert-2.0.0.tgz#86a0c44d81d40551bae22fee6709904573eea4f5"
+  integrity sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==
+  dependencies:
+    co "^4.6.0"
+    koa-compose "^4.1.0"
+
+koa-route@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.npmjs.org/koa-route/-/koa-route-3.2.0.tgz#76298b99a6bcfa9e38cab6fe5c79a8733e758bce"
+  integrity sha1-dimLmaa8+p44yrb+XHmocz51i84=
+  dependencies:
+    debug "*"
+    methods "~1.1.0"
+    path-to-regexp "^1.2.0"
+
+koa-router@^10.1.1:
+  version "10.1.1"
+  resolved "https://registry.npmmirror.com/koa-router/-/koa-router-10.1.1.tgz#20809f82648518b84726cd445037813cd99f17ff"
+  integrity sha512-z/OzxVjf5NyuNO3t9nJpx7e1oR3FSBAauiwXtMQu4ppcnuNZzTaQ4p21P8A6r2Es8uJJM339oc4oVW+qX7SqnQ==
+  dependencies:
+    debug "^4.1.1"
+    http-errors "^1.7.3"
+    koa-compose "^4.1.0"
+    methods "^1.1.2"
+    path-to-regexp "^6.1.0"
+
+koa-send@^5.0.0:
+  version "5.0.1"
+  resolved "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz#39dceebfafb395d0d60beaffba3a70b4f543fe79"
+  integrity sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==
+  dependencies:
+    debug "^4.1.1"
+    http-errors "^1.7.3"
+    resolve-path "^1.4.0"
+
+koa-static@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz#5e92fc96b537ad5219f425319c95b64772776943"
+  integrity sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==
+  dependencies:
+    debug "^3.1.0"
+    koa-send "^5.0.0"
+
+koa-websocket@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.npmjs.org/koa-websocket/-/koa-websocket-6.0.0.tgz#7fb7698a7004c07aac663b15e84bf4bc99901352"
+  integrity sha512-pGTaB+aXILD/q+bQNh+Ejrg8zSxf6QRpiUQoh2TFQSmUZo2hrt6KGk4qlyxfHxFH40bVtyKeo4x1u0kKgJDOWA==
+  dependencies:
+    co "^4.4.0"
+    debug "^4.0.1"
+    koa-compose "^4.1.0"
+    ws "^7.0.1"
+
+koa2-cors@^2.0.6:
+  version "2.0.6"
+  resolved "https://registry.npmjs.org/koa2-cors/-/koa2-cors-2.0.6.tgz#9ad23df3a0b9bb84530b46f5944f3fb576086554"
+  integrity sha512-JRCcSM4lamM+8kvKGDKlesYk2ASrmSTczDtGUnIadqMgnHU4Ct5Gw7Bxt3w3m6d6dy3WN0PU4oMP43HbddDEWg==
+
+koa@^2.13.4:
+  version "2.13.4"
+  resolved "https://registry.npmmirror.com/koa/-/koa-2.13.4.tgz#ee5b0cb39e0b8069c38d115139c774833d32462e"
+  integrity sha512-43zkIKubNbnrULWlHdN5h1g3SEKXOEzoAlRsHOTFpnlDu8JlAOZSMJBLULusuXRequboiwJcj5vtYXKB3k7+2g==
+  dependencies:
+    accepts "^1.3.5"
+    cache-content-type "^1.0.0"
+    content-disposition "~0.5.2"
+    content-type "^1.0.4"
+    cookies "~0.8.0"
+    debug "^4.3.2"
+    delegates "^1.0.0"
+    depd "^2.0.0"
+    destroy "^1.0.4"
+    encodeurl "^1.0.2"
+    escape-html "^1.0.3"
+    fresh "~0.5.2"
+    http-assert "^1.3.0"
+    http-errors "^1.6.3"
+    is-generator-function "^1.0.7"
+    koa-compose "^4.1.0"
+    koa-convert "^2.0.0"
+    on-finished "^2.3.0"
+    only "~0.0.2"
+    parseurl "^1.3.2"
+    statuses "^1.5.0"
+    type-is "^1.6.16"
+    vary "^1.1.2"
+
+lazy@~1.0.11:
+  version "1.0.11"
+  resolved "https://registry.npmjs.org/lazy/-/lazy-1.0.11.tgz#daa068206282542c088288e975c297c1ae77b690"
+  integrity sha1-2qBoIGKCVCwIgojpdcKXwa53tpA=
+
+levn@~0.3.0:
+  version "0.3.0"
+  resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+  integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
+  dependencies:
+    prelude-ls "~1.1.2"
+    type-check "~0.3.2"
+
+lines-and-columns@^1.1.6:
+  version "1.1.6"
+  resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
+  integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
+
+load-tsconfig@^0.2.0:
+  version "0.2.3"
+  resolved "https://registry.npmmirror.com/load-tsconfig/-/load-tsconfig-0.2.3.tgz#08af3e7744943caab0c75f8af7f1703639c3ef1f"
+  integrity sha512-iyT2MXws+dc2Wi6o3grCFtGXpeMvHmJqS27sMPGtV2eUu4PeFnG+33I8BlFK1t1NWMjOpcx9bridn5yxLDX2gQ==
+
+lodash.sortby@^4.7.0:
+  version "4.7.0"
+  resolved "https://registry.npmmirror.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
+  integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==
+
+lodash@^4.17.14:
+  version "4.17.21"
+  resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+  integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+log-driver@^1.2.7:
+  version "1.2.7"
+  resolved "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8"
+  integrity sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==
+
+lru-cache@^5.1.1:
+  version "5.1.1"
+  resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+  integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+  dependencies:
+    yallist "^3.0.2"
+
+lru-cache@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+  integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+  dependencies:
+    yallist "^4.0.0"
+
+make-error@^1.1.1:
+  version "1.3.6"
+  resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
+  integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
+
+media-typer@0.3.0:
+  version "0.3.0"
+  resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+  integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
+
+merge-stream@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+  integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
+
+merge2@^1.3.0:
+  version "1.4.1"
+  resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+  integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+methods@^1.1.2, methods@~1.1.0:
+  version "1.1.2"
+  resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+  integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
+
+micromatch@^4.0.2:
+  version "4.0.4"
+  resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9"
+  integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==
+  dependencies:
+    braces "^3.0.1"
+    picomatch "^2.2.3"
+
+mime-db@1.48.0:
+  version "1.48.0"
+  resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d"
+  integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==
+
+mime-types@^2.1.18, mime-types@~2.1.24:
+  version "2.1.31"
+  resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b"
+  integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==
+  dependencies:
+    mime-db "1.48.0"
+
+mimic-fn@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
+  integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+
+minimatch@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+  integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
+  dependencies:
+    brace-expansion "^1.1.7"
+
+minimist@^1.2.0:
+  version "1.2.5"
+  resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
+  integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+
+minimist@^1.2.6:
+  version "1.2.6"
+  resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
+  integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
+
+mkdirp@1.0.4:
+  version "1.0.4"
+  resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+  integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
+module-details-from-path@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz#114c949673e2a8a35e9d35788527aa37b679da2b"
+  integrity sha1-EUyUlnPiqKNenTV4hSeqN7Z52is=
+
+ms@2.1.2:
+  version "2.1.2"
+  resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+  integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+ms@^2.1.1:
+  version "2.1.3"
+  resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+  integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+mute-stream@~0.0.4:
+  version "0.0.8"
+  resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
+  integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
+
+mz@^2.7.0:
+  version "2.7.0"
+  resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
+  integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==
+  dependencies:
+    any-promise "^1.0.0"
+    object-assign "^4.0.1"
+    thenify-all "^1.0.0"
+
+needle@2.4.0:
+  version "2.4.0"
+  resolved "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c"
+  integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==
+  dependencies:
+    debug "^3.2.6"
+    iconv-lite "^0.4.4"
+    sax "^1.2.4"
+
+negotiator@0.6.2:
+  version "0.6.2"
+  resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
+  integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
+
+netmask@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/netmask/-/netmask-2.0.2.tgz#8b01a07644065d536383835823bc52004ebac5e7"
+  integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==
+
+node-modules-regexp@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40"
+  integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=
+
+nodemon@^2.0.15:
+  version "2.0.19"
+  resolved "https://registry.npmmirror.com/nodemon/-/nodemon-2.0.19.tgz#cac175f74b9cb8b57e770d47841995eebe4488bd"
+  integrity sha512-4pv1f2bMDj0Eeg/MhGqxrtveeQ5/G/UVe9iO6uTZzjnRluSA4PVWf8CW99LUPwGB3eNIA7zUFoP77YuI7hOc0A==
+  dependencies:
+    chokidar "^3.5.2"
+    debug "^3.2.7"
+    ignore-by-default "^1.0.1"
+    minimatch "^3.0.4"
+    pstree.remy "^1.1.8"
+    semver "^5.7.1"
+    simple-update-notifier "^1.0.7"
+    supports-color "^5.5.0"
+    touch "^3.1.0"
+    undefsafe "^2.0.5"
+
+nopt@~1.0.10:
+  version "1.0.10"
+  resolved "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee"
+  integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=
+  dependencies:
+    abbrev "1"
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+  integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+npm-run-path@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
+  integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
+  dependencies:
+    path-key "^3.0.0"
+
+nssocket@0.6.0:
+  version "0.6.0"
+  resolved "https://registry.npmjs.org/nssocket/-/nssocket-0.6.0.tgz#59f96f6ff321566f33c70f7dbeeecdfdc07154fa"
+  integrity sha1-Wflvb/MhVm8zxw99vu7N/cBxVPo=
+  dependencies:
+    eventemitter2 "~0.4.14"
+    lazy "~1.0.11"
+
+object-assign@^4.0.1:
+  version "4.1.1"
+  resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+  integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+
+object-inspect@^1.9.0:
+  version "1.10.3"
+  resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369"
+  integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==
+
+on-finished@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+  integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
+  dependencies:
+    ee-first "1.1.1"
+
+once@^1.3.0:
+  version "1.4.0"
+  resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+  integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+  dependencies:
+    wrappy "1"
+
+onetime@^5.1.2:
+  version "5.1.2"
+  resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
+  integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
+  dependencies:
+    mimic-fn "^2.1.0"
+
+only@~0.0.2:
+  version "0.0.2"
+  resolved "https://registry.npmjs.org/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4"
+  integrity sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=
+
+optionator@^0.8.1:
+  version "0.8.3"
+  resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
+  integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
+  dependencies:
+    deep-is "~0.1.3"
+    fast-levenshtein "~2.0.6"
+    levn "~0.3.0"
+    prelude-ls "~1.1.2"
+    type-check "~0.3.2"
+    word-wrap "~1.2.3"
+
+pac-proxy-agent@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz#b718f76475a6a5415c2efbe256c1c971c84f635e"
+  integrity sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==
+  dependencies:
+    "@tootallnate/once" "1"
+    agent-base "6"
+    debug "4"
+    get-uri "3"
+    http-proxy-agent "^4.0.1"
+    https-proxy-agent "5"
+    pac-resolver "^5.0.0"
+    raw-body "^2.2.0"
+    socks-proxy-agent "5"
+
+pac-resolver@^5.0.0:
+  version "5.0.1"
+  resolved "https://registry.npmmirror.com/pac-resolver/-/pac-resolver-5.0.1.tgz#c91efa3a9af9f669104fa2f51102839d01cde8e7"
+  integrity sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==
+  dependencies:
+    degenerator "^3.0.2"
+    ip "^1.1.5"
+    netmask "^2.0.2"
+
+pako@^0.2.5:
+  version "0.2.9"
+  resolved "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75"
+  integrity sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=
+
+parent-module@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+  integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+  dependencies:
+    callsites "^3.0.0"
+
+parse-json@^5.0.0:
+  version "5.2.0"
+  resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
+  integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
+  dependencies:
+    "@babel/code-frame" "^7.0.0"
+    error-ex "^1.3.1"
+    json-parse-even-better-errors "^2.3.0"
+    lines-and-columns "^1.1.6"
+
+parseurl@^1.3.2:
+  version "1.3.3"
+  resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+  integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
+path-is-absolute@1.0.1, path-is-absolute@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+  integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+
+path-key@^3.0.0, path-key@^3.1.0:
+  version "3.1.1"
+  resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+  integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-parse@^1.0.6:
+  version "1.0.7"
+  resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+  integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-to-regexp@^1.2.0:
+  version "1.8.0"
+  resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a"
+  integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==
+  dependencies:
+    isarray "0.0.1"
+
+path-to-regexp@^6.1.0:
+  version "6.2.0"
+  resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.0.tgz#f7b3803336104c346889adece614669230645f38"
+  integrity sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==
+
+path-type@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
+  integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3:
+  version "2.3.0"
+  resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972"
+  integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==
+
+pidusage@^2.0.21:
+  version "2.0.21"
+  resolved "https://registry.npmmirror.com/pidusage/-/pidusage-2.0.21.tgz#7068967b3d952baea73e57668c98b9eaa876894e"
+  integrity sha512-cv3xAQos+pugVX+BfXpHsbyz/dLzX+lr44zNMsYiGxUw+kV5sgQCIcLd1z+0vq+KyC7dJ+/ts2PsfgWfSC3WXA==
+  dependencies:
+    safe-buffer "^5.2.1"
+
+pidusage@~3.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/pidusage/-/pidusage-3.0.0.tgz#69108079724c9afdd958644b920bc40bac964044"
+  integrity sha512-8VJLToXhj+RYZGNVw8oxc7dS54iCQXUJ+MDFHezQ/fwF5B8W4OWodAMboc1wb08S/4LiHwAmkT4ohf/d3YPPsw==
+  dependencies:
+    safe-buffer "^5.2.1"
+
+pirates@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87"
+  integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==
+  dependencies:
+    node-modules-regexp "^1.0.0"
+
+pm2-axon-rpc@~0.7.0, pm2-axon-rpc@~0.7.1:
+  version "0.7.1"
+  resolved "https://registry.npmmirror.com/pm2-axon-rpc/-/pm2-axon-rpc-0.7.1.tgz#2daec5383a63135b3f18babb70266dacdcbc429a"
+  integrity sha512-FbLvW60w+vEyvMjP/xom2UPhUN/2bVpdtLfKJeYM3gwzYhoTEEChCOICfFzxkxuoEleOlnpjie+n1nue91bDQw==
+  dependencies:
+    debug "^4.3.1"
+
+pm2-axon@~4.0.1:
+  version "4.0.1"
+  resolved "https://registry.npmjs.org/pm2-axon/-/pm2-axon-4.0.1.tgz#a7b4bb586e9aeb35b1042b488cde15b60cabafd2"
+  integrity sha512-kES/PeSLS8orT8dR5jMlNl+Yu4Ty3nbvZRmaAtROuVm9nYYGiaoXqqKQqQYzWQzMYWUKHMQTvBlirjE5GIIxqg==
+  dependencies:
+    amp "~0.3.1"
+    amp-message "~0.1.1"
+    debug "^4.3.1"
+    escape-string-regexp "^4.0.0"
+
+pm2-deploy@~1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmjs.org/pm2-deploy/-/pm2-deploy-1.0.2.tgz#98d8385553a3a4dca11c7b3116deb519bc5961a7"
+  integrity sha512-YJx6RXKrVrWaphEYf++EdOOx9EH18vM8RSZN/P1Y+NokTKqYAca/ejXwVLyiEpNju4HPZEk3Y2uZouwMqUlcgg==
+  dependencies:
+    run-series "^1.1.8"
+    tv4 "^1.3.0"
+
+pm2-multimeter@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.npmjs.org/pm2-multimeter/-/pm2-multimeter-0.1.2.tgz#1a1e55153d41a05534cea23cfe860abaa0eb4ace"
+  integrity sha1-Gh5VFT1BoFU0zqI8/oYKuqDrSs4=
+  dependencies:
+    charm "~0.1.1"
+
+pm2-sysmonit@^1.2.8:
+  version "1.2.8"
+  resolved "https://registry.npmmirror.com/pm2-sysmonit/-/pm2-sysmonit-1.2.8.tgz#eddea34a53fd8c8d7c3efb73b97a3c548686e24d"
+  integrity sha512-ACOhlONEXdCTVwKieBIQLSi2tQZ8eKinhcr9JpZSUAL8Qy0ajIgRtsLxG/lwPOW3JEKqPyw/UaHmTWhUzpP4kA==
+  dependencies:
+    async "^3.2.0"
+    debug "^4.3.1"
+    pidusage "^2.0.21"
+    systeminformation "^5.7"
+    tx2 "~1.0.4"
+
+pm2@^5.2.0:
+  version "5.2.0"
+  resolved "https://registry.npmmirror.com/pm2/-/pm2-5.2.0.tgz#fda71fab4b8fcfa5b7f546ca55a6e59e9ec5a68d"
+  integrity sha512-PO5hMVhQ85cTszFM++6v07Me9hPJMkFbHjkFigtMMk+La8ty2wCi2dlBTeZYJDhPUSjK8Ccltpq2buNRcyMOTw==
+  dependencies:
+    "@pm2/agent" "~2.0.0"
+    "@pm2/io" "~5.0.0"
+    "@pm2/js-api" "~0.6.7"
+    "@pm2/pm2-version-check" latest
+    async "~3.2.0"
+    blessed "0.1.81"
+    chalk "3.0.0"
+    chokidar "^3.5.1"
+    cli-tableau "^2.0.0"
+    commander "2.15.1"
+    croner "~4.1.92"
+    dayjs "~1.8.25"
+    debug "^4.3.1"
+    enquirer "2.3.6"
+    eventemitter2 "5.0.1"
+    fclone "1.0.11"
+    mkdirp "1.0.4"
+    needle "2.4.0"
+    pidusage "~3.0"
+    pm2-axon "~4.0.1"
+    pm2-axon-rpc "~0.7.1"
+    pm2-deploy "~1.0.2"
+    pm2-multimeter "^0.1.2"
+    promptly "^2"
+    semver "^7.2"
+    source-map-support "0.5.19"
+    sprintf-js "1.1.2"
+    vizion "~2.2.1"
+    yamljs "0.3.0"
+  optionalDependencies:
+    pm2-sysmonit "^1.2.8"
+
+postcss-load-config@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.0.1.tgz#d214bf9cfec1608ffaf0f4161b3ba20664ab64b9"
+  integrity sha512-/pDHe30UYZUD11IeG8GWx9lNtu1ToyTsZHnyy45B4Mrwr/Kb6NgYl7k753+05CJNKnjbwh4975amoPJ+TEjHNQ==
+  dependencies:
+    cosmiconfig "^7.0.0"
+    import-cwd "^3.0.0"
+
+prelude-ls@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+  integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
+
+promptly@^2:
+  version "2.2.0"
+  resolved "https://registry.npmjs.org/promptly/-/promptly-2.2.0.tgz#2a13fa063688a2a5983b161fff0108a07d26fc74"
+  integrity sha1-KhP6BjaIoqWYOxYf/wEIoH0m/HQ=
+  dependencies:
+    read "^1.0.4"
+
+proxy-agent@~5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/proxy-agent/-/proxy-agent-5.0.0.tgz#d31405c10d6e8431fde96cba7a0c027ce01d633b"
+  integrity sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==
+  dependencies:
+    agent-base "^6.0.0"
+    debug "4"
+    http-proxy-agent "^4.0.0"
+    https-proxy-agent "^5.0.0"
+    lru-cache "^5.1.1"
+    pac-proxy-agent "^5.0.0"
+    proxy-from-env "^1.0.0"
+    socks-proxy-agent "^5.0.0"
+
+proxy-from-env@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
+  integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
+
+pstree.remy@^1.1.8:
+  version "1.1.8"
+  resolved "https://registry.npmmirror.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a"
+  integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==
+
+punycode@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+  integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
+qs@^6.4.0, qs@^6.5.2:
+  version "6.10.1"
+  resolved "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a"
+  integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==
+  dependencies:
+    side-channel "^1.0.4"
+
+queue-microtask@^1.2.2:
+  version "1.2.3"
+  resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
+  integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+
+raw-body@^2.2.0, raw-body@^2.3.3:
+  version "2.4.1"
+  resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c"
+  integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==
+  dependencies:
+    bytes "3.1.0"
+    http-errors "1.7.3"
+    iconv-lite "0.4.24"
+    unpipe "1.0.0"
+
+read@^1.0.4:
+  version "1.0.7"
+  resolved "https://registry.npmjs.org/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4"
+  integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=
+  dependencies:
+    mute-stream "~0.0.4"
+
+readable-stream@1.1.x:
+  version "1.1.14"
+  resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+  integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk=
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "0.0.1"
+    string_decoder "~0.10.x"
+
+readdirp@~3.5.0:
+  version "3.5.0"
+  resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e"
+  integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==
+  dependencies:
+    picomatch "^2.2.1"
+
+readdirp@~3.6.0:
+  version "3.6.0"
+  resolved "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
+  integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+  dependencies:
+    picomatch "^2.2.1"
+
+require-in-the-middle@^5.0.0:
+  version "5.1.0"
+  resolved "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.1.0.tgz#b768f800377b47526d026bbf5a7f727f16eb412f"
+  integrity sha512-M2rLKVupQfJ5lf9OvqFGIT+9iVLnTmjgbOmpil12hiSQNn5zJTKGPoIisETNjfK+09vP3rpm1zJajmErpr2sEQ==
+  dependencies:
+    debug "^4.1.1"
+    module-details-from-path "^1.0.3"
+    resolve "^1.12.0"
+
+resolve-from@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+  integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+resolve-from@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
+  integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
+
+resolve-path@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7"
+  integrity sha1-xL2p9e+y/OZSR4c6s2u02DT+Fvc=
+  dependencies:
+    http-errors "~1.6.2"
+    path-is-absolute "1.0.1"
+
+resolve@^1.12.0:
+  version "1.20.0"
+  resolved "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
+  integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
+  dependencies:
+    is-core-module "^2.2.0"
+    path-parse "^1.0.6"
+
+reusify@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+  integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
+rimraf@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+  integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+  dependencies:
+    glob "^7.1.3"
+
+rollup@^2.74.1:
+  version "2.78.0"
+  resolved "https://registry.npmmirror.com/rollup/-/rollup-2.78.0.tgz#00995deae70c0f712ea79ad904d5f6b033209d9e"
+  integrity sha512-4+YfbQC9QEVvKTanHhIAFVUFSRsezvQF8vFOJwtGfb9Bb+r014S+qryr9PSmw8x6sMnPkmFBGAvIFVQxvJxjtg==
+  optionalDependencies:
+    fsevents "~2.3.2"
+
+run-parallel@^1.1.9:
+  version "1.2.0"
+  resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
+  integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+  dependencies:
+    queue-microtask "^1.2.2"
+
+run-series@^1.1.8:
+  version "1.1.9"
+  resolved "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz#15ba9cb90e6a6c054e67c98e1dc063df0ecc113a"
+  integrity sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==
+
+safe-buffer@5.1.2:
+  version "5.1.2"
+  resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+  integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-buffer@^5.2.1:
+  version "5.2.1"
+  resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+  integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+"safer-buffer@>= 2.1.2 < 3":
+  version "2.1.2"
+  resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+  integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+sax@^1.2.4:
+  version "1.2.4"
+  resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+  integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
+
+semver@6.3.0:
+  version "6.3.0"
+  resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+  integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+
+semver@^5.3.0, semver@^5.5.0, semver@^5.7.1:
+  version "5.7.1"
+  resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+  integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+
+semver@^7.2:
+  version "7.3.5"
+  resolved "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
+  integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
+  dependencies:
+    lru-cache "^6.0.0"
+
+semver@~7.0.0:
+  version "7.0.0"
+  resolved "https://registry.npmmirror.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
+  integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
+
+semver@~7.2.0:
+  version "7.2.3"
+  resolved "https://registry.npmjs.org/semver/-/semver-7.2.3.tgz#3641217233c6382173c76bf2c7ecd1e1c16b0d8a"
+  integrity sha512-utbW9Z7ZxVvwiIWkdOMLOR9G/NFXh2aRucghkVrEMJWuC++r3lCkBC3LwqBinyHzGMAJxY5tn6VakZGHObq5ig==
+
+setprototypeof@1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
+  integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==
+
+setprototypeof@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
+  integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
+
+setprototypeof@1.2.0:
+  version "1.2.0"
+  resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
+  integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
+
+shebang-command@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+  integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+  dependencies:
+    shebang-regex "^3.0.0"
+
+shebang-regex@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+  integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+shimmer@^1.1.0, shimmer@^1.2.0:
+  version "1.2.1"
+  resolved "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz#610859f7de327b587efebf501fb43117f9aff337"
+  integrity sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==
+
+side-channel@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
+  integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+  dependencies:
+    call-bind "^1.0.0"
+    get-intrinsic "^1.0.2"
+    object-inspect "^1.9.0"
+
+signal-exit@^3.0.3:
+  version "3.0.3"
+  resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
+  integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
+
+simple-update-notifier@^1.0.7:
+  version "1.0.7"
+  resolved "https://registry.npmmirror.com/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz#7edf75c5bdd04f88828d632f762b2bc32996a9cc"
+  integrity sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==
+  dependencies:
+    semver "~7.0.0"
+
+slash@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+  integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+smart-buffer@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba"
+  integrity sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==
+
+socks-proxy-agent@5, socks-proxy-agent@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz#7c0f364e7b1cf4a7a437e71253bed72e9004be60"
+  integrity sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==
+  dependencies:
+    agent-base "6"
+    debug "4"
+    socks "^2.3.3"
+
+socks@^2.3.3:
+  version "2.6.1"
+  resolved "https://registry.npmjs.org/socks/-/socks-2.6.1.tgz#989e6534a07cf337deb1b1c94aaa44296520d30e"
+  integrity sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA==
+  dependencies:
+    ip "^1.1.5"
+    smart-buffer "^4.1.0"
+
+source-map-support@0.5.19:
+  version "0.5.19"
+  resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
+  integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
+  dependencies:
+    buffer-from "^1.0.0"
+    source-map "^0.6.0"
+
+source-map@0.8.0-beta.0:
+  version "0.8.0-beta.0"
+  resolved "https://registry.npmmirror.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11"
+  integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==
+  dependencies:
+    whatwg-url "^7.0.0"
+
+source-map@^0.6.0, source-map@~0.6.1:
+  version "0.6.1"
+  resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+  integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+sprintf-js@1.1.2:
+  version "1.1.2"
+  resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673"
+  integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==
+
+sprintf-js@~1.0.2:
+  version "1.0.3"
+  resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+  integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
+"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@^1.5.0:
+  version "1.5.0"
+  resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+  integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
+
+string_decoder@~0.10.x:
+  version "0.10.31"
+  resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+  integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
+
+strip-bom@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+  integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
+
+strip-final-newline@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
+  integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
+
+sucrase@^3.20.3:
+  version "3.25.0"
+  resolved "https://registry.npmmirror.com/sucrase/-/sucrase-3.25.0.tgz#6dffa34e614b3347877507a4380cc4f022b7b7aa"
+  integrity sha512-WxTtwEYXSmZArPGStGBicyRsg5TBEFhT5b7N+tF+zauImP0Acy+CoUK0/byJ8JNPK/5lbpWIVuFagI4+0l85QQ==
+  dependencies:
+    commander "^4.0.0"
+    glob "7.1.6"
+    lines-and-columns "^1.1.6"
+    mz "^2.7.0"
+    pirates "^4.0.1"
+    ts-interface-checker "^0.1.9"
+
+supports-color@^5.3.0, supports-color@^5.5.0:
+  version "5.5.0"
+  resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+  integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+  dependencies:
+    has-flag "^3.0.0"
+
+supports-color@^7.1.0:
+  version "7.2.0"
+  resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+  integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+  dependencies:
+    has-flag "^4.0.0"
+
+systeminformation@^5.7:
+  version "5.12.5"
+  resolved "https://registry.npmmirror.com/systeminformation/-/systeminformation-5.12.5.tgz#ba223aca6d99453136986fb6a4c96518d13d27b5"
+  integrity sha512-lWhWMZTQzwHaB2aacQ9wbhSncgXo8bYv7M9K5Qrz9tJuvqPepiCvb5Uauq2xwH+JhbjPO9YJD2qLXQEXFAjwwA==
+
+thenify-all@^1.0.0:
+  version "1.6.0"
+  resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726"
+  integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=
+  dependencies:
+    thenify ">= 3.1.0 < 4"
+
+"thenify@>= 3.1.0 < 4":
+  version "3.3.1"
+  resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f"
+  integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==
+  dependencies:
+    any-promise "^1.0.0"
+
+to-regex-range@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+  integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+  dependencies:
+    is-number "^7.0.0"
+
+toidentifier@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
+  integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
+
+touch@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b"
+  integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==
+  dependencies:
+    nopt "~1.0.10"
+
+tr46@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09"
+  integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==
+  dependencies:
+    punycode "^2.1.0"
+
+tree-kill@^1.2.2:
+  version "1.2.2"
+  resolved "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc"
+  integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==
+
+ts-interface-checker@^0.1.9:
+  version "0.1.13"
+  resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699"
+  integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==
+
+ts-node@^10.7.0:
+  version "10.9.1"
+  resolved "https://registry.npmmirror.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b"
+  integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==
+  dependencies:
+    "@cspotcode/source-map-support" "^0.8.0"
+    "@tsconfig/node10" "^1.0.7"
+    "@tsconfig/node12" "^1.0.7"
+    "@tsconfig/node14" "^1.0.0"
+    "@tsconfig/node16" "^1.0.2"
+    acorn "^8.4.1"
+    acorn-walk "^8.1.1"
+    arg "^4.1.0"
+    create-require "^1.1.0"
+    diff "^4.0.1"
+    make-error "^1.1.1"
+    v8-compile-cache-lib "^3.0.1"
+    yn "3.1.1"
+
+tsconfig-paths@^3.14.0:
+  version "3.14.1"
+  resolved "https://registry.npmmirror.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a"
+  integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==
+  dependencies:
+    "@types/json5" "^0.0.29"
+    json5 "^1.0.1"
+    minimist "^1.2.6"
+    strip-bom "^3.0.0"
+
+tslib@1.9.3:
+  version "1.9.3"
+  resolved "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
+  integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==
+
+tslib@^2.0.1:
+  version "2.2.0"
+  resolved "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c"
+  integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==
+
+tsscmp@1.0.6:
+  version "1.0.6"
+  resolved "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb"
+  integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==
+
+tsup@^5.12.1:
+  version "5.12.9"
+  resolved "https://registry.npmmirror.com/tsup/-/tsup-5.12.9.tgz#8cdd9b4bc6493317cb92edf5f3476920dddcdb18"
+  integrity sha512-dUpuouWZYe40lLufo64qEhDpIDsWhRbr2expv5dHEMjwqeKJS2aXA/FPqs1dxO4T6mBojo7rvo3jP9NNzaKyDg==
+  dependencies:
+    bundle-require "^3.0.2"
+    cac "^6.7.12"
+    chokidar "^3.5.1"
+    debug "^4.3.1"
+    esbuild "^0.14.25"
+    execa "^5.0.0"
+    globby "^11.0.3"
+    joycon "^3.0.1"
+    postcss-load-config "^3.0.1"
+    resolve-from "^5.0.0"
+    rollup "^2.74.1"
+    source-map "0.8.0-beta.0"
+    sucrase "^3.20.3"
+    tree-kill "^1.2.2"
+
+tv4@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz#d020c846fadd50c855abb25ebaecc68fc10f7963"
+  integrity sha1-0CDIRvrdUMhVq7JeuuzGj8EPeWM=
+
+tx2@~1.0.4:
+  version "1.0.5"
+  resolved "https://registry.npmmirror.com/tx2/-/tx2-1.0.5.tgz#ee0b0e5e2c351f8d23e54bdf46dd60afa3bbc73d"
+  integrity sha512-sJ24w0y03Md/bxzK4FU8J8JveYYUbSs2FViLJ2D/8bytSiyPRbuE3DyL/9UKYXTZlV3yXq0L8GLlhobTnekCVg==
+  dependencies:
+    json-stringify-safe "^5.0.1"
+
+type-check@~0.3.2:
+  version "0.3.2"
+  resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+  integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=
+  dependencies:
+    prelude-ls "~1.1.2"
+
+type-is@^1.6.14, type-is@^1.6.16:
+  version "1.6.18"
+  resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+  integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+  dependencies:
+    media-typer "0.3.0"
+    mime-types "~2.1.24"
+
+typescript@^4.6.2:
+  version "4.7.4"
+  resolved "https://registry.npmmirror.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235"
+  integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==
+
+undefsafe@^2.0.5:
+  version "2.0.5"
+  resolved "https://registry.npmmirror.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c"
+  integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==
+
+universalify@^0.1.0:
+  version "0.1.2"
+  resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+  integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+
+universalify@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
+  integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
+
+unpipe@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+  integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
+
+uuid@^3.2.1:
+  version "3.4.0"
+  resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
+  integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+
+v8-compile-cache-lib@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf"
+  integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==
+
+vary@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+  integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
+
+vizion@~2.2.1:
+  version "2.2.1"
+  resolved "https://registry.npmmirror.com/vizion/-/vizion-2.2.1.tgz#04201ea45ffd145d5b5210e385a8f35170387fb2"
+  integrity sha512-sfAcO2yeSU0CSPFI/DmZp3FsFE9T+8913nv1xWBOyzODv13fwkn6Vl7HqxGpkr9F608M+8SuFId3s+BlZqfXww==
+  dependencies:
+    async "^2.6.3"
+    git-node-fs "^1.0.0"
+    ini "^1.3.5"
+    js-git "^0.7.8"
+
+vm2@^3.9.8:
+  version "3.9.10"
+  resolved "https://registry.npmmirror.com/vm2/-/vm2-3.9.10.tgz#c66543096b5c44c8861a6465805c23c7cc996a44"
+  integrity sha512-AuECTSvwu2OHLAZYhG716YzwodKCIJxB6u1zG7PgSQwIgAlEaoXH52bxdcvT8GkGjnYK7r7yWDW0m0sOsPuBjQ==
+  dependencies:
+    acorn "^8.7.0"
+    acorn-walk "^8.2.0"
+
+webidl-conversions@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
+  integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==
+
+whatwg-url@^7.0.0:
+  version "7.1.0"
+  resolved "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06"
+  integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==
+  dependencies:
+    lodash.sortby "^4.7.0"
+    tr46 "^1.0.1"
+    webidl-conversions "^4.0.2"
+
+which@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+  integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+  dependencies:
+    isexe "^2.0.0"
+
+word-wrap@~1.2.3:
+  version "1.2.3"
+  resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
+  integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
+
+wrappy@1:
+  version "1.0.2"
+  resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+  integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+ws@^7.0.0, ws@^7.0.1, ws@~7.4.0:
+  version "7.4.6"
+  resolved "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c"
+  integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==
+
+xregexp@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943"
+  integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=
+
+yallist@^3.0.2:
+  version "3.1.1"
+  resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+  integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yallist@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+  integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yaml@^1.10.0:
+  version "1.10.2"
+  resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
+  integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
+
+yamljs@0.3.0:
+  version "0.3.0"
+  resolved "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz#dc060bf267447b39f7304e9b2bfbe8b5a7ddb03b"
+  integrity sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==
+  dependencies:
+    argparse "^1.0.7"
+    glob "^7.0.5"
+
+ylru@^1.2.0:
+  version "1.2.1"
+  resolved "https://registry.npmjs.org/ylru/-/ylru-1.2.1.tgz#f576b63341547989c1de7ba288760923b27fe84f"
+  integrity sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ==
+
+yn@3.1.1:
+  version "3.1.1"
+  resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
+  integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
diff --git a/tsconfig.json b/tsconfig.json
index 2b9097318e5facc323e496c52075b5d6e6704401..76e91f264d25221ab2f6c4fed9a03cbdda025911 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -4,6 +4,7 @@
     "module": "esnext",
     "moduleResolution": "node",
     "strict": true,
+    "noLib": false,
     "forceConsistentCasingInFileNames": true,
     "allowSyntheticDefaultImports": true,
     "strictFunctionTypes": false,
@@ -17,15 +18,17 @@
     "noUnusedParameters": true,
     "experimentalDecorators": true,
     "lib": ["dom", "esnext"],
-    "typeRoots": ["./node_modules/@types/", "./types"],
     "noImplicitAny": false,
     "skipLibCheck": true,
+    "types": ["vite/client"],
+    "removeComments": true,
     "paths": {
       "/@/*": ["src/*"],
       "/#/*": ["types/*"]
     }
   },
   "include": [
+    "tests/**/*.ts",
     "src/**/*.ts",
     "src/**/*.d.ts",
     "src/**/*.tsx",
@@ -37,5 +40,5 @@
     "mock/**/*.ts",
     "vite.config.ts"
   ],
-  "exclude": ["node_modules", "dist", "**/*.js"]
+  "exclude": ["node_modules", "tests/server/**/*.ts", "dist", "**/*.js"]
 }
diff --git a/types/axios.d.ts b/types/axios.d.ts
index e60187f9fe9b0d00acc446dcf7664b93b8f0e069..a9f26f80c4475ab1b869bd82f651efc156da1eaa 100644
--- a/types/axios.d.ts
+++ b/types/axios.d.ts
@@ -1,4 +1,4 @@
-export type ErrorMessageMode = 'none' | 'modal' | 'message' | undefined;
+export type ErrorMessageMode = "none" | "modal" | "message" | undefined;
 
 export interface RequestOptions {
   // Splicing request parameters to url
@@ -23,13 +23,20 @@ export interface RequestOptions {
   ignoreCancelToken?: boolean;
   // Whether to send token in header
   withToken?: boolean;
+  // 请求重试机制
+  retryRequest?: RetryRequest;
 }
 
+export interface RetryRequest {
+  isOpenRetry: boolean;
+  count: number;
+  waitTime: number;
+}
 export interface Result<T = any> {
   code: number;
-  type: 'success' | 'error' | 'warning';
+  type: "success" | "error" | "warning";
   message: string;
-  result: T;
+  data: T;
 }
 
 // multipart/form-data: upload file
diff --git a/types/config.d.ts b/types/config.d.ts
index cb5a5a99aa82881e310c99a4015a1bac05afb6b5..3752aadfb452e360376ec3a6500e8d4383c8099d 100644
--- a/types/config.d.ts
+++ b/types/config.d.ts
@@ -1,4 +1,4 @@
-import { MenuTypeEnum, MenuModeEnum, TriggerEnum, MixSidebarTriggerEnum } from '/@/enums/menuEnum';
+import { MenuTypeEnum, MenuModeEnum, TriggerEnum, MixSidebarTriggerEnum } from "/@/enums/menuEnum";
 import {
   ContentEnum,
   PermissionModeEnum,
@@ -6,16 +6,17 @@ import {
   RouterTransitionEnum,
   SettingButtonPositionEnum,
   SessionTimeoutProcessingEnum,
-} from '/@/enums/appEnum';
+} from "/@/enums/appEnum";
 
-import { CacheTypeEnum } from '/@/enums/cacheEnum';
+import { CacheTypeEnum } from "/@/enums/cacheEnum";
 
-export type LocaleType = 'zh_CN' | 'en' | 'ru' | 'ja' | 'ko';
+export type LocaleType = "zh_CN" | "en" | "ru" | "ja" | "ko";
 
 export interface MenuSetting {
   bgColor: string;
   fixed: boolean;
   collapsed: boolean;
+  siderHidden: boolean;
   canDrag: boolean;
   show: boolean;
   hidden: boolean;
@@ -24,7 +25,7 @@ export interface MenuSetting {
   mode: MenuModeEnum;
   type: MenuTypeEnum;
   theme: ThemeEnum;
-  topMenuAlign: 'start' | 'center' | 'end';
+  topMenuAlign: "start" | "center" | "end";
   trigger: TriggerEnum;
   accordion: boolean;
   closeMixSidebarOnChange: boolean;
diff --git a/types/module.d.ts b/types/module.d.ts
index 8db51560fd7fe09b80d0fe19dc20c3224049d681..287ad38b1f485dc994bbca7f8956b2564117ac8c 100644
--- a/types/module.d.ts
+++ b/types/module.d.ts
@@ -1,22 +1,16 @@
-declare module '*.vue' {
-  import { DefineComponent } from 'vue';
+declare module "*.vue" {
+  import { DefineComponent } from "vue";
   const Component: DefineComponent<{}, {}, any>;
   export default Component;
 }
 
-declare module 'ant-design-vue/es/locale/*' {
-  import { Locale } from 'ant-design-vue/types/locale-provider';
+declare module "ant-design-vue/es/locale/*" {
+  import { Locale } from "ant-design-vue/types/locale-provider";
   const locale: Locale & ReadonlyRecordable;
   export default locale as Locale & ReadonlyRecordable;
 }
 
-declare module 'moment/dist/locale/*' {
-  import { LocaleSpecification } from 'moment';
-  const locale: LocaleSpecification & ReadonlyRecordable;
-  export default locale;
-}
-
-declare module 'virtual:*' {
+declare module "virtual:*" {
   const result: any;
   export default result;
 }
diff --git a/vite.config.ts b/vite.config.ts
index e6305e221012549804095b20395d26de0346fa5f..50f1a259a31f950a45460c9b969d582969970185 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -1,22 +1,22 @@
-import type { UserConfig, ConfigEnv } from 'vite';
-import pkg from './package.json';
-import moment from 'moment';
-import { loadEnv } from 'vite';
-import { resolve } from 'path';
-import { generateModifyVars } from './build/generate/generateModifyVars';
-import { createProxy } from './build/vite/proxy';
-import { wrapperEnv } from './build/utils';
-import { createVitePlugins } from './build/vite/plugin';
-import { OUTPUT_DIR } from './build/constant';
+import type { UserConfig, ConfigEnv } from "vite";
+import pkg from "./package.json";
+import dayjs from "dayjs";
+import { loadEnv } from "vite";
+import { resolve } from "path";
+import { generateModifyVars } from "./build/generate/generateModifyVars";
+import { createProxy } from "./build/vite/proxy";
+import { wrapperEnv } from "./build/utils";
+import { createVitePlugins } from "./build/vite/plugin";
+import { OUTPUT_DIR } from "./build/constant";
 
 function pathResolve(dir: string) {
-  return resolve(process.cwd(), '.', dir);
+  return resolve(process.cwd(), ".", dir);
 }
 
 const { dependencies, devDependencies, name, version } = pkg;
 const __APP_INFO__ = {
   pkg: { dependencies, devDependencies, name, version },
-  lastBuildTime: moment().format('YYYY-MM-DD HH:mm:ss'),
+  lastBuildTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
 };
 
 export default ({ command, mode }: ConfigEnv): UserConfig => {
@@ -29,7 +29,7 @@ export default ({ command, mode }: ConfigEnv): UserConfig => {
 
   const { VITE_PORT, VITE_PUBLIC_PATH, VITE_PROXY, VITE_DROP_CONSOLE } = viteEnv;
 
-  const isBuild = command === 'build';
+  const isBuild = command === "build";
 
   return {
     base: VITE_PUBLIC_PATH,
@@ -37,38 +37,47 @@ export default ({ command, mode }: ConfigEnv): UserConfig => {
     resolve: {
       alias: [
         {
-          find: 'vue-i18n',
-          replacement: 'vue-i18n/dist/vue-i18n.cjs.js',
+          find: "vue-i18n",
+          replacement: "vue-i18n/dist/vue-i18n.cjs.js",
         },
         // /@/xxxx => src/xxxx
         {
           find: /\/@\//,
-          replacement: pathResolve('src') + '/',
+          replacement: pathResolve("src") + "/",
         },
         // /#/xxxx => types/xxxx
         {
           find: /\/#\//,
-          replacement: pathResolve('types') + '/',
+          replacement: pathResolve("types") + "/",
         },
       ],
     },
     server: {
+      https: true,
       // Listening on all local IPs
       host: true,
       port: VITE_PORT,
       // Load proxy configuration from .env
       proxy: createProxy(VITE_PROXY),
     },
+    esbuild: {
+      pure: VITE_DROP_CONSOLE ? ["console.log", "debugger"] : [],
+    },
     build: {
-      target: 'es2015',
+      target: "es2015",
+      cssTarget: "chrome80",
       outDir: OUTPUT_DIR,
-      terserOptions: {
-        compress: {
-          keep_infinity: true,
-          // Used to delete console in production environment
-          drop_console: VITE_DROP_CONSOLE,
-        },
-      },
+      // minify: 'terser',
+      /**
+       * 当 minify=“minify:'terser'” 解开注释
+       * Uncomment when minify="minify:'terser'"
+       */
+      // terserOptions: {
+      //   compress: {
+      //     keep_infinity: true,
+      //     drop_console: VITE_DROP_CONSOLE,
+      //   },
+      // },
       // Turning off brotliSize display can slightly reduce packaging time
       brotliSize: false,
       chunkSizeWarningLimit: 2000,
@@ -95,13 +104,12 @@ export default ({ command, mode }: ConfigEnv): UserConfig => {
     optimizeDeps: {
       // @iconify/iconify: The dependency is dynamically and virtually loaded by @purge-icons/generated, so it needs to be specified explicitly
       include: [
-        '@iconify/iconify',
-        'ant-design-vue/es/locale/zh_CN',
-        'moment/dist/locale/zh-cn',
-        'ant-design-vue/es/locale/en_US',
-        'moment/dist/locale/eu',
+        "@vue/runtime-core",
+        "@vue/shared",
+        "@iconify/iconify",
+        "ant-design-vue/es/locale/zh_CN",
+        "ant-design-vue/es/locale/en_US",
       ],
-      exclude: ['vue-demi', 'consolidate'],
     },
   };
 };
diff --git a/windi.config.ts b/windi.config.ts
index ff1aba2359b3ca8e40c71f46e341494017ae7d9f..fcd35dd96263c24bb0d83c8a4cfaa1f197eb34c8 100644
--- a/windi.config.ts
+++ b/windi.config.ts
@@ -1,34 +1,34 @@
-import { defineConfig } from 'vite-plugin-windicss';
-import { primaryColor } from './build/config/themeConfig';
+import { defineConfig } from "vite-plugin-windicss";
+import { primaryColor } from "./build/config/themeConfig";
 
 export default defineConfig({
-  darkMode: 'class',
+  darkMode: "class",
   plugins: [createEnterPlugin()],
   theme: {
     extend: {
       zIndex: {
-        '-1': '-1',
+        "-1": "-1",
       },
       colors: {
         primary: primaryColor,
       },
       screens: {
-        sm: '576px',
-        md: '768px',
-        lg: '992px',
-        xl: '1200px',
-        '2xl': '1600px',
+        sm: "576px",
+        md: "768px",
+        lg: "992px",
+        xl: "1200px",
+        "2xl": "1600px",
       },
     },
   },
 });
 
 /**
- * Used for animation when the element is displayed
- * @param maxOutput The larger the maxOutput output, the larger the generated css volume
+ * Used for animation when the element is displayed.
+ * @param maxOutput The larger the maxOutput output, the larger the generated css volume.
  */
-function createEnterPlugin(maxOutput = 7) {
-  const createCss = (index: number, d = 'x') => {
+function createEnterPlugin(maxOutput = 6) {
+  const createCss = (index: number, d = "x") => {
     const upd = d.toUpperCase();
     return {
       [`*> .enter-${d}:nth-child(${index})`]: {
@@ -38,11 +38,11 @@ function createEnterPlugin(maxOutput = 7) {
         transform: `translate${upd}(-50px)`,
       },
       [`* > .enter-${d}:nth-child(${index}),* > .-enter-${d}:nth-child(${index})`]: {
-        'z-index': `${10 - index}`,
-        opacity: '0',
+        "z-index": `${10 - index}`,
+        opacity: "0",
         animation: `enter-${d}-animation 0.4s ease-in-out 0.3s`,
-        'animation-fill-mode': 'forwards',
-        'animation-delay': `${(index * 1) / 10}s`,
+        "animation-fill-mode": "forwards",
+        "animation-delay": `${(index * 1) / 10}s`,
       },
     };
   };
@@ -50,22 +50,22 @@ function createEnterPlugin(maxOutput = 7) {
     const addRawCss = {};
     for (let index = 1; index < maxOutput; index++) {
       Object.assign(addRawCss, {
-        ...createCss(index, 'x'),
-        ...createCss(index, 'y'),
+        ...createCss(index, "x"),
+        ...createCss(index, "y"),
       });
     }
     addBase({
       ...addRawCss,
       [`@keyframes enter-x-animation`]: {
         to: {
-          opacity: '1',
-          transform: 'translateX(0)',
+          opacity: "1",
+          transform: "translateX(0)",
         },
       },
       [`@keyframes enter-y-animation`]: {
         to: {
-          opacity: '1',
-          transform: 'translateY(0)',
+          opacity: "1",
+          transform: "translateY(0)",
         },
       },
     });
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 0000000000000000000000000000000000000000..3d5b92ec1566720584e4c34c802c3a79231744b2
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,9858 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@ampproject/remapping@^2.1.0":
+  version "2.2.0"
+  resolved "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d"
+  integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==
+  dependencies:
+    "@jridgewell/gen-mapping" "^0.1.0"
+    "@jridgewell/trace-mapping" "^0.3.9"
+
+"@ant-design/colors@^6.0.0":
+  version "6.0.0"
+  resolved "https://registry.npmmirror.com/@ant-design/colors/-/colors-6.0.0.tgz#9b9366257cffcc47db42b9d0203bb592c13c0298"
+  integrity sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==
+  dependencies:
+    "@ctrl/tinycolor" "^3.4.0"
+
+"@ant-design/icons-svg@^4.2.1":
+  version "4.2.1"
+  resolved "https://registry.npmmirror.com/@ant-design/icons-svg/-/icons-svg-4.2.1.tgz#8630da8eb4471a4aabdaed7d1ff6a97dcb2cf05a"
+  integrity sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==
+
+"@ant-design/icons-vue@^6.1.0":
+  version "6.1.0"
+  resolved "https://registry.npmmirror.com/@ant-design/icons-vue/-/icons-vue-6.1.0.tgz#f9324fdc0eb4cea943cf626d2bf3db9a4ff4c074"
+  integrity sha512-EX6bYm56V+ZrKN7+3MT/ubDkvJ5rK/O2t380WFRflDcVFgsvl3NLH7Wxeau6R8DbrO5jWR6DSTC3B6gYFp77AA==
+  dependencies:
+    "@ant-design/colors" "^6.0.0"
+    "@ant-design/icons-svg" "^4.2.1"
+
+"@antfu/utils@^0.5.2":
+  version "0.5.2"
+  resolved "https://registry.npmmirror.com/@antfu/utils/-/utils-0.5.2.tgz#8c2d931ff927be0ebe740169874a3d4004ab414b"
+  integrity sha512-CQkeV+oJxUazwjlHD0/3ZD08QWKuGQkhnrKo3e6ly5pd48VUpXbb77q0xMU4+vc2CkJnDS02Eq/M9ugyX20XZA==
+
+"@apideck/better-ajv-errors@^0.3.1":
+  version "0.3.6"
+  resolved "https://registry.npmmirror.com/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz#957d4c28e886a64a8141f7522783be65733ff097"
+  integrity sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==
+  dependencies:
+    json-schema "^0.4.0"
+    jsonpointer "^5.0.0"
+    leven "^3.1.0"
+
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a"
+  integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==
+  dependencies:
+    "@babel/highlight" "^7.18.6"
+
+"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8":
+  version "7.18.8"
+  resolved "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d"
+  integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==
+
+"@babel/core@^7.11.1", "@babel/core@^7.17.9":
+  version "7.18.10"
+  resolved "https://registry.npmmirror.com/@babel/core/-/core-7.18.10.tgz#39ad504991d77f1f3da91be0b8b949a5bc466fb8"
+  integrity sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==
+  dependencies:
+    "@ampproject/remapping" "^2.1.0"
+    "@babel/code-frame" "^7.18.6"
+    "@babel/generator" "^7.18.10"
+    "@babel/helper-compilation-targets" "^7.18.9"
+    "@babel/helper-module-transforms" "^7.18.9"
+    "@babel/helpers" "^7.18.9"
+    "@babel/parser" "^7.18.10"
+    "@babel/template" "^7.18.10"
+    "@babel/traverse" "^7.18.10"
+    "@babel/types" "^7.18.10"
+    convert-source-map "^1.7.0"
+    debug "^4.1.0"
+    gensync "^1.0.0-beta.2"
+    json5 "^2.2.1"
+    semver "^6.3.0"
+
+"@babel/generator@^7.18.10":
+  version "7.18.12"
+  resolved "https://registry.npmmirror.com/@babel/generator/-/generator-7.18.12.tgz#fa58daa303757bd6f5e4bbca91b342040463d9f4"
+  integrity sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==
+  dependencies:
+    "@babel/types" "^7.18.10"
+    "@jridgewell/gen-mapping" "^0.3.2"
+    jsesc "^2.5.1"
+
+"@babel/helper-annotate-as-pure@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb"
+  integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==
+  dependencies:
+    "@babel/types" "^7.18.6"
+
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6":
+  version "7.18.9"
+  resolved "https://registry.npmmirror.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb"
+  integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==
+  dependencies:
+    "@babel/helper-explode-assignable-expression" "^7.18.6"
+    "@babel/types" "^7.18.9"
+
+"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9":
+  version "7.18.9"
+  resolved "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz#69e64f57b524cde3e5ff6cc5a9f4a387ee5563bf"
+  integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==
+  dependencies:
+    "@babel/compat-data" "^7.18.8"
+    "@babel/helper-validator-option" "^7.18.6"
+    browserslist "^4.20.2"
+    semver "^6.3.0"
+
+"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.18.9":
+  version "7.18.9"
+  resolved "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.9.tgz#d802ee16a64a9e824fcbf0a2ffc92f19d58550ce"
+  integrity sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.18.6"
+    "@babel/helper-environment-visitor" "^7.18.9"
+    "@babel/helper-function-name" "^7.18.9"
+    "@babel/helper-member-expression-to-functions" "^7.18.9"
+    "@babel/helper-optimise-call-expression" "^7.18.6"
+    "@babel/helper-replace-supers" "^7.18.9"
+    "@babel/helper-split-export-declaration" "^7.18.6"
+
+"@babel/helper-create-regexp-features-plugin@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz#3e35f4e04acbbf25f1b3534a657610a000543d3c"
+  integrity sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.18.6"
+    regexpu-core "^5.1.0"
+
+"@babel/helper-define-polyfill-provider@^0.3.2":
+  version "0.3.2"
+  resolved "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.2.tgz#bd10d0aca18e8ce012755395b05a79f45eca5073"
+  integrity sha512-r9QJJ+uDWrd+94BSPcP6/de67ygLtvVy6cK4luE6MOuDsZIdoaPBnfSpbO/+LTifjPckbKXRuI9BB/Z2/y3iTg==
+  dependencies:
+    "@babel/helper-compilation-targets" "^7.17.7"
+    "@babel/helper-plugin-utils" "^7.16.7"
+    debug "^4.1.1"
+    lodash.debounce "^4.0.8"
+    resolve "^1.14.2"
+    semver "^6.1.2"
+
+"@babel/helper-environment-visitor@^7.18.9":
+  version "7.18.9"
+  resolved "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be"
+  integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==
+
+"@babel/helper-explode-assignable-expression@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096"
+  integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==
+  dependencies:
+    "@babel/types" "^7.18.6"
+
+"@babel/helper-function-name@^7.18.9":
+  version "7.18.9"
+  resolved "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz#940e6084a55dee867d33b4e487da2676365e86b0"
+  integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==
+  dependencies:
+    "@babel/template" "^7.18.6"
+    "@babel/types" "^7.18.9"
+
+"@babel/helper-hoist-variables@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678"
+  integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==
+  dependencies:
+    "@babel/types" "^7.18.6"
+
+"@babel/helper-member-expression-to-functions@^7.18.9":
+  version "7.18.9"
+  resolved "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815"
+  integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==
+  dependencies:
+    "@babel/types" "^7.18.9"
+
+"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e"
+  integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==
+  dependencies:
+    "@babel/types" "^7.18.6"
+
+"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.18.9":
+  version "7.18.9"
+  resolved "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz#5a1079c005135ed627442df31a42887e80fcb712"
+  integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==
+  dependencies:
+    "@babel/helper-environment-visitor" "^7.18.9"
+    "@babel/helper-module-imports" "^7.18.6"
+    "@babel/helper-simple-access" "^7.18.6"
+    "@babel/helper-split-export-declaration" "^7.18.6"
+    "@babel/helper-validator-identifier" "^7.18.6"
+    "@babel/template" "^7.18.6"
+    "@babel/traverse" "^7.18.9"
+    "@babel/types" "^7.18.9"
+
+"@babel/helper-optimise-call-expression@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe"
+  integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==
+  dependencies:
+    "@babel/types" "^7.18.6"
+
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
+  version "7.18.9"
+  resolved "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz#4b8aea3b069d8cb8a72cdfe28ddf5ceca695ef2f"
+  integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==
+
+"@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9":
+  version "7.18.9"
+  resolved "https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519"
+  integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.18.6"
+    "@babel/helper-environment-visitor" "^7.18.9"
+    "@babel/helper-wrap-function" "^7.18.9"
+    "@babel/types" "^7.18.9"
+
+"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.18.9":
+  version "7.18.9"
+  resolved "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.18.9.tgz#1092e002feca980fbbb0bd4d51b74a65c6a500e6"
+  integrity sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==
+  dependencies:
+    "@babel/helper-environment-visitor" "^7.18.9"
+    "@babel/helper-member-expression-to-functions" "^7.18.9"
+    "@babel/helper-optimise-call-expression" "^7.18.6"
+    "@babel/traverse" "^7.18.9"
+    "@babel/types" "^7.18.9"
+
+"@babel/helper-simple-access@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea"
+  integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==
+  dependencies:
+    "@babel/types" "^7.18.6"
+
+"@babel/helper-skip-transparent-expression-wrappers@^7.18.9":
+  version "7.18.9"
+  resolved "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz#778d87b3a758d90b471e7b9918f34a9a02eb5818"
+  integrity sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==
+  dependencies:
+    "@babel/types" "^7.18.9"
+
+"@babel/helper-split-export-declaration@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075"
+  integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==
+  dependencies:
+    "@babel/types" "^7.18.6"
+
+"@babel/helper-string-parser@^7.18.10":
+  version "7.18.10"
+  resolved "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56"
+  integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==
+
+"@babel/helper-validator-identifier@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076"
+  integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==
+
+"@babel/helper-validator-option@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8"
+  integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==
+
+"@babel/helper-wrap-function@^7.18.9":
+  version "7.18.11"
+  resolved "https://registry.npmmirror.com/@babel/helper-wrap-function/-/helper-wrap-function-7.18.11.tgz#bff23ace436e3f6aefb61f85ffae2291c80ed1fb"
+  integrity sha512-oBUlbv+rjZLh2Ks9SKi4aL7eKaAXBWleHzU89mP0G6BMUlRxSckk9tSIkgDGydhgFxHuGSlBQZfnaD47oBEB7w==
+  dependencies:
+    "@babel/helper-function-name" "^7.18.9"
+    "@babel/template" "^7.18.10"
+    "@babel/traverse" "^7.18.11"
+    "@babel/types" "^7.18.10"
+
+"@babel/helpers@^7.18.9":
+  version "7.18.9"
+  resolved "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.18.9.tgz#4bef3b893f253a1eced04516824ede94dcfe7ff9"
+  integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==
+  dependencies:
+    "@babel/template" "^7.18.6"
+    "@babel/traverse" "^7.18.9"
+    "@babel/types" "^7.18.9"
+
+"@babel/highlight@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf"
+  integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==
+  dependencies:
+    "@babel/helper-validator-identifier" "^7.18.6"
+    chalk "^2.0.0"
+    js-tokens "^4.0.0"
+
+"@babel/parser@^7.16.4", "@babel/parser@^7.18.10", "@babel/parser@^7.18.11":
+  version "7.18.11"
+  resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.18.11.tgz#68bb07ab3d380affa9a3f96728df07969645d2d9"
+  integrity sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==
+
+"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2"
+  integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9":
+  version "7.18.9"
+  resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz#a11af19aa373d68d561f08e0a57242350ed0ec50"
+  integrity sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.9"
+    "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9"
+    "@babel/plugin-proposal-optional-chaining" "^7.18.9"
+
+"@babel/plugin-proposal-async-generator-functions@^7.18.10":
+  version "7.18.10"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz#85ea478c98b0095c3e4102bff3b67d306ed24952"
+  integrity sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==
+  dependencies:
+    "@babel/helper-environment-visitor" "^7.18.9"
+    "@babel/helper-plugin-utils" "^7.18.9"
+    "@babel/helper-remap-async-to-generator" "^7.18.9"
+    "@babel/plugin-syntax-async-generators" "^7.8.4"
+
+"@babel/plugin-proposal-class-properties@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3"
+  integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==
+  dependencies:
+    "@babel/helper-create-class-features-plugin" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-proposal-class-static-block@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz#8aa81d403ab72d3962fc06c26e222dacfc9b9020"
+  integrity sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==
+  dependencies:
+    "@babel/helper-create-class-features-plugin" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/plugin-syntax-class-static-block" "^7.14.5"
+
+"@babel/plugin-proposal-dynamic-import@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94"
+  integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+
+"@babel/plugin-proposal-export-namespace-from@^7.18.9":
+  version "7.18.9"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203"
+  integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.9"
+    "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+
+"@babel/plugin-proposal-json-strings@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b"
+  integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/plugin-syntax-json-strings" "^7.8.3"
+
+"@babel/plugin-proposal-logical-assignment-operators@^7.18.9":
+  version "7.18.9"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz#8148cbb350483bf6220af06fa6db3690e14b2e23"
+  integrity sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.9"
+    "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+
+"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1"
+  integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+
+"@babel/plugin-proposal-numeric-separator@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75"
+  integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+
+"@babel/plugin-proposal-object-rest-spread@^7.18.9":
+  version "7.18.9"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz#f9434f6beb2c8cae9dfcf97d2a5941bbbf9ad4e7"
+  integrity sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==
+  dependencies:
+    "@babel/compat-data" "^7.18.8"
+    "@babel/helper-compilation-targets" "^7.18.9"
+    "@babel/helper-plugin-utils" "^7.18.9"
+    "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+    "@babel/plugin-transform-parameters" "^7.18.8"
+
+"@babel/plugin-proposal-optional-catch-binding@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb"
+  integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+
+"@babel/plugin-proposal-optional-chaining@^7.18.9":
+  version "7.18.9"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz#e8e8fe0723f2563960e4bf5e9690933691915993"
+  integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.9"
+    "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9"
+    "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+
+"@babel/plugin-proposal-private-methods@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea"
+  integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==
+  dependencies:
+    "@babel/helper-create-class-features-plugin" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-proposal-private-property-in-object@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz#a64137b232f0aca3733a67eb1a144c192389c503"
+  integrity sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.18.6"
+    "@babel/helper-create-class-features-plugin" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+
+"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e"
+  integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==
+  dependencies:
+    "@babel/helper-create-regexp-features-plugin" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-syntax-async-generators@^7.8.4":
+  version "7.8.4"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
+  integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-class-properties@^7.12.13":
+  version "7.12.13"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10"
+  integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-syntax-class-static-block@^7.14.5":
+  version "7.14.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406"
+  integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-dynamic-import@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
+  integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-export-namespace-from@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a"
+  integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.3"
+
+"@babel/plugin-syntax-import-assertions@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz#cd6190500a4fa2fe31990a963ffab4b63e4505e4"
+  integrity sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-syntax-import-meta@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51"
+  integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-json-strings@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
+  integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-jsx@^7.0.0":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0"
+  integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
+  integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
+  integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-numeric-separator@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
+  integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-object-rest-spread@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
+  integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-catch-binding@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
+  integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-chaining@^7.8.3":
+  version "7.8.3"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
+  integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-private-property-in-object@^7.14.5":
+  version "7.14.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad"
+  integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-top-level-await@^7.14.5":
+  version "7.14.5"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c"
+  integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-typescript@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz#1c09cd25795c7c2b8a4ba9ae49394576d4133285"
+  integrity sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-arrow-functions@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz#19063fcf8771ec7b31d742339dac62433d0611fe"
+  integrity sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-async-to-generator@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz#ccda3d1ab9d5ced5265fdb13f1882d5476c71615"
+  integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==
+  dependencies:
+    "@babel/helper-module-imports" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-remap-async-to-generator" "^7.18.6"
+
+"@babel/plugin-transform-block-scoped-functions@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8"
+  integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-block-scoping@^7.18.9":
+  version "7.18.9"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz#f9b7e018ac3f373c81452d6ada8bd5a18928926d"
+  integrity sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.9"
+
+"@babel/plugin-transform-classes@^7.18.9":
+  version "7.18.9"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.9.tgz#90818efc5b9746879b869d5ce83eb2aa48bbc3da"
+  integrity sha512-EkRQxsxoytpTlKJmSPYrsOMjCILacAjtSVkd4gChEe2kXjFCun3yohhW5I7plXJhCemM0gKsaGMcO8tinvCA5g==
+  dependencies:
+    "@babel/helper-annotate-as-pure" "^7.18.6"
+    "@babel/helper-environment-visitor" "^7.18.9"
+    "@babel/helper-function-name" "^7.18.9"
+    "@babel/helper-optimise-call-expression" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.18.9"
+    "@babel/helper-replace-supers" "^7.18.9"
+    "@babel/helper-split-export-declaration" "^7.18.6"
+    globals "^11.1.0"
+
+"@babel/plugin-transform-computed-properties@^7.18.9":
+  version "7.18.9"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz#2357a8224d402dad623caf6259b611e56aec746e"
+  integrity sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.9"
+
+"@babel/plugin-transform-destructuring@^7.18.9":
+  version "7.18.9"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.9.tgz#68906549c021cb231bee1db21d3b5b095f8ee292"
+  integrity sha512-p5VCYNddPLkZTq4XymQIaIfZNJwT9YsjkPOhkVEqt6QIpQFZVM9IltqqYpOEkJoN1DPznmxUDyZ5CTZs/ZCuHA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.9"
+
+"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8"
+  integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==
+  dependencies:
+    "@babel/helper-create-regexp-features-plugin" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-duplicate-keys@^7.18.9":
+  version "7.18.9"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e"
+  integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.9"
+
+"@babel/plugin-transform-exponentiation-operator@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd"
+  integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==
+  dependencies:
+    "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-for-of@^7.18.8":
+  version "7.18.8"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1"
+  integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-function-name@^7.18.9":
+  version "7.18.9"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0"
+  integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==
+  dependencies:
+    "@babel/helper-compilation-targets" "^7.18.9"
+    "@babel/helper-function-name" "^7.18.9"
+    "@babel/helper-plugin-utils" "^7.18.9"
+
+"@babel/plugin-transform-literals@^7.18.9":
+  version "7.18.9"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc"
+  integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.9"
+
+"@babel/plugin-transform-member-expression-literals@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e"
+  integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-modules-amd@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz#8c91f8c5115d2202f277549848874027d7172d21"
+  integrity sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==
+  dependencies:
+    "@babel/helper-module-transforms" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.18.6"
+    babel-plugin-dynamic-import-node "^2.3.3"
+
+"@babel/plugin-transform-modules-commonjs@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz#afd243afba166cca69892e24a8fd8c9f2ca87883"
+  integrity sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==
+  dependencies:
+    "@babel/helper-module-transforms" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-simple-access" "^7.18.6"
+    babel-plugin-dynamic-import-node "^2.3.3"
+
+"@babel/plugin-transform-modules-systemjs@^7.18.9":
+  version "7.18.9"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.9.tgz#545df284a7ac6a05125e3e405e536c5853099a06"
+  integrity sha512-zY/VSIbbqtoRoJKo2cDTewL364jSlZGvn0LKOf9ntbfxOvjfmyrdtEEOAdswOswhZEb8UH3jDkCKHd1sPgsS0A==
+  dependencies:
+    "@babel/helper-hoist-variables" "^7.18.6"
+    "@babel/helper-module-transforms" "^7.18.9"
+    "@babel/helper-plugin-utils" "^7.18.9"
+    "@babel/helper-validator-identifier" "^7.18.6"
+    babel-plugin-dynamic-import-node "^2.3.3"
+
+"@babel/plugin-transform-modules-umd@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9"
+  integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==
+  dependencies:
+    "@babel/helper-module-transforms" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-named-capturing-groups-regex@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz#c89bfbc7cc6805d692f3a49bc5fc1b630007246d"
+  integrity sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==
+  dependencies:
+    "@babel/helper-create-regexp-features-plugin" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-new-target@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8"
+  integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-object-super@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c"
+  integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.6"
+    "@babel/helper-replace-supers" "^7.18.6"
+
+"@babel/plugin-transform-parameters@^7.18.8":
+  version "7.18.8"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz#ee9f1a0ce6d78af58d0956a9378ea3427cccb48a"
+  integrity sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-property-literals@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3"
+  integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-regenerator@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz#585c66cb84d4b4bf72519a34cfce761b8676ca73"
+  integrity sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.6"
+    regenerator-transform "^0.15.0"
+
+"@babel/plugin-transform-reserved-words@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a"
+  integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-shorthand-properties@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9"
+  integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-spread@^7.18.9":
+  version "7.18.9"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.9.tgz#6ea7a6297740f381c540ac56caf75b05b74fb664"
+  integrity sha512-39Q814wyoOPtIB/qGopNIL9xDChOE1pNU0ZY5dO0owhiVt/5kFm4li+/bBtwc7QotG0u5EPzqhZdjMtmqBqyQA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.9"
+    "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9"
+
+"@babel/plugin-transform-sticky-regex@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc"
+  integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-template-literals@^7.18.9":
+  version "7.18.9"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e"
+  integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.9"
+
+"@babel/plugin-transform-typeof-symbol@^7.18.9":
+  version "7.18.9"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0"
+  integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.9"
+
+"@babel/plugin-transform-typescript@^7.16.8":
+  version "7.18.12"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.12.tgz#712e9a71b9e00fde9f8c0238e0cceee86ab2f8fd"
+  integrity sha512-2vjjam0cum0miPkenUbQswKowuxs/NjMwIKEq0zwegRxXk12C9YOF9STXnaUptITOtOJHKHpzvvWYOjbm6tc0w==
+  dependencies:
+    "@babel/helper-create-class-features-plugin" "^7.18.9"
+    "@babel/helper-plugin-utils" "^7.18.9"
+    "@babel/plugin-syntax-typescript" "^7.18.6"
+
+"@babel/plugin-transform-unicode-escapes@^7.18.10":
+  version "7.18.10"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246"
+  integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.18.9"
+
+"@babel/plugin-transform-unicode-regex@^7.18.6":
+  version "7.18.6"
+  resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca"
+  integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==
+  dependencies:
+    "@babel/helper-create-regexp-features-plugin" "^7.18.6"
+    "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/preset-env@^7.11.0":
+  version "7.18.10"
+  resolved "https://registry.npmmirror.com/@babel/preset-env/-/preset-env-7.18.10.tgz#83b8dfe70d7eea1aae5a10635ab0a5fe60dfc0f4"
+  integrity sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==
+  dependencies:
+    "@babel/compat-data" "^7.18.8"
+    "@babel/helper-compilation-targets" "^7.18.9"
+    "@babel/helper-plugin-utils" "^7.18.9"
+    "@babel/helper-validator-option" "^7.18.6"
+    "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6"
+    "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9"
+    "@babel/plugin-proposal-async-generator-functions" "^7.18.10"
+    "@babel/plugin-proposal-class-properties" "^7.18.6"
+    "@babel/plugin-proposal-class-static-block" "^7.18.6"
+    "@babel/plugin-proposal-dynamic-import" "^7.18.6"
+    "@babel/plugin-proposal-export-namespace-from" "^7.18.9"
+    "@babel/plugin-proposal-json-strings" "^7.18.6"
+    "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9"
+    "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6"
+    "@babel/plugin-proposal-numeric-separator" "^7.18.6"
+    "@babel/plugin-proposal-object-rest-spread" "^7.18.9"
+    "@babel/plugin-proposal-optional-catch-binding" "^7.18.6"
+    "@babel/plugin-proposal-optional-chaining" "^7.18.9"
+    "@babel/plugin-proposal-private-methods" "^7.18.6"
+    "@babel/plugin-proposal-private-property-in-object" "^7.18.6"
+    "@babel/plugin-proposal-unicode-property-regex" "^7.18.6"
+    "@babel/plugin-syntax-async-generators" "^7.8.4"
+    "@babel/plugin-syntax-class-properties" "^7.12.13"
+    "@babel/plugin-syntax-class-static-block" "^7.14.5"
+    "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+    "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+    "@babel/plugin-syntax-import-assertions" "^7.18.6"
+    "@babel/plugin-syntax-json-strings" "^7.8.3"
+    "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+    "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+    "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+    "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+    "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+    "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+    "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+    "@babel/plugin-syntax-top-level-await" "^7.14.5"
+    "@babel/plugin-transform-arrow-functions" "^7.18.6"
+    "@babel/plugin-transform-async-to-generator" "^7.18.6"
+    "@babel/plugin-transform-block-scoped-functions" "^7.18.6"
+    "@babel/plugin-transform-block-scoping" "^7.18.9"
+    "@babel/plugin-transform-classes" "^7.18.9"
+    "@babel/plugin-transform-computed-properties" "^7.18.9"
+    "@babel/plugin-transform-destructuring" "^7.18.9"
+    "@babel/plugin-transform-dotall-regex" "^7.18.6"
+    "@babel/plugin-transform-duplicate-keys" "^7.18.9"
+    "@babel/plugin-transform-exponentiation-operator" "^7.18.6"
+    "@babel/plugin-transform-for-of" "^7.18.8"
+    "@babel/plugin-transform-function-name" "^7.18.9"
+    "@babel/plugin-transform-literals" "^7.18.9"
+    "@babel/plugin-transform-member-expression-literals" "^7.18.6"
+    "@babel/plugin-transform-modules-amd" "^7.18.6"
+    "@babel/plugin-transform-modules-commonjs" "^7.18.6"
+    "@babel/plugin-transform-modules-systemjs" "^7.18.9"
+    "@babel/plugin-transform-modules-umd" "^7.18.6"
+    "@babel/plugin-transform-named-capturing-groups-regex" "^7.18.6"
+    "@babel/plugin-transform-new-target" "^7.18.6"
+    "@babel/plugin-transform-object-super" "^7.18.6"
+    "@babel/plugin-transform-parameters" "^7.18.8"
+    "@babel/plugin-transform-property-literals" "^7.18.6"
+    "@babel/plugin-transform-regenerator" "^7.18.6"
+    "@babel/plugin-transform-reserved-words" "^7.18.6"
+    "@babel/plugin-transform-shorthand-properties" "^7.18.6"
+    "@babel/plugin-transform-spread" "^7.18.9"
+    "@babel/plugin-transform-sticky-regex" "^7.18.6"
+    "@babel/plugin-transform-template-literals" "^7.18.9"
+    "@babel/plugin-transform-typeof-symbol" "^7.18.9"
+    "@babel/plugin-transform-unicode-escapes" "^7.18.10"
+    "@babel/plugin-transform-unicode-regex" "^7.18.6"
+    "@babel/preset-modules" "^0.1.5"
+    "@babel/types" "^7.18.10"
+    babel-plugin-polyfill-corejs2 "^0.3.2"
+    babel-plugin-polyfill-corejs3 "^0.5.3"
+    babel-plugin-polyfill-regenerator "^0.4.0"
+    core-js-compat "^3.22.1"
+    semver "^6.3.0"
+
+"@babel/preset-modules@^0.1.5":
+  version "0.1.5"
+  resolved "https://registry.npmmirror.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9"
+  integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/plugin-proposal-unicode-property-regex" "^7.4.4"
+    "@babel/plugin-transform-dotall-regex" "^7.4.4"
+    "@babel/types" "^7.4.4"
+    esutils "^2.0.2"
+
+"@babel/runtime@^7.10.5", "@babel/runtime@^7.11.2", "@babel/runtime@^7.8.4":
+  version "7.18.9"
+  resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.18.9.tgz#b4fcfce55db3d2e5e080d2490f608a3b9f407f4a"
+  integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==
+  dependencies:
+    regenerator-runtime "^0.13.4"
+
+"@babel/standalone@^7.17.11":
+  version "7.18.12"
+  resolved "https://registry.npmmirror.com/@babel/standalone/-/standalone-7.18.12.tgz#4c0abdf1b5213394e73a0ba5500dcc287194a20d"
+  integrity sha512-wDh3K5IUJiSMAY0MLYBFoCaj2RCZwvDz5BHn2uHat9KOsGWEVDFgFQFIOO+81Js2phFKNppLC45iOCsZVfJniw==
+
+"@babel/template@^7.0.0", "@babel/template@^7.18.10", "@babel/template@^7.18.6":
+  version "7.18.10"
+  resolved "https://registry.npmmirror.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71"
+  integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==
+  dependencies:
+    "@babel/code-frame" "^7.18.6"
+    "@babel/parser" "^7.18.10"
+    "@babel/types" "^7.18.10"
+
+"@babel/traverse@^7.0.0", "@babel/traverse@^7.18.10", "@babel/traverse@^7.18.11", "@babel/traverse@^7.18.9":
+  version "7.18.11"
+  resolved "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.18.11.tgz#3d51f2afbd83ecf9912bcbb5c4d94e3d2ddaa16f"
+  integrity sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ==
+  dependencies:
+    "@babel/code-frame" "^7.18.6"
+    "@babel/generator" "^7.18.10"
+    "@babel/helper-environment-visitor" "^7.18.9"
+    "@babel/helper-function-name" "^7.18.9"
+    "@babel/helper-hoist-variables" "^7.18.6"
+    "@babel/helper-split-export-declaration" "^7.18.6"
+    "@babel/parser" "^7.18.11"
+    "@babel/types" "^7.18.10"
+    debug "^4.1.0"
+    globals "^11.1.0"
+
+"@babel/types@^7.0.0", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.4.4":
+  version "7.18.10"
+  resolved "https://registry.npmmirror.com/@babel/types/-/types-7.18.10.tgz#4908e81b6b339ca7c6b7a555a5fc29446f26dde6"
+  integrity sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==
+  dependencies:
+    "@babel/helper-string-parser" "^7.18.10"
+    "@babel/helper-validator-identifier" "^7.18.6"
+    to-fast-properties "^2.0.0"
+
+"@commitlint/cli@^16.2.3":
+  version "16.3.0"
+  resolved "https://registry.npmmirror.com/@commitlint/cli/-/cli-16.3.0.tgz#5689f5c2abbb7880d5ff13329251e5648a784b16"
+  integrity sha512-P+kvONlfsuTMnxSwWE1H+ZcPMY3STFaHb2kAacsqoIkNx66O0T7sTpBxpxkMrFPyhkJiLJnJWMhk4bbvYD3BMA==
+  dependencies:
+    "@commitlint/format" "^16.2.1"
+    "@commitlint/lint" "^16.2.4"
+    "@commitlint/load" "^16.3.0"
+    "@commitlint/read" "^16.2.1"
+    "@commitlint/types" "^16.2.1"
+    lodash "^4.17.19"
+    resolve-from "5.0.0"
+    resolve-global "1.0.0"
+    yargs "^17.0.0"
+
+"@commitlint/config-conventional@^16.2.1":
+  version "16.2.4"
+  resolved "https://registry.npmmirror.com/@commitlint/config-conventional/-/config-conventional-16.2.4.tgz#56647108c89ed06fc5271242787550331988c0fb"
+  integrity sha512-av2UQJa3CuE5P0dzxj/o/B9XVALqYzEViHrMXtDrW9iuflrqCStWBAioijppj9URyz6ONpohJKAtSdgAOE0gkA==
+  dependencies:
+    conventional-changelog-conventionalcommits "^4.3.1"
+
+"@commitlint/config-validator@^16.2.1":
+  version "16.2.1"
+  resolved "https://registry.npmmirror.com/@commitlint/config-validator/-/config-validator-16.2.1.tgz#794e769afd4756e4cf1bfd823b6612932e39c56d"
+  integrity sha512-hogSe0WGg7CKmp4IfNbdNES3Rq3UEI4XRPB8JL4EPgo/ORq5nrGTVzxJh78omibNuB8Ho4501Czb1Er1MoDWpw==
+  dependencies:
+    "@commitlint/types" "^16.2.1"
+    ajv "^6.12.6"
+
+"@commitlint/ensure@^16.2.1":
+  version "16.2.1"
+  resolved "https://registry.npmmirror.com/@commitlint/ensure/-/ensure-16.2.1.tgz#0fc538173f95c1eb2694eeedb79cab478347f16f"
+  integrity sha512-/h+lBTgf1r5fhbDNHOViLuej38i3rZqTQnBTk+xEg+ehOwQDXUuissQ5GsYXXqI5uGy+261ew++sT4EA3uBJ+A==
+  dependencies:
+    "@commitlint/types" "^16.2.1"
+    lodash "^4.17.19"
+
+"@commitlint/execute-rule@^16.2.1":
+  version "16.2.1"
+  resolved "https://registry.npmmirror.com/@commitlint/execute-rule/-/execute-rule-16.2.1.tgz#60be73be4b9af97a41546e7ce59fdd33787c65f8"
+  integrity sha512-oSls82fmUTLM6cl5V3epdVo4gHhbmBFvCvQGHBRdQ50H/690Uq1Dyd7hXMuKITCIdcnr9umyDkr8r5C6HZDF3g==
+
+"@commitlint/format@^16.2.1":
+  version "16.2.1"
+  resolved "https://registry.npmmirror.com/@commitlint/format/-/format-16.2.1.tgz#6e673f710c799be78e68b2682323e04f75080d07"
+  integrity sha512-Yyio9bdHWmNDRlEJrxHKglamIk3d6hC0NkEUW6Ti6ipEh2g0BAhy8Od6t4vLhdZRa1I2n+gY13foy+tUgk0i1Q==
+  dependencies:
+    "@commitlint/types" "^16.2.1"
+    chalk "^4.0.0"
+
+"@commitlint/is-ignored@^16.2.4":
+  version "16.2.4"
+  resolved "https://registry.npmmirror.com/@commitlint/is-ignored/-/is-ignored-16.2.4.tgz#369e40a240ad5451bf2b57a80829253129d7f19b"
+  integrity sha512-Lxdq9aOAYCOOOjKi58ulbwK/oBiiKz+7Sq0+/SpFIEFwhHkIVugvDvWjh2VRBXmRC/x5lNcjDcYEwS/uYUvlYQ==
+  dependencies:
+    "@commitlint/types" "^16.2.1"
+    semver "7.3.7"
+
+"@commitlint/lint@^16.2.4":
+  version "16.2.4"
+  resolved "https://registry.npmmirror.com/@commitlint/lint/-/lint-16.2.4.tgz#575f5a9d227dddfca8386253d9aff27be5b94788"
+  integrity sha512-AUDuwOxb2eGqsXbTMON3imUGkc1jRdtXrbbohiLSCSk3jFVXgJLTMaEcr39pR00N8nE9uZ+V2sYaiILByZVmxQ==
+  dependencies:
+    "@commitlint/is-ignored" "^16.2.4"
+    "@commitlint/parse" "^16.2.1"
+    "@commitlint/rules" "^16.2.4"
+    "@commitlint/types" "^16.2.1"
+
+"@commitlint/load@^16.3.0":
+  version "16.3.0"
+  resolved "https://registry.npmmirror.com/@commitlint/load/-/load-16.3.0.tgz#e674ccc9edefd64a2d8b82d175de81ec3bb70eca"
+  integrity sha512-3tykjV/iwbkv2FU9DG+NZ/JqmP0Nm3b7aDwgCNQhhKV5P74JAuByULkafnhn+zsFGypG1qMtI5u+BZoa9APm0A==
+  dependencies:
+    "@commitlint/config-validator" "^16.2.1"
+    "@commitlint/execute-rule" "^16.2.1"
+    "@commitlint/resolve-extends" "^16.2.1"
+    "@commitlint/types" "^16.2.1"
+    "@types/node" ">=12"
+    chalk "^4.0.0"
+    cosmiconfig "^7.0.0"
+    cosmiconfig-typescript-loader "^2.0.0"
+    lodash "^4.17.19"
+    resolve-from "^5.0.0"
+    typescript "^4.4.3"
+
+"@commitlint/message@^16.2.1":
+  version "16.2.1"
+  resolved "https://registry.npmmirror.com/@commitlint/message/-/message-16.2.1.tgz#bc6a0fa446a746ac2ca78cf372e4cec48daf620d"
+  integrity sha512-2eWX/47rftViYg7a3axYDdrgwKv32mxbycBJT6OQY/MJM7SUfYNYYvbMFOQFaA4xIVZt7t2Alyqslbl6blVwWw==
+
+"@commitlint/parse@^16.2.1":
+  version "16.2.1"
+  resolved "https://registry.npmmirror.com/@commitlint/parse/-/parse-16.2.1.tgz#50b359cb711ec566d2ee236a8e4c6baca07b77c0"
+  integrity sha512-2NP2dDQNL378VZYioLrgGVZhWdnJO4nAxQl5LXwYb08nEcN+cgxHN1dJV8OLJ5uxlGJtDeR8UZZ1mnQ1gSAD/g==
+  dependencies:
+    "@commitlint/types" "^16.2.1"
+    conventional-changelog-angular "^5.0.11"
+    conventional-commits-parser "^3.2.2"
+
+"@commitlint/read@^16.2.1":
+  version "16.2.1"
+  resolved "https://registry.npmmirror.com/@commitlint/read/-/read-16.2.1.tgz#e0539205d77cdb6879b560f95e5fb251e0c6f562"
+  integrity sha512-tViXGuaxLTrw2r7PiYMQOFA2fueZxnnt0lkOWqKyxT+n2XdEMGYcI9ID5ndJKXnfPGPppD0w/IItKsIXlZ+alw==
+  dependencies:
+    "@commitlint/top-level" "^16.2.1"
+    "@commitlint/types" "^16.2.1"
+    fs-extra "^10.0.0"
+    git-raw-commits "^2.0.0"
+
+"@commitlint/resolve-extends@^16.2.1":
+  version "16.2.1"
+  resolved "https://registry.npmmirror.com/@commitlint/resolve-extends/-/resolve-extends-16.2.1.tgz#2f7833a5a3a7aa79f508e59fcb0f1d33c45ed360"
+  integrity sha512-NbbCMPKTFf2J805kwfP9EO+vV+XvnaHRcBy6ud5dF35dxMsvdJqke54W3XazXF1ZAxC4a3LBy4i/GNVBAthsEg==
+  dependencies:
+    "@commitlint/config-validator" "^16.2.1"
+    "@commitlint/types" "^16.2.1"
+    import-fresh "^3.0.0"
+    lodash "^4.17.19"
+    resolve-from "^5.0.0"
+    resolve-global "^1.0.0"
+
+"@commitlint/rules@^16.2.4":
+  version "16.2.4"
+  resolved "https://registry.npmmirror.com/@commitlint/rules/-/rules-16.2.4.tgz#c2fbbf20d9d0e8fcf25690c88a27750d4a3e867b"
+  integrity sha512-rK5rNBIN2ZQNQK+I6trRPK3dWa0MtaTN4xnwOma1qxa4d5wQMQJtScwTZjTJeallFxhOgbNOgr48AMHkdounVg==
+  dependencies:
+    "@commitlint/ensure" "^16.2.1"
+    "@commitlint/message" "^16.2.1"
+    "@commitlint/to-lines" "^16.2.1"
+    "@commitlint/types" "^16.2.1"
+    execa "^5.0.0"
+
+"@commitlint/to-lines@^16.2.1":
+  version "16.2.1"
+  resolved "https://registry.npmmirror.com/@commitlint/to-lines/-/to-lines-16.2.1.tgz#42d000f34dc0406f514991e86237fdab5e8affd0"
+  integrity sha512-9/VjpYj5j1QeY3eiog1zQWY6axsdWAc0AonUUfyZ7B0MVcRI0R56YsHAfzF6uK/g/WwPZaoe4Lb1QCyDVnpVaQ==
+
+"@commitlint/top-level@^16.2.1":
+  version "16.2.1"
+  resolved "https://registry.npmmirror.com/@commitlint/top-level/-/top-level-16.2.1.tgz#bdaa53ab3d8970e0288879f1a342a8c2dfe01583"
+  integrity sha512-lS6GSieHW9y6ePL73ied71Z9bOKyK+Ib9hTkRsB8oZFAyQZcyRwq2w6nIa6Fngir1QW51oKzzaXfJL94qwImyw==
+  dependencies:
+    find-up "^5.0.0"
+
+"@commitlint/types@^16.2.1":
+  version "16.2.1"
+  resolved "https://registry.npmmirror.com/@commitlint/types/-/types-16.2.1.tgz#f25d373b88b01e51fc3fa44488101361945a61bd"
+  integrity sha512-7/z7pA7BM0i8XvMSBynO7xsB3mVQPUZbVn6zMIlp/a091XJ3qAXRXc+HwLYhiIdzzS5fuxxNIHZMGHVD4HJxdA==
+  dependencies:
+    chalk "^4.0.0"
+
+"@cspotcode/source-map-support@^0.8.0":
+  version "0.8.1"
+  resolved "https://registry.npmmirror.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1"
+  integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==
+  dependencies:
+    "@jridgewell/trace-mapping" "0.3.9"
+
+"@csstools/selector-specificity@^2.0.2":
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz#1bfafe4b7ed0f3e4105837e056e0a89b108ebe36"
+  integrity sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==
+
+"@ctrl/tinycolor@^3.4.0":
+  version "3.4.1"
+  resolved "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.4.1.tgz#75b4c27948c81e88ccd3a8902047bcd797f38d32"
+  integrity sha512-ej5oVy6lykXsvieQtqZxCOaLT+xD4+QNarq78cIYISHmZXshCvROLudpQN3lfL8G0NL7plMSSK+zlyvCaIJ4Iw==
+
+"@esbuild/linux-loong64@0.14.54":
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz#de2a4be678bd4d0d1ffbb86e6de779cde5999028"
+  integrity sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==
+
+"@esbuild/linux-loong64@0.15.5":
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.15.5.tgz#91aef76d332cdc7c8942b600fa2307f3387e6f82"
+  integrity sha512-UHkDFCfSGTuXq08oQltXxSZmH1TXyWsL+4QhZDWvvLl6mEJQqk3u7/wq1LjhrrAXYIllaTtRSzUXl4Olkf2J8A==
+
+"@eslint/eslintrc@^1.3.0":
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f"
+  integrity sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==
+  dependencies:
+    ajv "^6.12.4"
+    debug "^4.3.2"
+    espree "^9.3.2"
+    globals "^13.15.0"
+    ignore "^5.2.0"
+    import-fresh "^3.2.1"
+    js-yaml "^4.1.0"
+    minimatch "^3.1.2"
+    strip-json-comments "^3.1.1"
+
+"@humanwhocodes/config-array@^0.10.4":
+  version "0.10.4"
+  resolved "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.10.4.tgz#01e7366e57d2ad104feea63e72248f22015c520c"
+  integrity sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==
+  dependencies:
+    "@humanwhocodes/object-schema" "^1.2.1"
+    debug "^4.1.1"
+    minimatch "^3.0.4"
+
+"@humanwhocodes/gitignore-to-minimatch@^1.0.2":
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz#316b0a63b91c10e53f242efb4ace5c3b34e8728d"
+  integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==
+
+"@humanwhocodes/object-schema@^1.2.1":
+  version "1.2.1"
+  resolved "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
+  integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
+
+"@hutson/parse-repository-url@^3.0.0":
+  version "3.0.2"
+  resolved "https://registry.npmmirror.com/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340"
+  integrity sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==
+
+"@iconify/iconify@2.1.2":
+  version "2.1.2"
+  resolved "https://registry.npmmirror.com/@iconify/iconify/-/iconify-2.1.2.tgz#978e8f08c3b834816c82ae2933b3a70f143f7685"
+  integrity sha512-QcUzFeEWkE/mW+BVtEGmcWATClcCOIJFiYUD/PiCWuTcdEA297o8D4oN6Ra44WrNOHu1wqNW4J0ioaDIiqaFOQ==
+  dependencies:
+    cross-fetch "^3.1.5"
+
+"@iconify/iconify@>=2.0.0-rc.6", "@iconify/iconify@^2.2.1":
+  version "2.2.1"
+  resolved "https://registry.npmmirror.com/@iconify/iconify/-/iconify-2.2.1.tgz#03ad4d8554c6f2d7741d3b9440115efa0c707b37"
+  integrity sha512-WJzw+3iicrF/tbjbxxRinSgy5FHdJoz/egTqwi3xCDkNRJPq482RX1iyaWrjNuY2vMNSPkQMuqHvZDXgA+WnwQ==
+
+"@iconify/json@^2.1.30":
+  version "2.1.95"
+  resolved "https://registry.npmmirror.com/@iconify/json/-/json-2.1.95.tgz#23d9a0ee495e28d62116f89dc02eef6a74a2fe4d"
+  integrity sha512-ZlcUDRO0UBVw50Eya08vZx7fjZ2YcckncF3oqKP3YDvLHheO2YdulrXQJMvahPQ8+E87ybkDqudPLrXg+12Ihw==
+  dependencies:
+    "@iconify/types" "*"
+    pathe "^0.3.0"
+
+"@iconify/types@*":
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/@iconify/types/-/types-1.1.0.tgz#dc15fc988b1b3fd558dd140a24ede7e0aac11280"
+  integrity sha512-Jh0llaK2LRXQoYsorIH8maClebsnzTcve+7U3rQUSnC11X4jtPnFuyatqFLvMxZ8MLG8dB4zfHsbPfuvxluONw==
+
+"@intlify/core-base@9.2.2":
+  version "9.2.2"
+  resolved "https://registry.npmmirror.com/@intlify/core-base/-/core-base-9.2.2.tgz#5353369b05cc9fe35cab95fe20afeb8a4481f939"
+  integrity sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==
+  dependencies:
+    "@intlify/devtools-if" "9.2.2"
+    "@intlify/message-compiler" "9.2.2"
+    "@intlify/shared" "9.2.2"
+    "@intlify/vue-devtools" "9.2.2"
+
+"@intlify/devtools-if@9.2.2":
+  version "9.2.2"
+  resolved "https://registry.npmmirror.com/@intlify/devtools-if/-/devtools-if-9.2.2.tgz#b13d9ac4b4e2fe6d2e7daa556517a8061fe8bd39"
+  integrity sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==
+  dependencies:
+    "@intlify/shared" "9.2.2"
+
+"@intlify/message-compiler@9.2.2":
+  version "9.2.2"
+  resolved "https://registry.npmmirror.com/@intlify/message-compiler/-/message-compiler-9.2.2.tgz#e42ab6939b8ae5b3d21faf6a44045667a18bba1c"
+  integrity sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==
+  dependencies:
+    "@intlify/shared" "9.2.2"
+    source-map "0.6.1"
+
+"@intlify/shared@9.2.2":
+  version "9.2.2"
+  resolved "https://registry.npmmirror.com/@intlify/shared/-/shared-9.2.2.tgz#5011be9ca2b4ab86f8660739286e2707f9abb4a5"
+  integrity sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==
+
+"@intlify/vue-devtools@9.2.2":
+  version "9.2.2"
+  resolved "https://registry.npmmirror.com/@intlify/vue-devtools/-/vue-devtools-9.2.2.tgz#b95701556daf7ebb3a2d45aa3ae9e6415aed8317"
+  integrity sha512-+dUyqyCHWHb/UcvY1MlIpO87munedm3Gn6E9WWYdWrMuYLcoIoOEVDWSS8xSwtlPU+kA+MEQTP6Q1iI/ocusJg==
+  dependencies:
+    "@intlify/core-base" "9.2.2"
+    "@intlify/shared" "9.2.2"
+
+"@jridgewell/gen-mapping@^0.1.0":
+  version "0.1.1"
+  resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996"
+  integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==
+  dependencies:
+    "@jridgewell/set-array" "^1.0.0"
+    "@jridgewell/sourcemap-codec" "^1.4.10"
+
+"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2":
+  version "0.3.2"
+  resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9"
+  integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==
+  dependencies:
+    "@jridgewell/set-array" "^1.0.1"
+    "@jridgewell/sourcemap-codec" "^1.4.10"
+    "@jridgewell/trace-mapping" "^0.3.9"
+
+"@jridgewell/resolve-uri@^3.0.3":
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
+  integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
+
+"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1":
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
+  integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
+
+"@jridgewell/source-map@^0.3.2":
+  version "0.3.2"
+  resolved "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb"
+  integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==
+  dependencies:
+    "@jridgewell/gen-mapping" "^0.3.0"
+    "@jridgewell/trace-mapping" "^0.3.9"
+
+"@jridgewell/sourcemap-codec@^1.4.10":
+  version "1.4.14"
+  resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
+  integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
+
+"@jridgewell/trace-mapping@0.3.9":
+  version "0.3.9"
+  resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9"
+  integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==
+  dependencies:
+    "@jridgewell/resolve-uri" "^3.0.3"
+    "@jridgewell/sourcemap-codec" "^1.4.10"
+
+"@jridgewell/trace-mapping@^0.3.9":
+  version "0.3.15"
+  resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz#aba35c48a38d3fd84b37e66c9c0423f9744f9774"
+  integrity sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==
+  dependencies:
+    "@jridgewell/resolve-uri" "^3.0.3"
+    "@jridgewell/sourcemap-codec" "^1.4.10"
+
+"@logicflow/core@^1.1.13", "@logicflow/core@^1.1.25":
+  version "1.1.25"
+  resolved "https://registry.npmmirror.com/@logicflow/core/-/core-1.1.25.tgz#e9140e9e871cb728126870f6d0e8ff176d265599"
+  integrity sha512-qlsNKaKTLqJ94srwalmn/jpQ+l6vg/qNg9HH0rmobVSO7rpLa9aV6GsC0X1fN5y7VQpbnG2Zcs9QnYn5HtS6AA==
+  dependencies:
+    "@types/mousetrap" "^1.6.4"
+    mousetrap "^1.6.5"
+    preact "^10.4.8"
+
+"@logicflow/extension@^1.1.13":
+  version "1.1.25"
+  resolved "https://registry.npmmirror.com/@logicflow/extension/-/extension-1.1.25.tgz#4102d1d79ea050266bf621adf2ef05b4d0d4c0d9"
+  integrity sha512-IE/AhcCJKMYtSTEdH7YHWqArNfLJH0vnoRJ4q7HjbdAjQD6m8XgyG25ArF4lh/d4NUqCzts/AgqB9Fdp83OHcQ==
+  dependencies:
+    "@logicflow/core" "^1.1.25"
+    ids "^1.0.0"
+    preact "^10.4.8"
+
+"@nodelib/fs.scandir@2.1.5":
+  version "2.1.5"
+  resolved "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
+  integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
+  dependencies:
+    "@nodelib/fs.stat" "2.0.5"
+    run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
+  version "2.0.5"
+  resolved "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
+  integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
+
+"@nodelib/fs.walk@^1.2.3":
+  version "1.2.8"
+  resolved "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
+  integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
+  dependencies:
+    "@nodelib/fs.scandir" "2.1.5"
+    fastq "^1.6.0"
+
+"@octokit/auth-token@^3.0.0":
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/@octokit/auth-token/-/auth-token-3.0.1.tgz#88bc2baf5d706cb258474e722a720a8365dff2ec"
+  integrity sha512-/USkK4cioY209wXRpund6HZzHo9GmjakpV9ycOkpMcMxMk7QVcVFVyCMtzvXYiHsB2crgDgrtNYSELYFBXhhaA==
+  dependencies:
+    "@octokit/types" "^7.0.0"
+
+"@octokit/core@^4.0.0":
+  version "4.0.5"
+  resolved "https://registry.npmmirror.com/@octokit/core/-/core-4.0.5.tgz#589e68c0a35d2afdcd41dafceab072c2fbc6ab5f"
+  integrity sha512-4R3HeHTYVHCfzSAi0C6pbGXV8UDI5Rk+k3G7kLVNckswN9mvpOzW9oENfjfH3nEmzg8y3AmKmzs8Sg6pLCeOCA==
+  dependencies:
+    "@octokit/auth-token" "^3.0.0"
+    "@octokit/graphql" "^5.0.0"
+    "@octokit/request" "^6.0.0"
+    "@octokit/request-error" "^3.0.0"
+    "@octokit/types" "^7.0.0"
+    before-after-hook "^2.2.0"
+    universal-user-agent "^6.0.0"
+
+"@octokit/endpoint@^7.0.0":
+  version "7.0.1"
+  resolved "https://registry.npmmirror.com/@octokit/endpoint/-/endpoint-7.0.1.tgz#cb0d03e62e8762f3c80e52b025179de81899a823"
+  integrity sha512-/wTXAJwt0HzJ2IeE4kQXO+mBScfzyCkI0hMtkIaqyXd9zg76OpOfNQfHL9FlaxAV2RsNiOXZibVWloy8EexENg==
+  dependencies:
+    "@octokit/types" "^7.0.0"
+    is-plain-object "^5.0.0"
+    universal-user-agent "^6.0.0"
+
+"@octokit/graphql@^5.0.0":
+  version "5.0.1"
+  resolved "https://registry.npmmirror.com/@octokit/graphql/-/graphql-5.0.1.tgz#a06982514ad131fb6fbb9da968653b2233fade9b"
+  integrity sha512-sxmnewSwAixkP1TrLdE6yRG53eEhHhDTYUykUwdV9x8f91WcbhunIHk9x1PZLALdBZKRPUO2HRcm4kezZ79HoA==
+  dependencies:
+    "@octokit/request" "^6.0.0"
+    "@octokit/types" "^7.0.0"
+    universal-user-agent "^6.0.0"
+
+"@octokit/openapi-types@^13.4.0":
+  version "13.4.0"
+  resolved "https://registry.npmmirror.com/@octokit/openapi-types/-/openapi-types-13.4.0.tgz#06fe8fda93bf21bdd397fe7ef8805249efda6c06"
+  integrity sha512-2mVzW0X1+HDO3jF80/+QFZNzJiTefELKbhMu6yaBYbp/1gSMkVDm4rT472gJljTokWUlXaaE63m7WrWENhMDLw==
+
+"@octokit/plugin-paginate-rest@^4.0.0":
+  version "4.1.0"
+  resolved "https://registry.npmmirror.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-4.1.0.tgz#670ac9ac369448c69a2371bfcd7e2b37d95534f2"
+  integrity sha512-2O5K5fpajYG5g62wjzHR7/cWYaCA88CextAW3vFP+yoIHD0KEdlVMHfM5/i5LyV+JMmqiYW7w5qfg46FR+McNw==
+  dependencies:
+    "@octokit/types" "^7.1.1"
+
+"@octokit/plugin-request-log@^1.0.4":
+  version "1.0.4"
+  resolved "https://registry.npmmirror.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz#5e50ed7083a613816b1e4a28aeec5fb7f1462e85"
+  integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==
+
+"@octokit/plugin-rest-endpoint-methods@^6.0.0":
+  version "6.3.0"
+  resolved "https://registry.npmmirror.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.3.0.tgz#81549334ce020169b84bd4a7fa2577e9d725d829"
+  integrity sha512-qEu2wn6E7hqluZwIEUnDxWROvKjov3zMIAi4H4d7cmKWNMeBprEXZzJe8pE5eStUYC1ysGhD0B7L6IeG1Rfb+g==
+  dependencies:
+    "@octokit/types" "^7.0.0"
+    deprecation "^2.3.1"
+
+"@octokit/request-error@^3.0.0":
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/@octokit/request-error/-/request-error-3.0.1.tgz#3fd747913c06ab2195e52004a521889dadb4b295"
+  integrity sha512-ym4Bp0HTP7F3VFssV88WD1ZyCIRoE8H35pXSKwLeMizcdZAYc/t6N9X9Yr9n6t3aG9IH75XDnZ6UeZph0vHMWQ==
+  dependencies:
+    "@octokit/types" "^7.0.0"
+    deprecation "^2.0.0"
+    once "^1.4.0"
+
+"@octokit/request@^6.0.0":
+  version "6.2.1"
+  resolved "https://registry.npmmirror.com/@octokit/request/-/request-6.2.1.tgz#3ceeb22dab09a29595d96594b6720fc14495cf4e"
+  integrity sha512-gYKRCia3cpajRzDSU+3pt1q2OcuC6PK8PmFIyxZDWCzRXRSIBH8jXjFJ8ZceoygBIm0KsEUg4x1+XcYBz7dHPQ==
+  dependencies:
+    "@octokit/endpoint" "^7.0.0"
+    "@octokit/request-error" "^3.0.0"
+    "@octokit/types" "^7.0.0"
+    is-plain-object "^5.0.0"
+    node-fetch "^2.6.7"
+    universal-user-agent "^6.0.0"
+
+"@octokit/rest@^19.0.3":
+  version "19.0.4"
+  resolved "https://registry.npmmirror.com/@octokit/rest/-/rest-19.0.4.tgz#fd8bed1cefffa486e9ae46a9dc608ce81bcfcbdd"
+  integrity sha512-LwG668+6lE8zlSYOfwPj4FxWdv/qFXYBpv79TWIQEpBLKA9D/IMcWsF/U9RGpA3YqMVDiTxpgVpEW3zTFfPFTA==
+  dependencies:
+    "@octokit/core" "^4.0.0"
+    "@octokit/plugin-paginate-rest" "^4.0.0"
+    "@octokit/plugin-request-log" "^1.0.4"
+    "@octokit/plugin-rest-endpoint-methods" "^6.0.0"
+
+"@octokit/types@^7.0.0", "@octokit/types@^7.1.1":
+  version "7.1.1"
+  resolved "https://registry.npmmirror.com/@octokit/types/-/types-7.1.1.tgz#a30fd6ca3279d59d532fa75583d65d93b7588e6d"
+  integrity sha512-Dx6cNTORyVaKY0Yeb9MbHksk79L8GXsihbG6PtWqTpkyA2TY1qBWE26EQXVG3dHwY9Femdd/WEeRUEiD0+H3TQ==
+  dependencies:
+    "@octokit/openapi-types" "^13.4.0"
+
+"@purge-icons/core@^0.8.0":
+  version "0.8.0"
+  resolved "https://registry.npmmirror.com/@purge-icons/core/-/core-0.8.0.tgz#4b7394cad2bc63404095254a22551a928df8e3f6"
+  integrity sha512-8L6hP1U9XQO5B7kvquVJ5N7jzFvO0LZLXhBCjUQzzJzi42i6MAUanVKROApqbBuh21o9tmPwvNUg0xPe/uftRA==
+  dependencies:
+    "@iconify/iconify" "2.1.2"
+    axios "^0.26.0"
+    debug "^4.3.3"
+    fast-glob "^3.2.11"
+    fs-extra "^10.0.1"
+
+"@purge-icons/generated@^0.8.1":
+  version "0.8.1"
+  resolved "https://registry.npmmirror.com/@purge-icons/generated/-/generated-0.8.1.tgz#15544a9c9b2436e436d884828077f9d88df660e7"
+  integrity sha512-rIExGA33EGKEToqtc8WfpboaR7or1XRp+KV1Y5v/P0Rq7G5Me95DmP3ow/MpG7ql+XZ9xPzyS2naGRx5358+6Q==
+  dependencies:
+    "@iconify/iconify" ">=2.0.0-rc.6"
+
+"@rollup/plugin-babel@^5.2.0":
+  version "5.3.1"
+  resolved "https://registry.npmmirror.com/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz#04bc0608f4aa4b2e4b1aebf284344d0f68fda283"
+  integrity sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==
+  dependencies:
+    "@babel/helper-module-imports" "^7.10.4"
+    "@rollup/pluginutils" "^3.1.0"
+
+"@rollup/plugin-node-resolve@^11.2.1":
+  version "11.2.1"
+  resolved "https://registry.npmmirror.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz#82aa59397a29cd4e13248b106e6a4a1880362a60"
+  integrity sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==
+  dependencies:
+    "@rollup/pluginutils" "^3.1.0"
+    "@types/resolve" "1.17.1"
+    builtin-modules "^3.1.0"
+    deepmerge "^4.2.2"
+    is-module "^1.0.0"
+    resolve "^1.19.0"
+
+"@rollup/plugin-node-resolve@^13.0.4":
+  version "13.3.0"
+  resolved "https://registry.npmmirror.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz#da1c5c5ce8316cef96a2f823d111c1e4e498801c"
+  integrity sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==
+  dependencies:
+    "@rollup/pluginutils" "^3.1.0"
+    "@types/resolve" "1.17.1"
+    deepmerge "^4.2.2"
+    is-builtin-module "^3.1.0"
+    is-module "^1.0.0"
+    resolve "^1.19.0"
+
+"@rollup/plugin-replace@^2.4.1":
+  version "2.4.2"
+  resolved "https://registry.npmmirror.com/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz#a2d539314fbc77c244858faa523012825068510a"
+  integrity sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==
+  dependencies:
+    "@rollup/pluginutils" "^3.1.0"
+    magic-string "^0.25.7"
+
+"@rollup/pluginutils@^3.1.0":
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b"
+  integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==
+  dependencies:
+    "@types/estree" "0.0.39"
+    estree-walker "^1.0.1"
+    picomatch "^2.2.2"
+
+"@rollup/pluginutils@^4.1.2", "@rollup/pluginutils@^4.2.0":
+  version "4.2.1"
+  resolved "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d"
+  integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==
+  dependencies:
+    estree-walker "^2.0.1"
+    picomatch "^2.2.2"
+
+"@simonwep/pickr@~1.8.0":
+  version "1.8.2"
+  resolved "https://registry.npmmirror.com/@simonwep/pickr/-/pickr-1.8.2.tgz#96dc86675940d7cad63d69c22083dd1cbb9797cb"
+  integrity sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==
+  dependencies:
+    core-js "^3.15.1"
+    nanopop "^2.1.0"
+
+"@sindresorhus/is@^0.7.0":
+  version "0.7.0"
+  resolved "https://registry.npmmirror.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd"
+  integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==
+
+"@surma/rollup-plugin-off-main-thread@^2.2.3":
+  version "2.2.3"
+  resolved "https://registry.npmmirror.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz#ee34985952ca21558ab0d952f00298ad2190c053"
+  integrity sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==
+  dependencies:
+    ejs "^3.1.6"
+    json5 "^2.2.0"
+    magic-string "^0.25.0"
+    string.prototype.matchall "^4.0.6"
+
+"@trysound/sax@0.2.0":
+  version "0.2.0"
+  resolved "https://registry.npmmirror.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad"
+  integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==
+
+"@tsconfig/node10@^1.0.7":
+  version "1.0.9"
+  resolved "https://registry.npmmirror.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2"
+  integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==
+
+"@tsconfig/node12@^1.0.7":
+  version "1.0.11"
+  resolved "https://registry.npmmirror.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d"
+  integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==
+
+"@tsconfig/node14@^1.0.0":
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1"
+  integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==
+
+"@tsconfig/node16@^1.0.2":
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e"
+  integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==
+
+"@types/codemirror@^5.60.5":
+  version "5.60.5"
+  resolved "https://registry.npmmirror.com/@types/codemirror/-/codemirror-5.60.5.tgz#5b989a3b4bbe657458cf372c92b6bfda6061a2b7"
+  integrity sha512-TiECZmm8St5YxjFUp64LK0c8WU5bxMDt9YaAek1UqUb9swrSCoJhh92fWu1p3mTEqlHjhB5sY7OFBhWroJXZVg==
+  dependencies:
+    "@types/tern" "*"
+
+"@types/crypto-js@^4.1.1":
+  version "4.1.1"
+  resolved "https://registry.npmmirror.com/@types/crypto-js/-/crypto-js-4.1.1.tgz#602859584cecc91894eb23a4892f38cfa927890d"
+  integrity sha512-BG7fQKZ689HIoc5h+6D2Dgq1fABRa0RbBWKBd9SP/MVRVXROflpm5fhwyATX5duFmbStzyzyycPB8qUYKDH3NA==
+
+"@types/estree@*":
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2"
+  integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==
+
+"@types/estree@0.0.39":
+  version "0.0.39"
+  resolved "https://registry.npmmirror.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f"
+  integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==
+
+"@types/fs-extra@^9.0.13":
+  version "9.0.13"
+  resolved "https://registry.npmmirror.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45"
+  integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==
+  dependencies:
+    "@types/node" "*"
+
+"@types/glob@^7.1.1":
+  version "7.2.0"
+  resolved "https://registry.npmmirror.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb"
+  integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==
+  dependencies:
+    "@types/minimatch" "*"
+    "@types/node" "*"
+
+"@types/imagemin-gifsicle@^7.0.1":
+  version "7.0.1"
+  resolved "https://registry.npmmirror.com/@types/imagemin-gifsicle/-/imagemin-gifsicle-7.0.1.tgz#0844a96a338438bb98f77b298acf217260d0d409"
+  integrity sha512-kUz6sUh0P95JOS0RGEaaemWUrASuw+dLsWIveK2UZJx74id/B9epgblMkCk/r5MjUWbZ83wFvacG5Rb/f97gyA==
+  dependencies:
+    "@types/imagemin" "*"
+
+"@types/imagemin-jpegtran@^5.0.1":
+  version "5.0.1"
+  resolved "https://registry.npmmirror.com/@types/imagemin-jpegtran/-/imagemin-jpegtran-5.0.1.tgz#798b2a66cd49b7ec6550fb733c05a5b8755f211f"
+  integrity sha512-Ps8kbm+DUFte/Eln/tUdEvpMWHKFCsQKlV8n+RN50zqWqL/7QhfLxR0ymitP9wa90P6+rkbJlintBNPkVR+B/Q==
+  dependencies:
+    "@types/imagemin" "*"
+
+"@types/imagemin-mozjpeg@^8.0.1":
+  version "8.0.1"
+  resolved "https://registry.npmmirror.com/@types/imagemin-mozjpeg/-/imagemin-mozjpeg-8.0.1.tgz#eaf2f07aea3a317a1710ef2c763ec53f3bcfcdc5"
+  integrity sha512-kMQWEoKxxhlnH4POI3qfW9DjXlQfi80ux3l2b3j5R3eudSCoUIzKQLkfMjNJ6eMYnMWBcB+rfQOWqIzdIwFGKw==
+  dependencies:
+    "@types/imagemin" "*"
+
+"@types/imagemin-optipng@^5.2.1":
+  version "5.2.1"
+  resolved "https://registry.npmmirror.com/@types/imagemin-optipng/-/imagemin-optipng-5.2.1.tgz#6ef033f3b15d281009de4e0bd2cadf6cbd2e741a"
+  integrity sha512-XCM/3q+HUL7v4zOqMI+dJ5dTxT+MUukY9KU49DSnYb/4yWtSMHJyADP+WHSMVzTR63J2ZvfUOzSilzBNEQW78g==
+  dependencies:
+    "@types/imagemin" "*"
+
+"@types/imagemin-svgo@^10.0.0":
+  version "10.0.1"
+  resolved "https://registry.npmmirror.com/@types/imagemin-svgo/-/imagemin-svgo-10.0.1.tgz#c01d7a5612e3d6851e355ce92f4f26c6c25eef13"
+  integrity sha512-F3Tcm0iElDp9o1QnulC7EFR6KrYaXs0ARFnAmaYwPsPQ1AMcrjy45NI7cfGJ9yfuBDep/GU/tqj4EUD62DOWgg==
+  dependencies:
+    "@types/imagemin" "*"
+    "@types/svgo" "*"
+
+"@types/imagemin-webp@^7.0.0":
+  version "7.0.0"
+  resolved "https://registry.npmmirror.com/@types/imagemin-webp/-/imagemin-webp-7.0.0.tgz#8fa322c9a2f99a3b57d459aec6e80e06ce050afa"
+  integrity sha512-Lb1tjy2vEU7qYwM5iFB9o5k0J3mIpulw6Yftset5LLLugPu7+C16rLYRP1WEwr4QM8AeJZRjC2BGBLd9lGvRhQ==
+  dependencies:
+    "@types/imagemin" "*"
+
+"@types/imagemin@*":
+  version "8.0.0"
+  resolved "https://registry.npmmirror.com/@types/imagemin/-/imagemin-8.0.0.tgz#bf5bbe1feff3b112c7e0de06d024712ad261e033"
+  integrity sha512-B9X2CUeDv/uUeY9CqkzSTfmsLkeJP6PkmXlh4lODBbf9SwpmNuLS30WzUOi863dgsjY3zt3gY5q2F+UdifRi1A==
+  dependencies:
+    "@types/node" "*"
+
+"@types/imagemin@^7.0.1":
+  version "7.0.1"
+  resolved "https://registry.npmmirror.com/@types/imagemin/-/imagemin-7.0.1.tgz#11ca1e65ccb3871a8469d9b23033b95d3838eda0"
+  integrity sha512-xEn5+M3lDBtI3JxLy6eU3ksoVurygnlG7OYhTqJfGGP4PcvYnfn+IABCmMve7ziM/SneHDm5xgJFKC8hCYPicw==
+  dependencies:
+    "@types/node" "*"
+
+"@types/inquirer@^8.2.1":
+  version "8.2.3"
+  resolved "https://registry.npmmirror.com/@types/inquirer/-/inquirer-8.2.3.tgz#985515d04879a0d0c1f5f49ec375767410ba9dab"
+  integrity sha512-ZlBqD+8WIVNy3KIVkl+Qne6bGLW2erwN0GJXY9Ri/9EMbyupee3xw3H0Mmv5kJoLyNpfd/oHlwKxO0DUDH7yWA==
+  dependencies:
+    "@types/through" "*"
+
+"@types/intro.js@^3.0.2":
+  version "3.0.2"
+  resolved "https://registry.npmmirror.com/@types/intro.js/-/intro.js-3.0.2.tgz#cbf9b69f055b77582cc2cebe236e9a405b30efbd"
+  integrity sha512-kow8REgIIG42atN9vAaIdpEqVzj6WzV9m0PII8oce+an4Lc3eyfQF32/FbabbGmfWuF7TceTdd+gh74kOrXkPw==
+
+"@types/json-schema@^7.0.9":
+  version "7.0.11"
+  resolved "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
+  integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
+
+"@types/lodash-es@^4.17.6":
+  version "4.17.6"
+  resolved "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.6.tgz#c2ed4c8320ffa6f11b43eb89e9eaeec65966a0a0"
+  integrity sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==
+  dependencies:
+    "@types/lodash" "*"
+
+"@types/lodash@*":
+  version "4.14.184"
+  resolved "https://registry.npmmirror.com/@types/lodash/-/lodash-4.14.184.tgz#23f96cd2a21a28e106dc24d825d4aa966de7a9fe"
+  integrity sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q==
+
+"@types/minimatch@*":
+  version "3.0.5"
+  resolved "https://registry.npmmirror.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40"
+  integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==
+
+"@types/minimist@^1.2.0":
+  version "1.2.2"
+  resolved "https://registry.npmmirror.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c"
+  integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==
+
+"@types/mockjs@^1.0.4", "@types/mockjs@^1.0.6":
+  version "1.0.6"
+  resolved "https://registry.npmmirror.com/@types/mockjs/-/mockjs-1.0.6.tgz#dafdd5de65156f7aa63eab4e29fa3d532cd95609"
+  integrity sha512-Yu5YlqbYZyqsd6LjO4e8ONJDN9pTSnciHDcRP4teNOh/au2b8helFhgRx+3w8xsTFEnwr9jtfTVJbAx+eYmlHA==
+
+"@types/mousetrap@^1.6.4":
+  version "1.6.9"
+  resolved "https://registry.npmmirror.com/@types/mousetrap/-/mousetrap-1.6.9.tgz#f1ef9adbd1eac3466f21b6988b1c82c633a45340"
+  integrity sha512-HUAiN65VsRXyFCTicolwb5+I7FM6f72zjMWr+ajGk+YTvzBgXqa2A5U7d+rtsouAkunJ5U4Sb5lNJjo9w+nmXg==
+
+"@types/node@*", "@types/node@>=12":
+  version "18.7.9"
+  resolved "https://registry.npmmirror.com/@types/node/-/node-18.7.9.tgz#180bfc495c91dc62573967edf047e15dbdce1491"
+  integrity sha512-0N5Y1XAdcl865nDdjbO0m3T6FdmQ4ijE89/urOHLREyTXbpMWbSafx9y7XIsgWGtwUP2iYTinLyyW3FatAxBLQ==
+
+"@types/node@^14.17.1":
+  version "14.18.25"
+  resolved "https://registry.npmmirror.com/@types/node/-/node-14.18.25.tgz#57c72455af0a658da5b59aa062b2f89e73df0a61"
+  integrity sha512-9pLfceRSrKIsv/MISN6RoFWTIzka36Uk2Uuf5a8cHyDYhEgl5Hm5dXoe621KULeBjt+cFsY18mILsWWtJeG80w==
+
+"@types/node@^17.0.25":
+  version "17.0.45"
+  resolved "https://registry.npmmirror.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190"
+  integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==
+
+"@types/normalize-package-data@^2.4.0":
+  version "2.4.1"
+  resolved "https://registry.npmmirror.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301"
+  integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==
+
+"@types/nprogress@^0.2.0":
+  version "0.2.0"
+  resolved "https://registry.npmmirror.com/@types/nprogress/-/nprogress-0.2.0.tgz#86c593682d4199212a0509cc3c4d562bbbd6e45f"
+  integrity sha512-1cYJrqq9GezNFPsWTZpFut/d4CjpZqA0vhqDUPFWYKF1oIyBz5qnoYMzR+0C/T96t3ebLAC1SSnwrVOm5/j74A==
+
+"@types/parse-json@^4.0.0":
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
+  integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
+
+"@types/qrcode@^1.4.2":
+  version "1.5.0"
+  resolved "https://registry.npmmirror.com/@types/qrcode/-/qrcode-1.5.0.tgz#6a98fe9a9a7b2a9a3167b6dde17eff999eabe40b"
+  integrity sha512-x5ilHXRxUPIMfjtM+1vf/GPTRWZ81nqscursm5gMznJeK9M0YnZ1c3bEvRLQ0zSSgedLx1J6MGL231ObQGGhaA==
+  dependencies:
+    "@types/node" "*"
+
+"@types/qs@^6.9.7":
+  version "6.9.7"
+  resolved "https://registry.npmmirror.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb"
+  integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==
+
+"@types/resolve@1.17.1":
+  version "1.17.1"
+  resolved "https://registry.npmmirror.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6"
+  integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==
+  dependencies:
+    "@types/node" "*"
+
+"@types/showdown@^1.9.4":
+  version "1.9.4"
+  resolved "https://registry.npmmirror.com/@types/showdown/-/showdown-1.9.4.tgz#5385adf34143abad9309561661fa6c781d2ab962"
+  integrity sha512-50ehC3IAijfkvoNqmQ+VL73S7orOxmAK8ljQAFBv8o7G66lAZyxQj1L3BAv2dD86myLXI+sgKP1kcxAaxW356w==
+
+"@types/sortablejs@^1.10.7":
+  version "1.13.0"
+  resolved "https://registry.npmmirror.com/@types/sortablejs/-/sortablejs-1.13.0.tgz#870223438f8f2cd81157b128a4c0261adbcaa946"
+  integrity sha512-C3064MH72iEfeGCYEGCt7FCxXoAXaMPG0QPnstcxvPmbl54erpISu06d++FY37Smja64iWy5L8wOyHHBghWbJQ==
+
+"@types/svgo@*", "@types/svgo@^2.6.1":
+  version "2.6.4"
+  resolved "https://registry.npmmirror.com/@types/svgo/-/svgo-2.6.4.tgz#b7298fc1dd687539fd63fc818b00146d96e68836"
+  integrity sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==
+  dependencies:
+    "@types/node" "*"
+
+"@types/tern@*":
+  version "0.23.4"
+  resolved "https://registry.npmmirror.com/@types/tern/-/tern-0.23.4.tgz#03926eb13dbeaf3ae0d390caf706b2643a0127fb"
+  integrity sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg==
+  dependencies:
+    "@types/estree" "*"
+
+"@types/through@*":
+  version "0.0.30"
+  resolved "https://registry.npmmirror.com/@types/through/-/through-0.0.30.tgz#e0e42ce77e897bd6aead6f6ea62aeb135b8a3895"
+  integrity sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==
+  dependencies:
+    "@types/node" "*"
+
+"@types/tinycolor2@^1.4.2":
+  version "1.4.3"
+  resolved "https://registry.npmmirror.com/@types/tinycolor2/-/tinycolor2-1.4.3.tgz#ed4a0901f954b126e6a914b4839c77462d56e706"
+  integrity sha512-Kf1w9NE5HEgGxCRyIcRXR/ZYtDv0V8FVPtYHwLxl0O+maGX0erE77pQlD0gpP+/KByMZ87mOA79SjifhSB3PjQ==
+
+"@types/trusted-types@^2.0.2":
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/@types/trusted-types/-/trusted-types-2.0.2.tgz#fc25ad9943bcac11cceb8168db4f275e0e72e756"
+  integrity sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==
+
+"@types/web-bluetooth@^0.0.14":
+  version "0.0.14"
+  resolved "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.14.tgz#94e175b53623384bff1f354cdb3197a8d63cdbe5"
+  integrity sha512-5d2RhCard1nQUC3aHcq/gHzWYO6K0WJmAbjO7mQJgCQKtZpgXxv1rOM6O/dBDhDYYVutk1sciOgNSe+5YyfM8A==
+
+"@typescript-eslint/eslint-plugin@^5.20.0":
+  version "5.33.1"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.33.1.tgz#c0a480d05211660221eda963cc844732fe9b1714"
+  integrity sha512-S1iZIxrTvKkU3+m63YUOxYPKaP+yWDQrdhxTglVDVEVBf+aCSw85+BmJnyUaQQsk5TXFG/LpBu9fa+LrAQ91fQ==
+  dependencies:
+    "@typescript-eslint/scope-manager" "5.33.1"
+    "@typescript-eslint/type-utils" "5.33.1"
+    "@typescript-eslint/utils" "5.33.1"
+    debug "^4.3.4"
+    functional-red-black-tree "^1.0.1"
+    ignore "^5.2.0"
+    regexpp "^3.2.0"
+    semver "^7.3.7"
+    tsutils "^3.21.0"
+
+"@typescript-eslint/parser@^5.20.0":
+  version "5.33.1"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-5.33.1.tgz#e4b253105b4d2a4362cfaa4e184e2d226c440ff3"
+  integrity sha512-IgLLtW7FOzoDlmaMoXdxG8HOCByTBXrB1V2ZQYSEV1ggMmJfAkMWTwUjjzagS6OkfpySyhKFkBw7A9jYmcHpZA==
+  dependencies:
+    "@typescript-eslint/scope-manager" "5.33.1"
+    "@typescript-eslint/types" "5.33.1"
+    "@typescript-eslint/typescript-estree" "5.33.1"
+    debug "^4.3.4"
+
+"@typescript-eslint/scope-manager@5.33.1":
+  version "5.33.1"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-5.33.1.tgz#8d31553e1b874210018ca069b3d192c6d23bc493"
+  integrity sha512-8ibcZSqy4c5m69QpzJn8XQq9NnqAToC8OdH/W6IXPXv83vRyEDPYLdjAlUx8h/rbusq6MkW4YdQzURGOqsn3CA==
+  dependencies:
+    "@typescript-eslint/types" "5.33.1"
+    "@typescript-eslint/visitor-keys" "5.33.1"
+
+"@typescript-eslint/type-utils@5.33.1":
+  version "5.33.1"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-5.33.1.tgz#1a14e94650a0ae39f6e3b77478baff002cec4367"
+  integrity sha512-X3pGsJsD8OiqhNa5fim41YtlnyiWMF/eKsEZGsHID2HcDqeSC5yr/uLOeph8rNF2/utwuI0IQoAK3fpoxcLl2g==
+  dependencies:
+    "@typescript-eslint/utils" "5.33.1"
+    debug "^4.3.4"
+    tsutils "^3.21.0"
+
+"@typescript-eslint/types@5.33.1":
+  version "5.33.1"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/types/-/types-5.33.1.tgz#3faef41793d527a519e19ab2747c12d6f3741ff7"
+  integrity sha512-7K6MoQPQh6WVEkMrMW5QOA5FO+BOwzHSNd0j3+BlBwd6vtzfZceJ8xJ7Um2XDi/O3umS8/qDX6jdy2i7CijkwQ==
+
+"@typescript-eslint/typescript-estree@5.33.1":
+  version "5.33.1"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.33.1.tgz#a573bd360790afdcba80844e962d8b2031984f34"
+  integrity sha512-JOAzJ4pJ+tHzA2pgsWQi4804XisPHOtbvwUyqsuuq8+y5B5GMZs7lI1xDWs6V2d7gE/Ez5bTGojSK12+IIPtXA==
+  dependencies:
+    "@typescript-eslint/types" "5.33.1"
+    "@typescript-eslint/visitor-keys" "5.33.1"
+    debug "^4.3.4"
+    globby "^11.1.0"
+    is-glob "^4.0.3"
+    semver "^7.3.7"
+    tsutils "^3.21.0"
+
+"@typescript-eslint/utils@5.33.1":
+  version "5.33.1"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-5.33.1.tgz#171725f924fe1fe82bb776522bb85bc034e88575"
+  integrity sha512-uphZjkMaZ4fE8CR4dU7BquOV6u0doeQAr8n6cQenl/poMaIyJtBu8eys5uk6u5HiDH01Mj5lzbJ5SfeDz7oqMQ==
+  dependencies:
+    "@types/json-schema" "^7.0.9"
+    "@typescript-eslint/scope-manager" "5.33.1"
+    "@typescript-eslint/types" "5.33.1"
+    "@typescript-eslint/typescript-estree" "5.33.1"
+    eslint-scope "^5.1.1"
+    eslint-utils "^3.0.0"
+
+"@typescript-eslint/visitor-keys@5.33.1":
+  version "5.33.1"
+  resolved "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.33.1.tgz#0155c7571c8cd08956580b880aea327d5c34a18b"
+  integrity sha512-nwIxOK8Z2MPWltLKMLOEZwmfBZReqUdbEoHQXeCpa+sRVARe5twpJGHCB4dk9903Yaf0nMAlGbQfaAH92F60eg==
+  dependencies:
+    "@typescript-eslint/types" "5.33.1"
+    eslint-visitor-keys "^3.3.0"
+
+"@vitejs/plugin-legacy@^1.8.1":
+  version "1.8.2"
+  resolved "https://registry.npmmirror.com/@vitejs/plugin-legacy/-/plugin-legacy-1.8.2.tgz#2f315bcb6685b12719813fb9412851445cca636f"
+  integrity sha512-NCOKU+pU+cxLMR9P9RTolEuOK+h+zYBXlknj+zGcKSj/NXBZYgA1GAH1FnO4zijoWRiTaiOm2ha9LQrELE7XHg==
+  dependencies:
+    "@babel/standalone" "^7.17.11"
+    core-js "^3.22.3"
+    magic-string "^0.26.1"
+    regenerator-runtime "^0.13.9"
+    systemjs "^6.12.1"
+
+"@vitejs/plugin-vue-jsx@^1.3.10":
+  version "1.3.10"
+  resolved "https://registry.npmmirror.com/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-1.3.10.tgz#5b61294ed4334fbc5f5679243fd3ccc448b26044"
+  integrity sha512-Cf5zznh4yNMiEMBfTOztaDVDmK1XXfgxClzOSUVUc8WAmHzogrCUeM8B05ABzuGtg0D1amfng+mUmSIOFGP3Pw==
+  dependencies:
+    "@babel/core" "^7.17.9"
+    "@babel/plugin-syntax-import-meta" "^7.10.4"
+    "@babel/plugin-transform-typescript" "^7.16.8"
+    "@rollup/pluginutils" "^4.2.0"
+    "@vue/babel-plugin-jsx" "^1.1.1"
+    hash-sum "^2.0.0"
+
+"@vitejs/plugin-vue@^2.3.1":
+  version "2.3.4"
+  resolved "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-2.3.4.tgz#966a6279060eb2d9d1a02ea1a331af071afdcf9e"
+  integrity sha512-IfFNbtkbIm36O9KB8QodlwwYvTEsJb4Lll4c2IwB3VHc2gie2mSPtSzL0eYay7X2jd/2WX02FjSGTWR6OPr/zg==
+
+"@volar/code-gen@0.33.9":
+  version "0.33.9"
+  resolved "https://registry.npmmirror.com/@volar/code-gen/-/code-gen-0.33.9.tgz#5d108451c4872fb905eab59143b64b824610eed0"
+  integrity sha512-HI+XemEjvOv9uSjqaNXIL1brSTaBy9vRTcXqz9787nL5VKktI8aU1Zk4w9yJR88eTqw7mlPIdMaib7Ps/QPq8Q==
+  dependencies:
+    "@volar/source-map" "0.33.9"
+
+"@volar/pug-language-service@0.33.9":
+  version "0.33.9"
+  resolved "https://registry.npmmirror.com/@volar/pug-language-service/-/pug-language-service-0.33.9.tgz#e5f94cd9f3eca5012b35d9360236e6259528492a"
+  integrity sha512-3oOV0HmoqkCyPAiHXSMoDzbLrSEQQv3d1dY/Lfo4H8hGoS8kUYJ958328TuLFc90yzsSmYnuvIux5AUok138pg==
+  dependencies:
+    "@volar/code-gen" "0.33.9"
+    "@volar/shared" "0.33.9"
+    "@volar/source-map" "0.33.9"
+    "@volar/transforms" "0.33.9"
+    pug-lexer "^5.0.1"
+    pug-parser "^6.0.0"
+    vscode-languageserver-textdocument "^1.0.3"
+    vscode-languageserver-types "^3.17.0-next.6"
+
+"@volar/shared@0.33.9":
+  version "0.33.9"
+  resolved "https://registry.npmmirror.com/@volar/shared/-/shared-0.33.9.tgz#4a7244cafab2011c1a7942f22754e08a21f08cf7"
+  integrity sha512-YqEBYT1SjyO+/W73lyKZlftumimsrYGvd98pHrIyvgc6HNhFnCcthRbyHskstjU6P8Bgj90mRl+7Sb29J+Z5ng==
+  dependencies:
+    upath "^2.0.1"
+    vscode-jsonrpc "^8.0.0-next.5"
+    vscode-uri "^3.0.3"
+
+"@volar/source-map@0.33.9":
+  version "0.33.9"
+  resolved "https://registry.npmmirror.com/@volar/source-map/-/source-map-0.33.9.tgz#d86d9db30b15e554f4d0d2853e03a84ae1bc1ebd"
+  integrity sha512-SE7dfumZ8pLsbj4DtiSDTg2/d/JT45nF51rUnuz1UNSBPEeXBexlzvz5EQ2AyrX0FjAAd2ijrRtirTk1a0SFhQ==
+
+"@volar/transforms@0.33.9":
+  version "0.33.9"
+  resolved "https://registry.npmmirror.com/@volar/transforms/-/transforms-0.33.9.tgz#1155b5ea01b67bc318dddb49177f6c2df6b6f879"
+  integrity sha512-qdc2d0ZW/G6jCx1pBmoMjMJTY245pZJjpPL/OCT3zgbDLGvLvqhowXxQYQd2YiNXqxJvbadEKviH5LiZL3sU9g==
+  dependencies:
+    "@volar/shared" "0.33.9"
+    vscode-languageserver-types "^3.17.0-next.6"
+
+"@volar/vue-code-gen@0.33.9":
+  version "0.33.9"
+  resolved "https://registry.npmmirror.com/@volar/vue-code-gen/-/vue-code-gen-0.33.9.tgz#353b5803d9cf84b14f9a5e2e1c661a072d776736"
+  integrity sha512-qRCXcBhm1kUlI06sW5zolavn8gqZdSC2eIWw7jgbW68K/cGlTyXHGGZgJPM9P22cF9pcrjV1ByehO18ke2u+aA==
+  dependencies:
+    "@volar/code-gen" "0.33.9"
+    "@volar/source-map" "0.33.9"
+    "@vue/compiler-core" "^3.2.27"
+    "@vue/compiler-dom" "^3.2.27"
+    "@vue/shared" "^3.2.27"
+
+"@volar/vue-typescript@0.33.9":
+  version "0.33.9"
+  resolved "https://registry.npmmirror.com/@volar/vue-typescript/-/vue-typescript-0.33.9.tgz#6ac36812bba3967af316c0710559bf12bab904e8"
+  integrity sha512-UUViaQfzAV7z49TB+IsGCT6ls7zdEUib2N0L4k8U9nZbd2BQA4kcR9nyS/8oDOU5fK3ErP+pPlC+XzGGamKhcw==
+  dependencies:
+    "@volar/code-gen" "0.33.9"
+    "@volar/pug-language-service" "0.33.9"
+    "@volar/source-map" "0.33.9"
+    "@volar/vue-code-gen" "0.33.9"
+    "@vue/compiler-sfc" "^3.2.27"
+    "@vue/reactivity" "^3.2.27"
+
+"@vue/babel-helper-vue-transform-on@^1.0.2":
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz#9b9c691cd06fc855221a2475c3cc831d774bc7dc"
+  integrity sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==
+
+"@vue/babel-plugin-jsx@^1.1.1":
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.1.tgz#0c5bac27880d23f89894cd036a37b55ef61ddfc1"
+  integrity sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==
+  dependencies:
+    "@babel/helper-module-imports" "^7.0.0"
+    "@babel/plugin-syntax-jsx" "^7.0.0"
+    "@babel/template" "^7.0.0"
+    "@babel/traverse" "^7.0.0"
+    "@babel/types" "^7.0.0"
+    "@vue/babel-helper-vue-transform-on" "^1.0.2"
+    camelcase "^6.0.0"
+    html-tags "^3.1.0"
+    svg-tags "^1.0.0"
+
+"@vue/compiler-core@3.2.37", "@vue/compiler-core@^3.2.27":
+  version "3.2.37"
+  resolved "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.2.37.tgz#b3c42e04c0e0f2c496ff1784e543fbefe91e215a"
+  integrity sha512-81KhEjo7YAOh0vQJoSmAD68wLfYqJvoiD4ulyedzF+OEk/bk6/hx3fTNVfuzugIIaTrOx4PGx6pAiBRe5e9Zmg==
+  dependencies:
+    "@babel/parser" "^7.16.4"
+    "@vue/shared" "3.2.37"
+    estree-walker "^2.0.2"
+    source-map "^0.6.1"
+
+"@vue/compiler-dom@3.2.37", "@vue/compiler-dom@^3.2.27":
+  version "3.2.37"
+  resolved "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.2.37.tgz#10d2427a789e7c707c872da9d678c82a0c6582b5"
+  integrity sha512-yxJLH167fucHKxaqXpYk7x8z7mMEnXOw3G2q62FTkmsvNxu4FQSu5+3UMb+L7fjKa26DEzhrmCxAgFLLIzVfqQ==
+  dependencies:
+    "@vue/compiler-core" "3.2.37"
+    "@vue/shared" "3.2.37"
+
+"@vue/compiler-sfc@3.2.37", "@vue/compiler-sfc@^3.2.27", "@vue/compiler-sfc@^3.2.29", "@vue/compiler-sfc@^3.2.33":
+  version "3.2.37"
+  resolved "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.2.37.tgz#3103af3da2f40286edcd85ea495dcb35bc7f5ff4"
+  integrity sha512-+7i/2+9LYlpqDv+KTtWhOZH+pa8/HnX/905MdVmAcI/mPQOBwkHHIzrsEsucyOIZQYMkXUiTkmZq5am/NyXKkg==
+  dependencies:
+    "@babel/parser" "^7.16.4"
+    "@vue/compiler-core" "3.2.37"
+    "@vue/compiler-dom" "3.2.37"
+    "@vue/compiler-ssr" "3.2.37"
+    "@vue/reactivity-transform" "3.2.37"
+    "@vue/shared" "3.2.37"
+    estree-walker "^2.0.2"
+    magic-string "^0.25.7"
+    postcss "^8.1.10"
+    source-map "^0.6.1"
+
+"@vue/compiler-ssr@3.2.37":
+  version "3.2.37"
+  resolved "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.2.37.tgz#4899d19f3a5fafd61524a9d1aee8eb0505313cff"
+  integrity sha512-7mQJD7HdXxQjktmsWp/J67lThEIcxLemz1Vb5I6rYJHR5vI+lON3nPGOH3ubmbvYGt8xEUaAr1j7/tIFWiEOqw==
+  dependencies:
+    "@vue/compiler-dom" "3.2.37"
+    "@vue/shared" "3.2.37"
+
+"@vue/devtools-api@^6.1.0", "@vue/devtools-api@^6.1.4", "@vue/devtools-api@^6.2.1":
+  version "6.2.1"
+  resolved "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.2.1.tgz#6f2948ff002ec46df01420dfeff91de16c5b4092"
+  integrity sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ==
+
+"@vue/reactivity-transform@3.2.37":
+  version "3.2.37"
+  resolved "https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.2.37.tgz#0caa47c4344df4ae59f5a05dde2a8758829f8eca"
+  integrity sha512-IWopkKEb+8qpu/1eMKVeXrK0NLw9HicGviJzhJDEyfxTR9e1WtpnnbYkJWurX6WwoFP0sz10xQg8yL8lgskAZg==
+  dependencies:
+    "@babel/parser" "^7.16.4"
+    "@vue/compiler-core" "3.2.37"
+    "@vue/shared" "3.2.37"
+    estree-walker "^2.0.2"
+    magic-string "^0.25.7"
+
+"@vue/reactivity@3.2.37", "@vue/reactivity@^3.2.27":
+  version "3.2.37"
+  resolved "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.2.37.tgz#5bc3847ac58828e2b78526e08219e0a1089f8848"
+  integrity sha512-/7WRafBOshOc6m3F7plwzPeCu/RCVv9uMpOwa/5PiY1Zz+WLVRWiy0MYKwmg19KBdGtFWsmZ4cD+LOdVPcs52A==
+  dependencies:
+    "@vue/shared" "3.2.37"
+
+"@vue/runtime-core@3.2.37", "@vue/runtime-core@^3.2.33":
+  version "3.2.37"
+  resolved "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.2.37.tgz#7ba7c54bb56e5d70edfc2f05766e1ca8519966e3"
+  integrity sha512-JPcd9kFyEdXLl/i0ClS7lwgcs0QpUAWj+SKX2ZC3ANKi1U4DOtiEr6cRqFXsPwY5u1L9fAjkinIdB8Rz3FoYNQ==
+  dependencies:
+    "@vue/reactivity" "3.2.37"
+    "@vue/shared" "3.2.37"
+
+"@vue/runtime-dom@3.2.37":
+  version "3.2.37"
+  resolved "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.2.37.tgz#002bdc8228fa63949317756fb1e92cdd3f9f4bbd"
+  integrity sha512-HimKdh9BepShW6YozwRKAYjYQWg9mQn63RGEiSswMbW+ssIht1MILYlVGkAGGQbkhSh31PCdoUcfiu4apXJoPw==
+  dependencies:
+    "@vue/runtime-core" "3.2.37"
+    "@vue/shared" "3.2.37"
+    csstype "^2.6.8"
+
+"@vue/server-renderer@3.2.37":
+  version "3.2.37"
+  resolved "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.2.37.tgz#840a29c8dcc29bddd9b5f5ffa22b95c0e72afdfc"
+  integrity sha512-kLITEJvaYgZQ2h47hIzPh2K3jG8c1zCVbp/o/bzQOyvzaKiCquKS7AaioPI28GNxIsE/zSx+EwWYsNxDCX95MA==
+  dependencies:
+    "@vue/compiler-ssr" "3.2.37"
+    "@vue/shared" "3.2.37"
+
+"@vue/shared@3.2.37", "@vue/shared@^3.2.27", "@vue/shared@^3.2.33":
+  version "3.2.37"
+  resolved "https://registry.npmmirror.com/@vue/shared/-/shared-3.2.37.tgz#8e6adc3f2759af52f0e85863dfb0b711ecc5c702"
+  integrity sha512-4rSJemR2NQIo9Klm1vabqWjD8rs/ZaJSzMxkMNeJS6lHiUjjUeYFbooN19NgFjztubEKh3WlZUeOLVdbbUWHsw==
+
+"@vue/test-utils@^2.0.0-rc.21":
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/@vue/test-utils/-/test-utils-2.0.2.tgz#0b5edd683366153d5bc5a91edc62f292118710eb"
+  integrity sha512-E2P4oXSaWDqTZNbmKZFVLrNN/siVN78YkEqs7pHryWerrlZR9bBFLWdJwRoguX45Ru6HxIflzKl4vQvwRMwm5g==
+
+"@vueuse/core@^8.3.0":
+  version "8.9.4"
+  resolved "https://registry.npmmirror.com/@vueuse/core/-/core-8.9.4.tgz#c7db40f19390b3c9f4ff9294a30461497f62ec19"
+  integrity sha512-B/Mdj9TK1peFyWaPof+Zf/mP9XuGAngaJZBwPaXBvU3aCTZlx3ltlrFFFyMV4iGBwsjSCeUCgZrtkEj9dS2Y3Q==
+  dependencies:
+    "@types/web-bluetooth" "^0.0.14"
+    "@vueuse/metadata" "8.9.4"
+    "@vueuse/shared" "8.9.4"
+    vue-demi "*"
+
+"@vueuse/metadata@8.9.4":
+  version "8.9.4"
+  resolved "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-8.9.4.tgz#a4132db33e4c1b1023636acfa20aa7b37ab3d978"
+  integrity sha512-IwSfzH80bnJMzqhaapqJl9JRIiyQU0zsRGEgnxN6jhq7992cPUJIRfV+JHRIZXjYqbwt07E1gTEp0R0zPJ1aqw==
+
+"@vueuse/shared@8.9.4", "@vueuse/shared@^8.3.0":
+  version "8.9.4"
+  resolved "https://registry.npmmirror.com/@vueuse/shared/-/shared-8.9.4.tgz#c9741c30ffb666b50d62f0dd80b76119fd47573e"
+  integrity sha512-wt+T30c4K6dGRMVqPddexEVLa28YwxW5OFIPmzUHICjphfAuBFTTdDoyqREZNDOFJZ44ARH1WWQNCUK8koJ+Ag==
+  dependencies:
+    vue-demi "*"
+
+"@windicss/config@1.8.7":
+  version "1.8.7"
+  resolved "https://registry.npmmirror.com/@windicss/config/-/config-1.8.7.tgz#650bec3c6e3293306e4fe0c478253bd0085884aa"
+  integrity sha512-8n+/Y36j5L3rw2tgMdLjeGRuNV7VYfKoHoraLK6Bk9OJ1MTPd5vv7pekof/uOPWVV7WWjVeZ6CTO8SDbDDW3iw==
+  dependencies:
+    debug "^4.3.4"
+    jiti "^1.14.0"
+    windicss "^3.5.6"
+
+"@windicss/plugin-utils@1.8.7":
+  version "1.8.7"
+  resolved "https://registry.npmmirror.com/@windicss/plugin-utils/-/plugin-utils-1.8.7.tgz#0e3ad889974276fc00029e1a2d911bca16792a33"
+  integrity sha512-dfj95olNZyGFDPFMBvE5oq8hA5f0ooUJZjVdWlthS4ek4W1/xNOHDxB6ygWR8LE9zCOXZykApjt1LOhy9Ky2QA==
+  dependencies:
+    "@antfu/utils" "^0.5.2"
+    "@windicss/config" "1.8.7"
+    debug "^4.3.4"
+    fast-glob "^3.2.11"
+    magic-string "^0.26.2"
+    micromatch "^4.0.5"
+    windicss "^3.5.6"
+
+"@zxcvbn-ts/core@^2.0.1":
+  version "2.0.4"
+  resolved "https://registry.npmmirror.com/@zxcvbn-ts/core/-/core-2.0.4.tgz#3fcf849df12470d48c7b18485c77d6e547be4929"
+  integrity sha512-qf+JMVIRbzGzMk+VOyX2Nouih+9VGdNhLhit5Wv3m7ZD/o581x30272P6En8C9x+xwFW0o3GIkr9uLvWN8yvKA==
+
+JSONStream@^1.0.4:
+  version "1.3.5"
+  resolved "https://registry.npmmirror.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0"
+  integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==
+  dependencies:
+    jsonparse "^1.2.0"
+    through ">=2.2.7 <3"
+
+acorn-jsx@^5.3.2:
+  version "5.3.2"
+  resolved "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
+  integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
+
+acorn-walk@^8.1.1:
+  version "8.2.0"
+  resolved "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1"
+  integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
+
+acorn@^7.1.1:
+  version "7.4.1"
+  resolved "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
+  integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
+
+acorn@^8.4.1, acorn@^8.5.0, acorn@^8.8.0:
+  version "8.8.0"
+  resolved "https://registry.npmmirror.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8"
+  integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==
+
+add-stream@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa"
+  integrity sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==
+
+adler-32@~1.3.0:
+  version "1.3.1"
+  resolved "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz#1dbf0b36dda0012189a32b3679061932df1821e2"
+  integrity sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==
+
+aggregate-error@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a"
+  integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==
+  dependencies:
+    clean-stack "^2.0.0"
+    indent-string "^4.0.0"
+
+ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.6:
+  version "6.12.6"
+  resolved "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+  integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+  dependencies:
+    fast-deep-equal "^3.1.1"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.4.1"
+    uri-js "^4.2.2"
+
+ajv@^8.0.1, ajv@^8.6.0:
+  version "8.11.0"
+  resolved "https://registry.npmmirror.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f"
+  integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==
+  dependencies:
+    fast-deep-equal "^3.1.1"
+    json-schema-traverse "^1.0.0"
+    require-from-string "^2.0.2"
+    uri-js "^4.2.2"
+
+ansi-escapes@^4.2.1, ansi-escapes@^4.3.0:
+  version "4.3.2"
+  resolved "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
+  integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
+  dependencies:
+    type-fest "^0.21.3"
+
+ansi-regex@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+  integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==
+
+ansi-regex@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+  integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-regex@^6.0.1:
+  version "6.0.1"
+  resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a"
+  integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==
+
+ansi-styles@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+  integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==
+
+ansi-styles@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+  integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+  dependencies:
+    color-convert "^1.9.0"
+
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+  version "4.3.0"
+  resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+  integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+  dependencies:
+    color-convert "^2.0.1"
+
+ansi-styles@^6.0.0:
+  version "6.1.0"
+  resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.1.0.tgz#87313c102b8118abd57371afab34618bf7350ed3"
+  integrity sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==
+
+ant-design-vue@^3.2.0:
+  version "3.2.11"
+  resolved "https://registry.npmmirror.com/ant-design-vue/-/ant-design-vue-3.2.11.tgz#034b2a2adef82a34440c10b90a5e02bcd25b376b"
+  integrity sha512-QKCAcOY5EJF0PepiVGA4X5PzUetYUvG5qALmA+2TON40pc2+brOEiVTwr3kjF9N+f7q4MpyiLPu4pIErwoajOQ==
+  dependencies:
+    "@ant-design/colors" "^6.0.0"
+    "@ant-design/icons-vue" "^6.1.0"
+    "@babel/runtime" "^7.10.5"
+    "@ctrl/tinycolor" "^3.4.0"
+    "@simonwep/pickr" "~1.8.0"
+    array-tree-filter "^2.1.0"
+    async-validator "^4.0.0"
+    dayjs "^1.10.5"
+    dom-align "^1.12.1"
+    dom-scroll-into-view "^2.0.0"
+    lodash "^4.17.21"
+    lodash-es "^4.17.15"
+    resize-observer-polyfill "^1.5.1"
+    scroll-into-view-if-needed "^2.2.25"
+    shallow-equal "^1.0.0"
+    vue-types "^3.0.0"
+    warning "^4.0.0"
+
+anymatch@~3.1.2:
+  version "3.1.2"
+  resolved "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
+  integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
+  dependencies:
+    normalize-path "^3.0.0"
+    picomatch "^2.0.4"
+
+arch@^2.1.0:
+  version "2.2.0"
+  resolved "https://registry.npmmirror.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11"
+  integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==
+
+archive-type@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/archive-type/-/archive-type-4.0.0.tgz#f92e72233056dfc6969472749c267bdb046b1d70"
+  integrity sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==
+  dependencies:
+    file-type "^4.2.0"
+
+arg@^4.1.0:
+  version "4.1.3"
+  resolved "https://registry.npmmirror.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
+  integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
+
+argparse@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+  integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
+arr-diff@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+  integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==
+
+arr-flatten@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+  integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
+
+arr-union@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+  integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==
+
+array-find-index@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
+  integrity sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==
+
+array-ify@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece"
+  integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==
+
+array-tree-filter@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz#873ac00fec83749f255ac8dd083814b4f6329190"
+  integrity sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==
+
+array-union@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
+  integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+
+array-unique@^0.3.2:
+  version "0.3.2"
+  resolved "https://registry.npmmirror.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+  integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==
+
+arrify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+  integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==
+
+assign-symbols@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+  integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==
+
+astral-regex@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
+  integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
+
+async-validator@^4.0.0:
+  version "4.2.5"
+  resolved "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz#c96ea3332a521699d0afaaceed510a54656c6339"
+  integrity sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==
+
+async@^3.2.3:
+  version "3.2.4"
+  resolved "https://registry.npmmirror.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c"
+  integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==
+
+at-least-node@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
+  integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
+
+atob@^2.1.2:
+  version "2.1.2"
+  resolved "https://registry.npmmirror.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
+  integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
+
+autoprefixer@^10.4.4:
+  version "10.4.8"
+  resolved "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.8.tgz#92c7a0199e1cfb2ad5d9427bd585a3d75895b9e5"
+  integrity sha512-75Jr6Q/XpTqEf6D2ltS5uMewJIx5irCU1oBYJrWjFenq/m12WRRrz6g15L1EIoYvPLXTbEry7rDOwrcYNj77xw==
+  dependencies:
+    browserslist "^4.21.3"
+    caniuse-lite "^1.0.30001373"
+    fraction.js "^4.2.0"
+    normalize-range "^0.1.2"
+    picocolors "^1.0.0"
+    postcss-value-parser "^4.2.0"
+
+axios@^0.21.4:
+  version "0.21.4"
+  resolved "https://registry.npmmirror.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575"
+  integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==
+  dependencies:
+    follow-redirects "^1.14.0"
+
+axios@^0.26.0, axios@^0.26.1:
+  version "0.26.1"
+  resolved "https://registry.npmmirror.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9"
+  integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==
+  dependencies:
+    follow-redirects "^1.14.8"
+
+babel-plugin-dynamic-import-node@^2.3.3:
+  version "2.3.3"
+  resolved "https://registry.npmmirror.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3"
+  integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==
+  dependencies:
+    object.assign "^4.1.0"
+
+babel-plugin-polyfill-corejs2@^0.3.2:
+  version "0.3.2"
+  resolved "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.2.tgz#e4c31d4c89b56f3cf85b92558954c66b54bd972d"
+  integrity sha512-LPnodUl3lS0/4wN3Rb+m+UK8s7lj2jcLRrjho4gLw+OJs+I4bvGXshINesY5xx/apM+biTnQ9reDI8yj+0M5+Q==
+  dependencies:
+    "@babel/compat-data" "^7.17.7"
+    "@babel/helper-define-polyfill-provider" "^0.3.2"
+    semver "^6.1.1"
+
+babel-plugin-polyfill-corejs3@^0.5.3:
+  version "0.5.3"
+  resolved "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz#d7e09c9a899079d71a8b670c6181af56ec19c5c7"
+  integrity sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==
+  dependencies:
+    "@babel/helper-define-polyfill-provider" "^0.3.2"
+    core-js-compat "^3.21.0"
+
+babel-plugin-polyfill-regenerator@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.0.tgz#8f51809b6d5883e07e71548d75966ff7635527fe"
+  integrity sha512-RW1cnryiADFeHmfLS+WW/G431p1PsW5qdRdz0SDRi7TKcUgc7Oh/uXkT7MZ/+tGsT1BkczEAmD5XjUyJ5SWDTw==
+  dependencies:
+    "@babel/helper-define-polyfill-provider" "^0.3.2"
+
+balanced-match@^1.0.0:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+  integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+balanced-match@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/balanced-match/-/balanced-match-2.0.0.tgz#dc70f920d78db8b858535795867bf48f820633d9"
+  integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==
+
+base64-js@^1.3.1:
+  version "1.5.1"
+  resolved "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
+  integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
+base@^0.11.1:
+  version "0.11.2"
+  resolved "https://registry.npmmirror.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+  integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
+  dependencies:
+    cache-base "^1.0.1"
+    class-utils "^0.3.5"
+    component-emitter "^1.2.1"
+    define-property "^1.0.0"
+    isobject "^3.0.1"
+    mixin-deep "^1.2.0"
+    pascalcase "^0.1.1"
+
+before-after-hook@^2.2.0:
+  version "2.2.2"
+  resolved "https://registry.npmmirror.com/before-after-hook/-/before-after-hook-2.2.2.tgz#a6e8ca41028d90ee2c24222f201c90956091613e"
+  integrity sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==
+
+big.js@^5.2.2:
+  version "5.2.2"
+  resolved "https://registry.npmmirror.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
+  integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
+
+bin-build@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/bin-build/-/bin-build-3.0.0.tgz#c5780a25a8a9f966d8244217e6c1f5082a143861"
+  integrity sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA==
+  dependencies:
+    decompress "^4.0.0"
+    download "^6.2.2"
+    execa "^0.7.0"
+    p-map-series "^1.0.0"
+    tempfile "^2.0.0"
+
+bin-check@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.npmmirror.com/bin-check/-/bin-check-4.1.0.tgz#fc495970bdc88bb1d5a35fc17e65c4a149fc4a49"
+  integrity sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==
+  dependencies:
+    execa "^0.7.0"
+    executable "^4.1.0"
+
+bin-version-check@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/bin-version-check/-/bin-version-check-4.0.0.tgz#7d819c62496991f80d893e6e02a3032361608f71"
+  integrity sha512-sR631OrhC+1f8Cvs8WyVWOA33Y8tgwjETNPyyD/myRBXLkfS/vl74FmH/lFcRl9KY3zwGh7jFhvyk9vV3/3ilQ==
+  dependencies:
+    bin-version "^3.0.0"
+    semver "^5.6.0"
+    semver-truncate "^1.1.2"
+
+bin-version@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/bin-version/-/bin-version-3.1.0.tgz#5b09eb280752b1bd28f0c9db3f96f2f43b6c0839"
+  integrity sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ==
+  dependencies:
+    execa "^1.0.0"
+    find-versions "^3.0.0"
+
+bin-wrapper@^4.0.0, bin-wrapper@^4.0.1, "bin-wrapper@npm:bin-wrapper-china":
+  version "0.1.0"
+  resolved "https://registry.npmmirror.com/bin-wrapper-china/-/bin-wrapper-china-0.1.0.tgz#c2ec95b4d0eaef6ed5ad10954f9227d8e5ef3725"
+  integrity sha512-1UCm17WYEbgry50tup+AQN+JGVEVzoW4f8HMl899k1lvuFxWKGZXl/G2fgxQxAckRjnloO3ijLVVEsv8zescUg==
+  dependencies:
+    bin-check "^4.1.0"
+    bin-version-check "^4.0.0"
+    binary-mirror-config "^1"
+    download "^7.1.0"
+    import-lazy "^4.0.0"
+    os-filter-obj "^2.0.0"
+    pify "^4.0.1"
+
+binary-extensions@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
+  integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+
+binary-mirror-config@^1:
+  version "1.41.0"
+  resolved "https://registry.npmmirror.com/binary-mirror-config/-/binary-mirror-config-1.41.0.tgz#b68032588392bee9262971f977922d075513964b"
+  integrity sha512-ZiIhR1s6Sv1Fv6qCQqfPjx0Cj86BgFlhqNxZgHkQOWcxJcMbO3mj1iqsuVjowYqJqeZL8e52+IEv7IRnSX6T6w==
+
+bl@^1.0.0:
+  version "1.2.3"
+  resolved "https://registry.npmmirror.com/bl/-/bl-1.2.3.tgz#1e8dd80142eac80d7158c9dccc047fb620e035e7"
+  integrity sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==
+  dependencies:
+    readable-stream "^2.3.5"
+    safe-buffer "^5.1.1"
+
+bl@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
+  integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
+  dependencies:
+    buffer "^5.5.0"
+    inherits "^2.0.4"
+    readable-stream "^3.4.0"
+
+bluebird@^3.5.0:
+  version "3.7.2"
+  resolved "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
+  integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
+
+boolbase@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+  integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==
+
+brace-expansion@^1.1.7:
+  version "1.1.11"
+  resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+  integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+  dependencies:
+    balanced-match "^1.0.0"
+    concat-map "0.0.1"
+
+brace-expansion@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae"
+  integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
+  dependencies:
+    balanced-match "^1.0.0"
+
+braces@^2.2.2:
+  version "2.3.2"
+  resolved "https://registry.npmmirror.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+  integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
+  dependencies:
+    arr-flatten "^1.1.0"
+    array-unique "^0.3.2"
+    extend-shallow "^2.0.1"
+    fill-range "^4.0.0"
+    isobject "^3.0.1"
+    repeat-element "^1.1.2"
+    snapdragon "^0.8.1"
+    snapdragon-node "^2.0.1"
+    split-string "^3.0.2"
+    to-regex "^3.0.1"
+
+braces@^3.0.2, braces@~3.0.2:
+  version "3.0.2"
+  resolved "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+  integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+  dependencies:
+    fill-range "^7.0.1"
+
+browserslist@^4.20.2, browserslist@^4.21.3:
+  version "4.21.3"
+  resolved "https://registry.npmmirror.com/browserslist/-/browserslist-4.21.3.tgz#5df277694eb3c48bc5c4b05af3e8b7e09c5a6d1a"
+  integrity sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==
+  dependencies:
+    caniuse-lite "^1.0.30001370"
+    electron-to-chromium "^1.4.202"
+    node-releases "^2.0.6"
+    update-browserslist-db "^1.0.5"
+
+buffer-alloc-unsafe@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
+  integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==
+
+buffer-alloc@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
+  integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==
+  dependencies:
+    buffer-alloc-unsafe "^1.1.0"
+    buffer-fill "^1.0.0"
+
+buffer-crc32@~0.2.3:
+  version "0.2.13"
+  resolved "https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
+  integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==
+
+buffer-fill@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
+  integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==
+
+buffer-from@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
+  integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
+
+buffer@^5.2.1, buffer@^5.5.0:
+  version "5.7.1"
+  resolved "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
+  integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
+  dependencies:
+    base64-js "^1.3.1"
+    ieee754 "^1.1.13"
+
+builtin-modules@^3.1.0, builtin-modules@^3.3.0:
+  version "3.3.0"
+  resolved "https://registry.npmmirror.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6"
+  integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==
+
+builtins@^4.0.0:
+  version "4.1.0"
+  resolved "https://registry.npmmirror.com/builtins/-/builtins-4.1.0.tgz#1edd016dd91ce771a1ed6fc3b2b71fb918953250"
+  integrity sha512-1bPRZQtmKaO6h7qV1YHXNtr6nCK28k0Zo95KM4dXfILcZZwoHJBN1m3lfLv9LPkcOZlrSr+J1bzMaZFO98Yq0w==
+  dependencies:
+    semver "^7.0.0"
+
+cache-base@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+  integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
+  dependencies:
+    collection-visit "^1.0.0"
+    component-emitter "^1.2.1"
+    get-value "^2.0.6"
+    has-value "^1.0.0"
+    isobject "^3.0.1"
+    set-value "^2.0.0"
+    to-object-path "^0.3.0"
+    union-value "^1.0.0"
+    unset-value "^1.0.0"
+
+cacheable-request@^2.1.1:
+  version "2.1.4"
+  resolved "https://registry.npmmirror.com/cacheable-request/-/cacheable-request-2.1.4.tgz#0d808801b6342ad33c91df9d0b44dc09b91e5c3d"
+  integrity sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ==
+  dependencies:
+    clone-response "1.0.2"
+    get-stream "3.0.0"
+    http-cache-semantics "3.8.1"
+    keyv "3.0.0"
+    lowercase-keys "1.0.0"
+    normalize-url "2.0.1"
+    responselike "1.0.2"
+
+call-bind@^1.0.0, call-bind@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
+  integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
+  dependencies:
+    function-bind "^1.1.1"
+    get-intrinsic "^1.0.2"
+
+callsites@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+  integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+camel-case@^4.1.2:
+  version "4.1.2"
+  resolved "https://registry.npmmirror.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a"
+  integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==
+  dependencies:
+    pascal-case "^3.1.2"
+    tslib "^2.0.3"
+
+camelcase-keys@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
+  integrity sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==
+  dependencies:
+    camelcase "^2.0.0"
+    map-obj "^1.0.0"
+
+camelcase-keys@^6.2.2:
+  version "6.2.2"
+  resolved "https://registry.npmmirror.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0"
+  integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==
+  dependencies:
+    camelcase "^5.3.1"
+    map-obj "^4.0.0"
+    quick-lru "^4.0.1"
+
+camelcase@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
+  integrity sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==
+
+camelcase@^5.0.0, camelcase@^5.3.1:
+  version "5.3.1"
+  resolved "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+  integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
+camelcase@^6.0.0:
+  version "6.3.0"
+  resolved "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
+  integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
+
+caniuse-lite@^1.0.30001370, caniuse-lite@^1.0.30001373:
+  version "1.0.30001380"
+  resolved "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001380.tgz#6f2427ad8ebee1b400a38ca3560515756ba352bb"
+  integrity sha512-OO+pPubxx16lkI7TVrbFpde8XHz66SMwstl1YWpg6uMGw56XnhYVwtPIjvX4kYpzwMwQKr4DDce394E03dQPGg==
+
+capital-case@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.npmmirror.com/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669"
+  integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==
+  dependencies:
+    no-case "^3.0.4"
+    tslib "^2.0.3"
+    upper-case-first "^2.0.2"
+
+caw@^2.0.0, caw@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/caw/-/caw-2.0.1.tgz#6c3ca071fc194720883c2dc5da9b074bfc7e9e95"
+  integrity sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==
+  dependencies:
+    get-proxy "^2.0.0"
+    isurl "^1.0.0-alpha5"
+    tunnel-agent "^0.6.0"
+    url-to-options "^1.0.1"
+
+cfb@~1.2.1:
+  version "1.2.2"
+  resolved "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz#94e687628c700e5155436dac05f74e08df23bc44"
+  integrity sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==
+  dependencies:
+    adler-32 "~1.3.0"
+    crc-32 "~1.2.0"
+
+chalk@^1.0.0, chalk@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.npmmirror.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+  integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==
+  dependencies:
+    ansi-styles "^2.2.1"
+    escape-string-regexp "^1.0.2"
+    has-ansi "^2.0.0"
+    strip-ansi "^3.0.0"
+    supports-color "^2.0.0"
+
+chalk@^2.0.0, chalk@^2.4.1:
+  version "2.4.2"
+  resolved "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+  integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+  dependencies:
+    ansi-styles "^3.2.1"
+    escape-string-regexp "^1.0.5"
+    supports-color "^5.3.0"
+
+chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2:
+  version "4.1.2"
+  resolved "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+  integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+  dependencies:
+    ansi-styles "^4.1.0"
+    supports-color "^7.1.0"
+
+change-case@^4.1.2:
+  version "4.1.2"
+  resolved "https://registry.npmmirror.com/change-case/-/change-case-4.1.2.tgz#fedfc5f136045e2398c0410ee441f95704641e12"
+  integrity sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==
+  dependencies:
+    camel-case "^4.1.2"
+    capital-case "^1.0.4"
+    constant-case "^3.0.4"
+    dot-case "^3.0.4"
+    header-case "^2.0.4"
+    no-case "^3.0.4"
+    param-case "^3.0.4"
+    pascal-case "^3.1.2"
+    path-case "^3.0.4"
+    sentence-case "^3.0.4"
+    snake-case "^3.0.4"
+    tslib "^2.0.3"
+
+character-parser@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.npmmirror.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0"
+  integrity sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==
+  dependencies:
+    is-regex "^1.0.3"
+
+chardet@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.npmmirror.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
+  integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
+
+chokidar@^3.5.2:
+  version "3.5.3"
+  resolved "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
+  integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
+  dependencies:
+    anymatch "~3.1.2"
+    braces "~3.0.2"
+    glob-parent "~5.1.2"
+    is-binary-path "~2.1.0"
+    is-glob "~4.0.1"
+    normalize-path "~3.0.0"
+    readdirp "~3.6.0"
+  optionalDependencies:
+    fsevents "~2.3.2"
+
+class-utils@^0.3.5:
+  version "0.3.6"
+  resolved "https://registry.npmmirror.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+  integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
+  dependencies:
+    arr-union "^3.1.0"
+    define-property "^0.2.5"
+    isobject "^3.0.0"
+    static-extend "^0.1.1"
+
+clean-css@^5.1.2, clean-css@^5.2.2:
+  version "5.3.1"
+  resolved "https://registry.npmmirror.com/clean-css/-/clean-css-5.3.1.tgz#d0610b0b90d125196a2894d35366f734e5d7aa32"
+  integrity sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg==
+  dependencies:
+    source-map "~0.6.0"
+
+clean-stack@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.npmmirror.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
+  integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==
+
+cli-cursor@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
+  integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
+  dependencies:
+    restore-cursor "^3.1.0"
+
+cli-spinners@^2.5.0:
+  version "2.7.0"
+  resolved "https://registry.npmmirror.com/cli-spinners/-/cli-spinners-2.7.0.tgz#f815fd30b5f9eaac02db604c7a231ed7cb2f797a"
+  integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==
+
+cli-truncate@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7"
+  integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==
+  dependencies:
+    slice-ansi "^3.0.0"
+    string-width "^4.2.0"
+
+cli-truncate@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389"
+  integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==
+  dependencies:
+    slice-ansi "^5.0.0"
+    string-width "^5.0.0"
+
+cli-width@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6"
+  integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==
+
+cliui@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.npmmirror.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1"
+  integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==
+  dependencies:
+    string-width "^4.2.0"
+    strip-ansi "^6.0.0"
+    wrap-ansi "^6.2.0"
+
+cliui@^7.0.2:
+  version "7.0.4"
+  resolved "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
+  integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
+  dependencies:
+    string-width "^4.2.0"
+    strip-ansi "^6.0.0"
+    wrap-ansi "^7.0.0"
+
+clone-response@1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
+  integrity sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==
+  dependencies:
+    mimic-response "^1.0.0"
+
+clone@^1.0.2:
+  version "1.0.4"
+  resolved "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
+  integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==
+
+clone@^2.1.1:
+  version "2.1.2"
+  resolved "https://registry.npmmirror.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
+  integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==
+
+codemirror@^5.65.3:
+  version "5.65.8"
+  resolved "https://registry.npmmirror.com/codemirror/-/codemirror-5.65.8.tgz#50f145ba7eb725091110c31f3a7c1fdef6bdc721"
+  integrity sha512-TNGkSkkoAsmZSf6W6g35LMVQJBHKasc2CKwhr/fTxSYun7cn6J+CbtyNjV/MYlFVkNTsqZoviegyCZimWhoMMA==
+
+codepage@~1.15.0:
+  version "1.15.0"
+  resolved "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz#2e00519024b39424ec66eeb3ec07227e692618ab"
+  integrity sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==
+
+collection-visit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+  integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==
+  dependencies:
+    map-visit "^1.0.0"
+    object-visit "^1.0.0"
+
+color-convert@^1.9.0:
+  version "1.9.3"
+  resolved "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+  integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+  dependencies:
+    color-name "1.1.3"
+
+color-convert@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+  integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+  dependencies:
+    color-name "~1.1.4"
+
+color-name@1.1.3:
+  version "1.1.3"
+  resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+  integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+
+color-name@~1.1.4:
+  version "1.1.4"
+  resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+  integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+colord@^2.9.3:
+  version "2.9.3"
+  resolved "https://registry.npmmirror.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43"
+  integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==
+
+colorette@^2.0.16:
+  version "2.0.19"
+  resolved "https://registry.npmmirror.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798"
+  integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==
+
+commander@*, commander@^9.0.0:
+  version "9.4.0"
+  resolved "https://registry.npmmirror.com/commander/-/commander-9.4.0.tgz#bc4a40918fefe52e22450c111ecd6b7acce6f11c"
+  integrity sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==
+
+commander@^2.20.0, commander@^2.8.1:
+  version "2.20.3"
+  resolved "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+  integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
+commander@^7.2.0:
+  version "7.2.0"
+  resolved "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
+  integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
+
+commander@^8.3.0:
+  version "8.3.0"
+  resolved "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66"
+  integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==
+
+common-tags@^1.8.0:
+  version "1.8.2"
+  resolved "https://registry.npmmirror.com/common-tags/-/common-tags-1.8.2.tgz#94ebb3c076d26032745fd54face7f688ef5ac9c6"
+  integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==
+
+compare-func@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3"
+  integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==
+  dependencies:
+    array-ify "^1.0.0"
+    dot-prop "^5.1.0"
+
+component-emitter@^1.2.1:
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
+  integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
+
+compute-scroll-into-view@^1.0.17:
+  version "1.0.17"
+  resolved "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.17.tgz#6a88f18acd9d42e9cf4baa6bec7e0522607ab7ab"
+  integrity sha512-j4dx+Fb0URmzbwwMUrhqWM2BEWHdFGx+qZ9qqASHRPqvTYdqvWnHg0H1hIbcyLnvgnoNAVMlwkepyqM3DaIFUg==
+
+concat-map@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+  integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
+
+config-chain@^1.1.11:
+  version "1.1.13"
+  resolved "https://registry.npmmirror.com/config-chain/-/config-chain-1.1.13.tgz#fad0795aa6a6cdaff9ed1b68e9dff94372c232f4"
+  integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==
+  dependencies:
+    ini "^1.3.4"
+    proto-list "~1.2.1"
+
+connect-history-api-fallback@^1.6.0:
+  version "1.6.0"
+  resolved "https://registry.npmmirror.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc"
+  integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==
+
+connect@^3.7.0:
+  version "3.7.0"
+  resolved "https://registry.npmmirror.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8"
+  integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==
+  dependencies:
+    debug "2.6.9"
+    finalhandler "1.1.2"
+    parseurl "~1.3.3"
+    utils-merge "1.0.1"
+
+consola@^2.15.3:
+  version "2.15.3"
+  resolved "https://registry.npmmirror.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550"
+  integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==
+
+console-stream@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.npmmirror.com/console-stream/-/console-stream-0.1.1.tgz#a095fe07b20465955f2fafd28b5d72bccd949d44"
+  integrity sha512-QC/8l9e6ofi6nqZ5PawlDgzmMw3OxIXtvolBzap/F4UDBJlDaZRSNbL/lb41C29FcbSJncBFlJFj2WJoNyZRfQ==
+
+console@^0.7.2:
+  version "0.7.2"
+  resolved "https://registry.npmmirror.com/console/-/console-0.7.2.tgz#f9a4331249291591b7bf9bffa8e205356f20a9f0"
+  integrity sha512-+JSDwGunA4MTEgAV/4VBKwUHonP8CzJ/6GIuwPi6acKFqFfHUdSGCm89ZxZ5FfGWdZfkdgAroy5bJ5FSeN/t4g==
+
+constant-case@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.npmmirror.com/constant-case/-/constant-case-3.0.4.tgz#3b84a9aeaf4cf31ec45e6bf5de91bdfb0589faf1"
+  integrity sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==
+  dependencies:
+    no-case "^3.0.4"
+    tslib "^2.0.3"
+    upper-case "^2.0.2"
+
+content-disposition@^0.5.2:
+  version "0.5.4"
+  resolved "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
+  integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==
+  dependencies:
+    safe-buffer "5.2.1"
+
+conventional-changelog-angular@^5.0.11, conventional-changelog-angular@^5.0.12:
+  version "5.0.13"
+  resolved "https://registry.npmmirror.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz#896885d63b914a70d4934b59d2fe7bde1832b28c"
+  integrity sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==
+  dependencies:
+    compare-func "^2.0.0"
+    q "^1.5.1"
+
+conventional-changelog-atom@^2.0.8:
+  version "2.0.8"
+  resolved "https://registry.npmmirror.com/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz#a759ec61c22d1c1196925fca88fe3ae89fd7d8de"
+  integrity sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==
+  dependencies:
+    q "^1.5.1"
+
+conventional-changelog-cli@^2.2.2:
+  version "2.2.2"
+  resolved "https://registry.npmmirror.com/conventional-changelog-cli/-/conventional-changelog-cli-2.2.2.tgz#9a7746cede92c6a8f27dc46692efaadfbed60daa"
+  integrity sha512-8grMV5Jo8S0kP3yoMeJxV2P5R6VJOqK72IiSV9t/4H5r/HiRqEBQ83bYGuz4Yzfdj4bjaAEhZN/FFbsFXr5bOA==
+  dependencies:
+    add-stream "^1.0.0"
+    conventional-changelog "^3.1.24"
+    lodash "^4.17.15"
+    meow "^8.0.0"
+    tempfile "^3.0.0"
+
+conventional-changelog-codemirror@^2.0.8:
+  version "2.0.8"
+  resolved "https://registry.npmmirror.com/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz#398e9530f08ce34ec4640af98eeaf3022eb1f7dc"
+  integrity sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==
+  dependencies:
+    q "^1.5.1"
+
+conventional-changelog-conventionalcommits@^4.3.1, conventional-changelog-conventionalcommits@^4.5.0:
+  version "4.6.3"
+  resolved "https://registry.npmmirror.com/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz#0765490f56424b46f6cb4db9135902d6e5a36dc2"
+  integrity sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==
+  dependencies:
+    compare-func "^2.0.0"
+    lodash "^4.17.15"
+    q "^1.5.1"
+
+conventional-changelog-core@^4.2.1:
+  version "4.2.4"
+  resolved "https://registry.npmmirror.com/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz#e50d047e8ebacf63fac3dc67bf918177001e1e9f"
+  integrity sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==
+  dependencies:
+    add-stream "^1.0.0"
+    conventional-changelog-writer "^5.0.0"
+    conventional-commits-parser "^3.2.0"
+    dateformat "^3.0.0"
+    get-pkg-repo "^4.0.0"
+    git-raw-commits "^2.0.8"
+    git-remote-origin-url "^2.0.0"
+    git-semver-tags "^4.1.1"
+    lodash "^4.17.15"
+    normalize-package-data "^3.0.0"
+    q "^1.5.1"
+    read-pkg "^3.0.0"
+    read-pkg-up "^3.0.0"
+    through2 "^4.0.0"
+
+conventional-changelog-ember@^2.0.9:
+  version "2.0.9"
+  resolved "https://registry.npmmirror.com/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz#619b37ec708be9e74a220f4dcf79212ae1c92962"
+  integrity sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==
+  dependencies:
+    q "^1.5.1"
+
+conventional-changelog-eslint@^3.0.9:
+  version "3.0.9"
+  resolved "https://registry.npmmirror.com/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz#689bd0a470e02f7baafe21a495880deea18b7cdb"
+  integrity sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==
+  dependencies:
+    q "^1.5.1"
+
+conventional-changelog-express@^2.0.6:
+  version "2.0.6"
+  resolved "https://registry.npmmirror.com/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz#420c9d92a347b72a91544750bffa9387665a6ee8"
+  integrity sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==
+  dependencies:
+    q "^1.5.1"
+
+conventional-changelog-jquery@^3.0.11:
+  version "3.0.11"
+  resolved "https://registry.npmmirror.com/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz#d142207400f51c9e5bb588596598e24bba8994bf"
+  integrity sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==
+  dependencies:
+    q "^1.5.1"
+
+conventional-changelog-jshint@^2.0.9:
+  version "2.0.9"
+  resolved "https://registry.npmmirror.com/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz#f2d7f23e6acd4927a238555d92c09b50fe3852ff"
+  integrity sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==
+  dependencies:
+    compare-func "^2.0.0"
+    q "^1.5.1"
+
+conventional-changelog-preset-loader@^2.3.4:
+  version "2.3.4"
+  resolved "https://registry.npmmirror.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz#14a855abbffd59027fd602581f1f34d9862ea44c"
+  integrity sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==
+
+conventional-changelog-writer@^5.0.0:
+  version "5.0.1"
+  resolved "https://registry.npmmirror.com/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz#e0757072f045fe03d91da6343c843029e702f359"
+  integrity sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==
+  dependencies:
+    conventional-commits-filter "^2.0.7"
+    dateformat "^3.0.0"
+    handlebars "^4.7.7"
+    json-stringify-safe "^5.0.1"
+    lodash "^4.17.15"
+    meow "^8.0.0"
+    semver "^6.0.0"
+    split "^1.0.0"
+    through2 "^4.0.0"
+
+conventional-changelog@^3.1.24:
+  version "3.1.25"
+  resolved "https://registry.npmmirror.com/conventional-changelog/-/conventional-changelog-3.1.25.tgz#3e227a37d15684f5aa1fb52222a6e9e2536ccaff"
+  integrity sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==
+  dependencies:
+    conventional-changelog-angular "^5.0.12"
+    conventional-changelog-atom "^2.0.8"
+    conventional-changelog-codemirror "^2.0.8"
+    conventional-changelog-conventionalcommits "^4.5.0"
+    conventional-changelog-core "^4.2.1"
+    conventional-changelog-ember "^2.0.9"
+    conventional-changelog-eslint "^3.0.9"
+    conventional-changelog-express "^2.0.6"
+    conventional-changelog-jquery "^3.0.11"
+    conventional-changelog-jshint "^2.0.9"
+    conventional-changelog-preset-loader "^2.3.4"
+
+conventional-commits-filter@^2.0.7:
+  version "2.0.7"
+  resolved "https://registry.npmmirror.com/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz#f8d9b4f182fce00c9af7139da49365b136c8a0b3"
+  integrity sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==
+  dependencies:
+    lodash.ismatch "^4.4.0"
+    modify-values "^1.0.0"
+
+conventional-commits-parser@^3.2.0, conventional-commits-parser@^3.2.2:
+  version "3.2.4"
+  resolved "https://registry.npmmirror.com/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz#a7d3b77758a202a9b2293d2112a8d8052c740972"
+  integrity sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==
+  dependencies:
+    JSONStream "^1.0.4"
+    is-text-path "^1.0.1"
+    lodash "^4.17.15"
+    meow "^8.0.0"
+    split2 "^3.0.0"
+    through2 "^4.0.0"
+
+convert-source-map@^1.7.0:
+  version "1.8.0"
+  resolved "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369"
+  integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==
+  dependencies:
+    safe-buffer "~5.1.1"
+
+copy-anything@^2.0.1:
+  version "2.0.6"
+  resolved "https://registry.npmmirror.com/copy-anything/-/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480"
+  integrity sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==
+  dependencies:
+    is-what "^3.14.1"
+
+copy-descriptor@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.npmmirror.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+  integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==
+
+core-js-compat@^3.21.0, core-js-compat@^3.22.1:
+  version "3.24.1"
+  resolved "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.24.1.tgz#d1af84a17e18dfdd401ee39da9996f9a7ba887de"
+  integrity sha512-XhdNAGeRnTpp8xbD+sR/HFDK9CbeeeqXT6TuofXh3urqEevzkWmLRgrVoykodsw8okqo2pu1BOmuCKrHx63zdw==
+  dependencies:
+    browserslist "^4.21.3"
+    semver "7.0.0"
+
+core-js@^3.15.1, core-js@^3.22.3:
+  version "3.24.1"
+  resolved "https://registry.npmmirror.com/core-js/-/core-js-3.24.1.tgz#cf7724d41724154010a6576b7b57d94c5d66e64f"
+  integrity sha512-0QTBSYSUZ6Gq21utGzkfITDylE8jWC9Ne1D2MrhvlsZBI1x39OdDIVbzSqtgMndIy6BlHxBXpMGqzZmnztg2rg==
+
+core-util-is@~1.0.0:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
+  integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
+
+cors@^2.8.5:
+  version "2.8.5"
+  resolved "https://registry.npmmirror.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
+  integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
+  dependencies:
+    object-assign "^4"
+    vary "^1"
+
+cosmiconfig-typescript-loader@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-2.0.2.tgz#7e7ce6064af041c910e1e43fb0fd9625cee56e93"
+  integrity sha512-KmE+bMjWMXJbkWCeY4FJX/npHuZPNr9XF9q9CIQ/bpFwi1qHfCmSiKarrCcRa0LO4fWjk93pVoeRtJAkTGcYNw==
+  dependencies:
+    cosmiconfig "^7"
+    ts-node "^10.8.1"
+
+cosmiconfig@^7, cosmiconfig@^7.0.0, cosmiconfig@^7.0.1:
+  version "7.0.1"
+  resolved "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d"
+  integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==
+  dependencies:
+    "@types/parse-json" "^4.0.0"
+    import-fresh "^3.2.1"
+    parse-json "^5.0.0"
+    path-type "^4.0.0"
+    yaml "^1.10.0"
+
+crc-32@~1.2.0, crc-32@~1.2.1:
+  version "1.2.2"
+  resolved "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff"
+  integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==
+
+create-require@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
+  integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
+
+cropperjs@^1.5.12:
+  version "1.5.12"
+  resolved "https://registry.npmmirror.com/cropperjs/-/cropperjs-1.5.12.tgz#d9c0db2bfb8c0d769d51739e8f916bbc44e10f50"
+  integrity sha512-re7UdjE5UnwdrovyhNzZ6gathI4Rs3KGCBSc8HCIjUo5hO42CtzyblmWLj6QWVw7huHyDMfpKxhiO2II77nhDw==
+
+cross-env@^7.0.3:
+  version "7.0.3"
+  resolved "https://registry.npmmirror.com/cross-env/-/cross-env-7.0.3.tgz#865264b29677dc015ba8418918965dd232fc54cf"
+  integrity sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==
+  dependencies:
+    cross-spawn "^7.0.1"
+
+cross-fetch@^3.1.5:
+  version "3.1.5"
+  resolved "https://registry.npmmirror.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f"
+  integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==
+  dependencies:
+    node-fetch "2.6.7"
+
+cross-spawn@^5.0.1:
+  version "5.1.0"
+  resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+  integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==
+  dependencies:
+    lru-cache "^4.0.1"
+    shebang-command "^1.2.0"
+    which "^1.2.9"
+
+cross-spawn@^6.0.0, cross-spawn@^6.0.5:
+  version "6.0.5"
+  resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
+  integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
+  dependencies:
+    nice-try "^1.0.4"
+    path-key "^2.0.1"
+    semver "^5.5.0"
+    shebang-command "^1.2.0"
+    which "^1.2.9"
+
+cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3:
+  version "7.0.3"
+  resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+  integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+  dependencies:
+    path-key "^3.1.0"
+    shebang-command "^2.0.0"
+    which "^2.0.1"
+
+crypto-js@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf"
+  integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==
+
+crypto-random-string@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5"
+  integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==
+
+css-functions-list@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/css-functions-list/-/css-functions-list-3.1.0.tgz#cf5b09f835ad91a00e5959bcfc627cd498e1321b"
+  integrity sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==
+
+css-select@^4.1.3, css-select@^4.2.1:
+  version "4.3.0"
+  resolved "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b"
+  integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==
+  dependencies:
+    boolbase "^1.0.0"
+    css-what "^6.0.1"
+    domhandler "^4.3.1"
+    domutils "^2.8.0"
+    nth-check "^2.0.1"
+
+css-tree@^1.1.2, css-tree@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.npmmirror.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d"
+  integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==
+  dependencies:
+    mdn-data "2.0.14"
+    source-map "^0.6.1"
+
+css-what@^6.0.1:
+  version "6.1.0"
+  resolved "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4"
+  integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==
+
+cssesc@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
+  integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
+
+csso@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.npmmirror.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529"
+  integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==
+  dependencies:
+    css-tree "^1.1.2"
+
+csstype@^2.6.8:
+  version "2.6.20"
+  resolved "https://registry.npmmirror.com/csstype/-/csstype-2.6.20.tgz#9229c65ea0b260cf4d3d997cb06288e36a8d6dda"
+  integrity sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==
+
+currently-unhandled@^0.4.1:
+  version "0.4.1"
+  resolved "https://registry.npmmirror.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
+  integrity sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==
+  dependencies:
+    array-find-index "^1.0.1"
+
+cwebp-bin@^5.0.0:
+  version "5.1.0"
+  resolved "https://registry.npmmirror.com/cwebp-bin/-/cwebp-bin-5.1.0.tgz#d5bea87c127358558e7bf7a90a6d440d42dcb074"
+  integrity sha512-BsPKStaNr98zfxwejWWLIGELbPERULJoD2v5ijvpeutSAGsegX7gmABgnkRK7MUucCPROXXfaPqkLAwI509JzA==
+  dependencies:
+    bin-build "^3.0.0"
+    bin-wrapper "^4.0.1"
+    logalot "^2.1.0"
+
+cz-git@^1.3.9:
+  version "1.3.11"
+  resolved "https://registry.npmmirror.com/cz-git/-/cz-git-1.3.11.tgz#fd386ca3b111d8585e22a1ea5678076b9aa897fa"
+  integrity sha512-YelXp5cbFCGslt60XQTpF+MQWoyTpkwPC5vMArIdI65bk9llgAl5vLQPtKBva+aQ781YctkeeKldlJ6Pizezbg==
+
+czg@^1.3.9:
+  version "1.3.11"
+  resolved "https://registry.npmmirror.com/czg/-/czg-1.3.11.tgz#a4de415478321ee83bb01da94ea6fee4e616c384"
+  integrity sha512-v7iZRG9Po8Vix8OfF7vqsaUxchc+uRD2iEOy0rN84Hr22rndzeekfRDff8Vl9wCZGSsBZDqn+eAp6HJt7nXgvg==
+
+dargs@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.npmmirror.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc"
+  integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==
+
+dateformat@^3.0.0:
+  version "3.0.3"
+  resolved "https://registry.npmmirror.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae"
+  integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==
+
+dayjs@^1.10.5, dayjs@^1.11.1:
+  version "1.11.5"
+  resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.5.tgz#00e8cc627f231f9499c19b38af49f56dc0ac5e93"
+  integrity sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA==
+
+debug@2.6.9, debug@^2.2.0, debug@^2.3.3:
+  version "2.6.9"
+  resolved "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+  integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+  dependencies:
+    ms "2.0.0"
+
+debug@^3.2.6:
+  version "3.2.7"
+  resolved "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
+  integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+  dependencies:
+    ms "^2.1.1"
+
+debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4:
+  version "4.3.4"
+  resolved "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
+  integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+  dependencies:
+    ms "2.1.2"
+
+decamelize-keys@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9"
+  integrity sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==
+  dependencies:
+    decamelize "^1.1.0"
+    map-obj "^1.0.0"
+
+decamelize@^1.1.0, decamelize@^1.1.2, decamelize@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+  integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==
+
+decode-uri-component@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.npmmirror.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+  integrity sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==
+
+decompress-response@^3.2.0, decompress-response@^3.3.0:
+  version "3.3.0"
+  resolved "https://registry.npmmirror.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
+  integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==
+  dependencies:
+    mimic-response "^1.0.0"
+
+decompress-tar@^4.0.0, decompress-tar@^4.1.0, decompress-tar@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.npmmirror.com/decompress-tar/-/decompress-tar-4.1.1.tgz#718cbd3fcb16209716e70a26b84e7ba4592e5af1"
+  integrity sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==
+  dependencies:
+    file-type "^5.2.0"
+    is-stream "^1.1.0"
+    tar-stream "^1.5.2"
+
+decompress-tarbz2@^4.0.0:
+  version "4.1.1"
+  resolved "https://registry.npmmirror.com/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz#3082a5b880ea4043816349f378b56c516be1a39b"
+  integrity sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==
+  dependencies:
+    decompress-tar "^4.1.0"
+    file-type "^6.1.0"
+    is-stream "^1.1.0"
+    seek-bzip "^1.0.5"
+    unbzip2-stream "^1.0.9"
+
+decompress-targz@^4.0.0:
+  version "4.1.1"
+  resolved "https://registry.npmmirror.com/decompress-targz/-/decompress-targz-4.1.1.tgz#c09bc35c4d11f3de09f2d2da53e9de23e7ce1eee"
+  integrity sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==
+  dependencies:
+    decompress-tar "^4.1.1"
+    file-type "^5.2.0"
+    is-stream "^1.1.0"
+
+decompress-unzip@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.npmmirror.com/decompress-unzip/-/decompress-unzip-4.0.1.tgz#deaaccdfd14aeaf85578f733ae8210f9b4848f69"
+  integrity sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==
+  dependencies:
+    file-type "^3.8.0"
+    get-stream "^2.2.0"
+    pify "^2.3.0"
+    yauzl "^2.4.2"
+
+decompress@^4.0.0, decompress@^4.2.0:
+  version "4.2.1"
+  resolved "https://registry.npmmirror.com/decompress/-/decompress-4.2.1.tgz#007f55cc6a62c055afa37c07eb6a4ee1b773f118"
+  integrity sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==
+  dependencies:
+    decompress-tar "^4.0.0"
+    decompress-tarbz2 "^4.0.0"
+    decompress-targz "^4.0.0"
+    decompress-unzip "^4.0.1"
+    graceful-fs "^4.1.10"
+    make-dir "^1.0.0"
+    pify "^2.3.0"
+    strip-dirs "^2.0.0"
+
+deep-is@^0.1.3:
+  version "0.1.4"
+  resolved "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
+  integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
+
+deepmerge@^4.2.2:
+  version "4.2.2"
+  resolved "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
+  integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==
+
+defaults@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
+  integrity sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==
+  dependencies:
+    clone "^1.0.2"
+
+define-lazy-prop@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f"
+  integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==
+
+define-properties@^1.1.3, define-properties@^1.1.4:
+  version "1.1.4"
+  resolved "https://registry.npmmirror.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1"
+  integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==
+  dependencies:
+    has-property-descriptors "^1.0.0"
+    object-keys "^1.1.1"
+
+define-property@^0.2.5:
+  version "0.2.5"
+  resolved "https://registry.npmmirror.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+  integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==
+  dependencies:
+    is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+  integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==
+  dependencies:
+    is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+  integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
+  dependencies:
+    is-descriptor "^1.0.2"
+    isobject "^3.0.1"
+
+deprecation@^2.0.0, deprecation@^2.3.1:
+  version "2.3.1"
+  resolved "https://registry.npmmirror.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919"
+  integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==
+
+diff-match-patch@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.npmmirror.com/diff-match-patch/-/diff-match-patch-1.0.5.tgz#abb584d5f10cd1196dfc55aa03701592ae3f7b37"
+  integrity sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==
+
+diff@^4.0.1:
+  version "4.0.2"
+  resolved "https://registry.npmmirror.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
+  integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
+
+dijkstrajs@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/dijkstrajs/-/dijkstrajs-1.0.2.tgz#2e48c0d3b825462afe75ab4ad5e829c8ece36257"
+  integrity sha512-QV6PMaHTCNmKSeP6QoXhVTw9snc9VD8MulTT0Bd99Pacp4SS1cjcrYPgBPmibqKVtMJJfqC6XvOXgPMEEPH/fg==
+
+dir-glob@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
+  integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
+  dependencies:
+    path-type "^4.0.0"
+
+doctrine@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
+  integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
+  dependencies:
+    esutils "^2.0.2"
+
+dom-align@^1.12.1:
+  version "1.12.3"
+  resolved "https://registry.npmmirror.com/dom-align/-/dom-align-1.12.3.tgz#a36d02531dae0eefa2abb0c4db6595250526f103"
+  integrity sha512-Gj9hZN3a07cbR6zviMUBOMPdWxYhbMI+x+WS0NAIu2zFZmbK8ys9R79g+iG9qLnlCwpFoaB+fKy8Pdv470GsPA==
+
+dom-scroll-into-view@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/dom-scroll-into-view/-/dom-scroll-into-view-2.0.1.tgz#0decc8522801fd8d3f1c6ba355a74d382c5f989b"
+  integrity sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==
+
+dom-serializer@0:
+  version "0.2.2"
+  resolved "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51"
+  integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==
+  dependencies:
+    domelementtype "^2.0.1"
+    entities "^2.0.0"
+
+dom-serializer@^1.0.1:
+  version "1.4.1"
+  resolved "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30"
+  integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==
+  dependencies:
+    domelementtype "^2.0.1"
+    domhandler "^4.2.0"
+    entities "^2.0.0"
+
+dom-serializer@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53"
+  integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==
+  dependencies:
+    domelementtype "^2.3.0"
+    domhandler "^5.0.2"
+    entities "^4.2.0"
+
+domelementtype@1, domelementtype@^1.3.1:
+  version "1.3.1"
+  resolved "https://registry.npmmirror.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
+  integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
+
+domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d"
+  integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==
+
+domhandler@^2.3.0:
+  version "2.4.2"
+  resolved "https://registry.npmmirror.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
+  integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==
+  dependencies:
+    domelementtype "1"
+
+domhandler@^4.2.0, domhandler@^4.3.1:
+  version "4.3.1"
+  resolved "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c"
+  integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==
+  dependencies:
+    domelementtype "^2.2.0"
+
+domhandler@^5.0.1, domhandler@^5.0.2:
+  version "5.0.3"
+  resolved "https://registry.npmmirror.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31"
+  integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==
+  dependencies:
+    domelementtype "^2.3.0"
+
+domutils@^1.5.1:
+  version "1.7.0"
+  resolved "https://registry.npmmirror.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
+  integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
+  dependencies:
+    dom-serializer "0"
+    domelementtype "1"
+
+domutils@^2.8.0:
+  version "2.8.0"
+  resolved "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135"
+  integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==
+  dependencies:
+    dom-serializer "^1.0.1"
+    domelementtype "^2.2.0"
+    domhandler "^4.2.0"
+
+domutils@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c"
+  integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==
+  dependencies:
+    dom-serializer "^2.0.0"
+    domelementtype "^2.3.0"
+    domhandler "^5.0.1"
+
+dot-case@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.npmmirror.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751"
+  integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==
+  dependencies:
+    no-case "^3.0.4"
+    tslib "^2.0.3"
+
+dot-prop@^5.1.0:
+  version "5.3.0"
+  resolved "https://registry.npmmirror.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88"
+  integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==
+  dependencies:
+    is-obj "^2.0.0"
+
+dotenv-expand@^8.0.2:
+  version "8.0.3"
+  resolved "https://registry.npmmirror.com/dotenv-expand/-/dotenv-expand-8.0.3.tgz#29016757455bcc748469c83a19b36aaf2b83dd6e"
+  integrity sha512-SErOMvge0ZUyWd5B0NXMQlDkN+8r+HhVUsxgOO7IoPDOdDRD2JjExpN6y3KnFR66jsJMwSn1pqIivhU5rcJiNg==
+
+dotenv@^16.0.0:
+  version "16.0.1"
+  resolved "https://registry.npmmirror.com/dotenv/-/dotenv-16.0.1.tgz#8f8f9d94876c35dac989876a5d3a82a267fdce1d"
+  integrity sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ==
+
+download@^6.2.2:
+  version "6.2.5"
+  resolved "https://registry.npmmirror.com/download/-/download-6.2.5.tgz#acd6a542e4cd0bb42ca70cfc98c9e43b07039714"
+  integrity sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==
+  dependencies:
+    caw "^2.0.0"
+    content-disposition "^0.5.2"
+    decompress "^4.0.0"
+    ext-name "^5.0.0"
+    file-type "5.2.0"
+    filenamify "^2.0.0"
+    get-stream "^3.0.0"
+    got "^7.0.0"
+    make-dir "^1.0.0"
+    p-event "^1.0.0"
+    pify "^3.0.0"
+
+download@^7.1.0:
+  version "7.1.0"
+  resolved "https://registry.npmmirror.com/download/-/download-7.1.0.tgz#9059aa9d70b503ee76a132897be6dec8e5587233"
+  integrity sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==
+  dependencies:
+    archive-type "^4.0.0"
+    caw "^2.0.1"
+    content-disposition "^0.5.2"
+    decompress "^4.2.0"
+    ext-name "^5.0.0"
+    file-type "^8.1.0"
+    filenamify "^2.0.0"
+    get-stream "^3.0.0"
+    got "^8.3.1"
+    make-dir "^1.2.0"
+    p-event "^2.1.0"
+    pify "^3.0.0"
+
+duplexer3@^0.1.4:
+  version "0.1.5"
+  resolved "https://registry.npmmirror.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e"
+  integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==
+
+eastasianwidth@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
+  integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
+
+echarts@^5.3.2:
+  version "5.3.3"
+  resolved "https://registry.npmmirror.com/echarts/-/echarts-5.3.3.tgz#df97b09c4c0e2ffcdfb44acf518d50c50e0b838e"
+  integrity sha512-BRw2serInRwO5SIwRviZ6Xgm5Lb7irgz+sLiFMmy/HOaf4SQ+7oYqxKzRHAKp4xHQ05AuHw1xvoQWJjDQq/FGw==
+  dependencies:
+    tslib "2.3.0"
+    zrender "5.3.2"
+
+ee-first@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+  integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
+
+ejs@^3.1.6:
+  version "3.1.8"
+  resolved "https://registry.npmmirror.com/ejs/-/ejs-3.1.8.tgz#758d32910c78047585c7ef1f92f9ee041c1c190b"
+  integrity sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==
+  dependencies:
+    jake "^10.8.5"
+
+electron-to-chromium@^1.4.202:
+  version "1.4.225"
+  resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.225.tgz#3e27bdd157cbaf19768141f2e0f0f45071e52338"
+  integrity sha512-ICHvGaCIQR3P88uK8aRtx8gmejbVJyC6bB4LEC3anzBrIzdzC7aiZHY4iFfXhN4st6I7lMO0x4sgBHf/7kBvRw==
+
+emoji-regex@^8.0.0:
+  version "8.0.0"
+  resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+  integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+emoji-regex@^9.2.2:
+  version "9.2.2"
+  resolved "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
+  integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
+
+emojis-list@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
+  integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
+
+encode-utf8@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/encode-utf8/-/encode-utf8-1.0.3.tgz#f30fdd31da07fb596f281beb2f6b027851994cda"
+  integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==
+
+encodeurl@~1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+  integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
+
+end-of-stream@^1.0.0, end-of-stream@^1.1.0:
+  version "1.4.4"
+  resolved "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
+  integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
+  dependencies:
+    once "^1.4.0"
+
+entities@^1.1.1:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
+  integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
+
+entities@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
+  integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==
+
+entities@^4.2.0, entities@^4.3.0:
+  version "4.3.1"
+  resolved "https://registry.npmmirror.com/entities/-/entities-4.3.1.tgz#c34062a94c865c322f9d67b4384e4169bcede6a4"
+  integrity sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==
+
+errno@^0.1.1:
+  version "0.1.8"
+  resolved "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f"
+  integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==
+  dependencies:
+    prr "~1.0.1"
+
+error-ex@^1.2.0, error-ex@^1.3.1:
+  version "1.3.2"
+  resolved "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+  integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+  dependencies:
+    is-arrayish "^0.2.1"
+
+es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.5:
+  version "1.20.1"
+  resolved "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814"
+  integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==
+  dependencies:
+    call-bind "^1.0.2"
+    es-to-primitive "^1.2.1"
+    function-bind "^1.1.1"
+    function.prototype.name "^1.1.5"
+    get-intrinsic "^1.1.1"
+    get-symbol-description "^1.0.0"
+    has "^1.0.3"
+    has-property-descriptors "^1.0.0"
+    has-symbols "^1.0.3"
+    internal-slot "^1.0.3"
+    is-callable "^1.2.4"
+    is-negative-zero "^2.0.2"
+    is-regex "^1.1.4"
+    is-shared-array-buffer "^1.0.2"
+    is-string "^1.0.7"
+    is-weakref "^1.0.2"
+    object-inspect "^1.12.0"
+    object-keys "^1.1.1"
+    object.assign "^4.1.2"
+    regexp.prototype.flags "^1.4.3"
+    string.prototype.trimend "^1.0.5"
+    string.prototype.trimstart "^1.0.5"
+    unbox-primitive "^1.0.2"
+
+es-module-lexer@^0.9.3:
+  version "0.9.3"
+  resolved "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19"
+  integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==
+
+es-to-primitive@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
+  integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+  dependencies:
+    is-callable "^1.1.4"
+    is-date-object "^1.0.1"
+    is-symbol "^1.0.2"
+
+esbuild-android-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz#505f41832884313bbaffb27704b8bcaa2d8616be"
+  integrity sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==
+
+esbuild-android-64@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.15.5.tgz#3c7b2f2a59017dab3f2c0356188a8dd9cbdc91c8"
+  integrity sha512-dYPPkiGNskvZqmIK29OPxolyY3tp+c47+Fsc2WYSOVjEPWNCHNyqhtFqQadcXMJDQt8eN0NMDukbyQgFcHquXg==
+
+esbuild-android-arm64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz#8ce69d7caba49646e009968fe5754a21a9871771"
+  integrity sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==
+
+esbuild-android-arm64@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.5.tgz#e301db818c5a67b786bf3bb7320e414ac0fcf193"
+  integrity sha512-YyEkaQl08ze3cBzI/4Cm1S+rVh8HMOpCdq8B78JLbNFHhzi4NixVN93xDrHZLztlocEYqi45rHHCgA8kZFidFg==
+
+esbuild-darwin-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz#24ba67b9a8cb890a3c08d9018f887cc221cdda25"
+  integrity sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==
+
+esbuild-darwin-64@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.5.tgz#11726de5d0bf5960b92421ef433e35871c091f8d"
+  integrity sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ==
+
+esbuild-darwin-arm64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz#3f7cdb78888ee05e488d250a2bdaab1fa671bf73"
+  integrity sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==
+
+esbuild-darwin-arm64@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.5.tgz#ad89dafebb3613fd374f5a245bb0ce4132413997"
+  integrity sha512-WIfQkocGtFrz7vCu44ypY5YmiFXpsxvz2xqwe688jFfSVCnUsCn2qkEVDo7gT8EpsLOz1J/OmqjExePL1dr1Kg==
+
+esbuild-freebsd-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz#09250f997a56ed4650f3e1979c905ffc40bbe94d"
+  integrity sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==
+
+esbuild-freebsd-64@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.5.tgz#6bfb52b4a0d29c965aa833e04126e95173289c8a"
+  integrity sha512-M5/EfzV2RsMd/wqwR18CELcenZ8+fFxQAAEO7TJKDmP3knhWSbD72ILzrXFMMwshlPAS1ShCZ90jsxkm+8FlaA==
+
+esbuild-freebsd-arm64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz#bafb46ed04fc5f97cbdb016d86947a79579f8e48"
+  integrity sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==
+
+esbuild-freebsd-arm64@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.5.tgz#38a3fed8c6398072f9914856c7c3e3444f9ef4dd"
+  integrity sha512-2JQQ5Qs9J0440F/n/aUBNvY6lTo4XP/4lt1TwDfHuo0DY3w5++anw+jTjfouLzbJmFFiwmX7SmUhMnysocx96w==
+
+esbuild-linux-32@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz#e2a8c4a8efdc355405325033fcebeb941f781fe5"
+  integrity sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==
+
+esbuild-linux-32@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.15.5.tgz#942dc70127f0c0a7ea91111baf2806e61fc81b32"
+  integrity sha512-gO9vNnIN0FTUGjvTFucIXtBSr1Woymmx/aHQtuU+2OllGU6YFLs99960UD4Dib1kFovVgs59MTXwpFdVoSMZoQ==
+
+esbuild-linux-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz#de5fdba1c95666cf72369f52b40b03be71226652"
+  integrity sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==
+
+esbuild-linux-64@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.15.5.tgz#6d748564492d5daaa7e62420862c31ac3a44aed9"
+  integrity sha512-ne0GFdNLsm4veXbTnYAWjbx3shpNKZJUd6XpNbKNUZaNllDZfYQt0/zRqOg0sc7O8GQ+PjSMv9IpIEULXVTVmg==
+
+esbuild-linux-arm64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz#dae4cd42ae9787468b6a5c158da4c84e83b0ce8b"
+  integrity sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==
+
+esbuild-linux-arm64@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.5.tgz#28cd899beb2d2b0a3870fd44f4526835089a318d"
+  integrity sha512-7EgFyP2zjO065XTfdCxiXVEk+f83RQ1JsryN1X/VSX2li9rnHAt2swRbpoz5Vlrl6qjHrCmq5b6yxD13z6RheA==
+
+esbuild-linux-arm@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz#a2c1dff6d0f21dbe8fc6998a122675533ddfcd59"
+  integrity sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==
+
+esbuild-linux-arm@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.5.tgz#6441c256225564d8794fdef5b0a69bc1a43051b5"
+  integrity sha512-wvAoHEN+gJ/22gnvhZnS/+2H14HyAxM07m59RSLn3iXrQsdS518jnEWRBnJz3fR6BJa+VUTo0NxYjGaNt7RA7Q==
+
+esbuild-linux-mips64le@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz#d9918e9e4cb972f8d6dae8e8655bf9ee131eda34"
+  integrity sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==
+
+esbuild-linux-mips64le@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.5.tgz#d4927f817290eaffc062446896b2a553f0e11981"
+  integrity sha512-KdnSkHxWrJ6Y40ABu+ipTZeRhFtc8dowGyFsZY5prsmMSr1ZTG9zQawguN4/tunJ0wy3+kD54GaGwdcpwWAvZQ==
+
+esbuild-linux-ppc64le@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz#3f9a0f6d41073fb1a640680845c7de52995f137e"
+  integrity sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==
+
+esbuild-linux-ppc64le@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.5.tgz#b6d660dc6d5295f89ac51c675f1a2f639e2fb474"
+  integrity sha512-QdRHGeZ2ykl5P0KRmfGBZIHmqcwIsUKWmmpZTOq573jRWwmpfRmS7xOhmDHBj9pxv+6qRMH8tLr2fe+ZKQvCYw==
+
+esbuild-linux-riscv64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz#618853c028178a61837bc799d2013d4695e451c8"
+  integrity sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==
+
+esbuild-linux-riscv64@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.5.tgz#2801bf18414dc3d3ad58d1ea83084f00d9d84896"
+  integrity sha512-p+WE6RX+jNILsf+exR29DwgV6B73khEQV0qWUbzxaycxawZ8NE0wA6HnnTxbiw5f4Gx9sJDUBemh9v49lKOORA==
+
+esbuild-linux-s390x@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz#d1885c4c5a76bbb5a0fe182e2c8c60eb9e29f2a6"
+  integrity sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==
+
+esbuild-linux-s390x@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.5.tgz#12a634ae6d3384cacc2b8f4201047deafe596eae"
+  integrity sha512-J2ngOB4cNzmqLHh6TYMM/ips8aoZIuzxJnDdWutBw5482jGXiOzsPoEF4j2WJ2mGnm7FBCO4StGcwzOgic70JQ==
+
+esbuild-netbsd-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz#69ae917a2ff241b7df1dbf22baf04bd330349e81"
+  integrity sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==
+
+esbuild-netbsd-64@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.5.tgz#951bbf87600512dfcfbe3b8d9d117d684d26c1b8"
+  integrity sha512-MmKUYGDizYjFia0Rwt8oOgmiFH7zaYlsoQ3tIOfPxOqLssAsEgG0MUdRDm5lliqjiuoog8LyDu9srQk5YwWF3w==
+
+esbuild-node-loader@^0.6.5:
+  version "0.6.5"
+  resolved "https://registry.npmmirror.com/esbuild-node-loader/-/esbuild-node-loader-0.6.5.tgz#c0aad436d01542150a8297b99dab71aa82add818"
+  integrity sha512-uPP+dllWm38cFvDysdocutN3lfe5pTIbddAHp1ENyLzpHYqE2r+3Wo+pfg9X3p8DFWwzIisft5YkeBIthIcixw==
+  dependencies:
+    esbuild ">=0.13.12"
+
+esbuild-openbsd-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz#db4c8495287a350a6790de22edea247a57c5d47b"
+  integrity sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==
+
+esbuild-openbsd-64@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.5.tgz#26705b61961d525d79a772232e8b8f211fdbb035"
+  integrity sha512-2mMFfkLk3oPWfopA9Plj4hyhqHNuGyp5KQyTT9Rc8hFd8wAn5ZrbJg+gNcLMo2yzf8Uiu0RT6G9B15YN9WQyMA==
+
+esbuild-plugin-alias@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.npmmirror.com/esbuild-plugin-alias/-/esbuild-plugin-alias-0.1.2.tgz#1232fbde807c0c8ad44c44ec859819eb492e12a8"
+  integrity sha512-WsX0OJy8IGOsGZV+4oHEU5B6XQUpxOsZN1iSoYf9COTDbY7WXcOwd1oCLYNWUIWCExyGXSghIGq2k7sXBldxwQ==
+
+esbuild-register@^3.3.2:
+  version "3.3.3"
+  resolved "https://registry.npmmirror.com/esbuild-register/-/esbuild-register-3.3.3.tgz#5bd80025c80caf77e6484ced5cc77233b1d39688"
+  integrity sha512-eFHOkutgIMJY5gc8LUp/7c+LLlDqzNi9T6AwCZ2WKKl3HmT+5ef3ZRyPPxDOynInML0fgaC50yszPKfPnjC0NQ==
+
+esbuild-sunos-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz#54287ee3da73d3844b721c21bc80c1dc7e1bf7da"
+  integrity sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==
+
+esbuild-sunos-64@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.5.tgz#d794da1ae60e6e2f6194c44d7b3c66bf66c7a141"
+  integrity sha512-2sIzhMUfLNoD+rdmV6AacilCHSxZIoGAU2oT7XmJ0lXcZWnCvCtObvO6D4puxX9YRE97GodciRGDLBaiC6x1SA==
+
+esbuild-windows-32@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz#f8aaf9a5667630b40f0fb3aa37bf01bbd340ce31"
+  integrity sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==
+
+esbuild-windows-32@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.15.5.tgz#0670326903f421424be86bc03b7f7b3ff86a9db7"
+  integrity sha512-e+duNED9UBop7Vnlap6XKedA/53lIi12xv2ebeNS4gFmu7aKyTrok7DPIZyU5w/ftHD4MUDs5PJUkQPP9xJRzg==
+
+esbuild-windows-64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz#bf54b51bd3e9b0f1886ffdb224a4176031ea0af4"
+  integrity sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==
+
+esbuild-windows-64@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.15.5.tgz#64f32acb7341f3f0a4d10e8ff1998c2d1ebfc0a9"
+  integrity sha512-v+PjvNtSASHOjPDMIai9Yi+aP+Vwox+3WVdg2JB8N9aivJ7lyhp4NVU+J0MV2OkWFPnVO8AE/7xH+72ibUUEnw==
+
+esbuild-windows-arm64@0.14.54:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz#937d15675a15e4b0e4fafdbaa3a01a776a2be982"
+  integrity sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==
+
+esbuild-windows-arm64@0.15.5:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.5.tgz#4fe7f333ce22a922906b10233c62171673a3854b"
+  integrity sha512-Yz8w/D8CUPYstvVQujByu6mlf48lKmXkq6bkeSZZxTA626efQOJb26aDGLzmFWx6eg/FwrXgt6SZs9V8Pwy/aA==
+
+esbuild@0.11.3:
+  version "0.11.3"
+  resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.11.3.tgz#b57165b907be4ffba651f6450538ce8d8c1d5eb0"
+  integrity sha512-BzVRHcCtFepjS9WcqRjqoIxLqgpK21a8J4Zi4msSGxDxiXVO1IbcqT1KjhdDDnJxKfe7bvzZrvMEX+bVO0Elcw==
+
+esbuild@>=0.13.0, esbuild@>=0.13.12:
+  version "0.15.5"
+  resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.15.5.tgz#5effd05666f621d4ff2fe2c76a67c198292193ff"
+  integrity sha512-VSf6S1QVqvxfIsSKb3UKr3VhUCis7wgDbtF4Vd9z84UJr05/Sp2fRKmzC+CSPG/dNAPPJZ0BTBLTT1Fhd6N9Gg==
+  optionalDependencies:
+    "@esbuild/linux-loong64" "0.15.5"
+    esbuild-android-64 "0.15.5"
+    esbuild-android-arm64 "0.15.5"
+    esbuild-darwin-64 "0.15.5"
+    esbuild-darwin-arm64 "0.15.5"
+    esbuild-freebsd-64 "0.15.5"
+    esbuild-freebsd-arm64 "0.15.5"
+    esbuild-linux-32 "0.15.5"
+    esbuild-linux-64 "0.15.5"
+    esbuild-linux-arm "0.15.5"
+    esbuild-linux-arm64 "0.15.5"
+    esbuild-linux-mips64le "0.15.5"
+    esbuild-linux-ppc64le "0.15.5"
+    esbuild-linux-riscv64 "0.15.5"
+    esbuild-linux-s390x "0.15.5"
+    esbuild-netbsd-64 "0.15.5"
+    esbuild-openbsd-64 "0.15.5"
+    esbuild-sunos-64 "0.15.5"
+    esbuild-windows-32 "0.15.5"
+    esbuild-windows-64 "0.15.5"
+    esbuild-windows-arm64 "0.15.5"
+
+esbuild@^0.11.23:
+  version "0.11.23"
+  resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.11.23.tgz#c42534f632e165120671d64db67883634333b4b8"
+  integrity sha512-iaiZZ9vUF5wJV8ob1tl+5aJTrwDczlvGP0JoMmnpC2B0ppiMCu8n8gmy5ZTGl5bcG081XBVn+U+jP+mPFm5T5Q==
+
+esbuild@^0.14.14, esbuild@^0.14.27, esbuild@^0.14.47:
+  version "0.14.54"
+  resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.14.54.tgz#8b44dcf2b0f1a66fc22459943dccf477535e9aa2"
+  integrity sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==
+  optionalDependencies:
+    "@esbuild/linux-loong64" "0.14.54"
+    esbuild-android-64 "0.14.54"
+    esbuild-android-arm64 "0.14.54"
+    esbuild-darwin-64 "0.14.54"
+    esbuild-darwin-arm64 "0.14.54"
+    esbuild-freebsd-64 "0.14.54"
+    esbuild-freebsd-arm64 "0.14.54"
+    esbuild-linux-32 "0.14.54"
+    esbuild-linux-64 "0.14.54"
+    esbuild-linux-arm "0.14.54"
+    esbuild-linux-arm64 "0.14.54"
+    esbuild-linux-mips64le "0.14.54"
+    esbuild-linux-ppc64le "0.14.54"
+    esbuild-linux-riscv64 "0.14.54"
+    esbuild-linux-s390x "0.14.54"
+    esbuild-netbsd-64 "0.14.54"
+    esbuild-openbsd-64 "0.14.54"
+    esbuild-sunos-64 "0.14.54"
+    esbuild-windows-32 "0.14.54"
+    esbuild-windows-64 "0.14.54"
+    esbuild-windows-arm64 "0.14.54"
+
+escalade@^3.1.1:
+  version "3.1.1"
+  resolved "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
+  integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+
+escape-html@~1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+  integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
+
+escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+  integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
+
+escape-string-regexp@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+  integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+eslint-config-prettier@^8.5.0:
+  version "8.5.0"
+  resolved "https://registry.npmmirror.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1"
+  integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==
+
+eslint-plugin-prettier@^4.0.0:
+  version "4.2.1"
+  resolved "https://registry.npmmirror.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b"
+  integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==
+  dependencies:
+    prettier-linter-helpers "^1.0.0"
+
+eslint-plugin-vue@^8.6.0:
+  version "8.7.1"
+  resolved "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz#f13c53547a0c9d64588a675cc5ecc6ccaf63703f"
+  integrity sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==
+  dependencies:
+    eslint-utils "^3.0.0"
+    natural-compare "^1.4.0"
+    nth-check "^2.0.1"
+    postcss-selector-parser "^6.0.9"
+    semver "^7.3.5"
+    vue-eslint-parser "^8.0.1"
+
+eslint-scope@^5.1.1:
+  version "5.1.1"
+  resolved "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
+  integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
+  dependencies:
+    esrecurse "^4.3.0"
+    estraverse "^4.1.1"
+
+eslint-scope@^7.0.0, eslint-scope@^7.1.1:
+  version "7.1.1"
+  resolved "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642"
+  integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==
+  dependencies:
+    esrecurse "^4.3.0"
+    estraverse "^5.2.0"
+
+eslint-utils@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672"
+  integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==
+  dependencies:
+    eslint-visitor-keys "^2.0.0"
+
+eslint-visitor-keys@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
+  integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
+
+eslint-visitor-keys@^3.1.0, eslint-visitor-keys@^3.3.0:
+  version "3.3.0"
+  resolved "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
+  integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
+
+eslint@^8.13.0:
+  version "8.22.0"
+  resolved "https://registry.npmmirror.com/eslint/-/eslint-8.22.0.tgz#78fcb044196dfa7eef30a9d65944f6f980402c48"
+  integrity sha512-ci4t0sz6vSRKdmkOGmprBo6fmI4PrphDFMy5JEq/fNS0gQkJM3rLmrqcp8ipMcdobH3KtUP40KniAE9W19S4wA==
+  dependencies:
+    "@eslint/eslintrc" "^1.3.0"
+    "@humanwhocodes/config-array" "^0.10.4"
+    "@humanwhocodes/gitignore-to-minimatch" "^1.0.2"
+    ajv "^6.10.0"
+    chalk "^4.0.0"
+    cross-spawn "^7.0.2"
+    debug "^4.3.2"
+    doctrine "^3.0.0"
+    escape-string-regexp "^4.0.0"
+    eslint-scope "^7.1.1"
+    eslint-utils "^3.0.0"
+    eslint-visitor-keys "^3.3.0"
+    espree "^9.3.3"
+    esquery "^1.4.0"
+    esutils "^2.0.2"
+    fast-deep-equal "^3.1.3"
+    file-entry-cache "^6.0.1"
+    find-up "^5.0.0"
+    functional-red-black-tree "^1.0.1"
+    glob-parent "^6.0.1"
+    globals "^13.15.0"
+    globby "^11.1.0"
+    grapheme-splitter "^1.0.4"
+    ignore "^5.2.0"
+    import-fresh "^3.0.0"
+    imurmurhash "^0.1.4"
+    is-glob "^4.0.0"
+    js-yaml "^4.1.0"
+    json-stable-stringify-without-jsonify "^1.0.1"
+    levn "^0.4.1"
+    lodash.merge "^4.6.2"
+    minimatch "^3.1.2"
+    natural-compare "^1.4.0"
+    optionator "^0.9.1"
+    regexpp "^3.2.0"
+    strip-ansi "^6.0.1"
+    strip-json-comments "^3.1.0"
+    text-table "^0.2.0"
+    v8-compile-cache "^2.0.3"
+
+esno@^0.14.1:
+  version "0.14.1"
+  resolved "https://registry.npmmirror.com/esno/-/esno-0.14.1.tgz#b7557b3c70eda5ae0c3f0daa07739b8337526610"
+  integrity sha512-yDFYw6dGUjCT1qKsdG7WOc/RzIh/qwxUEVZ+ohCltaxBxEFMNqeqbQL9xjRl6Yvdwrfc5OCjUA9JbFmuu/8BKg==
+  dependencies:
+    cross-spawn "^7.0.3"
+    esbuild ">=0.13.0"
+    esbuild-node-loader "^0.6.5"
+    esbuild-register "^3.3.2"
+    import-meta-resolve "^1.1.1"
+
+espree@^9.0.0, espree@^9.3.2, espree@^9.3.3:
+  version "9.3.3"
+  resolved "https://registry.npmmirror.com/espree/-/espree-9.3.3.tgz#2dd37c4162bb05f433ad3c1a52ddf8a49dc08e9d"
+  integrity sha512-ORs1Rt/uQTqUKjDdGCyrtYxbazf5umATSf/K4qxjmZHORR6HJk+2s/2Pqe+Kk49HHINC/xNIrGfgh8sZcll0ng==
+  dependencies:
+    acorn "^8.8.0"
+    acorn-jsx "^5.3.2"
+    eslint-visitor-keys "^3.3.0"
+
+esquery@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.npmmirror.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5"
+  integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==
+  dependencies:
+    estraverse "^5.1.0"
+
+esrecurse@^4.3.0:
+  version "4.3.0"
+  resolved "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
+  integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
+  dependencies:
+    estraverse "^5.2.0"
+
+estraverse@^4.1.1:
+  version "4.3.0"
+  resolved "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
+  integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
+
+estraverse@^5.1.0, estraverse@^5.2.0:
+  version "5.3.0"
+  resolved "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
+  integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+
+estree-walker@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700"
+  integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==
+
+estree-walker@^2.0.1, estree-walker@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
+  integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
+
+esutils@^2.0.2:
+  version "2.0.3"
+  resolved "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+  integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+etag@^1.8.1:
+  version "1.8.1"
+  resolved "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+  integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==
+
+exec-buffer@^3.0.0:
+  version "3.2.0"
+  resolved "https://registry.npmmirror.com/exec-buffer/-/exec-buffer-3.2.0.tgz#b1686dbd904c7cf982e652c1f5a79b1e5573082b"
+  integrity sha512-wsiD+2Tp6BWHoVv3B+5Dcx6E7u5zky+hUwOHjuH2hKSLR3dvRmX8fk8UD8uqQixHs4Wk6eDmiegVrMPjKj7wpA==
+  dependencies:
+    execa "^0.7.0"
+    p-finally "^1.0.0"
+    pify "^3.0.0"
+    rimraf "^2.5.4"
+    tempfile "^2.0.0"
+
+execa@^0.7.0:
+  version "0.7.0"
+  resolved "https://registry.npmmirror.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
+  integrity sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==
+  dependencies:
+    cross-spawn "^5.0.1"
+    get-stream "^3.0.0"
+    is-stream "^1.1.0"
+    npm-run-path "^2.0.0"
+    p-finally "^1.0.0"
+    signal-exit "^3.0.0"
+    strip-eof "^1.0.0"
+
+execa@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
+  integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==
+  dependencies:
+    cross-spawn "^6.0.0"
+    get-stream "^4.0.0"
+    is-stream "^1.1.0"
+    npm-run-path "^2.0.0"
+    p-finally "^1.0.0"
+    signal-exit "^3.0.0"
+    strip-eof "^1.0.0"
+
+execa@^4.0.0:
+  version "4.1.0"
+  resolved "https://registry.npmmirror.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a"
+  integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==
+  dependencies:
+    cross-spawn "^7.0.0"
+    get-stream "^5.0.0"
+    human-signals "^1.1.1"
+    is-stream "^2.0.0"
+    merge-stream "^2.0.0"
+    npm-run-path "^4.0.0"
+    onetime "^5.1.0"
+    signal-exit "^3.0.2"
+    strip-final-newline "^2.0.0"
+
+execa@^5.0.0, execa@^5.1.1:
+  version "5.1.1"
+  resolved "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
+  integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
+  dependencies:
+    cross-spawn "^7.0.3"
+    get-stream "^6.0.0"
+    human-signals "^2.1.0"
+    is-stream "^2.0.0"
+    merge-stream "^2.0.0"
+    npm-run-path "^4.0.1"
+    onetime "^5.1.2"
+    signal-exit "^3.0.3"
+    strip-final-newline "^2.0.0"
+
+executable@^4.1.0:
+  version "4.1.1"
+  resolved "https://registry.npmmirror.com/executable/-/executable-4.1.1.tgz#41532bff361d3e57af4d763b70582db18f5d133c"
+  integrity sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==
+  dependencies:
+    pify "^2.2.0"
+
+expand-brackets@^2.1.4:
+  version "2.1.4"
+  resolved "https://registry.npmmirror.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+  integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==
+  dependencies:
+    debug "^2.3.3"
+    define-property "^0.2.5"
+    extend-shallow "^2.0.1"
+    posix-character-classes "^0.1.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+ext-list@^2.0.0:
+  version "2.2.2"
+  resolved "https://registry.npmmirror.com/ext-list/-/ext-list-2.2.2.tgz#0b98e64ed82f5acf0f2931babf69212ef52ddd37"
+  integrity sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==
+  dependencies:
+    mime-db "^1.28.0"
+
+ext-name@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/ext-name/-/ext-name-5.0.0.tgz#70781981d183ee15d13993c8822045c506c8f0a6"
+  integrity sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==
+  dependencies:
+    ext-list "^2.0.0"
+    sort-keys-length "^1.0.0"
+
+extend-shallow@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+  integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==
+  dependencies:
+    is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+  integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==
+  dependencies:
+    assign-symbols "^1.0.0"
+    is-extendable "^1.0.1"
+
+external-editor@^3.0.3:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
+  integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==
+  dependencies:
+    chardet "^0.7.0"
+    iconv-lite "^0.4.24"
+    tmp "^0.0.33"
+
+extglob@^2.0.2:
+  version "2.0.4"
+  resolved "https://registry.npmmirror.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+  integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
+  dependencies:
+    array-unique "^0.3.2"
+    define-property "^1.0.0"
+    expand-brackets "^2.1.4"
+    extend-shallow "^2.0.1"
+    fragment-cache "^0.2.1"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
+  version "3.1.3"
+  resolved "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+  integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-diff@^1.1.2:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03"
+  integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
+
+fast-glob@^3.0.3, fast-glob@^3.2.11, fast-glob@^3.2.7, fast-glob@^3.2.9:
+  version "3.2.11"
+  resolved "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9"
+  integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==
+  dependencies:
+    "@nodelib/fs.stat" "^2.0.2"
+    "@nodelib/fs.walk" "^1.2.3"
+    glob-parent "^5.1.2"
+    merge2 "^1.3.0"
+    micromatch "^4.0.4"
+
+fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+  integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@^2.0.6:
+  version "2.0.6"
+  resolved "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+  integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
+
+fast-xml-parser@^3.19.0:
+  version "3.21.1"
+  resolved "https://registry.npmmirror.com/fast-xml-parser/-/fast-xml-parser-3.21.1.tgz#152a1d51d445380f7046b304672dd55d15c9e736"
+  integrity sha512-FTFVjYoBOZTJekiUsawGsSYV9QL0A+zDYCRj7y34IO6Jg+2IMYEtQa+bbictpdpV8dHxXywqU7C0gRDEOFtBFg==
+  dependencies:
+    strnum "^1.0.4"
+
+fastest-levenshtein@^1.0.16:
+  version "1.0.16"
+  resolved "https://registry.npmmirror.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5"
+  integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==
+
+fastq@^1.6.0:
+  version "1.13.0"
+  resolved "https://registry.npmmirror.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c"
+  integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==
+  dependencies:
+    reusify "^1.0.4"
+
+fd-slicer@~1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
+  integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==
+  dependencies:
+    pend "~1.2.0"
+
+figures@^1.3.5:
+  version "1.7.0"
+  resolved "https://registry.npmmirror.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
+  integrity sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==
+  dependencies:
+    escape-string-regexp "^1.0.5"
+    object-assign "^4.1.0"
+
+figures@^3.0.0:
+  version "3.2.0"
+  resolved "https://registry.npmmirror.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af"
+  integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==
+  dependencies:
+    escape-string-regexp "^1.0.5"
+
+file-entry-cache@^6.0.1:
+  version "6.0.1"
+  resolved "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
+  integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
+  dependencies:
+    flat-cache "^3.0.4"
+
+file-type@5.2.0, file-type@^5.2.0:
+  version "5.2.0"
+  resolved "https://registry.npmmirror.com/file-type/-/file-type-5.2.0.tgz#2ddbea7c73ffe36368dfae49dc338c058c2b8ad6"
+  integrity sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==
+
+file-type@^10.4.0, file-type@^10.5.0:
+  version "10.11.0"
+  resolved "https://registry.npmmirror.com/file-type/-/file-type-10.11.0.tgz#2961d09e4675b9fb9a3ee6b69e9cd23f43fd1890"
+  integrity sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==
+
+file-type@^12.0.0:
+  version "12.4.2"
+  resolved "https://registry.npmmirror.com/file-type/-/file-type-12.4.2.tgz#a344ea5664a1d01447ee7fb1b635f72feb6169d9"
+  integrity sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==
+
+file-type@^3.8.0:
+  version "3.9.0"
+  resolved "https://registry.npmmirror.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9"
+  integrity sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==
+
+file-type@^4.2.0:
+  version "4.4.0"
+  resolved "https://registry.npmmirror.com/file-type/-/file-type-4.4.0.tgz#1b600e5fca1fbdc6e80c0a70c71c8dba5f7906c5"
+  integrity sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==
+
+file-type@^6.1.0:
+  version "6.2.0"
+  resolved "https://registry.npmmirror.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919"
+  integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==
+
+file-type@^8.1.0:
+  version "8.1.0"
+  resolved "https://registry.npmmirror.com/file-type/-/file-type-8.1.0.tgz#244f3b7ef641bbe0cca196c7276e4b332399f68c"
+  integrity sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==
+
+filelist@^1.0.1:
+  version "1.0.4"
+  resolved "https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5"
+  integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==
+  dependencies:
+    minimatch "^5.0.1"
+
+filename-reserved-regex@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229"
+  integrity sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==
+
+filenamify@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/filenamify/-/filenamify-2.1.0.tgz#88faf495fb1b47abfd612300002a16228c677ee9"
+  integrity sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==
+  dependencies:
+    filename-reserved-regex "^2.0.0"
+    strip-outer "^1.0.0"
+    trim-repeated "^1.0.0"
+
+fill-range@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+  integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-number "^3.0.0"
+    repeat-string "^1.6.1"
+    to-regex-range "^2.1.0"
+
+fill-range@^7.0.1:
+  version "7.0.1"
+  resolved "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+  integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+  dependencies:
+    to-regex-range "^5.0.1"
+
+finalhandler@1.1.2:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
+  integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
+  dependencies:
+    debug "2.6.9"
+    encodeurl "~1.0.2"
+    escape-html "~1.0.3"
+    on-finished "~2.3.0"
+    parseurl "~1.3.3"
+    statuses "~1.5.0"
+    unpipe "~1.0.0"
+
+find-up@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+  integrity sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==
+  dependencies:
+    path-exists "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+find-up@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+  integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==
+  dependencies:
+    locate-path "^2.0.0"
+
+find-up@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
+  integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
+  dependencies:
+    locate-path "^5.0.0"
+    path-exists "^4.0.0"
+
+find-up@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
+  integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
+  dependencies:
+    locate-path "^6.0.0"
+    path-exists "^4.0.0"
+
+find-versions@^3.0.0:
+  version "3.2.0"
+  resolved "https://registry.npmmirror.com/find-versions/-/find-versions-3.2.0.tgz#10297f98030a786829681690545ef659ed1d254e"
+  integrity sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==
+  dependencies:
+    semver-regex "^2.0.0"
+
+flat-cache@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
+  integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==
+  dependencies:
+    flatted "^3.1.0"
+    rimraf "^3.0.2"
+
+flatted@^3.1.0:
+  version "3.2.7"
+  resolved "https://registry.npmmirror.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787"
+  integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==
+
+follow-redirects@^1.14.0, follow-redirects@^1.14.8:
+  version "1.15.1"
+  resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5"
+  integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==
+
+for-in@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+  integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==
+
+frac@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz#3d74f7f6478c88a1b5020306d747dc6313c74d0b"
+  integrity sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==
+
+fraction.js@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950"
+  integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==
+
+fragment-cache@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.npmmirror.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+  integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==
+  dependencies:
+    map-cache "^0.2.2"
+
+from2@^2.1.1:
+  version "2.3.0"
+  resolved "https://registry.npmmirror.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
+  integrity sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==
+  dependencies:
+    inherits "^2.0.1"
+    readable-stream "^2.0.0"
+
+fs-constants@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
+  integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
+
+fs-extra@^10.0.0, fs-extra@^10.0.1, fs-extra@^10.1.0:
+  version "10.1.0"
+  resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf"
+  integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==
+  dependencies:
+    graceful-fs "^4.2.0"
+    jsonfile "^6.0.1"
+    universalify "^2.0.0"
+
+fs-extra@^9.0.1:
+  version "9.1.0"
+  resolved "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d"
+  integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
+  dependencies:
+    at-least-node "^1.0.0"
+    graceful-fs "^4.2.0"
+    jsonfile "^6.0.1"
+    universalify "^2.0.0"
+
+fs.realpath@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+  integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
+
+fsevents@~2.3.2:
+  version "2.3.2"
+  resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+  integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
+function-bind@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+  integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+function.prototype.name@^1.1.5:
+  version "1.1.5"
+  resolved "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621"
+  integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==
+  dependencies:
+    call-bind "^1.0.2"
+    define-properties "^1.1.3"
+    es-abstract "^1.19.0"
+    functions-have-names "^1.2.2"
+
+functional-red-black-tree@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+  integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==
+
+functions-have-names@^1.2.2:
+  version "1.2.3"
+  resolved "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
+  integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
+
+gensync@^1.0.0-beta.2:
+  version "1.0.0-beta.2"
+  resolved "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
+  integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+
+get-caller-file@^2.0.1, get-caller-file@^2.0.5:
+  version "2.0.5"
+  resolved "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+  integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598"
+  integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==
+  dependencies:
+    function-bind "^1.1.1"
+    has "^1.0.3"
+    has-symbols "^1.0.3"
+
+get-own-enumerable-property-symbols@^3.0.0:
+  version "3.0.2"
+  resolved "https://registry.npmmirror.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664"
+  integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==
+
+get-pkg-repo@^4.0.0:
+  version "4.2.1"
+  resolved "https://registry.npmmirror.com/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz#75973e1c8050c73f48190c52047c4cee3acbf385"
+  integrity sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==
+  dependencies:
+    "@hutson/parse-repository-url" "^3.0.0"
+    hosted-git-info "^4.0.0"
+    through2 "^2.0.0"
+    yargs "^16.2.0"
+
+get-proxy@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/get-proxy/-/get-proxy-2.1.0.tgz#349f2b4d91d44c4d4d4e9cba2ad90143fac5ef93"
+  integrity sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==
+  dependencies:
+    npm-conf "^1.1.0"
+
+get-stdin@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.npmmirror.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
+  integrity sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==
+
+get-stream@3.0.0, get-stream@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+  integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==
+
+get-stream@^2.2.0:
+  version "2.3.1"
+  resolved "https://registry.npmmirror.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de"
+  integrity sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==
+  dependencies:
+    object-assign "^4.0.1"
+    pinkie-promise "^2.0.0"
+
+get-stream@^4.0.0:
+  version "4.1.0"
+  resolved "https://registry.npmmirror.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
+  integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
+  dependencies:
+    pump "^3.0.0"
+
+get-stream@^5.0.0:
+  version "5.2.0"
+  resolved "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
+  integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
+  dependencies:
+    pump "^3.0.0"
+
+get-stream@^6.0.0:
+  version "6.0.1"
+  resolved "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
+  integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
+
+get-symbol-description@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6"
+  integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==
+  dependencies:
+    call-bind "^1.0.2"
+    get-intrinsic "^1.1.1"
+
+get-value@^2.0.3, get-value@^2.0.6:
+  version "2.0.6"
+  resolved "https://registry.npmmirror.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+  integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==
+
+gifsicle@5.2.0, gifsicle@^5.0.0:
+  version "5.2.0"
+  resolved "https://registry.npmmirror.com/gifsicle/-/gifsicle-5.2.0.tgz#b06b25ed7530f033f6ed2c545d6f9b546cc182fb"
+  integrity sha512-vOIS3j0XoTCxq9pkGj43gEix82RkI5FveNgaFZutjbaui/HH+4fR8Y56dwXDuxYo8hR4xOo6/j2h1WHoQW6XLw==
+  dependencies:
+    bin-build "^3.0.0"
+    bin-wrapper "^4.0.0"
+    execa "^5.0.0"
+    logalot "^2.0.0"
+
+git-raw-commits@^2.0.0, git-raw-commits@^2.0.8:
+  version "2.0.11"
+  resolved "https://registry.npmmirror.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723"
+  integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==
+  dependencies:
+    dargs "^7.0.0"
+    lodash "^4.17.15"
+    meow "^8.0.0"
+    split2 "^3.0.0"
+    through2 "^4.0.0"
+
+git-remote-origin-url@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f"
+  integrity sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==
+  dependencies:
+    gitconfiglocal "^1.0.0"
+    pify "^2.3.0"
+
+git-semver-tags@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.npmmirror.com/git-semver-tags/-/git-semver-tags-4.1.1.tgz#63191bcd809b0ec3e151ba4751c16c444e5b5780"
+  integrity sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==
+  dependencies:
+    meow "^8.0.0"
+    semver "^6.0.0"
+
+gitconfiglocal@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b"
+  integrity sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==
+  dependencies:
+    ini "^1.3.2"
+
+glob-parent@^5.1.2, glob-parent@~5.1.2:
+  version "5.1.2"
+  resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+  integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+  dependencies:
+    is-glob "^4.0.1"
+
+glob-parent@^6.0.1:
+  version "6.0.2"
+  resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
+  integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
+  dependencies:
+    is-glob "^4.0.3"
+
+glob@^7.1.3, glob@^7.1.6:
+  version "7.2.3"
+  resolved "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
+  integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.1.1"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+global-dirs@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.npmmirror.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445"
+  integrity sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==
+  dependencies:
+    ini "^1.3.4"
+
+global-modules@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780"
+  integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==
+  dependencies:
+    global-prefix "^3.0.0"
+
+global-prefix@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97"
+  integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==
+  dependencies:
+    ini "^1.3.5"
+    kind-of "^6.0.2"
+    which "^1.3.1"
+
+globals@^11.1.0:
+  version "11.12.0"
+  resolved "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
+  integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
+globals@^13.15.0:
+  version "13.17.0"
+  resolved "https://registry.npmmirror.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4"
+  integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==
+  dependencies:
+    type-fest "^0.20.2"
+
+globby@^10.0.0:
+  version "10.0.2"
+  resolved "https://registry.npmmirror.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543"
+  integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==
+  dependencies:
+    "@types/glob" "^7.1.1"
+    array-union "^2.1.0"
+    dir-glob "^3.0.1"
+    fast-glob "^3.0.3"
+    glob "^7.1.3"
+    ignore "^5.1.1"
+    merge2 "^1.2.3"
+    slash "^3.0.0"
+
+globby@^11.1.0:
+  version "11.1.0"
+  resolved "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
+  integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
+  dependencies:
+    array-union "^2.1.0"
+    dir-glob "^3.0.1"
+    fast-glob "^3.2.9"
+    ignore "^5.2.0"
+    merge2 "^1.4.1"
+    slash "^3.0.0"
+
+globjoin@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.npmmirror.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43"
+  integrity sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==
+
+got@^7.0.0:
+  version "7.1.0"
+  resolved "https://registry.npmmirror.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a"
+  integrity sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==
+  dependencies:
+    decompress-response "^3.2.0"
+    duplexer3 "^0.1.4"
+    get-stream "^3.0.0"
+    is-plain-obj "^1.1.0"
+    is-retry-allowed "^1.0.0"
+    is-stream "^1.0.0"
+    isurl "^1.0.0-alpha5"
+    lowercase-keys "^1.0.0"
+    p-cancelable "^0.3.0"
+    p-timeout "^1.1.1"
+    safe-buffer "^5.0.1"
+    timed-out "^4.0.0"
+    url-parse-lax "^1.0.0"
+    url-to-options "^1.0.1"
+
+got@^8.3.1:
+  version "8.3.2"
+  resolved "https://registry.npmmirror.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937"
+  integrity sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==
+  dependencies:
+    "@sindresorhus/is" "^0.7.0"
+    cacheable-request "^2.1.1"
+    decompress-response "^3.3.0"
+    duplexer3 "^0.1.4"
+    get-stream "^3.0.0"
+    into-stream "^3.1.0"
+    is-retry-allowed "^1.1.0"
+    isurl "^1.0.0-alpha5"
+    lowercase-keys "^1.0.0"
+    mimic-response "^1.0.0"
+    p-cancelable "^0.4.0"
+    p-timeout "^2.0.1"
+    pify "^3.0.0"
+    safe-buffer "^5.1.1"
+    timed-out "^4.0.1"
+    url-parse-lax "^3.0.0"
+    url-to-options "^1.0.1"
+
+graceful-fs@^4.1.10, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2:
+  version "4.2.10"
+  resolved "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
+  integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
+
+grapheme-splitter@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.npmmirror.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e"
+  integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==
+
+handlebars@^4.7.7:
+  version "4.7.7"
+  resolved "https://registry.npmmirror.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1"
+  integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==
+  dependencies:
+    minimist "^1.2.5"
+    neo-async "^2.6.0"
+    source-map "^0.6.1"
+    wordwrap "^1.0.0"
+  optionalDependencies:
+    uglify-js "^3.1.4"
+
+hard-rejection@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883"
+  integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==
+
+has-ansi@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+  integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==
+  dependencies:
+    ansi-regex "^2.0.0"
+
+has-bigints@^1.0.1, has-bigints@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa"
+  integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==
+
+has-flag@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
+  integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==
+
+has-flag@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+  integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
+
+has-flag@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+  integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-property-descriptors@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861"
+  integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==
+  dependencies:
+    get-intrinsic "^1.1.1"
+
+has-symbol-support-x@^1.4.1:
+  version "1.4.2"
+  resolved "https://registry.npmmirror.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455"
+  integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==
+
+has-symbols@^1.0.2, has-symbols@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
+  integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+
+has-to-string-tag-x@^1.2.0:
+  version "1.4.1"
+  resolved "https://registry.npmmirror.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d"
+  integrity sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==
+  dependencies:
+    has-symbol-support-x "^1.4.1"
+
+has-tostringtag@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25"
+  integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==
+  dependencies:
+    has-symbols "^1.0.2"
+
+has-value@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.npmmirror.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+  integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==
+  dependencies:
+    get-value "^2.0.3"
+    has-values "^0.1.4"
+    isobject "^2.0.0"
+
+has-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+  integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==
+  dependencies:
+    get-value "^2.0.6"
+    has-values "^1.0.0"
+    isobject "^3.0.0"
+
+has-values@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.npmmirror.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+  integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==
+
+has-values@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+  integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==
+  dependencies:
+    is-number "^3.0.0"
+    kind-of "^4.0.0"
+
+has@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+  integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+  dependencies:
+    function-bind "^1.1.1"
+
+hash-sum@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/hash-sum/-/hash-sum-2.0.0.tgz#81d01bb5de8ea4a214ad5d6ead1b523460b0b45a"
+  integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==
+
+he@1.2.0, he@^1.1.1, he@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
+  integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
+
+header-case@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.npmmirror.com/header-case/-/header-case-2.0.4.tgz#5a42e63b55177349cf405beb8d775acabb92c063"
+  integrity sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==
+  dependencies:
+    capital-case "^1.0.4"
+    tslib "^2.0.3"
+
+hosted-git-info@^2.1.4:
+  version "2.8.9"
+  resolved "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
+  integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==
+
+hosted-git-info@^4.0.0, hosted-git-info@^4.0.1:
+  version "4.1.0"
+  resolved "https://registry.npmmirror.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224"
+  integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==
+  dependencies:
+    lru-cache "^6.0.0"
+
+html-minifier-terser@^6.1.0:
+  version "6.1.0"
+  resolved "https://registry.npmmirror.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab"
+  integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==
+  dependencies:
+    camel-case "^4.1.2"
+    clean-css "^5.2.2"
+    commander "^8.3.0"
+    he "^1.2.0"
+    param-case "^3.0.4"
+    relateurl "^0.2.7"
+    terser "^5.10.0"
+
+html-tags@^3.1.0, html-tags@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.npmmirror.com/html-tags/-/html-tags-3.2.0.tgz#dbb3518d20b726524e4dd43de397eb0a95726961"
+  integrity sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==
+
+htmlparser2@^3.8.3:
+  version "3.10.1"
+  resolved "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f"
+  integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==
+  dependencies:
+    domelementtype "^1.3.1"
+    domhandler "^2.3.0"
+    domutils "^1.5.1"
+    entities "^1.1.1"
+    inherits "^2.0.1"
+    readable-stream "^3.1.1"
+
+htmlparser2@^8.0.0:
+  version "8.0.1"
+  resolved "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-8.0.1.tgz#abaa985474fcefe269bc761a779b544d7196d010"
+  integrity sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==
+  dependencies:
+    domelementtype "^2.3.0"
+    domhandler "^5.0.2"
+    domutils "^3.0.1"
+    entities "^4.3.0"
+
+http-cache-semantics@3.8.1:
+  version "3.8.1"
+  resolved "https://registry.npmmirror.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2"
+  integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==
+
+human-signals@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
+  integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
+
+human-signals@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
+  integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
+
+husky@^7.0.4:
+  version "7.0.4"
+  resolved "https://registry.npmmirror.com/husky/-/husky-7.0.4.tgz#242048245dc49c8fb1bf0cc7cfb98dd722531535"
+  integrity sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==
+
+iconv-lite@^0.4.24:
+  version "0.4.24"
+  resolved "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+  integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+  dependencies:
+    safer-buffer ">= 2.1.2 < 3"
+
+iconv-lite@^0.6.3:
+  version "0.6.3"
+  resolved "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
+  integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
+  dependencies:
+    safer-buffer ">= 2.1.2 < 3.0.0"
+
+idb@^7.0.1:
+  version "7.0.2"
+  resolved "https://registry.npmmirror.com/idb/-/idb-7.0.2.tgz#7a067e20dd16539938e456814b7d714ba8db3892"
+  integrity sha512-jjKrT1EnyZewQ/gCBb/eyiYrhGzws2FeY92Yx8qT9S9GeQAmo4JFVIiWRIfKW/6Ob9A+UDAOW9j9jn58fy2HIg==
+
+ids@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/ids/-/ids-1.0.0.tgz#df67f2d37b81d7c2effc87e03d17ebff95a58c05"
+  integrity sha512-Zvtq1xUto4LttpstyOlFum8lKx+i1OmRfg+6A9drFS9iSZsDPMHG4Sof/qwNR4kCU7jBeWFPrY2ocHxiz7cCRw==
+
+ieee754@^1.1.13:
+  version "1.2.1"
+  resolved "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
+  integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
+ignore@^5.1.1, ignore@^5.2.0:
+  version "5.2.0"
+  resolved "https://registry.npmmirror.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
+  integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
+
+image-size@^0.5.1, image-size@~0.5.0:
+  version "0.5.5"
+  resolved "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c"
+  integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==
+
+imagemin-gifsicle@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.npmmirror.com/imagemin-gifsicle/-/imagemin-gifsicle-7.0.0.tgz#1a7ab136a144c4678657ba3b6c412f80805d26b0"
+  integrity sha512-LaP38xhxAwS3W8PFh4y5iQ6feoTSF+dTAXFRUEYQWYst6Xd+9L/iPk34QGgK/VO/objmIlmq9TStGfVY2IcHIA==
+  dependencies:
+    execa "^1.0.0"
+    gifsicle "^5.0.0"
+    is-gif "^3.0.0"
+
+imagemin-jpegtran@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.npmmirror.com/imagemin-jpegtran/-/imagemin-jpegtran-7.0.0.tgz#7728f84876362d489b9a1656e0cc8e2009406e6f"
+  integrity sha512-MJoyTCW8YjMJf56NorFE41SR/WkaGA3IYk4JgvMlRwguJEEd3PnP9UxA8Y2UWjquz8d+On3Ds/03ZfiiLS8xTQ==
+  dependencies:
+    exec-buffer "^3.0.0"
+    is-jpg "^2.0.0"
+    jpegtran-bin "^5.0.0"
+
+imagemin-mozjpeg@^9.0.0:
+  version "9.0.0"
+  resolved "https://registry.npmmirror.com/imagemin-mozjpeg/-/imagemin-mozjpeg-9.0.0.tgz#d1af26d0b43d75a41c211051c1910da59d9d2324"
+  integrity sha512-TwOjTzYqCFRgROTWpVSt5UTT0JeCuzF1jswPLKALDd89+PmrJ2PdMMYeDLYZ1fs9cTovI9GJd68mRSnuVt691w==
+  dependencies:
+    execa "^4.0.0"
+    is-jpg "^2.0.0"
+    mozjpeg "^7.0.0"
+
+imagemin-optipng@^8.0.0:
+  version "8.0.0"
+  resolved "https://registry.npmmirror.com/imagemin-optipng/-/imagemin-optipng-8.0.0.tgz#b88e5cf6da25cc8479e07cdf38c3ae0479df7ef2"
+  integrity sha512-CUGfhfwqlPjAC0rm8Fy+R2DJDBGjzy2SkfyT09L8rasnF9jSoHFqJ1xxSZWK6HVPZBMhGPMxCTL70OgTHlLF5A==
+  dependencies:
+    exec-buffer "^3.0.0"
+    is-png "^2.0.0"
+    optipng-bin "^7.0.0"
+
+imagemin-pngquant@^9.0.2:
+  version "9.0.2"
+  resolved "https://registry.npmmirror.com/imagemin-pngquant/-/imagemin-pngquant-9.0.2.tgz#38155702b0cc4f60f671ba7c2b086ea3805d9567"
+  integrity sha512-cj//bKo8+Frd/DM8l6Pg9pws1pnDUjgb7ae++sUX1kUVdv2nrngPykhiUOgFeE0LGY/LmUbCf4egCHC4YUcZSg==
+  dependencies:
+    execa "^4.0.0"
+    is-png "^2.0.0"
+    is-stream "^2.0.0"
+    ow "^0.17.0"
+    pngquant-bin "^6.0.0"
+
+imagemin-svgo@^9.0.0:
+  version "9.0.0"
+  resolved "https://registry.npmmirror.com/imagemin-svgo/-/imagemin-svgo-9.0.0.tgz#749370804608917a67d4ff590f07a87756aec006"
+  integrity sha512-uNgXpKHd99C0WODkrJ8OO/3zW3qjgS4pW7hcuII0RcHN3tnKxDjJWcitdVC/TZyfIqSricU8WfrHn26bdSW62g==
+  dependencies:
+    is-svg "^4.2.1"
+    svgo "^2.1.0"
+
+imagemin-webp@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.npmmirror.com/imagemin-webp/-/imagemin-webp-6.0.0.tgz#bb2d77bab818fd6133df9675326497b877e7be4d"
+  integrity sha512-DmVCkI8H1csyqAExsk93LzC88gj2uKXaLLW5Ly+WYsvNx7xv5cJAlozXWIx9Z0kEQr9w98gphi5aP2b++iDH8g==
+  dependencies:
+    cwebp-bin "^5.0.0"
+    exec-buffer "^3.0.0"
+    is-cwebp-readable "^3.0.0"
+
+imagemin@^7.0.1:
+  version "7.0.1"
+  resolved "https://registry.npmmirror.com/imagemin/-/imagemin-7.0.1.tgz#f6441ca647197632e23db7d971fffbd530c87dbf"
+  integrity sha512-33AmZ+xjZhg2JMCe+vDf6a9mzWukE7l+wAtesjE7KyteqqKjzxv7aVQeWnul1Ve26mWvEQqyPwl0OctNBfSR9w==
+  dependencies:
+    file-type "^12.0.0"
+    globby "^10.0.0"
+    graceful-fs "^4.2.2"
+    junk "^3.1.0"
+    make-dir "^3.0.0"
+    p-pipe "^3.0.0"
+    replace-ext "^1.0.0"
+
+import-fresh@^3.0.0, import-fresh@^3.2.1:
+  version "3.3.0"
+  resolved "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
+  integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
+  dependencies:
+    parent-module "^1.0.0"
+    resolve-from "^4.0.0"
+
+import-lazy@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153"
+  integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==
+
+import-meta-resolve@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/import-meta-resolve/-/import-meta-resolve-1.1.1.tgz#244fd542fd1fae73550d4f8b3cde3bba1d7b2b18"
+  integrity sha512-JiTuIvVyPaUg11eTrNDx5bgQ/yMKMZffc7YSjvQeSMXy58DO2SQ8BtAf3xteZvmzvjYh14wnqNjL8XVeDy2o9A==
+  dependencies:
+    builtins "^4.0.0"
+
+imurmurhash@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+  integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
+
+indent-string@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
+  integrity sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==
+  dependencies:
+    repeating "^2.0.0"
+
+indent-string@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
+  integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
+
+inflight@^1.0.4:
+  version "1.0.6"
+  resolved "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+  integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
+  dependencies:
+    once "^1.3.0"
+    wrappy "1"
+
+inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3:
+  version "2.0.4"
+  resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+  integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+ini@^1.3.2, ini@^1.3.4, ini@^1.3.5:
+  version "1.3.8"
+  resolved "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
+  integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
+
+inquirer@^8.2.2:
+  version "8.2.4"
+  resolved "https://registry.npmmirror.com/inquirer/-/inquirer-8.2.4.tgz#ddbfe86ca2f67649a67daa6f1051c128f684f0b4"
+  integrity sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==
+  dependencies:
+    ansi-escapes "^4.2.1"
+    chalk "^4.1.1"
+    cli-cursor "^3.1.0"
+    cli-width "^3.0.0"
+    external-editor "^3.0.3"
+    figures "^3.0.0"
+    lodash "^4.17.21"
+    mute-stream "0.0.8"
+    ora "^5.4.1"
+    run-async "^2.4.0"
+    rxjs "^7.5.5"
+    string-width "^4.1.0"
+    strip-ansi "^6.0.0"
+    through "^2.3.6"
+    wrap-ansi "^7.0.0"
+
+internal-slot@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c"
+  integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==
+  dependencies:
+    get-intrinsic "^1.1.0"
+    has "^1.0.3"
+    side-channel "^1.0.4"
+
+into-stream@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/into-stream/-/into-stream-3.1.0.tgz#96fb0a936c12babd6ff1752a17d05616abd094c6"
+  integrity sha512-TcdjPibTksa1NQximqep2r17ISRiNE9fwlfbg3F8ANdvP5/yrFTew86VcO//jk4QTaMlbjypPBq76HN2zaKfZQ==
+  dependencies:
+    from2 "^2.1.1"
+    p-is-promise "^1.1.0"
+
+intro.js@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.npmmirror.com/intro.js/-/intro.js-5.1.0.tgz#ffa804cd03f464198aa9be505afdd7fb814def3a"
+  integrity sha512-zwWl/duTh00eeNcZRU4o4/xxloNYPFKs4n4lMRDNx59jZr+qRI0jSOnzqYMOuVftD4beGrmxBHz4k8qp9/dCMA==
+
+is-accessor-descriptor@^0.1.6:
+  version "0.1.6"
+  resolved "https://registry.npmmirror.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+  integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==
+  dependencies:
+    kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+  integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
+  dependencies:
+    kind-of "^6.0.0"
+
+is-arrayish@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+  integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
+
+is-bigint@^1.0.1:
+  version "1.0.4"
+  resolved "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
+  integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==
+  dependencies:
+    has-bigints "^1.0.1"
+
+is-binary-path@~2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+  integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+  dependencies:
+    binary-extensions "^2.0.0"
+
+is-boolean-object@^1.1.0:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719"
+  integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==
+  dependencies:
+    call-bind "^1.0.2"
+    has-tostringtag "^1.0.0"
+
+is-buffer@^1.1.5:
+  version "1.1.6"
+  resolved "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+  integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
+is-builtin-module@^3.1.0:
+  version "3.2.0"
+  resolved "https://registry.npmmirror.com/is-builtin-module/-/is-builtin-module-3.2.0.tgz#bb0310dfe881f144ca83f30100ceb10cf58835e0"
+  integrity sha512-phDA4oSGt7vl1n5tJvTWooWWAsXLY+2xCnxNqvKhGEzujg+A43wPlPOyDg3C8XQHN+6k/JTQWJ/j0dQh/qr+Hw==
+  dependencies:
+    builtin-modules "^3.3.0"
+
+is-callable@^1.1.4, is-callable@^1.2.4:
+  version "1.2.4"
+  resolved "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945"
+  integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==
+
+is-core-module@^2.5.0, is-core-module@^2.9.0:
+  version "2.10.0"
+  resolved "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed"
+  integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==
+  dependencies:
+    has "^1.0.3"
+
+is-cwebp-readable@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/is-cwebp-readable/-/is-cwebp-readable-3.0.0.tgz#0554aaa400977a2fc4de366d8c0244f13cde58cb"
+  integrity sha512-bpELc7/Q1/U5MWHn4NdHI44R3jxk0h9ew9ljzabiRl70/UIjL/ZAqRMb52F5+eke/VC8yTiv4Ewryo1fPWidvA==
+  dependencies:
+    file-type "^10.5.0"
+
+is-data-descriptor@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.npmmirror.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+  integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==
+  dependencies:
+    kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+  integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
+  dependencies:
+    kind-of "^6.0.0"
+
+is-date-object@^1.0.1:
+  version "1.0.5"
+  resolved "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
+  integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
+  dependencies:
+    has-tostringtag "^1.0.0"
+
+is-descriptor@^0.1.0:
+  version "0.1.6"
+  resolved "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+  integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
+  dependencies:
+    is-accessor-descriptor "^0.1.6"
+    is-data-descriptor "^0.1.4"
+    kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+  integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
+  dependencies:
+    is-accessor-descriptor "^1.0.0"
+    is-data-descriptor "^1.0.0"
+    kind-of "^6.0.2"
+
+is-docker@^2.0.0, is-docker@^2.1.1:
+  version "2.2.1"
+  resolved "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
+  integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
+
+is-expression@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/is-expression/-/is-expression-4.0.0.tgz#c33155962abf21d0afd2552514d67d2ec16fd2ab"
+  integrity sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==
+  dependencies:
+    acorn "^7.1.1"
+    object-assign "^4.1.1"
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+  integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==
+
+is-extendable@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+  integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
+  dependencies:
+    is-plain-object "^2.0.4"
+
+is-extglob@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+  integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
+is-finite@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3"
+  integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==
+
+is-fullwidth-code-point@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+  integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-fullwidth-code-point@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88"
+  integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==
+
+is-gif@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/is-gif/-/is-gif-3.0.0.tgz#c4be60b26a301d695bb833b20d9b5d66c6cf83b1"
+  integrity sha512-IqJ/jlbw5WJSNfwQ/lHEDXF8rxhRgF6ythk2oiEvhpG29F704eX9NO6TvPfMiq9DrbwgcEDnETYNcZDPewQoVw==
+  dependencies:
+    file-type "^10.4.0"
+
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
+  version "4.0.3"
+  resolved "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+  integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+  dependencies:
+    is-extglob "^2.1.1"
+
+is-interactive@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e"
+  integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==
+
+is-jpg@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/is-jpg/-/is-jpg-2.0.0.tgz#2e1997fa6e9166eaac0242daae443403e4ef1d97"
+  integrity sha512-ODlO0ruzhkzD3sdynIainVP5eoOFNN85rxA1+cwwnPe4dKyX0r5+hxNO5XpCrxlHcmb9vkOit9mhRD2JVuimHg==
+
+is-module@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591"
+  integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==
+
+is-natural-number@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.npmmirror.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8"
+  integrity sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==
+
+is-negative-zero@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150"
+  integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==
+
+is-number-object@^1.0.4:
+  version "1.0.7"
+  resolved "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc"
+  integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==
+  dependencies:
+    has-tostringtag "^1.0.0"
+
+is-number@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+  integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==
+  dependencies:
+    kind-of "^3.0.2"
+
+is-number@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+  integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-obj@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
+  integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==
+
+is-obj@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
+  integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
+
+is-object@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf"
+  integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==
+
+is-plain-obj@^1.0.0, is-plain-obj@^1.1, is-plain-obj@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+  integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==
+
+is-plain-object@3.0.1:
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-3.0.1.tgz#662d92d24c0aa4302407b0d45d21f2251c85f85b"
+  integrity sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==
+
+is-plain-object@5.0.0, is-plain-object@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344"
+  integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==
+
+is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+  version "2.0.4"
+  resolved "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+  integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
+  dependencies:
+    isobject "^3.0.1"
+
+is-png@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/is-png/-/is-png-2.0.0.tgz#ee8cbc9e9b050425cedeeb4a6fb74a649b0a4a8d"
+  integrity sha512-4KPGizaVGj2LK7xwJIz8o5B2ubu1D/vcQsgOGFEDlpcvgZHto4gBnyd0ig7Ws+67ixmwKoNmu0hYnpo6AaKb5g==
+
+is-regex@^1.0.3, is-regex@^1.1.4:
+  version "1.1.4"
+  resolved "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
+  integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
+  dependencies:
+    call-bind "^1.0.2"
+    has-tostringtag "^1.0.0"
+
+is-regexp@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069"
+  integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==
+
+is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4"
+  integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==
+
+is-shared-array-buffer@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79"
+  integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==
+  dependencies:
+    call-bind "^1.0.2"
+
+is-stream@^1.0.0, is-stream@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+  integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==
+
+is-stream@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
+  integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
+
+is-string@^1.0.5, is-string@^1.0.7:
+  version "1.0.7"
+  resolved "https://registry.npmmirror.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
+  integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
+  dependencies:
+    has-tostringtag "^1.0.0"
+
+is-svg@^4.2.1:
+  version "4.3.2"
+  resolved "https://registry.npmmirror.com/is-svg/-/is-svg-4.3.2.tgz#a119e9932e1af53f6be1969d1790d6cc5fd947d3"
+  integrity sha512-mM90duy00JGMyjqIVHu9gNTjywdZV+8qNasX8cm/EEYZ53PHDgajvbBwNVvty5dwSAxLUD3p3bdo+7sR/UMrpw==
+  dependencies:
+    fast-xml-parser "^3.19.0"
+
+is-symbol@^1.0.2, is-symbol@^1.0.3:
+  version "1.0.4"
+  resolved "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
+  integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+  dependencies:
+    has-symbols "^1.0.2"
+
+is-text-path@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e"
+  integrity sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==
+  dependencies:
+    text-extensions "^1.0.0"
+
+is-unicode-supported@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7"
+  integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==
+
+is-utf8@^0.2.0:
+  version "0.2.1"
+  resolved "https://registry.npmmirror.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+  integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==
+
+is-weakref@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2"
+  integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==
+  dependencies:
+    call-bind "^1.0.2"
+
+is-what@^3.14.1:
+  version "3.14.1"
+  resolved "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1"
+  integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==
+
+is-windows@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+  integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
+
+is-wsl@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
+  integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
+  dependencies:
+    is-docker "^2.0.0"
+
+isarray@1.0.0, isarray@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+  integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
+
+isexe@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+  integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+
+isobject@^2.0.0, isobject@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+  integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==
+  dependencies:
+    isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+  integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==
+
+isurl@^1.0.0-alpha5:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67"
+  integrity sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==
+  dependencies:
+    has-to-string-tag-x "^1.2.0"
+    is-object "^1.0.1"
+
+jake@^10.8.5:
+  version "10.8.5"
+  resolved "https://registry.npmmirror.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46"
+  integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==
+  dependencies:
+    async "^3.2.3"
+    chalk "^4.0.2"
+    filelist "^1.0.1"
+    minimatch "^3.0.4"
+
+jest-worker@^26.2.1:
+  version "26.6.2"
+  resolved "https://registry.npmmirror.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed"
+  integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==
+  dependencies:
+    "@types/node" "*"
+    merge-stream "^2.0.0"
+    supports-color "^7.0.0"
+
+jiti@^1.14.0:
+  version "1.14.0"
+  resolved "https://registry.npmmirror.com/jiti/-/jiti-1.14.0.tgz#5350fff532a4d891ca4bcd700c47c1f40e6ee326"
+  integrity sha512-4IwstlaKQc9vCTC+qUXLM1hajy2ImiL9KnLvVYiaHOtS/v3wRjhLlGl121AmgDgx/O43uKmxownJghS5XMya2A==
+
+jpegtran-bin@^5.0.0:
+  version "5.0.2"
+  resolved "https://registry.npmmirror.com/jpegtran-bin/-/jpegtran-bin-5.0.2.tgz#5870fd7e68317bd203a1c94572bd06ae7732cac3"
+  integrity sha512-4FSmgIcr8d5+V6T1+dHbPZjaFH0ogVyP4UVsE+zri7S9YLO4qAT2our4IN3sW3STVgNTbqPermdIgt2XuAJ4EA==
+  dependencies:
+    bin-build "^3.0.0"
+    bin-wrapper "^4.0.0"
+    logalot "^2.0.0"
+
+jpegtran-bin@^6.0.1:
+  version "6.0.1"
+  resolved "https://registry.npmmirror.com/jpegtran-bin/-/jpegtran-bin-6.0.1.tgz#9b86b8be0628c220cce40e7cb25d3541a8253459"
+  integrity sha512-WohhhHhqe22de7PU8hXs6Sr5d4BAvkrfA93NR5tGlHyPnFLgvEW/bH+q7fv65JgoiQDsd7SBwwQ/OGRBivU3Mw==
+  dependencies:
+    bin-build "^3.0.0"
+    bin-wrapper "^4.0.0"
+
+js-base64@^2.1.9:
+  version "2.6.4"
+  resolved "https://registry.npmmirror.com/js-base64/-/js-base64-2.6.4.tgz#f4e686c5de1ea1f867dbcad3d46d969428df98c4"
+  integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==
+
+"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+  integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-tokens@^8.0.0:
+  version "8.0.0"
+  resolved "https://registry.npmmirror.com/js-tokens/-/js-tokens-8.0.0.tgz#5dbe2cdfa9afc93251d3a77bf18c3ad6fa8a4de4"
+  integrity sha512-PC7MzqInq9OqKyTXfIvQNcjMkODJYC8A17kAaQgeW79yfhqTWSOfjHYQ2mDDcwJ96Iibtwkfh0C7R/OvqPlgVA==
+
+js-yaml@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
+  integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
+  dependencies:
+    argparse "^2.0.1"
+
+jsesc@^2.5.1:
+  version "2.5.2"
+  resolved "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
+  integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+
+jsesc@~0.5.0:
+  version "0.5.0"
+  resolved "https://registry.npmmirror.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+  integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==
+
+json-buffer@3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
+  integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==
+
+json-parse-better-errors@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
+  integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
+
+json-parse-even-better-errors@^2.3.0:
+  version "2.3.1"
+  resolved "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
+  integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
+
+json-schema-traverse@^0.4.1:
+  version "0.4.1"
+  resolved "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+  integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-schema-traverse@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
+  integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
+
+json-schema@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5"
+  integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==
+
+json-stable-stringify-without-jsonify@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+  integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
+
+json-stringify-safe@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+  integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==
+
+json5@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
+  integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
+  dependencies:
+    minimist "^1.2.0"
+
+json5@^2.2.0, json5@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.npmmirror.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c"
+  integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==
+
+jsonfile@^6.0.1:
+  version "6.1.0"
+  resolved "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
+  integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
+  dependencies:
+    universalify "^2.0.0"
+  optionalDependencies:
+    graceful-fs "^4.1.6"
+
+jsonparse@^1.2.0:
+  version "1.3.1"
+  resolved "https://registry.npmmirror.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
+  integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==
+
+jsonpointer@^5.0.0:
+  version "5.0.1"
+  resolved "https://registry.npmmirror.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559"
+  integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==
+
+junk@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1"
+  integrity sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==
+
+keyv@3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/keyv/-/keyv-3.0.0.tgz#44923ba39e68b12a7cec7df6c3268c031f2ef373"
+  integrity sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==
+  dependencies:
+    json-buffer "3.0.0"
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+  version "3.2.2"
+  resolved "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+  integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==
+  dependencies:
+    is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+  integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==
+  dependencies:
+    is-buffer "^1.1.5"
+
+kind-of@^5.0.0, kind-of@^5.0.2:
+  version "5.1.0"
+  resolved "https://registry.npmmirror.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+  integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
+
+kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3:
+  version "6.0.3"
+  resolved "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
+  integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+
+known-css-properties@^0.25.0:
+  version "0.25.0"
+  resolved "https://registry.npmmirror.com/known-css-properties/-/known-css-properties-0.25.0.tgz#6ebc4d4b412f602e5cfbeb4086bd544e34c0a776"
+  integrity sha512-b0/9J1O9Jcyik1GC6KC42hJ41jKwdO/Mq8Mdo5sYN+IuRTXs2YFHZC3kZSx6ueusqa95x3wLYe/ytKjbAfGixA==
+
+kolorist@^1.5.1:
+  version "1.5.1"
+  resolved "https://registry.npmmirror.com/kolorist/-/kolorist-1.5.1.tgz#c3d66dc4fabde4f6b7faa6efda84c00491f9e52b"
+  integrity sha512-lxpCM3HTvquGxKGzHeknB/sUjuVoUElLlfYnXZT73K8geR9jQbroGlSCFBax9/0mpGoD3kzcMLnOlGQPJJNyqQ==
+
+less@^4.1.2:
+  version "4.1.3"
+  resolved "https://registry.npmmirror.com/less/-/less-4.1.3.tgz#175be9ddcbf9b250173e0a00b4d6920a5b770246"
+  integrity sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==
+  dependencies:
+    copy-anything "^2.0.1"
+    parse-node-version "^1.0.1"
+    tslib "^2.3.0"
+  optionalDependencies:
+    errno "^0.1.1"
+    graceful-fs "^4.1.2"
+    image-size "~0.5.0"
+    make-dir "^2.1.0"
+    mime "^1.4.1"
+    needle "^3.1.0"
+    source-map "~0.6.0"
+
+leven@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
+  integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==
+
+levn@^0.4.1:
+  version "0.4.1"
+  resolved "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
+  integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
+  dependencies:
+    prelude-ls "^1.2.1"
+    type-check "~0.4.0"
+
+lilconfig@2.0.4:
+  version "2.0.4"
+  resolved "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.0.4.tgz#f4507d043d7058b380b6a8f5cb7bcd4b34cee082"
+  integrity sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==
+
+lines-and-columns@^1.1.6:
+  version "1.2.4"
+  resolved "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
+  integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
+
+lint-staged@12.3.7:
+  version "12.3.7"
+  resolved "https://registry.npmmirror.com/lint-staged/-/lint-staged-12.3.7.tgz#ad0e2014302f704f9cf2c0ebdb97ac63d0f17be0"
+  integrity sha512-/S4D726e2GIsDVWIk1XGvheCaDm1SJRQp8efamZFWJxQMVEbOwSysp7xb49Oo73KYCdy97mIWinhlxcoNqIfIQ==
+  dependencies:
+    cli-truncate "^3.1.0"
+    colorette "^2.0.16"
+    commander "^8.3.0"
+    debug "^4.3.3"
+    execa "^5.1.1"
+    lilconfig "2.0.4"
+    listr2 "^4.0.1"
+    micromatch "^4.0.4"
+    normalize-path "^3.0.0"
+    object-inspect "^1.12.0"
+    pidtree "^0.5.0"
+    string-argv "^0.3.1"
+    supports-color "^9.2.1"
+    yaml "^1.10.2"
+
+listr2@^4.0.1:
+  version "4.0.5"
+  resolved "https://registry.npmmirror.com/listr2/-/listr2-4.0.5.tgz#9dcc50221583e8b4c71c43f9c7dfd0ef546b75d5"
+  integrity sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==
+  dependencies:
+    cli-truncate "^2.1.0"
+    colorette "^2.0.16"
+    log-update "^4.0.0"
+    p-map "^4.0.0"
+    rfdc "^1.3.0"
+    rxjs "^7.5.5"
+    through "^2.3.8"
+    wrap-ansi "^7.0.0"
+
+load-json-file@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+  integrity sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==
+  dependencies:
+    graceful-fs "^4.1.2"
+    parse-json "^2.2.0"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+    strip-bom "^2.0.0"
+
+load-json-file@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b"
+  integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==
+  dependencies:
+    graceful-fs "^4.1.2"
+    parse-json "^4.0.0"
+    pify "^3.0.0"
+    strip-bom "^3.0.0"
+
+loader-utils@^1.1.0:
+  version "1.4.0"
+  resolved "https://registry.npmmirror.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613"
+  integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==
+  dependencies:
+    big.js "^5.2.2"
+    emojis-list "^3.0.0"
+    json5 "^1.0.1"
+
+locate-path@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+  integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==
+  dependencies:
+    p-locate "^2.0.0"
+    path-exists "^3.0.0"
+
+locate-path@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
+  integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
+  dependencies:
+    p-locate "^4.1.0"
+
+locate-path@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
+  integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
+  dependencies:
+    p-locate "^5.0.0"
+
+lodash-es@^4.17.15, lodash-es@^4.17.21:
+  version "4.17.21"
+  resolved "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
+  integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
+
+lodash.debounce@^4.0.8:
+  version "4.0.8"
+  resolved "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+  integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==
+
+lodash.ismatch@^4.4.0:
+  version "4.4.0"
+  resolved "https://registry.npmmirror.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37"
+  integrity sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==
+
+lodash.merge@^4.6.2:
+  version "4.6.2"
+  resolved "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
+  integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+
+lodash.sortby@^4.7.0:
+  version "4.7.0"
+  resolved "https://registry.npmmirror.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
+  integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==
+
+lodash.truncate@^4.4.2:
+  version "4.4.2"
+  resolved "https://registry.npmmirror.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193"
+  integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==
+
+lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21:
+  version "4.17.21"
+  resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+  integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+log-symbols@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503"
+  integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==
+  dependencies:
+    chalk "^4.1.0"
+    is-unicode-supported "^0.1.0"
+
+log-update@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1"
+  integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==
+  dependencies:
+    ansi-escapes "^4.3.0"
+    cli-cursor "^3.1.0"
+    slice-ansi "^4.0.0"
+    wrap-ansi "^6.2.0"
+
+logalot@^2.0.0, logalot@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/logalot/-/logalot-2.1.0.tgz#5f8e8c90d304edf12530951a5554abb8c5e3f552"
+  integrity sha512-Ah4CgdSRfeCJagxQhcVNMi9BfGYyEKLa6d7OA6xSbld/Hg3Cf2QiOa1mDpmG7Ve8LOH6DN3mdttzjQAvWTyVkw==
+  dependencies:
+    figures "^1.3.5"
+    squeak "^1.0.0"
+
+longest@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
+  integrity sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==
+
+loose-envify@^1.0.0:
+  version "1.4.0"
+  resolved "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+  integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+  dependencies:
+    js-tokens "^3.0.0 || ^4.0.0"
+
+loud-rejection@^1.0.0:
+  version "1.6.0"
+  resolved "https://registry.npmmirror.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
+  integrity sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==
+  dependencies:
+    currently-unhandled "^0.4.1"
+    signal-exit "^3.0.0"
+
+lower-case@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28"
+  integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==
+  dependencies:
+    tslib "^2.0.3"
+
+lowercase-keys@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306"
+  integrity sha512-RPlX0+PHuvxVDZ7xX+EBVAp4RsVxP/TdDSN2mJYdiq1Lc4Hz7EUSjUI7RZrKKlmrIzVhf6Jo2stj7++gVarS0A==
+
+lowercase-keys@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
+  integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
+
+lpad-align@^1.0.1:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/lpad-align/-/lpad-align-1.1.2.tgz#21f600ac1c3095c3c6e497ee67271ee08481fe9e"
+  integrity sha512-MMIcFmmR9zlGZtBcFOows6c2COMekHCIFJz3ew/rRpKZ1wR4mXDPzvcVqLarux8M33X4TPSq2Jdw8WJj0q0KbQ==
+  dependencies:
+    get-stdin "^4.0.1"
+    indent-string "^2.1.0"
+    longest "^1.0.0"
+    meow "^3.3.0"
+
+lru-cache@^4.0.1:
+  version "4.1.5"
+  resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
+  integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
+  dependencies:
+    pseudomap "^1.0.2"
+    yallist "^2.1.2"
+
+lru-cache@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+  integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+  dependencies:
+    yallist "^4.0.0"
+
+magic-string@^0.25.0, magic-string@^0.25.7:
+  version "0.25.9"
+  resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c"
+  integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==
+  dependencies:
+    sourcemap-codec "^1.4.8"
+
+magic-string@^0.26.1, magic-string@^0.26.2:
+  version "0.26.2"
+  resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.26.2.tgz#5331700e4158cd6befda738bb6b0c7b93c0d4432"
+  integrity sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==
+  dependencies:
+    sourcemap-codec "^1.4.8"
+
+make-dir@^1.0.0, make-dir@^1.2.0:
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
+  integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==
+  dependencies:
+    pify "^3.0.0"
+
+make-dir@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
+  integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==
+  dependencies:
+    pify "^4.0.1"
+    semver "^5.6.0"
+
+make-dir@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
+  integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
+  dependencies:
+    semver "^6.0.0"
+
+make-error@^1.1.1:
+  version "1.3.6"
+  resolved "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
+  integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
+
+map-cache@^0.2.2:
+  version "0.2.2"
+  resolved "https://registry.npmmirror.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+  integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==
+
+map-obj@^1.0.0, map-obj@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
+  integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==
+
+map-obj@^4.0.0:
+  version "4.3.0"
+  resolved "https://registry.npmmirror.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a"
+  integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==
+
+map-visit@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+  integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==
+  dependencies:
+    object-visit "^1.0.0"
+
+mathml-tag-names@^2.1.3:
+  version "2.1.3"
+  resolved "https://registry.npmmirror.com/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3"
+  integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==
+
+mdn-data@2.0.14:
+  version "2.0.14"
+  resolved "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50"
+  integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==
+
+memorystream@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.npmmirror.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2"
+  integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==
+
+meow@^3.3.0:
+  version "3.7.0"
+  resolved "https://registry.npmmirror.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
+  integrity sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==
+  dependencies:
+    camelcase-keys "^2.0.0"
+    decamelize "^1.1.2"
+    loud-rejection "^1.0.0"
+    map-obj "^1.0.1"
+    minimist "^1.1.3"
+    normalize-package-data "^2.3.4"
+    object-assign "^4.0.1"
+    read-pkg-up "^1.0.1"
+    redent "^1.0.0"
+    trim-newlines "^1.0.0"
+
+meow@^8.0.0:
+  version "8.1.2"
+  resolved "https://registry.npmmirror.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897"
+  integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==
+  dependencies:
+    "@types/minimist" "^1.2.0"
+    camelcase-keys "^6.2.2"
+    decamelize-keys "^1.1.0"
+    hard-rejection "^2.1.0"
+    minimist-options "4.1.0"
+    normalize-package-data "^3.0.0"
+    read-pkg-up "^7.0.1"
+    redent "^3.0.0"
+    trim-newlines "^3.0.0"
+    type-fest "^0.18.0"
+    yargs-parser "^20.2.3"
+
+meow@^9.0.0:
+  version "9.0.0"
+  resolved "https://registry.npmmirror.com/meow/-/meow-9.0.0.tgz#cd9510bc5cac9dee7d03c73ee1f9ad959f4ea364"
+  integrity sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==
+  dependencies:
+    "@types/minimist" "^1.2.0"
+    camelcase-keys "^6.2.2"
+    decamelize "^1.2.0"
+    decamelize-keys "^1.1.0"
+    hard-rejection "^2.1.0"
+    minimist-options "4.1.0"
+    normalize-package-data "^3.0.0"
+    read-pkg-up "^7.0.1"
+    redent "^3.0.0"
+    trim-newlines "^3.0.0"
+    type-fest "^0.18.0"
+    yargs-parser "^20.2.3"
+
+merge-options@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/merge-options/-/merge-options-1.0.1.tgz#2a64b24457becd4e4dc608283247e94ce589aa32"
+  integrity sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==
+  dependencies:
+    is-plain-obj "^1.1"
+
+merge-stream@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+  integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
+
+merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1:
+  version "1.4.1"
+  resolved "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+  integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+micromatch@3.1.0:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/micromatch/-/micromatch-3.1.0.tgz#5102d4eaf20b6997d6008e3acfe1c44a3fa815e2"
+  integrity sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==
+  dependencies:
+    arr-diff "^4.0.0"
+    array-unique "^0.3.2"
+    braces "^2.2.2"
+    define-property "^1.0.0"
+    extend-shallow "^2.0.1"
+    extglob "^2.0.2"
+    fragment-cache "^0.2.1"
+    kind-of "^5.0.2"
+    nanomatch "^1.2.1"
+    object.pick "^1.3.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+micromatch@^4.0.4, micromatch@^4.0.5:
+  version "4.0.5"
+  resolved "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
+  integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
+  dependencies:
+    braces "^3.0.2"
+    picomatch "^2.3.1"
+
+mime-db@^1.28.0:
+  version "1.52.0"
+  resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+  integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime@^1.4.1:
+  version "1.6.0"
+  resolved "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+  integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+mimic-fn@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
+  integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+
+mimic-response@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
+  integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
+
+min-indent@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
+  integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
+
+minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2:
+  version "3.1.2"
+  resolved "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+  integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+  dependencies:
+    brace-expansion "^1.1.7"
+
+minimatch@^5.0.1:
+  version "5.1.0"
+  resolved "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7"
+  integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==
+  dependencies:
+    brace-expansion "^2.0.1"
+
+minimist-options@4.1.0:
+  version "4.1.0"
+  resolved "https://registry.npmmirror.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619"
+  integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==
+  dependencies:
+    arrify "^1.0.1"
+    is-plain-obj "^1.1.0"
+    kind-of "^6.0.3"
+
+minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5:
+  version "1.2.6"
+  resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
+  integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
+
+mixin-deep@^1.2.0:
+  version "1.3.2"
+  resolved "https://registry.npmmirror.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
+  integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
+  dependencies:
+    for-in "^1.0.2"
+    is-extendable "^1.0.1"
+
+mockjs@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/mockjs/-/mockjs-1.1.0.tgz#e6a0c378e91906dbaff20911cc0273b3c7d75b06"
+  integrity sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==
+  dependencies:
+    commander "*"
+
+modify-values@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022"
+  integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==
+
+mousetrap@^1.6.5:
+  version "1.6.5"
+  resolved "https://registry.npmmirror.com/mousetrap/-/mousetrap-1.6.5.tgz#8a766d8c272b08393d5f56074e0b5ec183485bf9"
+  integrity sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==
+
+mozjpeg@^7.0.0:
+  version "7.1.1"
+  resolved "https://registry.npmmirror.com/mozjpeg/-/mozjpeg-7.1.1.tgz#dfb61953536e66fcabd4ae795e7a312d42a51f18"
+  integrity sha512-iIDxWvzhWvLC9mcRJ1uSkiKaj4drF58oCqK2bITm5c2Jt6cJ8qQjSSru2PCaysG+hLIinryj8mgz5ZJzOYTv1A==
+  dependencies:
+    bin-build "^3.0.0"
+    bin-wrapper "^4.0.0"
+
+ms@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+  integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
+
+ms@2.1.2:
+  version "2.1.2"
+  resolved "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+  integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+ms@^2.1.1:
+  version "2.1.3"
+  resolved "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+  integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+mute-stream@0.0.8:
+  version "0.0.8"
+  resolved "https://registry.npmmirror.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
+  integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
+
+nanoid@^3.3.4:
+  version "3.3.4"
+  resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
+  integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==
+
+nanomatch@^1.2.1:
+  version "1.2.13"
+  resolved "https://registry.npmmirror.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+  integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
+  dependencies:
+    arr-diff "^4.0.0"
+    array-unique "^0.3.2"
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    fragment-cache "^0.2.1"
+    is-windows "^1.0.2"
+    kind-of "^6.0.2"
+    object.pick "^1.3.0"
+    regex-not "^1.0.0"
+    snapdragon "^0.8.1"
+    to-regex "^3.0.1"
+
+nanopop@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/nanopop/-/nanopop-2.1.0.tgz#23476513cee2405888afd2e8a4b54066b70b9e60"
+  integrity sha512-jGTwpFRexSH+fxappnGQtN9dspgE2ipa1aOjtR24igG0pv6JCxImIAmrLRHX+zUF5+1wtsFVbKyfP51kIGAVNw==
+
+natural-compare@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+  integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
+
+needle@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/needle/-/needle-3.1.0.tgz#3bf5cd090c28eb15644181ab6699e027bd6c53c9"
+  integrity sha512-gCE9weDhjVGCRqS8dwDR/D3GTAeyXLXuqp7I8EzH6DllZGXSUyxuqqLh+YX9rMAWaaTFyVAg6rHGL25dqvczKw==
+  dependencies:
+    debug "^3.2.6"
+    iconv-lite "^0.6.3"
+    sax "^1.2.4"
+
+neo-async@^2.6.0:
+  version "2.6.2"
+  resolved "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
+  integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
+
+nice-try@^1.0.4:
+  version "1.0.5"
+  resolved "https://registry.npmmirror.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
+  integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
+
+no-case@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.npmmirror.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d"
+  integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==
+  dependencies:
+    lower-case "^2.0.2"
+    tslib "^2.0.3"
+
+node-fetch@2.6.7, node-fetch@^2.6.7:
+  version "2.6.7"
+  resolved "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
+  integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
+  dependencies:
+    whatwg-url "^5.0.0"
+
+node-html-parser@^5.3.3:
+  version "5.4.1"
+  resolved "https://registry.npmmirror.com/node-html-parser/-/node-html-parser-5.4.1.tgz#c9938b9521ef542c2374e4923078f8f2a365f50d"
+  integrity sha512-xy/O2wOEBJsIRLs4avwa1lVY7tIpXXOoHHUJLa0GvnoPPqMG1hgBVl1tNI3GHOwRktTVZy+Y6rjghk4B9/NLyg==
+  dependencies:
+    css-select "^4.2.1"
+    he "1.2.0"
+
+node-releases@^2.0.6:
+  version "2.0.6"
+  resolved "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503"
+  integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==
+
+normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0:
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
+  integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
+  dependencies:
+    hosted-git-info "^2.1.4"
+    resolve "^1.10.0"
+    semver "2 || 3 || 4 || 5"
+    validate-npm-package-license "^3.0.1"
+
+normalize-package-data@^3.0.0:
+  version "3.0.3"
+  resolved "https://registry.npmmirror.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e"
+  integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==
+  dependencies:
+    hosted-git-info "^4.0.1"
+    is-core-module "^2.5.0"
+    semver "^7.3.4"
+    validate-npm-package-license "^3.0.1"
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+  integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+normalize-range@^0.1.2:
+  version "0.1.2"
+  resolved "https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
+  integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==
+
+normalize-url@2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6"
+  integrity sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==
+  dependencies:
+    prepend-http "^2.0.0"
+    query-string "^5.0.1"
+    sort-keys "^2.0.0"
+
+npm-conf@^1.1.0:
+  version "1.1.3"
+  resolved "https://registry.npmmirror.com/npm-conf/-/npm-conf-1.1.3.tgz#256cc47bd0e218c259c4e9550bf413bc2192aff9"
+  integrity sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==
+  dependencies:
+    config-chain "^1.1.11"
+    pify "^3.0.0"
+
+npm-run-all@^4.1.5:
+  version "4.1.5"
+  resolved "https://registry.npmmirror.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba"
+  integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==
+  dependencies:
+    ansi-styles "^3.2.1"
+    chalk "^2.4.1"
+    cross-spawn "^6.0.5"
+    memorystream "^0.3.1"
+    minimatch "^3.0.4"
+    pidtree "^0.3.0"
+    read-pkg "^3.0.0"
+    shell-quote "^1.6.1"
+    string.prototype.padend "^3.0.0"
+
+npm-run-path@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+  integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==
+  dependencies:
+    path-key "^2.0.0"
+
+npm-run-path@^4.0.0, npm-run-path@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
+  integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
+  dependencies:
+    path-key "^3.0.0"
+
+nprogress@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.npmmirror.com/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1"
+  integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==
+
+nth-check@^2.0.1:
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d"
+  integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==
+  dependencies:
+    boolbase "^1.0.0"
+
+object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+  integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
+
+object-copy@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.npmmirror.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+  integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==
+  dependencies:
+    copy-descriptor "^0.1.0"
+    define-property "^0.2.5"
+    kind-of "^3.0.3"
+
+object-inspect@^1.12.0, object-inspect@^1.9.0:
+  version "1.12.2"
+  resolved "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea"
+  integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==
+
+object-keys@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+  integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object-visit@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+  integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==
+  dependencies:
+    isobject "^3.0.0"
+
+object.assign@^4.1.0, object.assign@^4.1.2:
+  version "4.1.4"
+  resolved "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f"
+  integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==
+  dependencies:
+    call-bind "^1.0.2"
+    define-properties "^1.1.4"
+    has-symbols "^1.0.3"
+    object-keys "^1.1.1"
+
+object.pick@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+  integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==
+  dependencies:
+    isobject "^3.0.1"
+
+on-finished@~2.3.0:
+  version "2.3.0"
+  resolved "https://registry.npmmirror.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+  integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==
+  dependencies:
+    ee-first "1.1.1"
+
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.npmmirror.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+  integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
+  dependencies:
+    wrappy "1"
+
+onetime@^5.1.0, onetime@^5.1.2:
+  version "5.1.2"
+  resolved "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
+  integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
+  dependencies:
+    mimic-fn "^2.1.0"
+
+open@^8.4.0:
+  version "8.4.0"
+  resolved "https://registry.npmmirror.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8"
+  integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==
+  dependencies:
+    define-lazy-prop "^2.0.0"
+    is-docker "^2.1.1"
+    is-wsl "^2.2.0"
+
+optionator@^0.9.1:
+  version "0.9.1"
+  resolved "https://registry.npmmirror.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
+  integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==
+  dependencies:
+    deep-is "^0.1.3"
+    fast-levenshtein "^2.0.6"
+    levn "^0.4.1"
+    prelude-ls "^1.2.1"
+    type-check "^0.4.0"
+    word-wrap "^1.2.3"
+
+optipng-bin@^7.0.0:
+  version "7.0.1"
+  resolved "https://registry.npmmirror.com/optipng-bin/-/optipng-bin-7.0.1.tgz#beb8e55a52f8a26f885ee57ab44fcf62397d6972"
+  integrity sha512-W99mpdW7Nt2PpFiaO+74pkht7KEqkXkeRomdWXfEz3SALZ6hns81y/pm1dsGZ6ItUIfchiNIP6ORDr1zETU1jA==
+  dependencies:
+    bin-build "^3.0.0"
+    bin-wrapper "^4.0.0"
+
+ora@^5.4.1:
+  version "5.4.1"
+  resolved "https://registry.npmmirror.com/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18"
+  integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==
+  dependencies:
+    bl "^4.1.0"
+    chalk "^4.1.0"
+    cli-cursor "^3.1.0"
+    cli-spinners "^2.5.0"
+    is-interactive "^1.0.0"
+    is-unicode-supported "^0.1.0"
+    log-symbols "^4.1.0"
+    strip-ansi "^6.0.0"
+    wcwidth "^1.0.1"
+
+os-filter-obj@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/os-filter-obj/-/os-filter-obj-2.0.0.tgz#1c0b62d5f3a2442749a2d139e6dddee6e81d8d16"
+  integrity sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==
+  dependencies:
+    arch "^2.1.0"
+
+os-tmpdir@~1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+  integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==
+
+ow@^0.17.0:
+  version "0.17.0"
+  resolved "https://registry.npmmirror.com/ow/-/ow-0.17.0.tgz#4f938999fed6264c9048cd6254356e0f1e7f688c"
+  integrity sha512-i3keDzDQP5lWIe4oODyDFey1qVrq2hXKTuTH2VpqwpYtzPiKZt2ziRI4NBQmgW40AnV5Euz17OyWweCb+bNEQA==
+  dependencies:
+    type-fest "^0.11.0"
+
+p-cancelable@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.npmmirror.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa"
+  integrity sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==
+
+p-cancelable@^0.4.0:
+  version "0.4.1"
+  resolved "https://registry.npmmirror.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0"
+  integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==
+
+p-event@^1.0.0:
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/p-event/-/p-event-1.3.0.tgz#8e6b4f4f65c72bc5b6fe28b75eda874f96a4a085"
+  integrity sha512-hV1zbA7gwqPVFcapfeATaNjQ3J0NuzorHPyG8GPL9g/Y/TplWVBVoCKCXL6Ej2zscrCEv195QNWJXuBH6XZuzA==
+  dependencies:
+    p-timeout "^1.1.1"
+
+p-event@^2.1.0:
+  version "2.3.1"
+  resolved "https://registry.npmmirror.com/p-event/-/p-event-2.3.1.tgz#596279ef169ab2c3e0cae88c1cfbb08079993ef6"
+  integrity sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==
+  dependencies:
+    p-timeout "^2.0.1"
+
+p-finally@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+  integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==
+
+p-is-promise@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e"
+  integrity sha512-zL7VE4JVS2IFSkR2GQKDSPEVxkoH43/p7oEnwpdCndKYJO0HVeRB7fA8TJwuLOTBREtK0ea8eHaxdwcpob5dmg==
+
+p-limit@^1.1.0:
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+  integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
+  dependencies:
+    p-try "^1.0.0"
+
+p-limit@^2.2.0:
+  version "2.3.0"
+  resolved "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+  integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+  dependencies:
+    p-try "^2.0.0"
+
+p-limit@^3.0.2:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
+  integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+  dependencies:
+    yocto-queue "^0.1.0"
+
+p-locate@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+  integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==
+  dependencies:
+    p-limit "^1.1.0"
+
+p-locate@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
+  integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
+  dependencies:
+    p-limit "^2.2.0"
+
+p-locate@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
+  integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
+  dependencies:
+    p-limit "^3.0.2"
+
+p-map-series@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/p-map-series/-/p-map-series-1.0.0.tgz#bf98fe575705658a9e1351befb85ae4c1f07bdca"
+  integrity sha512-4k9LlvY6Bo/1FcIdV33wqZQES0Py+iKISU9Uc8p8AjWoZPnFKMpVIVD3s0EYn4jzLh1I+WeUZkJ0Yoa4Qfw3Kg==
+  dependencies:
+    p-reduce "^1.0.0"
+
+p-map@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b"
+  integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==
+  dependencies:
+    aggregate-error "^3.0.0"
+
+p-pipe@^3.0.0:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/p-pipe/-/p-pipe-3.1.0.tgz#48b57c922aa2e1af6a6404cb7c6bf0eb9cc8e60e"
+  integrity sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==
+
+p-reduce@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa"
+  integrity sha512-3Tx1T3oM1xO/Y8Gj0sWyE78EIJZ+t+aEmXUdvQgvGmSMri7aPTHoovbXEreWKkL5j21Er60XAWLTzKbAKYOujQ==
+
+p-timeout@^1.1.1:
+  version "1.2.1"
+  resolved "https://registry.npmmirror.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386"
+  integrity sha512-gb0ryzr+K2qFqFv6qi3khoeqMZF/+ajxQipEF6NteZVnvz9tzdsfAVj3lYtn1gAXvH5lfLwfxEII799gt/mRIA==
+  dependencies:
+    p-finally "^1.0.0"
+
+p-timeout@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038"
+  integrity sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==
+  dependencies:
+    p-finally "^1.0.0"
+
+p-try@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+  integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==
+
+p-try@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+  integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+param-case@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.npmmirror.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5"
+  integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==
+  dependencies:
+    dot-case "^3.0.4"
+    tslib "^2.0.3"
+
+parent-module@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+  integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+  dependencies:
+    callsites "^3.0.0"
+
+parse-json@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.npmmirror.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+  integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==
+  dependencies:
+    error-ex "^1.2.0"
+
+parse-json@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
+  integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==
+  dependencies:
+    error-ex "^1.3.1"
+    json-parse-better-errors "^1.0.1"
+
+parse-json@^5.0.0:
+  version "5.2.0"
+  resolved "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
+  integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
+  dependencies:
+    "@babel/code-frame" "^7.0.0"
+    error-ex "^1.3.1"
+    json-parse-even-better-errors "^2.3.0"
+    lines-and-columns "^1.1.6"
+
+parse-node-version@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b"
+  integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==
+
+parseurl@~1.3.3:
+  version "1.3.3"
+  resolved "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+  integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
+pascal-case@^3.1.2:
+  version "3.1.2"
+  resolved "https://registry.npmmirror.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb"
+  integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==
+  dependencies:
+    no-case "^3.0.4"
+    tslib "^2.0.3"
+
+pascalcase@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.npmmirror.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+  integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==
+
+path-case@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.npmmirror.com/path-case/-/path-case-3.0.4.tgz#9168645334eb942658375c56f80b4c0cb5f82c6f"
+  integrity sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==
+  dependencies:
+    dot-case "^3.0.4"
+    tslib "^2.0.3"
+
+path-exists@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+  integrity sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==
+  dependencies:
+    pinkie-promise "^2.0.0"
+
+path-exists@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+  integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==
+
+path-exists@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+  integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+  integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
+
+path-key@^2.0.0, path-key@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+  integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==
+
+path-key@^3.0.0, path-key@^3.1.0:
+  version "3.1.1"
+  resolved "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+  integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-parse@^1.0.7:
+  version "1.0.7"
+  resolved "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+  integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-to-regexp@^6.2.0:
+  version "6.2.1"
+  resolved "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-6.2.1.tgz#d54934d6798eb9e5ef14e7af7962c945906918e5"
+  integrity sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==
+
+path-type@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+  integrity sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==
+  dependencies:
+    graceful-fs "^4.1.2"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+path-type@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f"
+  integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==
+  dependencies:
+    pify "^3.0.0"
+
+path-type@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
+  integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
+pathe@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.npmmirror.com/pathe/-/pathe-0.2.0.tgz#30fd7bbe0a0d91f0e60bae621f5d19e9e225c339"
+  integrity sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==
+
+pathe@^0.3.0:
+  version "0.3.5"
+  resolved "https://registry.npmmirror.com/pathe/-/pathe-0.3.5.tgz#87e5c1164ded1bebeb9dea5dab63563144062303"
+  integrity sha512-grU/QeYP0ChuE5kjU2/k8VtAeODzbernHlue0gTa27+ayGIu3wqYBIPGfP9r5xSqgCgDd4nWrjKXEfxMillByg==
+
+pend@~1.2.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
+  integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==
+
+picocolors@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
+  integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1:
+  version "2.3.1"
+  resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+  integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+pidtree@^0.3.0:
+  version "0.3.1"
+  resolved "https://registry.npmmirror.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a"
+  integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==
+
+pidtree@^0.5.0:
+  version "0.5.0"
+  resolved "https://registry.npmmirror.com/pidtree/-/pidtree-0.5.0.tgz#ad5fbc1de78b8a5f99d6fbdd4f6e4eee21d1aca1"
+  integrity sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA==
+
+pify@^2.0.0, pify@^2.2.0, pify@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+  integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==
+
+pify@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+  integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==
+
+pify@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
+  integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
+
+pinia@2.0.12:
+  version "2.0.12"
+  resolved "https://registry.npmmirror.com/pinia/-/pinia-2.0.12.tgz#4c6f7f59cb41f56f20deee71c403e66d8d3c637d"
+  integrity sha512-tUeuYGFrLU5irmGyRAIxp35q1OTcZ8sKpGT4XkPeVcG35W4R6cfXDbCGexzmVqH5lTQJJTXXbNGutIu9yS5yew==
+  dependencies:
+    "@vue/devtools-api" "^6.1.0"
+    vue-demi "*"
+
+pinkie-promise@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+  integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==
+  dependencies:
+    pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+  version "2.0.4"
+  resolved "https://registry.npmmirror.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+  integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==
+
+pngjs@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/pngjs/-/pngjs-5.0.0.tgz#e79dd2b215767fd9c04561c01236df960bce7fbb"
+  integrity sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==
+
+pngquant-bin@^6.0.0:
+  version "6.0.1"
+  resolved "https://registry.npmmirror.com/pngquant-bin/-/pngquant-bin-6.0.1.tgz#2b5789ca219eeb4d8509ab1ae082092801b7f07e"
+  integrity sha512-Q3PUyolfktf+hYio6wsg3SanQzEU/v8aICg/WpzxXcuCMRb7H2Q81okfpcEztbMvw25ILjd3a87doj2N9kvbpQ==
+  dependencies:
+    bin-build "^3.0.0"
+    bin-wrapper "^4.0.1"
+    execa "^4.0.0"
+
+posix-character-classes@^0.1.0:
+  version "0.1.1"
+  resolved "https://registry.npmmirror.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+  integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==
+
+postcss-html@^1.4.1:
+  version "1.5.0"
+  resolved "https://registry.npmmirror.com/postcss-html/-/postcss-html-1.5.0.tgz#57a43bc9e336f516ecc448a37d2e8c2290170a6f"
+  integrity sha512-kCMRWJRHKicpA166kc2lAVUGxDZL324bkj/pVOb6RhjB0Z5Krl7mN0AsVkBhVIRZZirY0lyQXG38HCVaoKVNoA==
+  dependencies:
+    htmlparser2 "^8.0.0"
+    js-tokens "^8.0.0"
+    postcss "^8.4.0"
+    postcss-safe-parser "^6.0.0"
+
+postcss-less@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.npmmirror.com/postcss-less/-/postcss-less-6.0.0.tgz#463b34c60f53b648c237f569aeb2e09149d85af4"
+  integrity sha512-FPX16mQLyEjLzEuuJtxA8X3ejDLNGGEG503d2YGZR5Ask1SpDN8KmZUMpzCvyalWRywAn1n1VOA5dcqfCLo5rg==
+
+postcss-media-query-parser@^0.2.3:
+  version "0.2.3"
+  resolved "https://registry.npmmirror.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244"
+  integrity sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==
+
+postcss-prefix-selector@^1.6.0:
+  version "1.16.0"
+  resolved "https://registry.npmmirror.com/postcss-prefix-selector/-/postcss-prefix-selector-1.16.0.tgz#ad5b56f9a73a2c090ca7161049632c9d89bcb404"
+  integrity sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q==
+
+postcss-resolve-nested-selector@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.npmmirror.com/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e"
+  integrity sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==
+
+postcss-safe-parser@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.npmmirror.com/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz#bb4c29894171a94bc5c996b9a30317ef402adaa1"
+  integrity sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==
+
+postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.9:
+  version "6.0.10"
+  resolved "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d"
+  integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==
+  dependencies:
+    cssesc "^3.0.0"
+    util-deprecate "^1.0.2"
+
+postcss-sorting@^7.0.1:
+  version "7.0.1"
+  resolved "https://registry.npmmirror.com/postcss-sorting/-/postcss-sorting-7.0.1.tgz#923b5268451cf2d93ebf8835e17a6537757049a5"
+  integrity sha512-iLBFYz6VRYyLJEJsBJ8M3TCqNcckVzz4wFounSc5Oez35ogE/X+aoC5fFu103Ot7NyvjU3/xqIXn93Gp3kJk4g==
+
+postcss-value-parser@^4.2.0:
+  version "4.2.0"
+  resolved "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
+  integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
+
+postcss@^5.2.17:
+  version "5.2.18"
+  resolved "https://registry.npmmirror.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5"
+  integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==
+  dependencies:
+    chalk "^1.1.3"
+    js-base64 "^2.1.9"
+    source-map "^0.5.6"
+    supports-color "^3.2.3"
+
+postcss@^8.1.10, postcss@^8.3.11, postcss@^8.4.0, postcss@^8.4.12, postcss@^8.4.13, postcss@^8.4.16:
+  version "8.4.16"
+  resolved "https://registry.npmmirror.com/postcss/-/postcss-8.4.16.tgz#33a1d675fac39941f5f445db0de4db2b6e01d43c"
+  integrity sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==
+  dependencies:
+    nanoid "^3.3.4"
+    picocolors "^1.0.0"
+    source-map-js "^1.0.2"
+
+posthtml-parser@^0.2.0, posthtml-parser@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.npmmirror.com/posthtml-parser/-/posthtml-parser-0.2.1.tgz#35d530de386740c2ba24ff2eb2faf39ccdf271dd"
+  integrity sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==
+  dependencies:
+    htmlparser2 "^3.8.3"
+    isobject "^2.1.0"
+
+posthtml-rename-id@^1.0:
+  version "1.0.12"
+  resolved "https://registry.npmmirror.com/posthtml-rename-id/-/posthtml-rename-id-1.0.12.tgz#cf7f6eb37146bf1afac31e68f18c6cc19ae61433"
+  integrity sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==
+  dependencies:
+    escape-string-regexp "1.0.5"
+
+posthtml-render@^1.0.5, posthtml-render@^1.0.6:
+  version "1.4.0"
+  resolved "https://registry.npmmirror.com/posthtml-render/-/posthtml-render-1.4.0.tgz#40114070c45881cacb93347dae3eff53afbcff13"
+  integrity sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==
+
+posthtml-svg-mode@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/posthtml-svg-mode/-/posthtml-svg-mode-1.0.3.tgz#abd554face81223cab0cb367e18e4efd2a4e74b0"
+  integrity sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==
+  dependencies:
+    merge-options "1.0.1"
+    posthtml "^0.9.2"
+    posthtml-parser "^0.2.1"
+    posthtml-render "^1.0.6"
+
+posthtml@^0.9.2:
+  version "0.9.2"
+  resolved "https://registry.npmmirror.com/posthtml/-/posthtml-0.9.2.tgz#f4c06db9f67b61fd17c4e256e7e3d9515bf726fd"
+  integrity sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==
+  dependencies:
+    posthtml-parser "^0.2.0"
+    posthtml-render "^1.0.5"
+
+preact@^10.4.8:
+  version "10.10.6"
+  resolved "https://registry.npmmirror.com/preact/-/preact-10.10.6.tgz#1fe62aecf93974b64e6a42e09ba1f00f93207d14"
+  integrity sha512-w0mCL5vICUAZrh1DuHEdOWBjxdO62lvcO++jbzr8UhhYcTbFkpegLH9XX+7MadjTl/y0feoqwQ/zAnzkc/EGog==
+
+prelude-ls@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
+  integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
+
+prepend-http@^1.0.1:
+  version "1.0.4"
+  resolved "https://registry.npmmirror.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
+  integrity sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==
+
+prepend-http@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
+  integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==
+
+prettier-linter-helpers@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b"
+  integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==
+  dependencies:
+    fast-diff "^1.1.2"
+
+prettier@^2.6.2:
+  version "2.7.1"
+  resolved "https://registry.npmmirror.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64"
+  integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==
+
+pretty-bytes@^5.3.0, pretty-bytes@^5.6.0:
+  version "5.6.0"
+  resolved "https://registry.npmmirror.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb"
+  integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==
+
+print-js@^1.6.0:
+  version "1.6.0"
+  resolved "https://registry.npmmirror.com/print-js/-/print-js-1.6.0.tgz#692b046cf31992b46afa6c6d8a9db1c69d431d1f"
+  integrity sha512-BfnOIzSKbqGRtO4o0rnj/K3681BSd2QUrsIZy/+WdCIugjIswjmx3lDEZpXB2ruGf9d4b3YNINri81+J0FsBWg==
+
+process-nextick-args@~2.0.0:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+  integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+proto-list@~1.2.1:
+  version "1.2.4"
+  resolved "https://registry.npmmirror.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
+  integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==
+
+prr@~1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+  integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==
+
+pseudomap@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+  integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==
+
+pug-error@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/pug-error/-/pug-error-2.0.0.tgz#5c62173cb09c34de2a2ce04f17b8adfec74d8ca5"
+  integrity sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==
+
+pug-lexer@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.npmmirror.com/pug-lexer/-/pug-lexer-5.0.1.tgz#ae44628c5bef9b190b665683b288ca9024b8b0d5"
+  integrity sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==
+  dependencies:
+    character-parser "^2.2.0"
+    is-expression "^4.0.0"
+    pug-error "^2.0.0"
+
+pug-parser@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.npmmirror.com/pug-parser/-/pug-parser-6.0.0.tgz#a8fdc035863a95b2c1dc5ebf4ecf80b4e76a1260"
+  integrity sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==
+  dependencies:
+    pug-error "^2.0.0"
+    token-stream "1.0.0"
+
+pump@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
+  integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
+  dependencies:
+    end-of-stream "^1.1.0"
+    once "^1.3.1"
+
+punycode@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+  integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
+q@^1.5.1:
+  version "1.5.1"
+  resolved "https://registry.npmmirror.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
+  integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==
+
+qrcode@^1.5.0:
+  version "1.5.1"
+  resolved "https://registry.npmmirror.com/qrcode/-/qrcode-1.5.1.tgz#0103f97317409f7bc91772ef30793a54cd59f0cb"
+  integrity sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg==
+  dependencies:
+    dijkstrajs "^1.0.1"
+    encode-utf8 "^1.0.3"
+    pngjs "^5.0.0"
+    yargs "^15.3.1"
+
+qs@^6.10.3:
+  version "6.11.0"
+  resolved "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a"
+  integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==
+  dependencies:
+    side-channel "^1.0.4"
+
+query-string@^4.3.2:
+  version "4.3.4"
+  resolved "https://registry.npmmirror.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb"
+  integrity sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==
+  dependencies:
+    object-assign "^4.1.0"
+    strict-uri-encode "^1.0.0"
+
+query-string@^5.0.1:
+  version "5.1.1"
+  resolved "https://registry.npmmirror.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb"
+  integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==
+  dependencies:
+    decode-uri-component "^0.2.0"
+    object-assign "^4.1.0"
+    strict-uri-encode "^1.0.0"
+
+queue-microtask@^1.2.2:
+  version "1.2.3"
+  resolved "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
+  integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+
+quick-lru@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.npmmirror.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f"
+  integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==
+
+randombytes@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+  integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+  dependencies:
+    safe-buffer "^5.1.0"
+
+read-pkg-up@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+  integrity sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==
+  dependencies:
+    find-up "^1.0.0"
+    read-pkg "^1.0.0"
+
+read-pkg-up@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07"
+  integrity sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==
+  dependencies:
+    find-up "^2.0.0"
+    read-pkg "^3.0.0"
+
+read-pkg-up@^7.0.1:
+  version "7.0.1"
+  resolved "https://registry.npmmirror.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507"
+  integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==
+  dependencies:
+    find-up "^4.1.0"
+    read-pkg "^5.2.0"
+    type-fest "^0.8.1"
+
+read-pkg@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+  integrity sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==
+  dependencies:
+    load-json-file "^1.0.0"
+    normalize-package-data "^2.3.2"
+    path-type "^1.0.0"
+
+read-pkg@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389"
+  integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==
+  dependencies:
+    load-json-file "^4.0.0"
+    normalize-package-data "^2.3.2"
+    path-type "^3.0.0"
+
+read-pkg@^5.2.0:
+  version "5.2.0"
+  resolved "https://registry.npmmirror.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc"
+  integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==
+  dependencies:
+    "@types/normalize-package-data" "^2.4.0"
+    normalize-package-data "^2.5.0"
+    parse-json "^5.0.0"
+    type-fest "^0.6.0"
+
+readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.1.1, readable-stream@^3.4.0:
+  version "3.6.0"
+  resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
+  integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
+  dependencies:
+    inherits "^2.0.3"
+    string_decoder "^1.1.1"
+    util-deprecate "^1.0.1"
+
+readable-stream@^2.0.0, readable-stream@^2.3.0, readable-stream@^2.3.5, readable-stream@~2.3.6:
+  version "2.3.7"
+  resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
+  integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.3"
+    isarray "~1.0.0"
+    process-nextick-args "~2.0.0"
+    safe-buffer "~5.1.1"
+    string_decoder "~1.1.1"
+    util-deprecate "~1.0.1"
+
+readdirp@~3.6.0:
+  version "3.6.0"
+  resolved "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
+  integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+  dependencies:
+    picomatch "^2.2.1"
+
+redent@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
+  integrity sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==
+  dependencies:
+    indent-string "^2.1.0"
+    strip-indent "^1.0.1"
+
+redent@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f"
+  integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==
+  dependencies:
+    indent-string "^4.0.0"
+    strip-indent "^3.0.0"
+
+regenerate-unicode-properties@^10.0.1:
+  version "10.0.1"
+  resolved "https://registry.npmmirror.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56"
+  integrity sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==
+  dependencies:
+    regenerate "^1.4.2"
+
+regenerate@^1.4.2:
+  version "1.4.2"
+  resolved "https://registry.npmmirror.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a"
+  integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==
+
+regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.9:
+  version "0.13.9"
+  resolved "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"
+  integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==
+
+regenerator-transform@^0.15.0:
+  version "0.15.0"
+  resolved "https://registry.npmmirror.com/regenerator-transform/-/regenerator-transform-0.15.0.tgz#cbd9ead5d77fae1a48d957cf889ad0586adb6537"
+  integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==
+  dependencies:
+    "@babel/runtime" "^7.8.4"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+  integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
+  dependencies:
+    extend-shallow "^3.0.2"
+    safe-regex "^1.1.0"
+
+regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3:
+  version "1.4.3"
+  resolved "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac"
+  integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==
+  dependencies:
+    call-bind "^1.0.2"
+    define-properties "^1.1.3"
+    functions-have-names "^1.2.2"
+
+regexpp@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.npmmirror.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
+  integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
+
+regexpu-core@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.npmmirror.com/regexpu-core/-/regexpu-core-5.1.0.tgz#2f8504c3fd0ebe11215783a41541e21c79942c6d"
+  integrity sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==
+  dependencies:
+    regenerate "^1.4.2"
+    regenerate-unicode-properties "^10.0.1"
+    regjsgen "^0.6.0"
+    regjsparser "^0.8.2"
+    unicode-match-property-ecmascript "^2.0.0"
+    unicode-match-property-value-ecmascript "^2.0.0"
+
+regjsgen@^0.6.0:
+  version "0.6.0"
+  resolved "https://registry.npmmirror.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d"
+  integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==
+
+regjsparser@^0.8.2:
+  version "0.8.4"
+  resolved "https://registry.npmmirror.com/regjsparser/-/regjsparser-0.8.4.tgz#8a14285ffcc5de78c5b95d62bbf413b6bc132d5f"
+  integrity sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==
+  dependencies:
+    jsesc "~0.5.0"
+
+relateurl@^0.2.7:
+  version "0.2.7"
+  resolved "https://registry.npmmirror.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
+  integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==
+
+repeat-element@^1.1.2:
+  version "1.1.4"
+  resolved "https://registry.npmmirror.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9"
+  integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==
+
+repeat-string@^1.6.1:
+  version "1.6.1"
+  resolved "https://registry.npmmirror.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+  integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==
+
+repeating@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+  integrity sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==
+  dependencies:
+    is-finite "^1.0.0"
+
+replace-ext@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/replace-ext/-/replace-ext-1.0.1.tgz#2d6d996d04a15855d967443631dd5f77825b016a"
+  integrity sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==
+
+require-directory@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+  integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
+
+require-from-string@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
+  integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
+
+require-main-filename@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
+  integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
+
+resize-observer-polyfill@^1.5.1:
+  version "1.5.1"
+  resolved "https://registry.npmmirror.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464"
+  integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==
+
+resolve-from@5.0.0, resolve-from@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
+  integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
+
+resolve-from@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+  integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+resolve-global@1.0.0, resolve-global@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/resolve-global/-/resolve-global-1.0.0.tgz#a2a79df4af2ca3f49bf77ef9ddacd322dad19255"
+  integrity sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==
+  dependencies:
+    global-dirs "^0.1.1"
+
+resolve-url@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.npmmirror.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+  integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==
+
+resolve@^1.10.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.22.0, resolve@^1.22.1:
+  version "1.22.1"
+  resolved "https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
+  integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
+  dependencies:
+    is-core-module "^2.9.0"
+    path-parse "^1.0.7"
+    supports-preserve-symlinks-flag "^1.0.0"
+
+responselike@1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
+  integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==
+  dependencies:
+    lowercase-keys "^1.0.0"
+
+restore-cursor@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
+  integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
+  dependencies:
+    onetime "^5.1.0"
+    signal-exit "^3.0.2"
+
+ret@~0.1.10:
+  version "0.1.15"
+  resolved "https://registry.npmmirror.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+  integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
+
+reusify@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+  integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
+rfdc@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b"
+  integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==
+
+rimraf@^2.5.4:
+  version "2.7.1"
+  resolved "https://registry.npmmirror.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
+  integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
+  dependencies:
+    glob "^7.1.3"
+
+rimraf@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+  integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+  dependencies:
+    glob "^7.1.3"
+
+rollup-plugin-purge-icons@^0.8.1:
+  version "0.8.1"
+  resolved "https://registry.npmmirror.com/rollup-plugin-purge-icons/-/rollup-plugin-purge-icons-0.8.1.tgz#ae371c92e162a1786816f26437a95931f8398698"
+  integrity sha512-7ktMV+gWtXAdOIShE8EtTcnpGhozi5H2hKk1MQVGt+7FmlLkjR+XKu1Nyzjocwd6xJvKube2Lh+SfcJ8FYYySw==
+  dependencies:
+    "@purge-icons/core" "^0.8.0"
+    "@purge-icons/generated" "^0.8.1"
+
+rollup-plugin-terser@^7.0.0:
+  version "7.0.2"
+  resolved "https://registry.npmmirror.com/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz#e8fbba4869981b2dc35ae7e8a502d5c6c04d324d"
+  integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==
+  dependencies:
+    "@babel/code-frame" "^7.10.4"
+    jest-worker "^26.2.1"
+    serialize-javascript "^4.0.0"
+    terser "^5.0.0"
+
+rollup-plugin-visualizer@^5.6.0:
+  version "5.8.0"
+  resolved "https://registry.npmmirror.com/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.8.0.tgz#32f2fe23d4299e977c06c59c07255590354e3445"
+  integrity sha512-pY6j/7qHz5I9rB7d/bQoA5gX+2FbV3MBG055wrsFxDn550bgl0FNViRj6wDHh85PMswv+JVdZjhnMBzz/hdAHA==
+  dependencies:
+    nanoid "^3.3.4"
+    open "^8.4.0"
+    source-map "^0.7.3"
+    yargs "^17.5.1"
+
+"rollup@>=2.59.0 <2.78.0", "rollup@>=2.75.6 <2.77.0 || ~2.77.0", rollup@^2.43.1, rollup@^2.56.3, rollup@^2.60.2, rollup@^2.70.2:
+  version "2.78.1"
+  resolved "https://registry.npmmirror.com/rollup/-/rollup-2.78.1.tgz#52fe3934d9c83cb4f7c4cb5fb75d88591be8648f"
+  integrity sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==
+  optionalDependencies:
+    fsevents "~2.3.2"
+
+run-async@^2.4.0:
+  version "2.4.1"
+  resolved "https://registry.npmmirror.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
+  integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
+
+run-parallel@^1.1.9:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
+  integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+  dependencies:
+    queue-microtask "^1.2.2"
+
+rxjs@^7.5.5:
+  version "7.5.6"
+  resolved "https://registry.npmmirror.com/rxjs/-/rxjs-7.5.6.tgz#0446577557862afd6903517ce7cae79ecb9662bc"
+  integrity sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==
+  dependencies:
+    tslib "^2.1.0"
+
+safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.2.0:
+  version "5.2.1"
+  resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+  integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+  version "5.1.2"
+  resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+  integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-regex@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+  integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==
+  dependencies:
+    ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0":
+  version "2.1.2"
+  resolved "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+  integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+sax@^1.2.4:
+  version "1.2.4"
+  resolved "https://registry.npmmirror.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+  integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
+
+scroll-into-view-if-needed@^2.2.25:
+  version "2.2.29"
+  resolved "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.29.tgz#551791a84b7e2287706511f8c68161e4990ab885"
+  integrity sha512-hxpAR6AN+Gh53AdAimHM6C8oTN1ppwVZITihix+WqalywBeFcQ6LdQP5ABNl26nX8GTEL7VT+b8lKpdqq65wXg==
+  dependencies:
+    compute-scroll-into-view "^1.0.17"
+
+seek-bzip@^1.0.5:
+  version "1.0.6"
+  resolved "https://registry.npmmirror.com/seek-bzip/-/seek-bzip-1.0.6.tgz#35c4171f55a680916b52a07859ecf3b5857f21c4"
+  integrity sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==
+  dependencies:
+    commander "^2.8.1"
+
+semver-regex@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338"
+  integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==
+
+semver-truncate@^1.1.2:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/semver-truncate/-/semver-truncate-1.1.2.tgz#57f41de69707a62709a7e0104ba2117109ea47e8"
+  integrity sha512-V1fGg9i4CL3qesB6U0L6XAm4xOJiHmt4QAacazumuasc03BvtFGIMCduv01JWQ69Nv+JST9TqhSCiJoxoY031w==
+  dependencies:
+    semver "^5.3.0"
+
+"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.6.0:
+  version "5.7.1"
+  resolved "https://registry.npmmirror.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+  integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+
+semver@7.0.0:
+  version "7.0.0"
+  resolved "https://registry.npmmirror.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
+  integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
+
+semver@7.3.7, semver@^7.0.0, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7:
+  version "7.3.7"
+  resolved "https://registry.npmmirror.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f"
+  integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==
+  dependencies:
+    lru-cache "^6.0.0"
+
+semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
+  version "6.3.0"
+  resolved "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+  integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+
+sentence-case@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.npmmirror.com/sentence-case/-/sentence-case-3.0.4.tgz#3645a7b8c117c787fde8702056225bb62a45131f"
+  integrity sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==
+  dependencies:
+    no-case "^3.0.4"
+    tslib "^2.0.3"
+    upper-case-first "^2.0.2"
+
+serialize-javascript@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa"
+  integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==
+  dependencies:
+    randombytes "^2.1.0"
+
+set-blocking@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+  integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==
+
+set-value@^2.0.0, set-value@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
+  integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-extendable "^0.1.1"
+    is-plain-object "^2.0.3"
+    split-string "^3.0.1"
+
+shallow-equal@^1.0.0:
+  version "1.2.1"
+  resolved "https://registry.npmmirror.com/shallow-equal/-/shallow-equal-1.2.1.tgz#4c16abfa56043aa20d050324efa68940b0da79da"
+  integrity sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==
+
+shebang-command@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+  integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==
+  dependencies:
+    shebang-regex "^1.0.0"
+
+shebang-command@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+  integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+  dependencies:
+    shebang-regex "^3.0.0"
+
+shebang-regex@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+  integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==
+
+shebang-regex@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+  integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+shell-quote@^1.6.1:
+  version "1.7.3"
+  resolved "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123"
+  integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==
+
+showdown@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/showdown/-/showdown-2.1.0.tgz#1251f5ed8f773f0c0c7bfc8e6fd23581f9e545c5"
+  integrity sha512-/6NVYu4U819R2pUIk79n67SYgJHWCce0a5xTP979WbNp0FL9MN1I1QK662IDU1b6JzKTvmhgI7T7JYIxBi3kMQ==
+  dependencies:
+    commander "^9.0.0"
+
+side-channel@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
+  integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+  dependencies:
+    call-bind "^1.0.0"
+    get-intrinsic "^1.0.2"
+    object-inspect "^1.9.0"
+
+signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7:
+  version "3.0.7"
+  resolved "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
+  integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
+
+slash@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+  integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+slice-ansi@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787"
+  integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==
+  dependencies:
+    ansi-styles "^4.0.0"
+    astral-regex "^2.0.0"
+    is-fullwidth-code-point "^3.0.0"
+
+slice-ansi@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
+  integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
+  dependencies:
+    ansi-styles "^4.0.0"
+    astral-regex "^2.0.0"
+    is-fullwidth-code-point "^3.0.0"
+
+slice-ansi@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a"
+  integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==
+  dependencies:
+    ansi-styles "^6.0.0"
+    is-fullwidth-code-point "^4.0.0"
+
+snake-case@^3.0.4:
+  version "3.0.4"
+  resolved "https://registry.npmmirror.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c"
+  integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==
+  dependencies:
+    dot-case "^3.0.4"
+    tslib "^2.0.3"
+
+snapdragon-node@^2.0.1:
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+  integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
+  dependencies:
+    define-property "^1.0.0"
+    isobject "^3.0.0"
+    snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+  integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
+  dependencies:
+    kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+  version "0.8.2"
+  resolved "https://registry.npmmirror.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+  integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
+  dependencies:
+    base "^0.11.1"
+    debug "^2.2.0"
+    define-property "^0.2.5"
+    extend-shallow "^2.0.1"
+    map-cache "^0.2.2"
+    source-map "^0.5.6"
+    source-map-resolve "^0.5.0"
+    use "^3.1.0"
+
+sort-keys-length@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/sort-keys-length/-/sort-keys-length-1.0.1.tgz#9cb6f4f4e9e48155a6aa0671edd336ff1479a188"
+  integrity sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==
+  dependencies:
+    sort-keys "^1.0.0"
+
+sort-keys@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
+  integrity sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==
+  dependencies:
+    is-plain-obj "^1.0.0"
+
+sort-keys@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128"
+  integrity sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==
+  dependencies:
+    is-plain-obj "^1.0.0"
+
+sortablejs@^1.15.0:
+  version "1.15.0"
+  resolved "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.15.0.tgz#53230b8aa3502bb77a29e2005808ffdb4a5f7e2a"
+  integrity sha512-bv9qgVMjUMf89wAvM6AxVvS/4MX3sPeN0+agqShejLU5z5GX4C75ow1O2e5k4L6XItUyAK3gH6AxSbXrOM5e8w==
+
+source-map-js@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
+  integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
+
+source-map-resolve@^0.5.0:
+  version "0.5.3"
+  resolved "https://registry.npmmirror.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a"
+  integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
+  dependencies:
+    atob "^2.1.2"
+    decode-uri-component "^0.2.0"
+    resolve-url "^0.2.1"
+    source-map-url "^0.4.0"
+    urix "^0.1.0"
+
+source-map-support@~0.5.20:
+  version "0.5.21"
+  resolved "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
+  integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
+  dependencies:
+    buffer-from "^1.0.0"
+    source-map "^0.6.0"
+
+source-map-url@^0.4.0:
+  version "0.4.1"
+  resolved "https://registry.npmmirror.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56"
+  integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==
+
+source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0:
+  version "0.6.1"
+  resolved "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+  integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+source-map@^0.5.6:
+  version "0.5.7"
+  resolved "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+  integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
+
+source-map@^0.7.3:
+  version "0.7.4"
+  resolved "https://registry.npmmirror.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656"
+  integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==
+
+source-map@^0.8.0-beta.0:
+  version "0.8.0-beta.0"
+  resolved "https://registry.npmmirror.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11"
+  integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==
+  dependencies:
+    whatwg-url "^7.0.0"
+
+sourcemap-codec@^1.4.8:
+  version "1.4.8"
+  resolved "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4"
+  integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
+
+spdx-correct@^3.0.0:
+  version "3.1.1"
+  resolved "https://registry.npmmirror.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"
+  integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==
+  dependencies:
+    spdx-expression-parse "^3.0.0"
+    spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+  version "2.3.0"
+  resolved "https://registry.npmmirror.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
+  integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
+
+spdx-expression-parse@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
+  integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
+  dependencies:
+    spdx-exceptions "^2.1.0"
+    spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+  version "3.0.11"
+  resolved "https://registry.npmmirror.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95"
+  integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==
+
+split-string@^3.0.1, split-string@^3.0.2:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+  integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
+  dependencies:
+    extend-shallow "^3.0.0"
+
+split2@^3.0.0:
+  version "3.2.2"
+  resolved "https://registry.npmmirror.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f"
+  integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==
+  dependencies:
+    readable-stream "^3.0.0"
+
+split@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9"
+  integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==
+  dependencies:
+    through "2"
+
+squeak@^1.0.0:
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/squeak/-/squeak-1.3.0.tgz#33045037b64388b567674b84322a6521073916c3"
+  integrity sha512-YQL1ulInM+ev8nXX7vfXsCsDh6IqXlrremc1hzi77776BtpWgYJUMto3UM05GSAaGzJgWekszjoKDrVNB5XG+A==
+  dependencies:
+    chalk "^1.0.0"
+    console-stream "^0.1.1"
+    lpad-align "^1.0.1"
+
+ssf@~0.11.2:
+  version "0.11.2"
+  resolved "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz#0b99698b237548d088fc43cdf2b70c1a7512c06c"
+  integrity sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==
+  dependencies:
+    frac "~1.1.2"
+
+stable@^0.1.8:
+  version "0.1.8"
+  resolved "https://registry.npmmirror.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
+  integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
+
+static-extend@^0.1.1:
+  version "0.1.2"
+  resolved "https://registry.npmmirror.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+  integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==
+  dependencies:
+    define-property "^0.2.5"
+    object-copy "^0.1.0"
+
+statuses@~1.5.0:
+  version "1.5.0"
+  resolved "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+  integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==
+
+strict-uri-encode@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
+  integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==
+
+string-argv@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.npmmirror.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da"
+  integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==
+
+string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
+  version "4.2.3"
+  resolved "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+  integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+  dependencies:
+    emoji-regex "^8.0.0"
+    is-fullwidth-code-point "^3.0.0"
+    strip-ansi "^6.0.1"
+
+string-width@^5.0.0:
+  version "5.1.2"
+  resolved "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794"
+  integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==
+  dependencies:
+    eastasianwidth "^0.2.0"
+    emoji-regex "^9.2.2"
+    strip-ansi "^7.0.1"
+
+string.prototype.matchall@^4.0.6:
+  version "4.0.7"
+  resolved "https://registry.npmmirror.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d"
+  integrity sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==
+  dependencies:
+    call-bind "^1.0.2"
+    define-properties "^1.1.3"
+    es-abstract "^1.19.1"
+    get-intrinsic "^1.1.1"
+    has-symbols "^1.0.3"
+    internal-slot "^1.0.3"
+    regexp.prototype.flags "^1.4.1"
+    side-channel "^1.0.4"
+
+string.prototype.padend@^3.0.0:
+  version "3.1.3"
+  resolved "https://registry.npmmirror.com/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz#997a6de12c92c7cb34dc8a201a6c53d9bd88a5f1"
+  integrity sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==
+  dependencies:
+    call-bind "^1.0.2"
+    define-properties "^1.1.3"
+    es-abstract "^1.19.1"
+
+string.prototype.trimend@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0"
+  integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==
+  dependencies:
+    call-bind "^1.0.2"
+    define-properties "^1.1.4"
+    es-abstract "^1.19.5"
+
+string.prototype.trimstart@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef"
+  integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==
+  dependencies:
+    call-bind "^1.0.2"
+    define-properties "^1.1.4"
+    es-abstract "^1.19.5"
+
+string_decoder@^1.1.1:
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+  integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+  dependencies:
+    safe-buffer "~5.2.0"
+
+string_decoder@~1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+  integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+  dependencies:
+    safe-buffer "~5.1.0"
+
+stringify-object@^3.3.0:
+  version "3.3.0"
+  resolved "https://registry.npmmirror.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629"
+  integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==
+  dependencies:
+    get-own-enumerable-property-symbols "^3.0.0"
+    is-obj "^1.0.1"
+    is-regexp "^1.0.0"
+
+strip-ansi@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+  integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==
+  dependencies:
+    ansi-regex "^2.0.0"
+
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+  version "6.0.1"
+  resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+  integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+  dependencies:
+    ansi-regex "^5.0.1"
+
+strip-ansi@^7.0.1:
+  version "7.0.1"
+  resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2"
+  integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==
+  dependencies:
+    ansi-regex "^6.0.1"
+
+strip-bom@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+  integrity sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==
+  dependencies:
+    is-utf8 "^0.2.0"
+
+strip-bom@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+  integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==
+
+strip-comments@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/strip-comments/-/strip-comments-2.0.1.tgz#4ad11c3fbcac177a67a40ac224ca339ca1c1ba9b"
+  integrity sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==
+
+strip-dirs@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/strip-dirs/-/strip-dirs-2.1.0.tgz#4987736264fc344cf20f6c34aca9d13d1d4ed6c5"
+  integrity sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==
+  dependencies:
+    is-natural-number "^4.0.1"
+
+strip-eof@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+  integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==
+
+strip-final-newline@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
+  integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
+
+strip-indent@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
+  integrity sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==
+  dependencies:
+    get-stdin "^4.0.1"
+
+strip-indent@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001"
+  integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==
+  dependencies:
+    min-indent "^1.0.0"
+
+strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
+  version "3.1.1"
+  resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
+  integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
+strip-outer@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631"
+  integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==
+  dependencies:
+    escape-string-regexp "^1.0.2"
+
+strnum@^1.0.4:
+  version "1.0.5"
+  resolved "https://registry.npmmirror.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db"
+  integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==
+
+style-search@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.npmmirror.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902"
+  integrity sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==
+
+stylelint-config-html@>=1.0.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/stylelint-config-html/-/stylelint-config-html-1.1.0.tgz#999db19aea713b7ff6dde92ada76e4c1bd812b66"
+  integrity sha512-IZv4IVESjKLumUGi+HWeb7skgO6/g4VMuAYrJdlqQFndgbj6WJAXPhaysvBiXefX79upBdQVumgYcdd17gCpjQ==
+
+stylelint-config-prettier@^9.0.3:
+  version "9.0.3"
+  resolved "https://registry.npmmirror.com/stylelint-config-prettier/-/stylelint-config-prettier-9.0.3.tgz#0dccebeff359dcc393c9229184408b08964d561c"
+  integrity sha512-5n9gUDp/n5tTMCq1GLqSpA30w2sqWITSSEiAWQlpxkKGAUbjcemQ0nbkRvRUa0B1LgD3+hCvdL7B1eTxy1QHJg==
+
+stylelint-config-recommended-vue@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.npmmirror.com/stylelint-config-recommended-vue/-/stylelint-config-recommended-vue-1.4.0.tgz#0a182da17dc9e846e4bec65a7676ccf882b35964"
+  integrity sha512-DVJqyX2KvMCn9U0+keL12r7xlsH26K4Vg8NrIZuq5MoF7g82DpMp326Om4E0Q+Il1o+bTHuUyejf2XAI0iD04Q==
+  dependencies:
+    semver "^7.3.5"
+    stylelint-config-html ">=1.0.0"
+    stylelint-config-recommended ">=6.0.0"
+
+stylelint-config-recommended@>=6.0.0:
+  version "9.0.0"
+  resolved "https://registry.npmmirror.com/stylelint-config-recommended/-/stylelint-config-recommended-9.0.0.tgz#1c9e07536a8cd875405f8ecef7314916d94e7e40"
+  integrity sha512-9YQSrJq4NvvRuTbzDsWX3rrFOzOlYBmZP+o513BJN/yfEmGSr0AxdvrWs0P/ilSpVV/wisamAHu5XSk8Rcf4CQ==
+
+stylelint-config-recommended@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.npmmirror.com/stylelint-config-recommended/-/stylelint-config-recommended-7.0.0.tgz#7497372ae83ab7a6fffc18d7d7b424c6480ae15e"
+  integrity sha512-yGn84Bf/q41J4luis1AZ95gj0EQwRX8lWmGmBwkwBNSkpGSpl66XcPTulxGa/Z91aPoNGuIGBmFkcM1MejMo9Q==
+
+stylelint-config-standard@^25.0.0:
+  version "25.0.0"
+  resolved "https://registry.npmmirror.com/stylelint-config-standard/-/stylelint-config-standard-25.0.0.tgz#2c916984e6655d40d6e8748b19baa8603b680bff"
+  integrity sha512-21HnP3VSpaT1wFjFvv9VjvOGDtAviv47uTp3uFmzcN+3Lt+RYRv6oAplLaV51Kf792JSxJ6svCJh/G18E9VnCA==
+  dependencies:
+    stylelint-config-recommended "^7.0.0"
+
+stylelint-order@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/stylelint-order/-/stylelint-order-5.0.0.tgz#abd20f6b85ac640774cbe40e70d3fe9c6fdf4400"
+  integrity sha512-OWQ7pmicXufDw5BlRqzdz3fkGKJPgLyDwD1rFY3AIEfIH/LQY38Vu/85v8/up0I+VPiuGRwbc2Hg3zLAsJaiyw==
+  dependencies:
+    postcss "^8.3.11"
+    postcss-sorting "^7.0.1"
+
+stylelint@^14.7.1:
+  version "14.11.0"
+  resolved "https://registry.npmmirror.com/stylelint/-/stylelint-14.11.0.tgz#e2ecb28bbacab05e1fbeb84cbba23883b27499cc"
+  integrity sha512-OTLjLPxpvGtojEfpESWM8Ir64Z01E89xsisaBMUP/ngOx1+4VG2DPRcUyCCiin9Rd3kPXPsh/uwHd9eqnvhsYA==
+  dependencies:
+    "@csstools/selector-specificity" "^2.0.2"
+    balanced-match "^2.0.0"
+    colord "^2.9.3"
+    cosmiconfig "^7.0.1"
+    css-functions-list "^3.1.0"
+    debug "^4.3.4"
+    fast-glob "^3.2.11"
+    fastest-levenshtein "^1.0.16"
+    file-entry-cache "^6.0.1"
+    global-modules "^2.0.0"
+    globby "^11.1.0"
+    globjoin "^0.1.4"
+    html-tags "^3.2.0"
+    ignore "^5.2.0"
+    import-lazy "^4.0.0"
+    imurmurhash "^0.1.4"
+    is-plain-object "^5.0.0"
+    known-css-properties "^0.25.0"
+    mathml-tag-names "^2.1.3"
+    meow "^9.0.0"
+    micromatch "^4.0.5"
+    normalize-path "^3.0.0"
+    picocolors "^1.0.0"
+    postcss "^8.4.16"
+    postcss-media-query-parser "^0.2.3"
+    postcss-resolve-nested-selector "^0.1.1"
+    postcss-safe-parser "^6.0.0"
+    postcss-selector-parser "^6.0.10"
+    postcss-value-parser "^4.2.0"
+    resolve-from "^5.0.0"
+    string-width "^4.2.3"
+    strip-ansi "^6.0.1"
+    style-search "^0.1.0"
+    supports-hyperlinks "^2.2.0"
+    svg-tags "^1.0.0"
+    table "^6.8.0"
+    v8-compile-cache "^2.3.0"
+    write-file-atomic "^4.0.2"
+
+supports-color@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+  integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==
+
+supports-color@^3.2.3:
+  version "3.2.3"
+  resolved "https://registry.npmmirror.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
+  integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==
+  dependencies:
+    has-flag "^1.0.0"
+
+supports-color@^5.3.0:
+  version "5.5.0"
+  resolved "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+  integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+  dependencies:
+    has-flag "^3.0.0"
+
+supports-color@^7.0.0, supports-color@^7.1.0:
+  version "7.2.0"
+  resolved "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+  integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+  dependencies:
+    has-flag "^4.0.0"
+
+supports-color@^9.2.1:
+  version "9.2.2"
+  resolved "https://registry.npmmirror.com/supports-color/-/supports-color-9.2.2.tgz#502acaf82f2b7ee78eb7c83dcac0f89694e5a7bb"
+  integrity sha512-XC6g/Kgux+rJXmwokjm9ECpD6k/smUoS5LKlUCcsYr4IY3rW0XyAympon2RmxGrlnZURMpg5T18gWDP9CsHXFA==
+
+supports-hyperlinks@^2.2.0:
+  version "2.2.0"
+  resolved "https://registry.npmmirror.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb"
+  integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==
+  dependencies:
+    has-flag "^4.0.0"
+    supports-color "^7.0.0"
+
+supports-preserve-symlinks-flag@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
+  integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+svg-baker@1.7.0:
+  version "1.7.0"
+  resolved "https://registry.npmmirror.com/svg-baker/-/svg-baker-1.7.0.tgz#8367f78d875550c52fe4756f7303d5c5d7c2e9a7"
+  integrity sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==
+  dependencies:
+    bluebird "^3.5.0"
+    clone "^2.1.1"
+    he "^1.1.1"
+    image-size "^0.5.1"
+    loader-utils "^1.1.0"
+    merge-options "1.0.1"
+    micromatch "3.1.0"
+    postcss "^5.2.17"
+    postcss-prefix-selector "^1.6.0"
+    posthtml-rename-id "^1.0"
+    posthtml-svg-mode "^1.0.3"
+    query-string "^4.3.2"
+    traverse "^0.6.6"
+
+svg-tags@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764"
+  integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==
+
+svgo@^2.1.0, svgo@^2.8.0:
+  version "2.8.0"
+  resolved "https://registry.npmmirror.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24"
+  integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==
+  dependencies:
+    "@trysound/sax" "0.2.0"
+    commander "^7.2.0"
+    css-select "^4.1.3"
+    css-tree "^1.1.3"
+    csso "^4.2.0"
+    picocolors "^1.0.0"
+    stable "^0.1.8"
+
+systemjs@^6.12.1:
+  version "6.12.3"
+  resolved "https://registry.npmmirror.com/systemjs/-/systemjs-6.12.3.tgz#9c4b614dea4445523d22cda0a7188714f0c4f64c"
+  integrity sha512-TtYUN86Hs8V1QGAoj9ad1xmJmZS9Lurfi8Iu8QWOKaUDDuTH0Bpfdxz9qZIdxsmvAg3WMQnZ5/pkQvloh2sr/Q==
+
+table@^6.8.0:
+  version "6.8.0"
+  resolved "https://registry.npmmirror.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca"
+  integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==
+  dependencies:
+    ajv "^8.0.1"
+    lodash.truncate "^4.4.2"
+    slice-ansi "^4.0.0"
+    string-width "^4.2.3"
+    strip-ansi "^6.0.1"
+
+tar-stream@^1.5.2:
+  version "1.6.2"
+  resolved "https://registry.npmmirror.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555"
+  integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==
+  dependencies:
+    bl "^1.0.0"
+    buffer-alloc "^1.2.0"
+    end-of-stream "^1.0.0"
+    fs-constants "^1.0.0"
+    readable-stream "^2.3.0"
+    to-buffer "^1.1.1"
+    xtend "^4.0.0"
+
+temp-dir@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d"
+  integrity sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==
+
+temp-dir@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e"
+  integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==
+
+tempfile@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/tempfile/-/tempfile-2.0.0.tgz#6b0446856a9b1114d1856ffcbe509cccb0977265"
+  integrity sha512-ZOn6nJUgvgC09+doCEF3oB+r3ag7kUvlsXEGX069QRD60p+P3uP7XG9N2/at+EyIRGSN//ZY3LyEotA1YpmjuA==
+  dependencies:
+    temp-dir "^1.0.0"
+    uuid "^3.0.1"
+
+tempfile@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/tempfile/-/tempfile-3.0.0.tgz#5376a3492de7c54150d0cc0612c3f00e2cdaf76c"
+  integrity sha512-uNFCg478XovRi85iD42egu+eSFUmmka750Jy7L5tfHI5hQKKtbPnxaSaXAbBqCDYrw3wx4tXjKwci4/QmsZJxw==
+  dependencies:
+    temp-dir "^2.0.0"
+    uuid "^3.3.2"
+
+tempy@^0.6.0:
+  version "0.6.0"
+  resolved "https://registry.npmmirror.com/tempy/-/tempy-0.6.0.tgz#65e2c35abc06f1124a97f387b08303442bde59f3"
+  integrity sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==
+  dependencies:
+    is-stream "^2.0.0"
+    temp-dir "^2.0.0"
+    type-fest "^0.16.0"
+    unique-string "^2.0.0"
+
+terser@^5.0.0, terser@^5.10.0:
+  version "5.14.2"
+  resolved "https://registry.npmmirror.com/terser/-/terser-5.14.2.tgz#9ac9f22b06994d736174f4091aa368db896f1c10"
+  integrity sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==
+  dependencies:
+    "@jridgewell/source-map" "^0.3.2"
+    acorn "^8.5.0"
+    commander "^2.20.0"
+    source-map-support "~0.5.20"
+
+text-extensions@^1.0.0:
+  version "1.9.0"
+  resolved "https://registry.npmmirror.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26"
+  integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==
+
+text-table@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+  integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
+
+through2@^2.0.0:
+  version "2.0.5"
+  resolved "https://registry.npmmirror.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
+  integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
+  dependencies:
+    readable-stream "~2.3.6"
+    xtend "~4.0.1"
+
+through2@^4.0.0:
+  version "4.0.2"
+  resolved "https://registry.npmmirror.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764"
+  integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==
+  dependencies:
+    readable-stream "3"
+
+through@2, "through@>=2.2.7 <3", through@^2.3.6, through@^2.3.8:
+  version "2.3.8"
+  resolved "https://registry.npmmirror.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+  integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
+
+timed-out@^4.0.0, timed-out@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.npmmirror.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
+  integrity sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==
+
+tinycolor2@^1.4.2:
+  version "1.4.2"
+  resolved "https://registry.npmmirror.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803"
+  integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==
+
+tinymce@^5.10.3:
+  version "5.10.5"
+  resolved "https://registry.npmmirror.com/tinymce/-/tinymce-5.10.5.tgz#02aef6a67e915f1559e51fa8fb007270d9666778"
+  integrity sha512-nFKtLhmoRtExBxUfv06JlkbQWux5D+d115vxSRAqUmccZdrtpFvOIYwZmikvulLdM9pfEpvO0B+RQ2qFV/+R7w==
+
+tmp@^0.0.33:
+  version "0.0.33"
+  resolved "https://registry.npmmirror.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
+  integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
+  dependencies:
+    os-tmpdir "~1.0.2"
+
+to-buffer@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80"
+  integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==
+
+to-fast-properties@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+  integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
+
+to-object-path@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.npmmirror.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+  integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==
+  dependencies:
+    kind-of "^3.0.2"
+
+to-regex-range@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+  integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==
+  dependencies:
+    is-number "^3.0.0"
+    repeat-string "^1.6.1"
+
+to-regex-range@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+  integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+  dependencies:
+    is-number "^7.0.0"
+
+to-regex@^3.0.1:
+  version "3.0.2"
+  resolved "https://registry.npmmirror.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+  integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
+  dependencies:
+    define-property "^2.0.2"
+    extend-shallow "^3.0.2"
+    regex-not "^1.0.2"
+    safe-regex "^1.1.0"
+
+token-stream@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/token-stream/-/token-stream-1.0.0.tgz#cc200eab2613f4166d27ff9afc7ca56d49df6eb4"
+  integrity sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==
+
+tr46@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09"
+  integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==
+  dependencies:
+    punycode "^2.1.0"
+
+tr46@~0.0.3:
+  version "0.0.3"
+  resolved "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
+  integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
+
+traverse@^0.6.6:
+  version "0.6.6"
+  resolved "https://registry.npmmirror.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137"
+  integrity sha512-kdf4JKs8lbARxWdp7RKdNzoJBhGUcIalSYibuGyHJbmk40pOysQ0+QPvlkCOICOivDWU2IJo2rkrxyTK2AH4fw==
+
+trim-newlines@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
+  integrity sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==
+
+trim-newlines@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144"
+  integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==
+
+trim-repeated@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21"
+  integrity sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==
+  dependencies:
+    escape-string-regexp "^1.0.2"
+
+ts-node@^10.7.0, ts-node@^10.8.1:
+  version "10.9.1"
+  resolved "https://registry.npmmirror.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b"
+  integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==
+  dependencies:
+    "@cspotcode/source-map-support" "^0.8.0"
+    "@tsconfig/node10" "^1.0.7"
+    "@tsconfig/node12" "^1.0.7"
+    "@tsconfig/node14" "^1.0.0"
+    "@tsconfig/node16" "^1.0.2"
+    acorn "^8.4.1"
+    acorn-walk "^8.1.1"
+    arg "^4.1.0"
+    create-require "^1.1.0"
+    diff "^4.0.1"
+    make-error "^1.1.1"
+    v8-compile-cache-lib "^3.0.1"
+    yn "3.1.1"
+
+tslib@2.3.0:
+  version "2.3.0"
+  resolved "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz#803b8cdab3e12ba581a4ca41c8839bbb0dacb09e"
+  integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==
+
+tslib@^1.8.1:
+  version "1.14.1"
+  resolved "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+  integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0:
+  version "2.4.0"
+  resolved "https://registry.npmmirror.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3"
+  integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==
+
+tsutils@^3.21.0:
+  version "3.21.0"
+  resolved "https://registry.npmmirror.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
+  integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==
+  dependencies:
+    tslib "^1.8.1"
+
+tunnel-agent@^0.6.0:
+  version "0.6.0"
+  resolved "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+  integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==
+  dependencies:
+    safe-buffer "^5.0.1"
+
+type-check@^0.4.0, type-check@~0.4.0:
+  version "0.4.0"
+  resolved "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
+  integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
+  dependencies:
+    prelude-ls "^1.2.1"
+
+type-fest@^0.11.0:
+  version "0.11.0"
+  resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1"
+  integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==
+
+type-fest@^0.16.0:
+  version "0.16.0"
+  resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860"
+  integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==
+
+type-fest@^0.18.0:
+  version "0.18.1"
+  resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f"
+  integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==
+
+type-fest@^0.20.2:
+  version "0.20.2"
+  resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
+  integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
+
+type-fest@^0.21.3:
+  version "0.21.3"
+  resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
+  integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
+
+type-fest@^0.6.0:
+  version "0.6.0"
+  resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b"
+  integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==
+
+type-fest@^0.8.1:
+  version "0.8.1"
+  resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
+  integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
+
+typescript@^4.4.3, typescript@^4.6.3:
+  version "4.7.4"
+  resolved "https://registry.npmmirror.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235"
+  integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==
+
+uglify-js@^3.1.4:
+  version "3.17.0"
+  resolved "https://registry.npmmirror.com/uglify-js/-/uglify-js-3.17.0.tgz#55bd6e9d19ce5eef0d5ad17cd1f587d85b180a85"
+  integrity sha512-aTeNPVmgIMPpm1cxXr2Q/nEbvkmV8yq66F3om7X3P/cvOXQ0TMQ64Wk63iyT1gPlmdmGzjGpyLh1f3y8MZWXGg==
+
+unbox-primitive@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e"
+  integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==
+  dependencies:
+    call-bind "^1.0.2"
+    has-bigints "^1.0.2"
+    has-symbols "^1.0.3"
+    which-boxed-primitive "^1.0.2"
+
+unbzip2-stream@^1.0.9:
+  version "1.4.3"
+  resolved "https://registry.npmmirror.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7"
+  integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==
+  dependencies:
+    buffer "^5.2.1"
+    through "^2.3.8"
+
+unicode-canonical-property-names-ecmascript@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc"
+  integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==
+
+unicode-match-property-ecmascript@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3"
+  integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==
+  dependencies:
+    unicode-canonical-property-names-ecmascript "^2.0.0"
+    unicode-property-aliases-ecmascript "^2.0.0"
+
+unicode-match-property-value-ecmascript@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714"
+  integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==
+
+unicode-property-aliases-ecmascript@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8"
+  integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==
+
+union-value@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847"
+  integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==
+  dependencies:
+    arr-union "^3.1.0"
+    get-value "^2.0.6"
+    is-extendable "^0.1.1"
+    set-value "^2.0.1"
+
+unique-string@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d"
+  integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==
+  dependencies:
+    crypto-random-string "^2.0.0"
+
+universal-user-agent@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.npmmirror.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee"
+  integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==
+
+universalify@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
+  integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
+
+unpipe@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+  integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
+
+unset-value@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+  integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==
+  dependencies:
+    has-value "^0.3.1"
+    isobject "^3.0.0"
+
+upath@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"
+  integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
+
+upath@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b"
+  integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==
+
+update-browserslist-db@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz#be06a5eedd62f107b7c19eb5bcefb194411abf38"
+  integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==
+  dependencies:
+    escalade "^3.1.1"
+    picocolors "^1.0.0"
+
+upper-case-first@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324"
+  integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==
+  dependencies:
+    tslib "^2.0.3"
+
+upper-case@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/upper-case/-/upper-case-2.0.2.tgz#d89810823faab1df1549b7d97a76f8662bae6f7a"
+  integrity sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==
+  dependencies:
+    tslib "^2.0.3"
+
+uri-js@^4.2.2:
+  version "4.4.1"
+  resolved "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+  integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+  dependencies:
+    punycode "^2.1.0"
+
+urix@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.npmmirror.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+  integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==
+
+url-parse-lax@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
+  integrity sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==
+  dependencies:
+    prepend-http "^1.0.1"
+
+url-parse-lax@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.npmmirror.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
+  integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==
+  dependencies:
+    prepend-http "^2.0.0"
+
+url-to-options@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9"
+  integrity sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==
+
+use@^3.1.0:
+  version "3.1.1"
+  resolved "https://registry.npmmirror.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+  integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
+
+util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+  integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
+
+utils-merge@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+  integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==
+
+uuid@^3.0.1, uuid@^3.3.2:
+  version "3.4.0"
+  resolved "https://registry.npmmirror.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
+  integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+
+v8-compile-cache-lib@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf"
+  integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==
+
+v8-compile-cache@^2.0.3, v8-compile-cache@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.npmmirror.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
+  integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
+
+validate-npm-package-license@^3.0.1:
+  version "3.0.4"
+  resolved "https://registry.npmmirror.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
+  integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
+  dependencies:
+    spdx-correct "^3.0.0"
+    spdx-expression-parse "^3.0.0"
+
+vary@^1:
+  version "1.1.2"
+  resolved "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+  integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
+
+vditor@^3.8.13:
+  version "3.8.17"
+  resolved "https://registry.npmmirror.com/vditor/-/vditor-3.8.17.tgz#13925dae3c70635bf70f28659915b5c523c00b29"
+  integrity sha512-itaVyNwC/+xjOsTaDZKGy4BGhEcmZWkCDKaMyIH7rcbojw2H29Vg/FV1MNPcNyjZ6mvmcNlS6oZT1drDnAVFMQ==
+  dependencies:
+    diff-match-patch "^1.0.5"
+
+vite-plugin-compression@^0.5.1:
+  version "0.5.1"
+  resolved "https://registry.npmmirror.com/vite-plugin-compression/-/vite-plugin-compression-0.5.1.tgz#a75b0d8f48357ebb377b65016da9f20885ef39b6"
+  integrity sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==
+  dependencies:
+    chalk "^4.1.2"
+    debug "^4.3.3"
+    fs-extra "^10.0.0"
+
+vite-plugin-html@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.npmmirror.com/vite-plugin-html/-/vite-plugin-html-3.2.0.tgz#0d4df9900642a321a139f1c25c05195ba9d0ec79"
+  integrity sha512-2VLCeDiHmV/BqqNn5h2V+4280KRgQzCFN47cst3WiNK848klESPQnzuC3okH5XHtgwHH/6s1Ho/YV6yIO0pgoQ==
+  dependencies:
+    "@rollup/pluginutils" "^4.2.0"
+    colorette "^2.0.16"
+    connect-history-api-fallback "^1.6.0"
+    consola "^2.15.3"
+    dotenv "^16.0.0"
+    dotenv-expand "^8.0.2"
+    ejs "^3.1.6"
+    fast-glob "^3.2.11"
+    fs-extra "^10.0.1"
+    html-minifier-terser "^6.1.0"
+    node-html-parser "^5.3.3"
+    pathe "^0.2.0"
+
+vite-plugin-imagemin@^0.6.1:
+  version "0.6.1"
+  resolved "https://registry.npmmirror.com/vite-plugin-imagemin/-/vite-plugin-imagemin-0.6.1.tgz#d4e538beaa6265fb0df17396666ee90483e953bc"
+  integrity sha512-cP7LDn8euPrji7WYtDoNQpJEB9nkMxJHm/A+QZnvMrrCSuyo/clpMy/T1v7suDXPBavsDiDdFdVQB5p7VGD2cg==
+  dependencies:
+    "@types/imagemin" "^7.0.1"
+    "@types/imagemin-gifsicle" "^7.0.1"
+    "@types/imagemin-jpegtran" "^5.0.1"
+    "@types/imagemin-mozjpeg" "^8.0.1"
+    "@types/imagemin-optipng" "^5.2.1"
+    "@types/imagemin-svgo" "^10.0.0"
+    "@types/imagemin-webp" "^7.0.0"
+    "@types/svgo" "^2.6.1"
+    chalk "^4.1.2"
+    debug "^4.3.3"
+    esbuild "^0.14.14"
+    fs-extra "^10.0.0"
+    gifsicle "5.2.0"
+    imagemin "^7.0.1"
+    imagemin-gifsicle "^7.0.0"
+    imagemin-jpegtran "^7.0.0"
+    imagemin-mozjpeg "^9.0.0"
+    imagemin-optipng "^8.0.0"
+    imagemin-pngquant "^9.0.2"
+    imagemin-svgo "^9.0.0"
+    imagemin-webp "^6.0.0"
+    jpegtran-bin "^6.0.1"
+    pathe "^0.2.0"
+
+vite-plugin-mkcert@^1.6.0:
+  version "1.9.0"
+  resolved "https://registry.npmmirror.com/vite-plugin-mkcert/-/vite-plugin-mkcert-1.9.0.tgz#894fadd4d932fb1a8face1b73009982428cfba3d"
+  integrity sha512-lKIOVJvbt1ijAMeF31TYGwEzH8iqK+Q8BiInpQRcAW543y8HYttZTRVGDAFqVaej6iE5o7XAisZ1aCg+q5tOfA==
+  dependencies:
+    "@octokit/rest" "^19.0.3"
+    axios "^0.21.4"
+    debug "^4.3.4"
+    picocolors "^1.0.0"
+    vite "^3.0.0"
+
+vite-plugin-mock@^2.9.6:
+  version "2.9.6"
+  resolved "https://registry.npmmirror.com/vite-plugin-mock/-/vite-plugin-mock-2.9.6.tgz#04dd23de6baa052faa5b9ad317514c90d6205e25"
+  integrity sha512-/Rm59oPppe/ncbkSrUuAxIQihlI2YcBmnbR4ST1RA2VzM1C0tEQc1KlbQvnUGhXECAGTaQN2JyasiwXP6EtKgg==
+  dependencies:
+    "@rollup/plugin-node-resolve" "^13.0.4"
+    "@types/mockjs" "^1.0.4"
+    chalk "^4.1.2"
+    chokidar "^3.5.2"
+    connect "^3.7.0"
+    debug "^4.3.2"
+    esbuild "0.11.3"
+    fast-glob "^3.2.7"
+    path-to-regexp "^6.2.0"
+
+vite-plugin-purge-icons@^0.8.1:
+  version "0.8.2"
+  resolved "https://registry.npmmirror.com/vite-plugin-purge-icons/-/vite-plugin-purge-icons-0.8.2.tgz#bdbbbad34f82e2cf239afc0f3aa8c6bd175f48f6"
+  integrity sha512-rW3RcNKj7QY3M7wcnwYVc3Ig+WwSQQ/Z67v+xdtk/8MA+ON05A3zc3qGaPdi6+8BUKYDpqvviKYiuLgRjleUOQ==
+  dependencies:
+    "@purge-icons/core" "^0.8.0"
+    "@purge-icons/generated" "^0.8.1"
+    rollup-plugin-purge-icons "^0.8.1"
+
+vite-plugin-pwa@^0.11.13:
+  version "0.11.13"
+  resolved "https://registry.npmmirror.com/vite-plugin-pwa/-/vite-plugin-pwa-0.11.13.tgz#54ed80580b7d3e61aadcf4325fe9bc6f7ffce5db"
+  integrity sha512-Ssj14m3TRVLfkFEAWSMcFE2d1cSdEZyrVTzfY2lSL+umHYvcIFHVDAY143sygtBCb44OPczsAOmWwBTxwOvh7g==
+  dependencies:
+    debug "^4.3.3"
+    fast-glob "^3.2.7"
+    pretty-bytes "^5.6.0"
+    rollup "^2.60.2"
+    workbox-build "^6.4.2"
+    workbox-window "^6.4.2"
+
+vite-plugin-style-import@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/vite-plugin-style-import/-/vite-plugin-style-import-2.0.0.tgz#edafd9fbb09e8bb5ae67dee8f601afbe386a9969"
+  integrity sha512-qtoHQae5dSUQPo/rYz/8p190VU5y19rtBaeV7ryLa/AYAU/e9CG89NrN/3+k7MR8mJy/GPIu91iJ3zk9foUOSA==
+  dependencies:
+    "@rollup/pluginutils" "^4.1.2"
+    change-case "^4.1.2"
+    console "^0.7.2"
+    es-module-lexer "^0.9.3"
+    fs-extra "^10.0.0"
+    magic-string "^0.25.7"
+    pathe "^0.2.0"
+
+vite-plugin-svg-icons@^2.0.1:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/vite-plugin-svg-icons/-/vite-plugin-svg-icons-2.0.1.tgz#7269a0962593509f371b9e2bb344d469db2c6df9"
+  integrity sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==
+  dependencies:
+    "@types/svgo" "^2.6.1"
+    cors "^2.8.5"
+    debug "^4.3.3"
+    etag "^1.8.1"
+    fs-extra "^10.0.0"
+    pathe "^0.2.0"
+    svg-baker "1.7.0"
+    svgo "^2.8.0"
+
+vite-plugin-theme@^0.8.6:
+  version "0.8.6"
+  resolved "https://registry.npmmirror.com/vite-plugin-theme/-/vite-plugin-theme-0.8.6.tgz#31d373ccd44d9160d22dd8f58ac69b237073eefc"
+  integrity sha512-GyoP9JjGkF106AawBh1kvw2eQZ/CCPeZKN5p5XhQe1ah1LO7A/6aVGY5gYGWk2qHG9nXpM1IvxjdbMsg94bvYg==
+  dependencies:
+    "@types/node" "^14.17.1"
+    "@types/tinycolor2" "^1.4.2"
+    chalk "^4.1.1"
+    clean-css "^5.1.2"
+    debug "^4.3.2"
+    esbuild "^0.11.23"
+    esbuild-plugin-alias "^0.1.2"
+    tinycolor2 "^1.4.2"
+
+vite-plugin-vue-setup-extend@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.npmmirror.com/vite-plugin-vue-setup-extend/-/vite-plugin-vue-setup-extend-0.4.0.tgz#ebbbe265320039b8c6a3b9fcae3b8d152ecf4a13"
+  integrity sha512-WMbjPCui75fboFoUTHhdbXzu4Y/bJMv5N9QT9a7do3wNMNHHqrk+Tn2jrSJU0LS5fGl/EG+FEDBYVUeWIkDqXQ==
+  dependencies:
+    "@vue/compiler-sfc" "^3.2.29"
+    magic-string "^0.25.7"
+
+vite-plugin-windicss@^1.8.4:
+  version "1.8.7"
+  resolved "https://registry.npmmirror.com/vite-plugin-windicss/-/vite-plugin-windicss-1.8.7.tgz#884b3e7e4054df22344f61f5b2fddf07f2982405"
+  integrity sha512-/zwQ8+RV+MSkbG0IGqsEma6r2R01NzN/aNpNjJD7VVAkxAptNznqDXOObFTskkWfZ+9m6KJZCOuCPgAFtQIzEA==
+  dependencies:
+    "@windicss/plugin-utils" "1.8.7"
+    debug "^4.3.4"
+    kolorist "^1.5.1"
+    windicss "^3.5.6"
+
+vite@^2.9.5:
+  version "2.9.15"
+  resolved "https://registry.npmmirror.com/vite/-/vite-2.9.15.tgz#2858dd5b2be26aa394a283e62324281892546f0b"
+  integrity sha512-fzMt2jK4vQ3yK56te3Kqpkaeq9DkcZfBbzHwYpobasvgYmP2SoAr6Aic05CsB4CzCZbsDv4sujX3pkEGhLabVQ==
+  dependencies:
+    esbuild "^0.14.27"
+    postcss "^8.4.13"
+    resolve "^1.22.0"
+    rollup ">=2.59.0 <2.78.0"
+  optionalDependencies:
+    fsevents "~2.3.2"
+
+vite@^3.0.0:
+  version "3.0.9"
+  resolved "https://registry.npmmirror.com/vite/-/vite-3.0.9.tgz#45fac22c2a5290a970f23d66c1aef56a04be8a30"
+  integrity sha512-waYABTM+G6DBTCpYAxvevpG50UOlZuynR0ckTK5PawNVt7ebX6X7wNXHaGIO6wYYFXSM7/WcuFuO2QzhBB6aMw==
+  dependencies:
+    esbuild "^0.14.47"
+    postcss "^8.4.16"
+    resolve "^1.22.1"
+    rollup ">=2.75.6 <2.77.0 || ~2.77.0"
+  optionalDependencies:
+    fsevents "~2.3.2"
+
+vscode-jsonrpc@^8.0.0-next.5:
+  version "8.0.2"
+  resolved "https://registry.npmmirror.com/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2.tgz#f239ed2cd6004021b6550af9fd9d3e47eee3cac9"
+  integrity sha512-RY7HwI/ydoC1Wwg4gJ3y6LpU9FJRZAUnTYMXthqhFXXu77ErDd/xkREpGuk4MyYkk4a+XDWAMqe0S3KkelYQEQ==
+
+vscode-languageserver-textdocument@^1.0.3:
+  version "1.0.5"
+  resolved "https://registry.npmmirror.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.5.tgz#838769940ece626176ec5d5a2aa2d0aa69f5095c"
+  integrity sha512-1ah7zyQjKBudnMiHbZmxz5bYNM9KKZYz+5VQLj+yr8l+9w3g+WAhCkUkWbhMEdC5u0ub4Ndiye/fDyS8ghIKQg==
+
+vscode-languageserver-types@^3.17.0-next.6:
+  version "3.17.2"
+  resolved "https://registry.npmmirror.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2.tgz#b2c2e7de405ad3d73a883e91989b850170ffc4f2"
+  integrity sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA==
+
+vscode-uri@^3.0.3:
+  version "3.0.3"
+  resolved "https://registry.npmmirror.com/vscode-uri/-/vscode-uri-3.0.3.tgz#a95c1ce2e6f41b7549f86279d19f47951e4f4d84"
+  integrity sha512-EcswR2S8bpR7fD0YPeS7r2xXExrScVMxg4MedACaWHEtx9ftCF/qHG1xGkolzTPcEmjTavCQgbVzHUIdTMzFGA==
+
+vue-demi@*:
+  version "0.13.8"
+  resolved "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.8.tgz#5c568fb3b4d8f848acc658dfccd3d875035b5653"
+  integrity sha512-Vy1zbZhCOdsmvGR6tJhAvO5vhP7eiS8xkbYQSoVa7o6KlIy3W8Rc53ED4qI4qpeRDjv3mLfXSEpYU6Yq4pgXRg==
+
+vue-eslint-parser@^8.0.1, vue-eslint-parser@^8.3.0:
+  version "8.3.0"
+  resolved "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz#5d31129a1b3dd89c0069ca0a1c88f970c360bd0d"
+  integrity sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==
+  dependencies:
+    debug "^4.3.2"
+    eslint-scope "^7.0.0"
+    eslint-visitor-keys "^3.1.0"
+    espree "^9.0.0"
+    esquery "^1.4.0"
+    lodash "^4.17.21"
+    semver "^7.3.5"
+
+vue-i18n@^9.1.9:
+  version "9.2.2"
+  resolved "https://registry.npmmirror.com/vue-i18n/-/vue-i18n-9.2.2.tgz#aeb49d9424923c77e0d6441e3f21dafcecd0e666"
+  integrity sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ==
+  dependencies:
+    "@intlify/core-base" "9.2.2"
+    "@intlify/shared" "9.2.2"
+    "@intlify/vue-devtools" "9.2.2"
+    "@vue/devtools-api" "^6.2.1"
+
+vue-json-pretty@^2.0.6:
+  version "2.2.0"
+  resolved "https://registry.npmmirror.com/vue-json-pretty/-/vue-json-pretty-2.2.0.tgz#d1a302bb0debdc72e7c1de2cebdf9937d019fec9"
+  integrity sha512-Jah7kWV+ZEFPIvf1NCAntUzcmtNYAbkkj2l5WHJotz97BE7YRJ3hx5ecBcaCPkW6bYBugm1ditZjKAdX8AQZMA==
+
+vue-router@^4.0.14:
+  version "4.1.3"
+  resolved "https://registry.npmmirror.com/vue-router/-/vue-router-4.1.3.tgz#f8dc7931a2253cc5aa9b740f8b98969d08ca283c"
+  integrity sha512-XvK81bcYglKiayT7/vYAg/f36ExPC4t90R/HIpzrZ5x+17BOWptXLCrEPufGgZeuq68ww4ekSIMBZY1qdUdfjA==
+  dependencies:
+    "@vue/devtools-api" "^6.1.4"
+
+vue-tsc@^0.33.9:
+  version "0.33.9"
+  resolved "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-0.33.9.tgz#96f81eeb0f141b7f0ab73a31941034fce823785e"
+  integrity sha512-s/+r4JNsCh4e3MUdsYrjEA8IgPPDzHL5kEah/OznxIHd1XMlYiIkXGdiyU6JE5J+lzXNOKdOlNliqwwpeETQWw==
+  dependencies:
+    "@volar/vue-typescript" "0.33.9"
+
+vue-types@^3.0.0:
+  version "3.0.2"
+  resolved "https://registry.npmmirror.com/vue-types/-/vue-types-3.0.2.tgz#ec16e05d412c038262fc1efa4ceb9647e7fb601d"
+  integrity sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==
+  dependencies:
+    is-plain-object "3.0.1"
+
+vue-types@^4.1.1:
+  version "4.2.1"
+  resolved "https://registry.npmmirror.com/vue-types/-/vue-types-4.2.1.tgz#f8f7e5fb42d4a6acda6d92c9736b510e5534c753"
+  integrity sha512-DNQZmJuOvovLUIp0BENRkdnZHbI0V4e2mNvjAZOAXKD56YGvRchtUYOXA/XqTxdv7Ng5SJLZqRKRpAhm5NLaPQ==
+  dependencies:
+    is-plain-object "5.0.0"
+
+vue@^3.2.33:
+  version "3.2.37"
+  resolved "https://registry.npmmirror.com/vue/-/vue-3.2.37.tgz#da220ccb618d78579d25b06c7c21498ca4e5452e"
+  integrity sha512-bOKEZxrm8Eh+fveCqS1/NkG/n6aMidsI6hahas7pa0w/l7jkbssJVsRhVDs07IdDq7h9KHswZOgItnwJAgtVtQ==
+  dependencies:
+    "@vue/compiler-dom" "3.2.37"
+    "@vue/compiler-sfc" "3.2.37"
+    "@vue/runtime-dom" "3.2.37"
+    "@vue/server-renderer" "3.2.37"
+    "@vue/shared" "3.2.37"
+
+warning@^4.0.0:
+  version "4.0.3"
+  resolved "https://registry.npmmirror.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3"
+  integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==
+  dependencies:
+    loose-envify "^1.0.0"
+
+wcwidth@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
+  integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==
+  dependencies:
+    defaults "^1.0.3"
+
+webidl-conversions@^3.0.0:
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
+  integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==
+
+webidl-conversions@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
+  integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==
+
+whatwg-url@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
+  integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==
+  dependencies:
+    tr46 "~0.0.3"
+    webidl-conversions "^3.0.0"
+
+whatwg-url@^7.0.0:
+  version "7.1.0"
+  resolved "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06"
+  integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==
+  dependencies:
+    lodash.sortby "^4.7.0"
+    tr46 "^1.0.1"
+    webidl-conversions "^4.0.2"
+
+which-boxed-primitive@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
+  integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+  dependencies:
+    is-bigint "^1.0.1"
+    is-boolean-object "^1.1.0"
+    is-number-object "^1.0.4"
+    is-string "^1.0.5"
+    is-symbol "^1.0.3"
+
+which-module@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+  integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==
+
+which@^1.2.9, which@^1.3.1:
+  version "1.3.1"
+  resolved "https://registry.npmmirror.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+  integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
+  dependencies:
+    isexe "^2.0.0"
+
+which@^2.0.1:
+  version "2.0.2"
+  resolved "https://registry.npmmirror.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+  integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+  dependencies:
+    isexe "^2.0.0"
+
+windicss@^3.5.6:
+  version "3.5.6"
+  resolved "https://registry.npmmirror.com/windicss/-/windicss-3.5.6.tgz#30a34da76894d952a96c9a1921f2e91e13932183"
+  integrity sha512-P1mzPEjgFMZLX0ZqfFht4fhV/FX8DTG7ERG1fBLiWvd34pTLVReS5CVsewKn9PApSgXnVfPWwvq+qUsRwpnwFA==
+
+wmf@~1.0.1:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz#7d19d621071a08c2bdc6b7e688a9c435298cc2da"
+  integrity sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==
+
+word-wrap@^1.2.3:
+  version "1.2.3"
+  resolved "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
+  integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
+
+word@~0.3.0:
+  version "0.3.0"
+  resolved "https://registry.npmmirror.com/word/-/word-0.3.0.tgz#8542157e4f8e849f4a363a288992d47612db9961"
+  integrity sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==
+
+wordwrap@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+  integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==
+
+workbox-background-sync@6.5.4:
+  version "6.5.4"
+  resolved "https://registry.npmmirror.com/workbox-background-sync/-/workbox-background-sync-6.5.4.tgz#3141afba3cc8aa2ae14c24d0f6811374ba8ff6a9"
+  integrity sha512-0r4INQZMyPky/lj4Ou98qxcThrETucOde+7mRGJl13MPJugQNKeZQOdIJe/1AchOP23cTqHcN/YVpD6r8E6I8g==
+  dependencies:
+    idb "^7.0.1"
+    workbox-core "6.5.4"
+
+workbox-broadcast-update@6.5.4:
+  version "6.5.4"
+  resolved "https://registry.npmmirror.com/workbox-broadcast-update/-/workbox-broadcast-update-6.5.4.tgz#8441cff5417cd41f384ba7633ca960a7ffe40f66"
+  integrity sha512-I/lBERoH1u3zyBosnpPEtcAVe5lwykx9Yg1k6f8/BGEPGaMMgZrwVrqL1uA9QZ1NGGFoyE6t9i7lBjOlDhFEEw==
+  dependencies:
+    workbox-core "6.5.4"
+
+workbox-build@^6.4.2:
+  version "6.5.4"
+  resolved "https://registry.npmmirror.com/workbox-build/-/workbox-build-6.5.4.tgz#7d06d31eb28a878817e1c991c05c5b93409f0389"
+  integrity sha512-kgRevLXEYvUW9WS4XoziYqZ8Q9j/2ziJYEtTrjdz5/L/cTUa2XfyMP2i7c3p34lgqJ03+mTiz13SdFef2POwbA==
+  dependencies:
+    "@apideck/better-ajv-errors" "^0.3.1"
+    "@babel/core" "^7.11.1"
+    "@babel/preset-env" "^7.11.0"
+    "@babel/runtime" "^7.11.2"
+    "@rollup/plugin-babel" "^5.2.0"
+    "@rollup/plugin-node-resolve" "^11.2.1"
+    "@rollup/plugin-replace" "^2.4.1"
+    "@surma/rollup-plugin-off-main-thread" "^2.2.3"
+    ajv "^8.6.0"
+    common-tags "^1.8.0"
+    fast-json-stable-stringify "^2.1.0"
+    fs-extra "^9.0.1"
+    glob "^7.1.6"
+    lodash "^4.17.20"
+    pretty-bytes "^5.3.0"
+    rollup "^2.43.1"
+    rollup-plugin-terser "^7.0.0"
+    source-map "^0.8.0-beta.0"
+    stringify-object "^3.3.0"
+    strip-comments "^2.0.1"
+    tempy "^0.6.0"
+    upath "^1.2.0"
+    workbox-background-sync "6.5.4"
+    workbox-broadcast-update "6.5.4"
+    workbox-cacheable-response "6.5.4"
+    workbox-core "6.5.4"
+    workbox-expiration "6.5.4"
+    workbox-google-analytics "6.5.4"
+    workbox-navigation-preload "6.5.4"
+    workbox-precaching "6.5.4"
+    workbox-range-requests "6.5.4"
+    workbox-recipes "6.5.4"
+    workbox-routing "6.5.4"
+    workbox-strategies "6.5.4"
+    workbox-streams "6.5.4"
+    workbox-sw "6.5.4"
+    workbox-window "6.5.4"
+
+workbox-cacheable-response@6.5.4:
+  version "6.5.4"
+  resolved "https://registry.npmmirror.com/workbox-cacheable-response/-/workbox-cacheable-response-6.5.4.tgz#a5c6ec0c6e2b6f037379198d4ef07d098f7cf137"
+  integrity sha512-DCR9uD0Fqj8oB2TSWQEm1hbFs/85hXXoayVwFKLVuIuxwJaihBsLsp4y7J9bvZbqtPJ1KlCkmYVGQKrBU4KAug==
+  dependencies:
+    workbox-core "6.5.4"
+
+workbox-core@6.5.4:
+  version "6.5.4"
+  resolved "https://registry.npmmirror.com/workbox-core/-/workbox-core-6.5.4.tgz#df48bf44cd58bb1d1726c49b883fb1dffa24c9ba"
+  integrity sha512-OXYb+m9wZm8GrORlV2vBbE5EC1FKu71GGp0H4rjmxmF4/HLbMCoTFws87M3dFwgpmg0v00K++PImpNQ6J5NQ6Q==
+
+workbox-expiration@6.5.4:
+  version "6.5.4"
+  resolved "https://registry.npmmirror.com/workbox-expiration/-/workbox-expiration-6.5.4.tgz#501056f81e87e1d296c76570bb483ce5e29b4539"
+  integrity sha512-jUP5qPOpH1nXtjGGh1fRBa1wJL2QlIb5mGpct3NzepjGG2uFFBn4iiEBiI9GUmfAFR2ApuRhDydjcRmYXddiEQ==
+  dependencies:
+    idb "^7.0.1"
+    workbox-core "6.5.4"
+
+workbox-google-analytics@6.5.4:
+  version "6.5.4"
+  resolved "https://registry.npmmirror.com/workbox-google-analytics/-/workbox-google-analytics-6.5.4.tgz#c74327f80dfa4c1954cbba93cd7ea640fe7ece7d"
+  integrity sha512-8AU1WuaXsD49249Wq0B2zn4a/vvFfHkpcFfqAFHNHwln3jK9QUYmzdkKXGIZl9wyKNP+RRX30vcgcyWMcZ9VAg==
+  dependencies:
+    workbox-background-sync "6.5.4"
+    workbox-core "6.5.4"
+    workbox-routing "6.5.4"
+    workbox-strategies "6.5.4"
+
+workbox-navigation-preload@6.5.4:
+  version "6.5.4"
+  resolved "https://registry.npmmirror.com/workbox-navigation-preload/-/workbox-navigation-preload-6.5.4.tgz#ede56dd5f6fc9e860a7e45b2c1a8f87c1c793212"
+  integrity sha512-IIwf80eO3cr8h6XSQJF+Hxj26rg2RPFVUmJLUlM0+A2GzB4HFbQyKkrgD5y2d84g2IbJzP4B4j5dPBRzamHrng==
+  dependencies:
+    workbox-core "6.5.4"
+
+workbox-precaching@6.5.4:
+  version "6.5.4"
+  resolved "https://registry.npmmirror.com/workbox-precaching/-/workbox-precaching-6.5.4.tgz#740e3561df92c6726ab5f7471e6aac89582cab72"
+  integrity sha512-hSMezMsW6btKnxHB4bFy2Qfwey/8SYdGWvVIKFaUm8vJ4E53JAY+U2JwLTRD8wbLWoP6OVUdFlXsTdKu9yoLTg==
+  dependencies:
+    workbox-core "6.5.4"
+    workbox-routing "6.5.4"
+    workbox-strategies "6.5.4"
+
+workbox-range-requests@6.5.4:
+  version "6.5.4"
+  resolved "https://registry.npmmirror.com/workbox-range-requests/-/workbox-range-requests-6.5.4.tgz#86b3d482e090433dab38d36ae031b2bb0bd74399"
+  integrity sha512-Je2qR1NXCFC8xVJ/Lux6saH6IrQGhMpDrPXWZWWS8n/RD+WZfKa6dSZwU+/QksfEadJEr/NfY+aP/CXFFK5JFg==
+  dependencies:
+    workbox-core "6.5.4"
+
+workbox-recipes@6.5.4:
+  version "6.5.4"
+  resolved "https://registry.npmmirror.com/workbox-recipes/-/workbox-recipes-6.5.4.tgz#cca809ee63b98b158b2702dcfb741b5cc3e24acb"
+  integrity sha512-QZNO8Ez708NNwzLNEXTG4QYSKQ1ochzEtRLGaq+mr2PyoEIC1xFW7MrWxrONUxBFOByksds9Z4//lKAX8tHyUA==
+  dependencies:
+    workbox-cacheable-response "6.5.4"
+    workbox-core "6.5.4"
+    workbox-expiration "6.5.4"
+    workbox-precaching "6.5.4"
+    workbox-routing "6.5.4"
+    workbox-strategies "6.5.4"
+
+workbox-routing@6.5.4:
+  version "6.5.4"
+  resolved "https://registry.npmmirror.com/workbox-routing/-/workbox-routing-6.5.4.tgz#6a7fbbd23f4ac801038d9a0298bc907ee26fe3da"
+  integrity sha512-apQswLsbrrOsBUWtr9Lf80F+P1sHnQdYodRo32SjiByYi36IDyL2r7BH1lJtFX8fwNHDa1QOVY74WKLLS6o5Pg==
+  dependencies:
+    workbox-core "6.5.4"
+
+workbox-strategies@6.5.4:
+  version "6.5.4"
+  resolved "https://registry.npmmirror.com/workbox-strategies/-/workbox-strategies-6.5.4.tgz#4edda035b3c010fc7f6152918370699334cd204d"
+  integrity sha512-DEtsxhx0LIYWkJBTQolRxG4EI0setTJkqR4m7r4YpBdxtWJH1Mbg01Cj8ZjNOO8etqfA3IZaOPHUxCs8cBsKLw==
+  dependencies:
+    workbox-core "6.5.4"
+
+workbox-streams@6.5.4:
+  version "6.5.4"
+  resolved "https://registry.npmmirror.com/workbox-streams/-/workbox-streams-6.5.4.tgz#1cb3c168a6101df7b5269d0353c19e36668d7d69"
+  integrity sha512-FXKVh87d2RFXkliAIheBojBELIPnWbQdyDvsH3t74Cwhg0fDheL1T8BqSM86hZvC0ZESLsznSYWw+Va+KVbUzg==
+  dependencies:
+    workbox-core "6.5.4"
+    workbox-routing "6.5.4"
+
+workbox-sw@6.5.4:
+  version "6.5.4"
+  resolved "https://registry.npmmirror.com/workbox-sw/-/workbox-sw-6.5.4.tgz#d93e9c67924dd153a61367a4656ff4d2ae2ed736"
+  integrity sha512-vo2RQo7DILVRoH5LjGqw3nphavEjK4Qk+FenXeUsknKn14eCNedHOXWbmnvP4ipKhlE35pvJ4yl4YYf6YsJArA==
+
+workbox-window@6.5.4, workbox-window@^6.4.2:
+  version "6.5.4"
+  resolved "https://registry.npmmirror.com/workbox-window/-/workbox-window-6.5.4.tgz#d991bc0a94dff3c2dbb6b84558cff155ca878e91"
+  integrity sha512-HnLZJDwYBE+hpG25AQBO8RUWBJRaCsI9ksQJEp3aCOFCaG5kqaToAYXFRAHxzRluM2cQbGzdQF5rjKPWPA1fug==
+  dependencies:
+    "@types/trusted-types" "^2.0.2"
+    workbox-core "6.5.4"
+
+wrap-ansi@^6.2.0:
+  version "6.2.0"
+  resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
+  integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
+  dependencies:
+    ansi-styles "^4.0.0"
+    string-width "^4.1.0"
+    strip-ansi "^6.0.0"
+
+wrap-ansi@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+  integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+  dependencies:
+    ansi-styles "^4.0.0"
+    string-width "^4.1.0"
+    strip-ansi "^6.0.0"
+
+wrappy@1:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+  integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+
+write-file-atomic@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.npmmirror.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd"
+  integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==
+  dependencies:
+    imurmurhash "^0.1.4"
+    signal-exit "^3.0.7"
+
+xlsx@^0.18.5:
+  version "0.18.5"
+  resolved "https://registry.npmmirror.com/xlsx/-/xlsx-0.18.5.tgz#16711b9113c848076b8a177022799ad356eba7d0"
+  integrity sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==
+  dependencies:
+    adler-32 "~1.3.0"
+    cfb "~1.2.1"
+    codepage "~1.15.0"
+    crc-32 "~1.2.1"
+    ssf "~0.11.2"
+    wmf "~1.0.1"
+    word "~0.3.0"
+
+xtend@^4.0.0, xtend@~4.0.1:
+  version "4.0.2"
+  resolved "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
+  integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+
+y18n@^4.0.0:
+  version "4.0.3"
+  resolved "https://registry.npmmirror.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf"
+  integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==
+
+y18n@^5.0.5:
+  version "5.0.8"
+  resolved "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
+  integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
+
+yallist@^2.1.2:
+  version "2.1.2"
+  resolved "https://registry.npmmirror.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+  integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==
+
+yallist@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+  integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yaml@^1.10.0, yaml@^1.10.2:
+  version "1.10.2"
+  resolved "https://registry.npmmirror.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
+  integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
+
+yargs-parser@^18.1.2:
+  version "18.1.3"
+  resolved "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"
+  integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==
+  dependencies:
+    camelcase "^5.0.0"
+    decamelize "^1.2.0"
+
+yargs-parser@^20.2.2, yargs-parser@^20.2.3:
+  version "20.2.9"
+  resolved "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
+  integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
+
+yargs-parser@^21.0.0:
+  version "21.1.1"
+  resolved "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"
+  integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
+
+yargs@^15.3.1:
+  version "15.4.1"
+  resolved "https://registry.npmmirror.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8"
+  integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==
+  dependencies:
+    cliui "^6.0.0"
+    decamelize "^1.2.0"
+    find-up "^4.1.0"
+    get-caller-file "^2.0.1"
+    require-directory "^2.1.1"
+    require-main-filename "^2.0.0"
+    set-blocking "^2.0.0"
+    string-width "^4.2.0"
+    which-module "^2.0.0"
+    y18n "^4.0.0"
+    yargs-parser "^18.1.2"
+
+yargs@^16.2.0:
+  version "16.2.0"
+  resolved "https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
+  integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
+  dependencies:
+    cliui "^7.0.2"
+    escalade "^3.1.1"
+    get-caller-file "^2.0.5"
+    require-directory "^2.1.1"
+    string-width "^4.2.0"
+    y18n "^5.0.5"
+    yargs-parser "^20.2.2"
+
+yargs@^17.0.0, yargs@^17.5.1:
+  version "17.5.1"
+  resolved "https://registry.npmmirror.com/yargs/-/yargs-17.5.1.tgz#e109900cab6fcb7fd44b1d8249166feb0b36e58e"
+  integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==
+  dependencies:
+    cliui "^7.0.2"
+    escalade "^3.1.1"
+    get-caller-file "^2.0.5"
+    require-directory "^2.1.1"
+    string-width "^4.2.3"
+    y18n "^5.0.5"
+    yargs-parser "^21.0.0"
+
+yauzl@^2.4.2:
+  version "2.10.0"
+  resolved "https://registry.npmmirror.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
+  integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==
+  dependencies:
+    buffer-crc32 "~0.2.3"
+    fd-slicer "~1.1.0"
+
+yn@3.1.1:
+  version "3.1.1"
+  resolved "https://registry.npmmirror.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
+  integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
+
+yocto-queue@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
+  integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
+
+zrender@5.3.2:
+  version "5.3.2"
+  resolved "https://registry.npmmirror.com/zrender/-/zrender-5.3.2.tgz#f67b11d36d3d020d62411d3bb123eb1c93cccd69"
+  integrity sha512-8IiYdfwHj2rx0UeIGZGGU4WEVSDEdeVCaIg/fomejg1Xu6OifAL1GVzIPHg2D+MyUkbNgPWji90t0a8IDk+39w==
+  dependencies:
+    tslib "2.3.0"