瀏覽代碼

Merge branch 'feature_first_pages' of Web/contentCooper into master

jihuaqiang 1 周之前
父節點
當前提交
77cb4be6d7
共有 67 個文件被更改,包括 4560 次插入8205 次删除
  1. 32 0
      .editorconfig
  2. 1 1
      .env.development
  3. 1 1
      .env.production
  4. 23 0
      .eslintrc.cjs
  5. 2 1
      index.html
  6. 0 7301
      package-lock.json
  7. 16 8
      package.json
  8. 7 0
      postcss.config.js
  9. 22 0
      public/logo.svg
  10. 1 1
      src/App.tsx
  11. 二進制
      src/assets/images/login/bg.png
  12. 二進制
      src/assets/images/login/gongan.png
  13. 22 0
      src/assets/images/login/logo.svg
  14. 1 0
      src/assets/images/publishContent/wxCom.svg
  15. 0 0
      src/assets/images/publishContent/wxGzh.svg
  16. 0 0
      src/assets/react.svg
  17. 2 3
      src/components/layout/contentbar.tsx
  18. 36 15
      src/components/layout/headerbar.tsx
  19. 9 16
      src/components/layout/index.tsx
  20. 9 5
      src/components/layout/sidebar.tsx
  21. 39 15
      src/http/api.ts
  22. 6 8
      src/http/index.ts
  23. 45 126
      src/http/sso.ts
  24. 5 1
      src/index.css
  25. 2 3
      src/main.tsx
  26. 1 2
      src/router/index.tsx
  27. 34 3
      src/store/config.ts
  28. 30 0
      src/views/cooperationAccount/cooperationAccount.router.tsx
  29. 257 0
      src/views/cooperationAccount/gzh/index.tsx
  30. 0 79
      src/views/demo/chart/index.tsx
  31. 0 59
      src/views/demo/demo.router.tsx
  32. 0 14
      src/views/demo/form/components/calendar.tsx
  33. 0 40
      src/views/demo/form/form.router.tsx
  34. 0 54
      src/views/demo/form/index.tsx
  35. 0 8
      src/views/demo/index.tsx
  36. 0 88
      src/views/demo/table/index.tsx
  37. 35 13
      src/views/login/login.module.css
  38. 275 200
      src/views/login/login.tsx
  39. 65 0
      src/views/publishContent/publishContent.router.tsx
  40. 151 0
      src/views/publishContent/weCom/components/linkDetailModal/index.tsx
  41. 199 0
      src/views/publishContent/weCom/components/planDetailModal/index.tsx
  42. 27 0
      src/views/publishContent/weCom/components/videoPlayModal/index.tsx
  43. 265 0
      src/views/publishContent/weCom/components/videoSelectModal/index.tsx
  44. 5 0
      src/views/publishContent/weCom/index.module.css
  45. 296 0
      src/views/publishContent/weCom/index.tsx
  46. 29 0
      src/views/publishContent/weCom/type.ts
  47. 48 0
      src/views/publishContent/weGZH/components/PunlishPlanDetailModal/index.tsx
  48. 289 0
      src/views/publishContent/weGZH/components/editTitleCoverModal/index.tsx
  49. 0 0
      src/views/publishContent/weGZH/components/publishPlanModal/index.module.css
  50. 278 0
      src/views/publishContent/weGZH/components/publishPlanModal/index.tsx
  51. 15 0
      src/views/publishContent/weGZH/components/types.ts
  52. 231 0
      src/views/publishContent/weGZH/components/videoSelectModal/index.tsx
  53. 39 0
      src/views/publishContent/weGZH/hooks/useAccountOptions.ts
  54. 76 0
      src/views/publishContent/weGZH/hooks/useGzhPlanList.ts
  55. 33 0
      src/views/publishContent/weGZH/hooks/useVideoCategoryOptions.ts
  56. 9 0
      src/views/publishContent/weGZH/index.module.css
  57. 286 0
      src/views/publishContent/weGZH/index.tsx
  58. 0 12
      src/views/test/index.tsx
  59. 209 0
      src/views/weData/gzh/index.tsx
  60. 275 0
      src/views/weData/qw/index.tsx
  61. 40 0
      src/views/weData/weData.router.tsx
  62. 12 0
      tailwind.config.js
  63. 0 31
      tsconfig.app.json
  64. 1 1
      types/http/index.d.ts
  65. 5 1
      vite.config.ts
  66. 38 0
      vite.test.config.ts
  67. 726 95
      yarn.lock

+ 32 - 0
.editorconfig

@@ -0,0 +1,32 @@
+# EditorConfig is awesome: https://EditorConfig.org
+
+# top-most EditorConfig file
+root = true
+
+# Unix-style newlines with a newline ending every file
+[*]
+end_of_line = lf
+insert_final_newline = true
+charset = utf-8
+indent_style = tab
+indent_size = 2
+
+# TypeScript and JavaScript files
+[*.{ts,tsx,js,jsx}]
+indent_style = tab
+indent_size = 2
+
+# JSON files
+[*.json]
+indent_style = tab
+indent_size = 2
+
+# CSS files
+[*.{css,scss,less}]
+indent_style = tab
+indent_size = 2
+
+# YAML files
+[*.{yml,yaml}]
+indent_style = space
+indent_size = 2

+ 1 - 1
.env.development

@@ -1 +1 @@
-VITE_API_URL = https://testapi.piaoquantv.com
+VITE_API_URL = https://test-tp-open.piaoquantv.com

+ 1 - 1
.env.production

@@ -1 +1 @@
-VITE_API_URL = https://api.piaoquantv.com
+VITE_API_URL = https://tp-open.piaoquantv.com

+ 23 - 0
.eslintrc.cjs

@@ -0,0 +1,23 @@
+module.exports = {
+  root: true,
+  env: { browser: true, es2020: true },
+  extends: [
+    'eslint:recommended',
+    'plugin:@typescript-eslint/recommended',
+    'plugin:react-hooks/recommended',
+  ],
+  ignorePatterns: ['dist', '.eslintrc.cjs'],
+  parser: '@typescript-eslint/parser',
+  plugins: ['react-refresh'],
+  rules: {
+    indent: 0,
+    quotes: 0,
+    semi: 0,
+    'no-case-declarations': 'off',
+    "@typescript-eslint/no-explicit-any": "off",
+    'react-refresh/only-export-components': [
+      'warn',
+      { allowConstantExport: true },
+    ],
+  },
+}

+ 2 - 1
index.html

@@ -2,8 +2,9 @@
 <html lang="en">
   <head>
     <meta charset="UTF-8" />
-    <link rel="icon" type="image/svg+xml" href="/vite.svg" />
+    <link rel="icon" type="image/svg+xml" href="/logo.svg" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+		<meta name="referrer" content="no-referrer" />
     <title>票圈对外内容平台</title>
   </head>
   <body>

+ 0 - 7301
package-lock.json

@@ -1,7301 +0,0 @@
-{
-  "name": "react-admin-dashboard",
-  "version": "0.0.0",
-  "lockfileVersion": 3,
-  "requires": true,
-  "packages": {
-    "": {
-      "name": "react-admin-dashboard",
-      "version": "0.0.0",
-      "dependencies": {
-        "@ant-design/charts": "^2.2.3",
-        "antd": "^5.18.3",
-        "axios": "^1.8.4",
-        "lodash-es": "^4.17.21",
-        "react": "^18.3.1",
-        "react-dom": "^18.3.1",
-        "react-router-dom": "^6.23.1",
-        "zustand": "^4.5.2"
-      },
-      "devDependencies": {
-        "@types/lodash-es": "^4.17.12",
-        "@types/node": "^22.14.0",
-        "@types/react": "^18.3.3",
-        "@types/react-dom": "^18.3.0",
-        "@typescript-eslint/eslint-plugin": "^7.13.1",
-        "@typescript-eslint/parser": "^7.13.1",
-        "@vitejs/plugin-react-swc": "^3.5.0",
-        "eslint": "^8.57.0",
-        "eslint-plugin-react-hooks": "^4.6.2",
-        "eslint-plugin-react-refresh": "^0.4.7",
-        "typescript": "^5.2.2",
-        "vite": "^5.3.1"
-      }
-    },
-    "node_modules/@ant-design/charts": {
-      "version": "2.2.3",
-      "resolved": "https://registry.npmjs.org/@ant-design/charts/-/charts-2.2.3.tgz",
-      "integrity": "sha512-gjyOJwAvRH3NztbR4R7bQ+wVfA/jRT+EgtSEQxQtjka4w0srMIftXgaoxoycgCEHgO1eUg20RWXx0mMFKyWIfg==",
-      "dependencies": {
-        "@ant-design/graphs": "^2.0.0",
-        "@ant-design/plots": "^2.1.3",
-        "lodash": "^4.17.21"
-      },
-      "peerDependencies": {
-        "react": ">=16.8.4",
-        "react-dom": ">=16.8.4"
-      }
-    },
-    "node_modules/@ant-design/charts-util": {
-      "version": "0.0.1-alpha.7",
-      "resolved": "https://registry.npmjs.org/@ant-design/charts-util/-/charts-util-0.0.1-alpha.7.tgz",
-      "integrity": "sha512-Yh0o6EdO6SvdSnStFZMbnUzjyymkVzV+TQ9ymVW9hlVgO/fUkUII3JYSdV+UVcFnYwUF0YiDKuSTLCZNAzg2bQ==",
-      "dependencies": {
-        "lodash": "^4.17.21"
-      },
-      "peerDependencies": {
-        "react": ">=16.8.4",
-        "react-dom": ">=16.8.4"
-      }
-    },
-    "node_modules/@ant-design/colors": {
-      "version": "7.0.2",
-      "resolved": "https://registry.npmmirror.com/@ant-design/colors/-/colors-7.0.2.tgz",
-      "integrity": "sha512-7KJkhTiPiLHSu+LmMJnehfJ6242OCxSlR3xHVBecYxnMW8MS/878NXct1GqYARyL59fyeFdKRxXTfvR9SnDgJg==",
-      "dependencies": {
-        "@ctrl/tinycolor": "^3.6.1"
-      }
-    },
-    "node_modules/@ant-design/cssinjs": {
-      "version": "1.21.0",
-      "resolved": "https://registry.npmmirror.com/@ant-design/cssinjs/-/cssinjs-1.21.0.tgz",
-      "integrity": "sha512-gIilraPl+9EoKdYxnupxjHB/Q6IHNRjEXszKbDxZdsgv4sAZ9pjkCq8yanDWNvyfjp4leir2OVAJm0vxwKK8YA==",
-      "dependencies": {
-        "@babel/runtime": "^7.11.1",
-        "@emotion/hash": "^0.8.0",
-        "@emotion/unitless": "^0.7.5",
-        "classnames": "^2.3.1",
-        "csstype": "^3.1.3",
-        "rc-util": "^5.35.0",
-        "stylis": "^4.0.13"
-      },
-      "peerDependencies": {
-        "react": ">=16.0.0",
-        "react-dom": ">=16.0.0"
-      }
-    },
-    "node_modules/@ant-design/graphs": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/@ant-design/graphs/-/graphs-2.0.1.tgz",
-      "integrity": "sha512-8ixmTvuw0y9tYiloQzhYkY/pdBgPisCF/8YpC2I/d4gXNetiZ4IRCvp3DkJKDqfYCZ9DymgOjMNuTEjvFVa/iA==",
-      "dependencies": {
-        "@ant-design/charts-util": "0.0.1-alpha.7",
-        "@antv/g6": "^5.0.30",
-        "@antv/g6-extension-react": "^0.1.7",
-        "@antv/graphin": "^3.0.4",
-        "lodash": "^4.17.21",
-        "react": "^18.3.1",
-        "react-dom": "^18.3.1",
-        "styled-components": "^6.1.13"
-      },
-      "peerDependencies": {
-        "react": ">=16.8.4",
-        "react-dom": ">=16.8.4"
-      }
-    },
-    "node_modules/@ant-design/icons": {
-      "version": "5.3.7",
-      "resolved": "https://registry.npmmirror.com/@ant-design/icons/-/icons-5.3.7.tgz",
-      "integrity": "sha512-bCPXTAg66f5bdccM4TT21SQBDO1Ek2gho9h3nO9DAKXJP4sq+5VBjrQMSxMVXSB3HyEz+cUbHQ5+6ogxCOpaew==",
-      "dependencies": {
-        "@ant-design/colors": "^7.0.0",
-        "@ant-design/icons-svg": "^4.4.0",
-        "@babel/runtime": "^7.11.2",
-        "classnames": "^2.2.6",
-        "rc-util": "^5.31.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "peerDependencies": {
-        "react": ">=16.0.0",
-        "react-dom": ">=16.0.0"
-      }
-    },
-    "node_modules/@ant-design/icons-svg": {
-      "version": "4.4.2",
-      "resolved": "https://registry.npmmirror.com/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz",
-      "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA=="
-    },
-    "node_modules/@ant-design/plots": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/@ant-design/plots/-/plots-2.3.2.tgz",
-      "integrity": "sha512-shFV2DTQcbQDtzBwpMagG2pnKy3+I4igws6VQvM7m8UIZtWFSwkWpjCnOl7Xefqgnov/M0C9HbaVGCGc9ZfIqA==",
-      "dependencies": {
-        "@ant-design/charts-util": "0.0.1-alpha.6",
-        "@antv/event-emitter": "^0.1.3",
-        "@antv/g": "^6.0.0",
-        "@antv/g2": "^5.1.18",
-        "@antv/g2-extension-plot": "^0.2.0",
-        "lodash": "^4.17.21"
-      },
-      "peerDependencies": {
-        "react": ">=16.8.4",
-        "react-dom": ">=16.8.4"
-      }
-    },
-    "node_modules/@ant-design/plots/node_modules/@ant-design/charts-util": {
-      "version": "0.0.1-alpha.6",
-      "resolved": "https://registry.npmjs.org/@ant-design/charts-util/-/charts-util-0.0.1-alpha.6.tgz",
-      "integrity": "sha512-roZobGkUJ0WqULPiQkX/2j01r6Cn0W6WTVpszq9u8dZKwyrSDr+UgfA/hDmrwOm9TWD9HAxe7aRHnvC06dux8w==",
-      "peerDependencies": {
-        "react": ">=16.8.4",
-        "react-dom": ">=16.8.4"
-      }
-    },
-    "node_modules/@ant-design/react-slick": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmmirror.com/@ant-design/react-slick/-/react-slick-1.1.2.tgz",
-      "integrity": "sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==",
-      "dependencies": {
-        "@babel/runtime": "^7.10.4",
-        "classnames": "^2.2.5",
-        "json2mq": "^0.2.0",
-        "resize-observer-polyfill": "^1.5.1",
-        "throttle-debounce": "^5.0.0"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0"
-      }
-    },
-    "node_modules/@antv/algorithm": {
-      "version": "0.1.26",
-      "resolved": "https://registry.npmjs.org/@antv/algorithm/-/algorithm-0.1.26.tgz",
-      "integrity": "sha512-DVhcFSQ8YQnMNW34Mk8BSsfc61iC1sAnmcfYoXTAshYHuU50p/6b7x3QYaGctDNKWGvi1ub7mPcSY0bK+aN0qg==",
-      "dependencies": {
-        "@antv/util": "^2.0.13",
-        "tslib": "^2.0.0"
-      }
-    },
-    "node_modules/@antv/algorithm/node_modules/@antv/util": {
-      "version": "2.0.17",
-      "resolved": "https://registry.npmjs.org/@antv/util/-/util-2.0.17.tgz",
-      "integrity": "sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q==",
-      "dependencies": {
-        "csstype": "^3.0.8",
-        "tslib": "^2.0.3"
-      }
-    },
-    "node_modules/@antv/component": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/@antv/component/-/component-2.1.1.tgz",
-      "integrity": "sha512-V0UCq3Bekqtjw5WedexT1tHM/9x5BY0UAaU7G/5A2NhRfp9GuaQ8xGWLMSWlCQiJSRZWhPIA7RoOSw4Y/W+7UA==",
-      "dependencies": {
-        "@antv/g": "^6.1.2",
-        "@antv/scale": "^0.4.3",
-        "@antv/util": "^3.3.5",
-        "svg-path-parser": "^1.1.0"
-      }
-    },
-    "node_modules/@antv/coord": {
-      "version": "0.4.7",
-      "resolved": "https://registry.npmjs.org/@antv/coord/-/coord-0.4.7.tgz",
-      "integrity": "sha512-UTbrMLhwJUkKzqJx5KFnSRpU3BqrdLORJbwUbHK2zHSCT3q3bjcFA//ZYLVfIlwqFDXp/hzfMyRtp0c77A9ZVA==",
-      "dependencies": {
-        "@antv/scale": "^0.4.12",
-        "@antv/util": "^2.0.13",
-        "gl-matrix": "^3.4.3"
-      }
-    },
-    "node_modules/@antv/coord/node_modules/@antv/util": {
-      "version": "2.0.17",
-      "resolved": "https://registry.npmjs.org/@antv/util/-/util-2.0.17.tgz",
-      "integrity": "sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q==",
-      "dependencies": {
-        "csstype": "^3.0.8",
-        "tslib": "^2.0.3"
-      }
-    },
-    "node_modules/@antv/event-emitter": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/@antv/event-emitter/-/event-emitter-0.1.3.tgz",
-      "integrity": "sha512-4ddpsiHN9Pd4UIlWuKVK1C4IiZIdbwQvy9i7DUSI3xNJ89FPUFt8lxDYj8GzzfdllV0NkJTRxnG+FvLk0llidg=="
-    },
-    "node_modules/@antv/g": {
-      "version": "6.1.9",
-      "resolved": "https://registry.npmjs.org/@antv/g/-/g-6.1.9.tgz",
-      "integrity": "sha512-JwZkjU6t8Q8X43TetRFxmEAyH51COHx3mHUJppmMDmXOtHdSD0nzMyZb9i8UvRPVLzhQOht818cGy3Fu6IHt0Q==",
-      "dependencies": {
-        "@antv/g-camera-api": "2.0.23",
-        "@antv/g-dom-mutation-observer-api": "2.0.20",
-        "@antv/g-lite": "2.2.4",
-        "@antv/g-web-animations-api": "2.1.9",
-        "@babel/runtime": "^7.25.6"
-      }
-    },
-    "node_modules/@antv/g-camera-api": {
-      "version": "2.0.23",
-      "resolved": "https://registry.npmjs.org/@antv/g-camera-api/-/g-camera-api-2.0.23.tgz",
-      "integrity": "sha512-tDoABx5HF+xAYsgWCFsVOj7qaC+XXM6l38ne2dxGuox9PGjzjAel1yMbWa0t97a4S1YWtnvgg4OpH+9HPTm2iQ==",
-      "dependencies": {
-        "@antv/g-lite": "2.2.4",
-        "@antv/util": "^3.3.5",
-        "@babel/runtime": "^7.25.6",
-        "gl-matrix": "^3.4.3",
-        "tslib": "^2.5.3"
-      }
-    },
-    "node_modules/@antv/g-canvas": {
-      "version": "2.0.27",
-      "resolved": "https://registry.npmjs.org/@antv/g-canvas/-/g-canvas-2.0.27.tgz",
-      "integrity": "sha512-3qqI6pfjfhZrcNqK9LARFuaxEJLO4b9LgL6gr1Wx8ByX9fNWXHxiXD4gRB2zv+RzVqq9n7PaYCtRlypODvl/oA==",
-      "dependencies": {
-        "@antv/g-lite": "2.2.4",
-        "@antv/g-plugin-canvas-path-generator": "2.1.4",
-        "@antv/g-plugin-canvas-picker": "2.1.6",
-        "@antv/g-plugin-canvas-renderer": "2.2.6",
-        "@antv/g-plugin-dom-interaction": "2.1.9",
-        "@antv/g-plugin-html-renderer": "2.1.9",
-        "@antv/g-plugin-image-loader": "2.1.6",
-        "@antv/util": "^3.3.5",
-        "@babel/runtime": "^7.25.6",
-        "tslib": "^2.5.3"
-      }
-    },
-    "node_modules/@antv/g-dom-mutation-observer-api": {
-      "version": "2.0.20",
-      "resolved": "https://registry.npmjs.org/@antv/g-dom-mutation-observer-api/-/g-dom-mutation-observer-api-2.0.20.tgz",
-      "integrity": "sha512-/KntumSsYt5LFrtRBcFB4AJrskWgp0iGPVZKkKmFCp38qufaxxDijiqewJRe1I1YHUeRQclP5DpLttv3o5woZQ==",
-      "dependencies": {
-        "@antv/g-lite": "2.2.4",
-        "@babel/runtime": "^7.25.6"
-      }
-    },
-    "node_modules/@antv/g-lite": {
-      "version": "2.2.4",
-      "resolved": "https://registry.npmjs.org/@antv/g-lite/-/g-lite-2.2.4.tgz",
-      "integrity": "sha512-61gfrqqErnmoRR2wtbHAAxx38U9VEFz2goYloNFQ3XDYJQJUAf3UCSBZ0kpsSKRSoWEMiY7n8m70nO6F/Q9kBg==",
-      "dependencies": {
-        "@antv/g-math": "3.0.0",
-        "@antv/util": "^3.3.5",
-        "@babel/runtime": "^7.25.6",
-        "d3-color": "^3.1.0",
-        "eventemitter3": "^5.0.1",
-        "gl-matrix": "^3.4.3",
-        "rbush": "^3.0.1",
-        "tslib": "^2.5.3"
-      }
-    },
-    "node_modules/@antv/g-math": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@antv/g-math/-/g-math-3.0.0.tgz",
-      "integrity": "sha512-AkmiNIEL1vgqTPeGY2wtsMdBBqKFwF7SKSgs+D1iOS/rqYMsXdhp/HvtuQ5tx/HdawE/ZzTiicIYopc520ADZw==",
-      "dependencies": {
-        "@antv/util": "^3.3.5",
-        "gl-matrix": "^3.4.3",
-        "tslib": "^2.5.3"
-      }
-    },
-    "node_modules/@antv/g-plugin-canvas-path-generator": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/@antv/g-plugin-canvas-path-generator/-/g-plugin-canvas-path-generator-2.1.4.tgz",
-      "integrity": "sha512-bSNKEAGoUyo+zps7RpD/9f66HNkXIW9QgjYit68n8APmlq7Du0xKE++ryR7DH8WQNUyx75DedwMNcXxemcV8NQ==",
-      "dependencies": {
-        "@antv/g-lite": "2.2.4",
-        "@antv/g-math": "3.0.0",
-        "@antv/util": "^3.3.5",
-        "@babel/runtime": "^7.25.6",
-        "tslib": "^2.5.3"
-      }
-    },
-    "node_modules/@antv/g-plugin-canvas-picker": {
-      "version": "2.1.6",
-      "resolved": "https://registry.npmjs.org/@antv/g-plugin-canvas-picker/-/g-plugin-canvas-picker-2.1.6.tgz",
-      "integrity": "sha512-3sXowCAnwU6eeN1KUMN4CCeuEy/vFWaQRVFXPGl8HDxCJkh9wua2K8J89tU4EuQx5CIIzfGYz/WFBHGQ+Ly8ug==",
-      "dependencies": {
-        "@antv/g-lite": "2.2.4",
-        "@antv/g-math": "3.0.0",
-        "@antv/g-plugin-canvas-path-generator": "2.1.4",
-        "@antv/g-plugin-canvas-renderer": "2.2.6",
-        "@antv/util": "^3.3.5",
-        "@babel/runtime": "^7.25.6",
-        "gl-matrix": "^3.4.3",
-        "tslib": "^2.5.3"
-      }
-    },
-    "node_modules/@antv/g-plugin-canvas-renderer": {
-      "version": "2.2.6",
-      "resolved": "https://registry.npmjs.org/@antv/g-plugin-canvas-renderer/-/g-plugin-canvas-renderer-2.2.6.tgz",
-      "integrity": "sha512-da0MakWZkUMqaDs1UR3MOtVfkUq3z2LWMeQkfdCQOO9WxTxxj75A+edPGT19hZ3YJIBujur7ZtbN6N0W1HZ34w==",
-      "dependencies": {
-        "@antv/g-lite": "2.2.4",
-        "@antv/g-math": "3.0.0",
-        "@antv/g-plugin-canvas-path-generator": "2.1.4",
-        "@antv/g-plugin-image-loader": "2.1.6",
-        "@antv/util": "^3.3.5",
-        "@babel/runtime": "^7.25.6",
-        "gl-matrix": "^3.4.3",
-        "tslib": "^2.5.3"
-      }
-    },
-    "node_modules/@antv/g-plugin-dom-interaction": {
-      "version": "2.1.9",
-      "resolved": "https://registry.npmjs.org/@antv/g-plugin-dom-interaction/-/g-plugin-dom-interaction-2.1.9.tgz",
-      "integrity": "sha512-84FqlejIJqH3yTivBLeQHEywtjNqeuLNvI5RAgg3xEPc93qUR4UWtB6ks6ETuJDwRyf5UZheFCy3E+JfmlEbLA==",
-      "dependencies": {
-        "@antv/g-lite": "2.2.4",
-        "@babel/runtime": "^7.25.6",
-        "tslib": "^2.5.3"
-      }
-    },
-    "node_modules/@antv/g-plugin-dragndrop": {
-      "version": "2.0.20",
-      "resolved": "https://registry.npmjs.org/@antv/g-plugin-dragndrop/-/g-plugin-dragndrop-2.0.20.tgz",
-      "integrity": "sha512-q74KLu5kh7YYW3oEcx6ZNSi5cmo4g+88MuVSKCWXrbzxYhFMRTBsT787Fkf2l6av9PTxdBgD9Ot30N5IyqgGtQ==",
-      "dependencies": {
-        "@antv/g-lite": "2.2.4",
-        "@antv/util": "^3.3.5",
-        "@babel/runtime": "^7.25.6",
-        "tslib": "^2.5.3"
-      }
-    },
-    "node_modules/@antv/g-plugin-html-renderer": {
-      "version": "2.1.9",
-      "resolved": "https://registry.npmjs.org/@antv/g-plugin-html-renderer/-/g-plugin-html-renderer-2.1.9.tgz",
-      "integrity": "sha512-OzTaswRchzNBdtxf9rByE7XS5m/xoohrDrn/nw+Q0X9JIdkEJCPfC2CecLsmreF1XuN58VUiKd0pXzdxmphigA==",
-      "dependencies": {
-        "@antv/g-lite": "2.2.4",
-        "@antv/util": "^3.3.5",
-        "@babel/runtime": "^7.25.6",
-        "gl-matrix": "^3.4.3",
-        "tslib": "^2.5.3"
-      }
-    },
-    "node_modules/@antv/g-plugin-image-loader": {
-      "version": "2.1.6",
-      "resolved": "https://registry.npmjs.org/@antv/g-plugin-image-loader/-/g-plugin-image-loader-2.1.6.tgz",
-      "integrity": "sha512-MkOjC/o4frh4Vx2WG2QUslMP+z7l19JyFXy4tf2sgYjADb1fwED/UQ/lxvtDiApEb5yR11yrG0JCtT+lhMgEqA==",
-      "dependencies": {
-        "@antv/g-lite": "2.2.4",
-        "@antv/util": "^3.3.5",
-        "@babel/runtime": "^7.25.6",
-        "gl-matrix": "^3.4.3",
-        "tslib": "^2.5.3"
-      }
-    },
-    "node_modules/@antv/g-plugin-svg-picker": {
-      "version": "2.0.22",
-      "resolved": "https://registry.npmjs.org/@antv/g-plugin-svg-picker/-/g-plugin-svg-picker-2.0.22.tgz",
-      "integrity": "sha512-X/xmF4p3jKs2RAlA5e9IT1f5MsxFVEfpGiEJ8XAATlN+3sQDcJj/e4Wmei9HAzbRedJWinlUb1nSjqByw8YCmQ==",
-      "dependencies": {
-        "@antv/g-lite": "2.2.4",
-        "@antv/g-plugin-svg-renderer": "2.2.4",
-        "@babel/runtime": "^7.25.6",
-        "tslib": "^2.5.3"
-      }
-    },
-    "node_modules/@antv/g-plugin-svg-renderer": {
-      "version": "2.2.4",
-      "resolved": "https://registry.npmjs.org/@antv/g-plugin-svg-renderer/-/g-plugin-svg-renderer-2.2.4.tgz",
-      "integrity": "sha512-yNWoaLZxrKuPi/LWXQNanHsyPshyXfQnMWPkTsO62MugJJK6/TrLKx0UT/vGIG9fgngdUvp1dl5I60FQ2xMMAw==",
-      "dependencies": {
-        "@antv/g-lite": "2.2.4",
-        "@antv/util": "^3.3.5",
-        "@babel/runtime": "^7.25.6",
-        "gl-matrix": "^3.4.3",
-        "tslib": "^2.5.3"
-      }
-    },
-    "node_modules/@antv/g-svg": {
-      "version": "2.0.22",
-      "resolved": "https://registry.npmjs.org/@antv/g-svg/-/g-svg-2.0.22.tgz",
-      "integrity": "sha512-93zSWx//orrU1iSAkTTnH47kSst6wKqv4ZjyydFDAnQPawwwBIsJoH9IyddX3D94mMeaO+5KDhuHHCSSaHa/IA==",
-      "dependencies": {
-        "@antv/g-lite": "2.2.4",
-        "@antv/g-plugin-dom-interaction": "2.1.9",
-        "@antv/g-plugin-svg-picker": "2.0.22",
-        "@antv/g-plugin-svg-renderer": "2.2.4",
-        "@antv/util": "^3.3.5",
-        "@babel/runtime": "^7.25.6",
-        "tslib": "^2.5.3"
-      }
-    },
-    "node_modules/@antv/g-web-animations-api": {
-      "version": "2.1.9",
-      "resolved": "https://registry.npmjs.org/@antv/g-web-animations-api/-/g-web-animations-api-2.1.9.tgz",
-      "integrity": "sha512-Lz9J0g4AQZNwmeflg+PPzdDhWrmyZlNJ3rHVHH8rQuzYdxFw+pOoamgbm+ImpmS5pBJFp2xtdbQtSDP12XTe2w==",
-      "dependencies": {
-        "@antv/g-lite": "2.2.4",
-        "@antv/util": "^3.3.5",
-        "@babel/runtime": "^7.25.6",
-        "tslib": "^2.5.3"
-      }
-    },
-    "node_modules/@antv/g2": {
-      "version": "5.2.7",
-      "resolved": "https://registry.npmjs.org/@antv/g2/-/g2-5.2.7.tgz",
-      "integrity": "sha512-bOU7ZJfa735KCqIsWWwlFtn3pc8TwJIckBhy7X8PFcxTuMIXzgqOt7vbMMdF4psBHMyIIOCDAo8zf9rGhgjEzA==",
-      "dependencies": {
-        "@antv/component": "^2.0.0",
-        "@antv/coord": "^0.4.6",
-        "@antv/event-emitter": "^0.1.3",
-        "@antv/g": "^6.0.0",
-        "@antv/g-canvas": "^2.0.0",
-        "@antv/g-plugin-dragndrop": "^2.0.0",
-        "@antv/scale": "^0.4.12",
-        "@antv/util": "^3.3.5",
-        "d3-array": "^3.2.4",
-        "d3-dsv": "^3.0.1",
-        "d3-force": "^3.0.0",
-        "d3-format": "^3.1.0",
-        "d3-geo": "^3.1.0",
-        "d3-hierarchy": "^3.1.2",
-        "d3-path": "^3.1.0",
-        "d3-scale-chromatic": "^3.0.0",
-        "d3-shape": "^3.2.0",
-        "flru": "^1.0.2",
-        "fmin": "^0.0.2",
-        "pdfast": "^0.2.0"
-      }
-    },
-    "node_modules/@antv/g2-extension-plot": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/@antv/g2-extension-plot/-/g2-extension-plot-0.2.1.tgz",
-      "integrity": "sha512-WNv/LIUNJLwlfG8XXmKUbje9PbImtJqh36UDvuOk/uu+kmP/uMyHAXsBuu0yCOWdQgBVTVwoxszxJOCnY4mVfg==",
-      "dependencies": {
-        "@antv/g2": "^5.1.8",
-        "@antv/util": "^3.3.5",
-        "d3-array": "^3.2.4",
-        "d3-hierarchy": "^3.1.2"
-      }
-    },
-    "node_modules/@antv/g6": {
-      "version": "5.0.32",
-      "resolved": "https://registry.npmjs.org/@antv/g6/-/g6-5.0.32.tgz",
-      "integrity": "sha512-9CgqhPBlVhvnHlmxeYyRsssdiU8FdrfYMrRpf0KNqa9qfF9yM+fsmEwMbcn8uWpKPRmUmcMA2mZTTL+N27A+Nw==",
-      "dependencies": {
-        "@antv/algorithm": "^0.1.26",
-        "@antv/component": "^2.1.1",
-        "@antv/event-emitter": "^0.1.3",
-        "@antv/g": "^6.1.7",
-        "@antv/g-canvas": "^2.0.24",
-        "@antv/g-plugin-dragndrop": "^2.0.18",
-        "@antv/graphlib": "^2.0.3",
-        "@antv/hierarchy": "^0.6.14",
-        "@antv/layout": "1.2.14-beta.9",
-        "@antv/util": "^3.3.10",
-        "bubblesets-js": "^2.3.4",
-        "hull.js": "^1.0.6"
-      }
-    },
-    "node_modules/@antv/g6-extension-react": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/@antv/g6-extension-react/-/g6-extension-react-0.1.7.tgz",
-      "integrity": "sha512-fKk1weq2odHSTi5i8iSg9/keDPbufryA2TZ2X2j+qkSAwxJ7WtURagV/7/CUN9r1tMMk1eoiuzQZXdvc72a1GA==",
-      "dependencies": {
-        "@antv/g": "^6.0.13",
-        "@antv/g-svg": "^2.0.11",
-        "@antv/react-g": "^2.0.14"
-      },
-      "peerDependencies": {
-        "@antv/g6": "^5.0.22",
-        "react": ">=16.8",
-        "react-dom": ">=16.8"
-      }
-    },
-    "node_modules/@antv/g6-extension-react/node_modules/@antv/react-g": {
-      "version": "2.0.25",
-      "resolved": "https://registry.npmjs.org/@antv/react-g/-/react-g-2.0.25.tgz",
-      "integrity": "sha512-O4Z8Ub2LDHMKBc8rNHIU2LwrAVrupEPG7/VqAn4NPepfpgQ827BQLkOkeUr8Nu/t9JVFJopaQv2BL6zDBSxZ6A==",
-      "dependencies": {
-        "@antv/g": "6.1.9",
-        "@antv/util": "^3.3.5",
-        "@babel/runtime": "^7.25.6",
-        "gl-matrix": "^3.4.3",
-        "react-reconciler": "^0.26.2",
-        "scheduler": "^0.20.2",
-        "tslib": "^2.5.3"
-      },
-      "peerDependencies": {
-        "react": "^16.13.1"
-      }
-    },
-    "node_modules/@antv/g6-extension-react/node_modules/@antv/react-g/node_modules/react-reconciler": {
-      "version": "0.26.2",
-      "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.26.2.tgz",
-      "integrity": "sha512-nK6kgY28HwrMNwDnMui3dvm3rCFjZrcGiuwLc5COUipBK5hWHLOxMJhSnSomirqWwjPBJKV1QcbkI0VJr7Gl1Q==",
-      "dependencies": {
-        "loose-envify": "^1.1.0",
-        "object-assign": "^4.1.1",
-        "scheduler": "^0.20.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      },
-      "peerDependencies": {
-        "react": "^17.0.2"
-      }
-    },
-    "node_modules/@antv/g6-extension-react/node_modules/scheduler": {
-      "version": "0.20.2",
-      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz",
-      "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==",
-      "dependencies": {
-        "loose-envify": "^1.1.0",
-        "object-assign": "^4.1.1"
-      }
-    },
-    "node_modules/@antv/graphin": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@antv/graphin/-/graphin-3.0.4.tgz",
-      "integrity": "sha512-7ce6RDI5Z6ud93yiyS7b+mmFrHJhlkwwNo53kb7P7KoCsnV7ioMONDE6Gw0ROeMSR6TwHtxGZUhHw9wxnPp82Q==",
-      "dependencies": {
-        "@antv/g6": "^5.0.28"
-      },
-      "peerDependencies": {
-        "react": "^18.0.0",
-        "react-dom": "^18.0.0"
-      }
-    },
-    "node_modules/@antv/graphlib": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/@antv/graphlib/-/graphlib-2.0.3.tgz",
-      "integrity": "sha512-EtQR+DIfsYy28tumTnH560v7yIzXZq0nSgFBZh76mMiV1oHEN1L4p6JKu7IMtILH14mDqzmYYYFetYoAODoQUw==",
-      "dependencies": {
-        "@antv/event-emitter": "^0.1.3"
-      }
-    },
-    "node_modules/@antv/hierarchy": {
-      "version": "0.6.14",
-      "resolved": "https://registry.npmjs.org/@antv/hierarchy/-/hierarchy-0.6.14.tgz",
-      "integrity": "sha512-V3uknf7bhynOqQDw2sg+9r9DwZ9pc6k/EcqyTFdfXB1+ydr7urisP0MipIuimucvQKN+Qkd+d6w601r1UIroqQ=="
-    },
-    "node_modules/@antv/layout": {
-      "version": "1.2.14-beta.9",
-      "resolved": "https://registry.npmjs.org/@antv/layout/-/layout-1.2.14-beta.9.tgz",
-      "integrity": "sha512-wPlwBFMtq2lWZFc89/7Lzb8fjHnyKVZZ9zBb2h+zZIP0YWmVmHRE8+dqCiPKOyOGUXEdDtn813f1g107dCHZlg==",
-      "dependencies": {
-        "@antv/event-emitter": "^0.1.3",
-        "@antv/graphlib": "^2.0.0",
-        "@antv/util": "^3.3.2",
-        "@naoak/workerize-transferable": "^0.1.0",
-        "comlink": "^4.4.1",
-        "d3-force": "^3.0.0",
-        "d3-force-3d": "^3.0.5",
-        "d3-octree": "^1.0.2",
-        "d3-quadtree": "^3.0.1",
-        "dagre": "^0.8.5",
-        "ml-matrix": "^6.10.4",
-        "tslib": "^2.5.0"
-      }
-    },
-    "node_modules/@antv/scale": {
-      "version": "0.4.16",
-      "resolved": "https://registry.npmjs.org/@antv/scale/-/scale-0.4.16.tgz",
-      "integrity": "sha512-5wg/zB5kXHxpTV5OYwJD3ja6R8yTiqIOkjOhmpEJiowkzRlbEC/BOyMvNUq5fqFIHnMCE9woO7+c3zxEQCKPjw==",
-      "dependencies": {
-        "@antv/util": "^3.3.7",
-        "color-string": "^1.5.5",
-        "fecha": "^4.2.1"
-      }
-    },
-    "node_modules/@antv/util": {
-      "version": "3.3.10",
-      "resolved": "https://registry.npmjs.org/@antv/util/-/util-3.3.10.tgz",
-      "integrity": "sha512-basGML3DFA3O87INnzvDStjzS+n0JLEhRnRsDzP9keiXz8gT1z/fTdmJAZFOzMMWxy+HKbi7NbSt0+8vz/OsBQ==",
-      "dependencies": {
-        "fast-deep-equal": "^3.1.3",
-        "gl-matrix": "^3.3.0",
-        "tslib": "^2.3.1"
-      }
-    },
-    "node_modules/@babel/runtime": {
-      "version": "7.26.0",
-      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz",
-      "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==",
-      "dependencies": {
-        "regenerator-runtime": "^0.14.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@ctrl/tinycolor": {
-      "version": "3.6.1",
-      "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz",
-      "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==",
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@emotion/hash": {
-      "version": "0.8.0",
-      "resolved": "https://registry.npmmirror.com/@emotion/hash/-/hash-0.8.0.tgz",
-      "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow=="
-    },
-    "node_modules/@emotion/is-prop-valid": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz",
-      "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==",
-      "dependencies": {
-        "@emotion/memoize": "^0.8.1"
-      }
-    },
-    "node_modules/@emotion/memoize": {
-      "version": "0.8.1",
-      "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz",
-      "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA=="
-    },
-    "node_modules/@emotion/unitless": {
-      "version": "0.7.5",
-      "resolved": "https://registry.npmmirror.com/@emotion/unitless/-/unitless-0.7.5.tgz",
-      "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg=="
-    },
-    "node_modules/@esbuild/aix-ppc64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
-      "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
-      "cpu": [
-        "ppc64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "aix"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/android-arm": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
-      "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/android-arm64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
-      "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/android-x64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
-      "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/darwin-arm64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
-      "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/darwin-x64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
-      "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/freebsd-arm64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
-      "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/freebsd-x64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
-      "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/linux-arm": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
-      "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/linux-arm64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
-      "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/linux-ia32": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
-      "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
-      "cpu": [
-        "ia32"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/linux-loong64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
-      "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
-      "cpu": [
-        "loong64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/linux-mips64el": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
-      "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
-      "cpu": [
-        "mips64el"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/linux-ppc64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
-      "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
-      "cpu": [
-        "ppc64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/linux-riscv64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
-      "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
-      "cpu": [
-        "riscv64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/linux-s390x": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
-      "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
-      "cpu": [
-        "s390x"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/linux-x64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
-      "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/netbsd-x64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
-      "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "netbsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/openbsd-x64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
-      "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "openbsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/sunos-x64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
-      "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "sunos"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/win32-arm64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
-      "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/win32-ia32": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
-      "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
-      "cpu": [
-        "ia32"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/win32-x64": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
-      "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@eslint-community/eslint-utils": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
-      "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
-      "dev": true,
-      "dependencies": {
-        "eslint-visitor-keys": "^3.3.0"
-      },
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      },
-      "peerDependencies": {
-        "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
-      }
-    },
-    "node_modules/@eslint-community/regexpp": {
-      "version": "4.10.1",
-      "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.10.1.tgz",
-      "integrity": "sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==",
-      "dev": true,
-      "engines": {
-        "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
-      }
-    },
-    "node_modules/@eslint/eslintrc": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
-      "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
-      "dev": true,
-      "dependencies": {
-        "ajv": "^6.12.4",
-        "debug": "^4.3.2",
-        "espree": "^9.6.0",
-        "globals": "^13.19.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"
-      },
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/eslint"
-      }
-    },
-    "node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dev": true,
-      "dependencies": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "node_modules/@eslint/eslintrc/node_modules/minimatch": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz",
-      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-      "dev": true,
-      "dependencies": {
-        "brace-expansion": "^1.1.7"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/@eslint/js": {
-      "version": "8.57.0",
-      "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-8.57.0.tgz",
-      "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
-      "dev": true,
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      }
-    },
-    "node_modules/@humanwhocodes/config-array": {
-      "version": "0.11.14",
-      "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
-      "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
-      "deprecated": "Use @eslint/config-array instead",
-      "dev": true,
-      "dependencies": {
-        "@humanwhocodes/object-schema": "^2.0.2",
-        "debug": "^4.3.1",
-        "minimatch": "^3.0.5"
-      },
-      "engines": {
-        "node": ">=10.10.0"
-      }
-    },
-    "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dev": true,
-      "dependencies": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "node_modules/@humanwhocodes/config-array/node_modules/minimatch": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz",
-      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-      "dev": true,
-      "dependencies": {
-        "brace-expansion": "^1.1.7"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/@humanwhocodes/module-importer": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
-      "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
-      "dev": true,
-      "engines": {
-        "node": ">=12.22"
-      }
-    },
-    "node_modules/@humanwhocodes/object-schema": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
-      "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
-      "deprecated": "Use @eslint/object-schema instead",
-      "dev": true
-    },
-    "node_modules/@jridgewell/gen-mapping": {
-      "version": "0.3.5",
-      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
-      "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
-      "peer": true,
-      "dependencies": {
-        "@jridgewell/set-array": "^1.2.1",
-        "@jridgewell/sourcemap-codec": "^1.4.10",
-        "@jridgewell/trace-mapping": "^0.3.24"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/@jridgewell/resolve-uri": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
-      "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
-      "peer": true,
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/@jridgewell/set-array": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
-      "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
-      "peer": true,
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/@jridgewell/source-map": {
-      "version": "0.3.6",
-      "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
-      "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
-      "peer": true,
-      "dependencies": {
-        "@jridgewell/gen-mapping": "^0.3.5",
-        "@jridgewell/trace-mapping": "^0.3.25"
-      }
-    },
-    "node_modules/@jridgewell/sourcemap-codec": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
-      "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
-      "peer": true
-    },
-    "node_modules/@jridgewell/trace-mapping": {
-      "version": "0.3.25",
-      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
-      "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
-      "peer": true,
-      "dependencies": {
-        "@jridgewell/resolve-uri": "^3.1.0",
-        "@jridgewell/sourcemap-codec": "^1.4.14"
-      }
-    },
-    "node_modules/@ljharb/resumer": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/@ljharb/resumer/-/resumer-0.0.1.tgz",
-      "integrity": "sha512-skQiAOrCfO7vRTq53cxznMpks7wS1va95UCidALlOVWqvBAzwPVErwizDwoMqNVMEn1mDq0utxZd02eIrvF1lw==",
-      "dependencies": {
-        "@ljharb/through": "^2.3.9"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/@ljharb/through": {
-      "version": "2.3.13",
-      "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz",
-      "integrity": "sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==",
-      "dependencies": {
-        "call-bind": "^1.0.7"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/@naoak/workerize-transferable": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/@naoak/workerize-transferable/-/workerize-transferable-0.1.0.tgz",
-      "integrity": "sha512-fDLfuP71IPNP5+zSfxFb52OHgtjZvauRJWbVnpzQ7G7BjcbLjTny0OW1d3ZO806XKpLWNKmeeW3MhE0sy8iwYQ==",
-      "peerDependencies": {
-        "workerize-loader": "*"
-      }
-    },
-    "node_modules/@nodelib/fs.scandir": {
-      "version": "2.1.5",
-      "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
-      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
-      "dev": true,
-      "dependencies": {
-        "@nodelib/fs.stat": "2.0.5",
-        "run-parallel": "^1.1.9"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/@nodelib/fs.stat": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
-      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
-      "dev": true,
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/@nodelib/fs.walk": {
-      "version": "1.2.8",
-      "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
-      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
-      "dev": true,
-      "dependencies": {
-        "@nodelib/fs.scandir": "2.1.5",
-        "fastq": "^1.6.0"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/@rc-component/async-validator": {
-      "version": "5.0.4",
-      "resolved": "https://registry.npmmirror.com/@rc-component/async-validator/-/async-validator-5.0.4.tgz",
-      "integrity": "sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==",
-      "dependencies": {
-        "@babel/runtime": "^7.24.4"
-      },
-      "engines": {
-        "node": ">=14.x"
-      }
-    },
-    "node_modules/@rc-component/color-picker": {
-      "version": "1.5.3",
-      "resolved": "https://registry.npmmirror.com/@rc-component/color-picker/-/color-picker-1.5.3.tgz",
-      "integrity": "sha512-+tGGH3nLmYXTalVe0L8hSZNs73VTP5ueSHwUlDC77KKRaN7G4DS4wcpG5DTDzdcV/Yas+rzA6UGgIyzd8fS4cw==",
-      "dependencies": {
-        "@babel/runtime": "^7.23.6",
-        "@ctrl/tinycolor": "^3.6.1",
-        "classnames": "^2.2.6",
-        "rc-util": "^5.38.1"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/@rc-component/context": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmmirror.com/@rc-component/context/-/context-1.4.0.tgz",
-      "integrity": "sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==",
-      "dependencies": {
-        "@babel/runtime": "^7.10.1",
-        "rc-util": "^5.27.0"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/@rc-component/mini-decimal": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmmirror.com/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz",
-      "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==",
-      "dependencies": {
-        "@babel/runtime": "^7.18.0"
-      },
-      "engines": {
-        "node": ">=8.x"
-      }
-    },
-    "node_modules/@rc-component/mutate-observer": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmmirror.com/@rc-component/mutate-observer/-/mutate-observer-1.1.0.tgz",
-      "integrity": "sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==",
-      "dependencies": {
-        "@babel/runtime": "^7.18.0",
-        "classnames": "^2.3.2",
-        "rc-util": "^5.24.4"
-      },
-      "engines": {
-        "node": ">=8.x"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/@rc-component/portal": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmmirror.com/@rc-component/portal/-/portal-1.1.2.tgz",
-      "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==",
-      "dependencies": {
-        "@babel/runtime": "^7.18.0",
-        "classnames": "^2.3.2",
-        "rc-util": "^5.24.4"
-      },
-      "engines": {
-        "node": ">=8.x"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/@rc-component/tour": {
-      "version": "1.15.0",
-      "resolved": "https://registry.npmmirror.com/@rc-component/tour/-/tour-1.15.0.tgz",
-      "integrity": "sha512-h6hyILDwL+In9GAgRobwRWihLqqsD7Uft3fZGrJ7L4EiyCoxbnNYwzPXDfz7vNDhWeVyvAWQJj9fJCzpI4+b4g==",
-      "dependencies": {
-        "@babel/runtime": "^7.18.0",
-        "@rc-component/portal": "^1.0.0-9",
-        "@rc-component/trigger": "^2.0.0",
-        "classnames": "^2.3.2",
-        "rc-util": "^5.24.4"
-      },
-      "engines": {
-        "node": ">=8.x"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/@rc-component/trigger": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmmirror.com/@rc-component/trigger/-/trigger-2.2.0.tgz",
-      "integrity": "sha512-QarBCji02YE9aRFhZgRZmOpXBj0IZutRippsVBv85sxvG4FGk/vRxwAlkn3MS9zK5mwbETd86mAVg2tKqTkdJA==",
-      "dependencies": {
-        "@babel/runtime": "^7.23.2",
-        "@rc-component/portal": "^1.1.0",
-        "classnames": "^2.3.2",
-        "rc-motion": "^2.0.0",
-        "rc-resize-observer": "^1.3.1",
-        "rc-util": "^5.38.0"
-      },
-      "engines": {
-        "node": ">=8.x"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/@remix-run/router": {
-      "version": "1.16.1",
-      "resolved": "https://registry.npmmirror.com/@remix-run/router/-/router-1.16.1.tgz",
-      "integrity": "sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig==",
-      "engines": {
-        "node": ">=14.0.0"
-      }
-    },
-    "node_modules/@rollup/rollup-android-arm-eabi": {
-      "version": "4.18.0",
-      "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz",
-      "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "android"
-      ]
-    },
-    "node_modules/@rollup/rollup-android-arm64": {
-      "version": "4.18.0",
-      "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz",
-      "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "android"
-      ]
-    },
-    "node_modules/@rollup/rollup-darwin-arm64": {
-      "version": "4.18.0",
-      "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz",
-      "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ]
-    },
-    "node_modules/@rollup/rollup-darwin-x64": {
-      "version": "4.18.0",
-      "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz",
-      "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
-      "version": "4.18.0",
-      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz",
-      "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-arm-musleabihf": {
-      "version": "4.18.0",
-      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz",
-      "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-arm64-gnu": {
-      "version": "4.18.0",
-      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz",
-      "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-arm64-musl": {
-      "version": "4.18.0",
-      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz",
-      "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
-      "version": "4.18.0",
-      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz",
-      "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==",
-      "cpu": [
-        "ppc64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-riscv64-gnu": {
-      "version": "4.18.0",
-      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz",
-      "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==",
-      "cpu": [
-        "riscv64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-s390x-gnu": {
-      "version": "4.18.0",
-      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz",
-      "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==",
-      "cpu": [
-        "s390x"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-x64-gnu": {
-      "version": "4.18.0",
-      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz",
-      "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-linux-x64-musl": {
-      "version": "4.18.0",
-      "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz",
-      "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ]
-    },
-    "node_modules/@rollup/rollup-win32-arm64-msvc": {
-      "version": "4.18.0",
-      "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz",
-      "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "win32"
-      ]
-    },
-    "node_modules/@rollup/rollup-win32-ia32-msvc": {
-      "version": "4.18.0",
-      "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz",
-      "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==",
-      "cpu": [
-        "ia32"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "win32"
-      ]
-    },
-    "node_modules/@rollup/rollup-win32-x64-msvc": {
-      "version": "4.18.0",
-      "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz",
-      "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "win32"
-      ]
-    },
-    "node_modules/@swc/core": {
-      "version": "1.6.5",
-      "resolved": "https://registry.npmmirror.com/@swc/core/-/core-1.6.5.tgz",
-      "integrity": "sha512-tyVvUK/HDOUUsK6/GmWvnqUtD9oDpPUA4f7f7JCOV8hXxtfjMtAZeBKf93yrB1XZet69TDR7EN0hFC6i4MF0Ig==",
-      "dev": true,
-      "hasInstallScript": true,
-      "dependencies": {
-        "@swc/counter": "^0.1.3",
-        "@swc/types": "^0.1.9"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/swc"
-      },
-      "optionalDependencies": {
-        "@swc/core-darwin-arm64": "1.6.5",
-        "@swc/core-darwin-x64": "1.6.5",
-        "@swc/core-linux-arm-gnueabihf": "1.6.5",
-        "@swc/core-linux-arm64-gnu": "1.6.5",
-        "@swc/core-linux-arm64-musl": "1.6.5",
-        "@swc/core-linux-x64-gnu": "1.6.5",
-        "@swc/core-linux-x64-musl": "1.6.5",
-        "@swc/core-win32-arm64-msvc": "1.6.5",
-        "@swc/core-win32-ia32-msvc": "1.6.5",
-        "@swc/core-win32-x64-msvc": "1.6.5"
-      },
-      "peerDependencies": {
-        "@swc/helpers": "*"
-      },
-      "peerDependenciesMeta": {
-        "@swc/helpers": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@swc/core-darwin-arm64": {
-      "version": "1.6.5",
-      "resolved": "https://registry.npmmirror.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.6.5.tgz",
-      "integrity": "sha512-RGQhMdni2v1/ANQ/2K+F+QYdzaucekYBewZcX1ogqJ8G5sbPaBdYdDN1qQ4kHLCIkPtGP6qC7c71qPEqL2RidQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@swc/core-darwin-x64": {
-      "version": "1.6.5",
-      "resolved": "https://registry.npmmirror.com/@swc/core-darwin-x64/-/core-darwin-x64-1.6.5.tgz",
-      "integrity": "sha512-/pSN0/Jtcbbb9+ovS9rKxR3qertpFAM3OEJr/+Dh/8yy7jK5G5EFPIrfsw/7Q5987ERPIJIH6BspK2CBB2tgcg==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@swc/core-linux-arm-gnueabihf": {
-      "version": "1.6.5",
-      "resolved": "https://registry.npmmirror.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.6.5.tgz",
-      "integrity": "sha512-B0g/dROCE747RRegs/jPHuKJgwXLracDhnqQa80kFdgWEMjlcb7OMCgs5OX86yJGRS4qcYbiMGD0Pp7Kbqn3yw==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@swc/core-linux-arm64-gnu": {
-      "version": "1.6.5",
-      "resolved": "https://registry.npmmirror.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.6.5.tgz",
-      "integrity": "sha512-W8meapgXTq8AOtSvDG4yKR8ant2WWD++yOjgzAleB5VAC+oC+aa8YJROGxj8HepurU8kurqzcialwoMeq5SZZQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@swc/core-linux-arm64-musl": {
-      "version": "1.6.5",
-      "resolved": "https://registry.npmmirror.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.6.5.tgz",
-      "integrity": "sha512-jyCKqoX50Fg8rJUQqh4u5PqnE7nqYKXHjVH2WcYr114/MU21zlsI+YL6aOQU1XP8bJQ2gPQ1rnlnGJdEHiKS/w==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@swc/core-linux-x64-gnu": {
-      "version": "1.6.5",
-      "resolved": "https://registry.npmmirror.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.6.5.tgz",
-      "integrity": "sha512-G6HmUn/RRIlXC0YYFfBz2qh6OZkHS/KUPkhoG4X9ADcgWXXjOFh6JrefwsYj8VBAJEnr5iewzjNfj+nztwHaeA==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@swc/core-linux-x64-musl": {
-      "version": "1.6.5",
-      "resolved": "https://registry.npmmirror.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.6.5.tgz",
-      "integrity": "sha512-AQpBjBnelQDSbeTJA50AXdS6+CP66LsXIMNTwhPSgUfE7Bx1ggZV11Fsi4Q5SGcs6a8Qw1cuYKN57ZfZC5QOuA==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@swc/core-win32-arm64-msvc": {
-      "version": "1.6.5",
-      "resolved": "https://registry.npmmirror.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.6.5.tgz",
-      "integrity": "sha512-MZTWM8kUwS30pVrtbzSGEXtek46aXNb/mT9D6rsS7NvOuv2w+qZhjR1rzf4LNbbn5f8VnR4Nac1WIOYZmfC5ng==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@swc/core-win32-ia32-msvc": {
-      "version": "1.6.5",
-      "resolved": "https://registry.npmmirror.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.6.5.tgz",
-      "integrity": "sha512-WZdu4gISAr3yOm1fVwKhhk6+MrP7kVX0KMP7+ZQFTN5zXQEiDSDunEJKVgjMVj3vlR+6mnAqa/L0V9Qa8+zKlQ==",
-      "cpu": [
-        "ia32"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@swc/core-win32-x64-msvc": {
-      "version": "1.6.5",
-      "resolved": "https://registry.npmmirror.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.6.5.tgz",
-      "integrity": "sha512-ezXgucnMTzlFIxQZw7ls/5r2hseFaRoDL04cuXUOs97E8r+nJSmFsRQm/ygH5jBeXNo59nyZCalrjJAjwfgACA==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@swc/counter": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmmirror.com/@swc/counter/-/counter-0.1.3.tgz",
-      "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==",
-      "dev": true
-    },
-    "node_modules/@swc/types": {
-      "version": "0.1.9",
-      "resolved": "https://registry.npmmirror.com/@swc/types/-/types-0.1.9.tgz",
-      "integrity": "sha512-qKnCno++jzcJ4lM4NTfYifm1EFSCeIfKiAHAfkENZAV5Kl9PjJIyd2yeeVv6c/2CckuLyv2NmRC5pv6pm2WQBg==",
-      "dev": true,
-      "dependencies": {
-        "@swc/counter": "^0.1.3"
-      }
-    },
-    "node_modules/@types/eslint": {
-      "version": "9.6.1",
-      "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
-      "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
-      "peer": true,
-      "dependencies": {
-        "@types/estree": "*",
-        "@types/json-schema": "*"
-      }
-    },
-    "node_modules/@types/eslint-scope": {
-      "version": "3.7.7",
-      "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
-      "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
-      "peer": true,
-      "dependencies": {
-        "@types/eslint": "*",
-        "@types/estree": "*"
-      }
-    },
-    "node_modules/@types/estree": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz",
-      "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw=="
-    },
-    "node_modules/@types/json-schema": {
-      "version": "7.0.15",
-      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
-      "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
-      "peer": true
-    },
-    "node_modules/@types/lodash": {
-      "version": "4.17.5",
-      "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.5.tgz",
-      "integrity": "sha512-MBIOHVZqVqgfro1euRDWX7OO0fBVUUMrN6Pwm8LQsz8cWhEpihlvR70ENj3f40j58TNxZaWv2ndSkInykNBBJw==",
-      "dev": true
-    },
-    "node_modules/@types/lodash-es": {
-      "version": "4.17.12",
-      "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz",
-      "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
-      "dev": true,
-      "dependencies": {
-        "@types/lodash": "*"
-      }
-    },
-    "node_modules/@types/node": {
-      "version": "22.14.0",
-      "resolved": "https://registry.npmmirror.com/@types/node/-/node-22.14.0.tgz",
-      "integrity": "sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==",
-      "license": "MIT",
-      "dependencies": {
-        "undici-types": "~6.21.0"
-      }
-    },
-    "node_modules/@types/prop-types": {
-      "version": "15.7.12",
-      "resolved": "https://registry.npmmirror.com/@types/prop-types/-/prop-types-15.7.12.tgz",
-      "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==",
-      "devOptional": true
-    },
-    "node_modules/@types/react": {
-      "version": "18.3.3",
-      "resolved": "https://registry.npmmirror.com/@types/react/-/react-18.3.3.tgz",
-      "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==",
-      "devOptional": true,
-      "dependencies": {
-        "@types/prop-types": "*",
-        "csstype": "^3.0.2"
-      }
-    },
-    "node_modules/@types/react-dom": {
-      "version": "18.3.0",
-      "resolved": "https://registry.npmmirror.com/@types/react-dom/-/react-dom-18.3.0.tgz",
-      "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==",
-      "dev": true,
-      "dependencies": {
-        "@types/react": "*"
-      }
-    },
-    "node_modules/@types/stylis": {
-      "version": "4.2.5",
-      "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz",
-      "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw=="
-    },
-    "node_modules/@typescript-eslint/eslint-plugin": {
-      "version": "7.13.1",
-      "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.13.1.tgz",
-      "integrity": "sha512-kZqi+WZQaZfPKnsflLJQCz6Ze9FFSMfXrrIOcyargekQxG37ES7DJNpJUE9Q/X5n3yTIP/WPutVNzgknQ7biLg==",
-      "dev": true,
-      "dependencies": {
-        "@eslint-community/regexpp": "^4.10.0",
-        "@typescript-eslint/scope-manager": "7.13.1",
-        "@typescript-eslint/type-utils": "7.13.1",
-        "@typescript-eslint/utils": "7.13.1",
-        "@typescript-eslint/visitor-keys": "7.13.1",
-        "graphemer": "^1.4.0",
-        "ignore": "^5.3.1",
-        "natural-compare": "^1.4.0",
-        "ts-api-utils": "^1.3.0"
-      },
-      "engines": {
-        "node": "^18.18.0 || >=20.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      },
-      "peerDependencies": {
-        "@typescript-eslint/parser": "^7.0.0",
-        "eslint": "^8.56.0"
-      },
-      "peerDependenciesMeta": {
-        "typescript": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@typescript-eslint/parser": {
-      "version": "7.13.1",
-      "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-7.13.1.tgz",
-      "integrity": "sha512-1ELDPlnLvDQ5ybTSrMhRTFDfOQEOXNM+eP+3HT/Yq7ruWpciQw+Avi73pdEbA4SooCawEWo3dtYbF68gN7Ed1A==",
-      "dev": true,
-      "dependencies": {
-        "@typescript-eslint/scope-manager": "7.13.1",
-        "@typescript-eslint/types": "7.13.1",
-        "@typescript-eslint/typescript-estree": "7.13.1",
-        "@typescript-eslint/visitor-keys": "7.13.1",
-        "debug": "^4.3.4"
-      },
-      "engines": {
-        "node": "^18.18.0 || >=20.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      },
-      "peerDependencies": {
-        "eslint": "^8.56.0"
-      },
-      "peerDependenciesMeta": {
-        "typescript": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@typescript-eslint/scope-manager": {
-      "version": "7.13.1",
-      "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-7.13.1.tgz",
-      "integrity": "sha512-adbXNVEs6GmbzaCpymHQ0MB6E4TqoiVbC0iqG3uijR8ZYfpAXMGttouQzF4Oat3P2GxDVIrg7bMI/P65LiQZdg==",
-      "dev": true,
-      "dependencies": {
-        "@typescript-eslint/types": "7.13.1",
-        "@typescript-eslint/visitor-keys": "7.13.1"
-      },
-      "engines": {
-        "node": "^18.18.0 || >=20.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      }
-    },
-    "node_modules/@typescript-eslint/type-utils": {
-      "version": "7.13.1",
-      "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-7.13.1.tgz",
-      "integrity": "sha512-aWDbLu1s9bmgPGXSzNCxELu+0+HQOapV/y+60gPXafR8e2g1Bifxzevaa+4L2ytCWm+CHqpELq4CSoN9ELiwCg==",
-      "dev": true,
-      "dependencies": {
-        "@typescript-eslint/typescript-estree": "7.13.1",
-        "@typescript-eslint/utils": "7.13.1",
-        "debug": "^4.3.4",
-        "ts-api-utils": "^1.3.0"
-      },
-      "engines": {
-        "node": "^18.18.0 || >=20.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      },
-      "peerDependencies": {
-        "eslint": "^8.56.0"
-      },
-      "peerDependenciesMeta": {
-        "typescript": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@typescript-eslint/types": {
-      "version": "7.13.1",
-      "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-7.13.1.tgz",
-      "integrity": "sha512-7K7HMcSQIAND6RBL4kDl24sG/xKM13cA85dc7JnmQXw2cBDngg7c19B++JzvJHRG3zG36n9j1i451GBzRuHchw==",
-      "dev": true,
-      "engines": {
-        "node": "^18.18.0 || >=20.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      }
-    },
-    "node_modules/@typescript-eslint/typescript-estree": {
-      "version": "7.13.1",
-      "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.13.1.tgz",
-      "integrity": "sha512-uxNr51CMV7npU1BxZzYjoVz9iyjckBduFBP0S5sLlh1tXYzHzgZ3BR9SVsNed+LmwKrmnqN3Kdl5t7eZ5TS1Yw==",
-      "dev": true,
-      "dependencies": {
-        "@typescript-eslint/types": "7.13.1",
-        "@typescript-eslint/visitor-keys": "7.13.1",
-        "debug": "^4.3.4",
-        "globby": "^11.1.0",
-        "is-glob": "^4.0.3",
-        "minimatch": "^9.0.4",
-        "semver": "^7.6.0",
-        "ts-api-utils": "^1.3.0"
-      },
-      "engines": {
-        "node": "^18.18.0 || >=20.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      },
-      "peerDependenciesMeta": {
-        "typescript": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@typescript-eslint/utils": {
-      "version": "7.13.1",
-      "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-7.13.1.tgz",
-      "integrity": "sha512-h5MzFBD5a/Gh/fvNdp9pTfqJAbuQC4sCN2WzuXme71lqFJsZtLbjxfSk4r3p02WIArOF9N94pdsLiGutpDbrXQ==",
-      "dev": true,
-      "dependencies": {
-        "@eslint-community/eslint-utils": "^4.4.0",
-        "@typescript-eslint/scope-manager": "7.13.1",
-        "@typescript-eslint/types": "7.13.1",
-        "@typescript-eslint/typescript-estree": "7.13.1"
-      },
-      "engines": {
-        "node": "^18.18.0 || >=20.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      },
-      "peerDependencies": {
-        "eslint": "^8.56.0"
-      }
-    },
-    "node_modules/@typescript-eslint/visitor-keys": {
-      "version": "7.13.1",
-      "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.13.1.tgz",
-      "integrity": "sha512-k/Bfne7lrP7hcb7m9zSsgcBmo+8eicqqfNAJ7uUY+jkTFpKeH2FSkWpFRtimBxgkyvqfu9jTPRbYOvud6isdXA==",
-      "dev": true,
-      "dependencies": {
-        "@typescript-eslint/types": "7.13.1",
-        "eslint-visitor-keys": "^3.4.3"
-      },
-      "engines": {
-        "node": "^18.18.0 || >=20.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/typescript-eslint"
-      }
-    },
-    "node_modules/@ungap/structured-clone": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
-      "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
-      "dev": true
-    },
-    "node_modules/@vitejs/plugin-react-swc": {
-      "version": "3.7.0",
-      "resolved": "https://registry.npmmirror.com/@vitejs/plugin-react-swc/-/plugin-react-swc-3.7.0.tgz",
-      "integrity": "sha512-yrknSb3Dci6svCd/qhHqhFPDSw0QtjumcqdKMoNNzmOl5lMXTTiqzjWtG4Qask2HdvvzaNgSunbQGet8/GrKdA==",
-      "dev": true,
-      "dependencies": {
-        "@swc/core": "^1.5.7"
-      },
-      "peerDependencies": {
-        "vite": "^4 || ^5"
-      }
-    },
-    "node_modules/@webassemblyjs/ast": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",
-      "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
-      "peer": true,
-      "dependencies": {
-        "@webassemblyjs/helper-numbers": "1.13.2",
-        "@webassemblyjs/helper-wasm-bytecode": "1.13.2"
-      }
-    },
-    "node_modules/@webassemblyjs/floating-point-hex-parser": {
-      "version": "1.13.2",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
-      "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
-      "peer": true
-    },
-    "node_modules/@webassemblyjs/helper-api-error": {
-      "version": "1.13.2",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
-      "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
-      "peer": true
-    },
-    "node_modules/@webassemblyjs/helper-buffer": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
-      "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
-      "peer": true
-    },
-    "node_modules/@webassemblyjs/helper-numbers": {
-      "version": "1.13.2",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz",
-      "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
-      "peer": true,
-      "dependencies": {
-        "@webassemblyjs/floating-point-hex-parser": "1.13.2",
-        "@webassemblyjs/helper-api-error": "1.13.2",
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "node_modules/@webassemblyjs/helper-wasm-bytecode": {
-      "version": "1.13.2",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
-      "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
-      "peer": true
-    },
-    "node_modules/@webassemblyjs/helper-wasm-section": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz",
-      "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
-      "peer": true,
-      "dependencies": {
-        "@webassemblyjs/ast": "1.14.1",
-        "@webassemblyjs/helper-buffer": "1.14.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
-        "@webassemblyjs/wasm-gen": "1.14.1"
-      }
-    },
-    "node_modules/@webassemblyjs/ieee754": {
-      "version": "1.13.2",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz",
-      "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
-      "peer": true,
-      "dependencies": {
-        "@xtuc/ieee754": "^1.2.0"
-      }
-    },
-    "node_modules/@webassemblyjs/leb128": {
-      "version": "1.13.2",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz",
-      "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
-      "peer": true,
-      "dependencies": {
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "node_modules/@webassemblyjs/utf8": {
-      "version": "1.13.2",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
-      "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
-      "peer": true
-    },
-    "node_modules/@webassemblyjs/wasm-edit": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz",
-      "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
-      "peer": true,
-      "dependencies": {
-        "@webassemblyjs/ast": "1.14.1",
-        "@webassemblyjs/helper-buffer": "1.14.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
-        "@webassemblyjs/helper-wasm-section": "1.14.1",
-        "@webassemblyjs/wasm-gen": "1.14.1",
-        "@webassemblyjs/wasm-opt": "1.14.1",
-        "@webassemblyjs/wasm-parser": "1.14.1",
-        "@webassemblyjs/wast-printer": "1.14.1"
-      }
-    },
-    "node_modules/@webassemblyjs/wasm-gen": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz",
-      "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
-      "peer": true,
-      "dependencies": {
-        "@webassemblyjs/ast": "1.14.1",
-        "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
-        "@webassemblyjs/ieee754": "1.13.2",
-        "@webassemblyjs/leb128": "1.13.2",
-        "@webassemblyjs/utf8": "1.13.2"
-      }
-    },
-    "node_modules/@webassemblyjs/wasm-opt": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz",
-      "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
-      "peer": true,
-      "dependencies": {
-        "@webassemblyjs/ast": "1.14.1",
-        "@webassemblyjs/helper-buffer": "1.14.1",
-        "@webassemblyjs/wasm-gen": "1.14.1",
-        "@webassemblyjs/wasm-parser": "1.14.1"
-      }
-    },
-    "node_modules/@webassemblyjs/wasm-parser": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz",
-      "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
-      "peer": true,
-      "dependencies": {
-        "@webassemblyjs/ast": "1.14.1",
-        "@webassemblyjs/helper-api-error": "1.13.2",
-        "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
-        "@webassemblyjs/ieee754": "1.13.2",
-        "@webassemblyjs/leb128": "1.13.2",
-        "@webassemblyjs/utf8": "1.13.2"
-      }
-    },
-    "node_modules/@webassemblyjs/wast-printer": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz",
-      "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
-      "peer": true,
-      "dependencies": {
-        "@webassemblyjs/ast": "1.14.1",
-        "@xtuc/long": "4.2.2"
-      }
-    },
-    "node_modules/@xtuc/ieee754": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
-      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
-      "peer": true
-    },
-    "node_modules/@xtuc/long": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
-      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
-      "peer": true
-    },
-    "node_modules/acorn": {
-      "version": "8.14.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
-      "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
-      "bin": {
-        "acorn": "bin/acorn"
-      },
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/acorn-jsx": {
-      "version": "5.3.2",
-      "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
-      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
-      "dev": true,
-      "peerDependencies": {
-        "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
-      }
-    },
-    "node_modules/ajv": {
-      "version": "6.12.6",
-      "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz",
-      "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"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/epoberezkin"
-      }
-    },
-    "node_modules/ajv-keywords": {
-      "version": "3.5.2",
-      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
-      "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
-      "peer": true,
-      "peerDependencies": {
-        "ajv": "^6.9.1"
-      }
-    },
-    "node_modules/align-text": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
-      "integrity": "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==",
-      "dependencies": {
-        "kind-of": "^3.0.2",
-        "longest": "^1.0.1",
-        "repeat-string": "^1.5.2"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/amdefine": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
-      "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==",
-      "engines": {
-        "node": ">=0.4.2"
-      }
-    },
-    "node_modules/ansi-regex": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/antd": {
-      "version": "5.18.3",
-      "resolved": "https://registry.npmmirror.com/antd/-/antd-5.18.3.tgz",
-      "integrity": "sha512-Dm3P8HBxoo/DiR/QZLj5Mk+rQZsSXxCCArSZACHGiklkkjW6klzlebAElOUr9NyDeFX7UnQ6LVk7vznXlnjTqQ==",
-      "dependencies": {
-        "@ant-design/colors": "^7.0.2",
-        "@ant-design/cssinjs": "^1.21.0",
-        "@ant-design/icons": "^5.3.7",
-        "@ant-design/react-slick": "~1.1.2",
-        "@babel/runtime": "^7.24.7",
-        "@ctrl/tinycolor": "^3.6.1",
-        "@rc-component/color-picker": "~1.5.3",
-        "@rc-component/mutate-observer": "^1.1.0",
-        "@rc-component/tour": "~1.15.0",
-        "@rc-component/trigger": "^2.2.0",
-        "classnames": "^2.5.1",
-        "copy-to-clipboard": "^3.3.3",
-        "dayjs": "^1.11.11",
-        "qrcode.react": "^3.1.0",
-        "rc-cascader": "~3.26.0",
-        "rc-checkbox": "~3.3.0",
-        "rc-collapse": "~3.7.3",
-        "rc-dialog": "~9.5.2",
-        "rc-drawer": "~7.2.0",
-        "rc-dropdown": "~4.2.0",
-        "rc-field-form": "~2.2.1",
-        "rc-image": "~7.9.0",
-        "rc-input": "~1.5.1",
-        "rc-input-number": "~9.1.0",
-        "rc-mentions": "~2.14.0",
-        "rc-menu": "~9.14.0",
-        "rc-motion": "^2.9.2",
-        "rc-notification": "~5.6.0",
-        "rc-pagination": "~4.0.4",
-        "rc-picker": "~4.5.0",
-        "rc-progress": "~4.0.0",
-        "rc-rate": "~2.13.0",
-        "rc-resize-observer": "^1.4.0",
-        "rc-segmented": "~2.3.0",
-        "rc-select": "~14.14.0",
-        "rc-slider": "~10.6.2",
-        "rc-steps": "~6.0.1",
-        "rc-switch": "~4.1.0",
-        "rc-table": "~7.45.7",
-        "rc-tabs": "~15.1.1",
-        "rc-textarea": "~1.7.0",
-        "rc-tooltip": "~6.2.0",
-        "rc-tree": "~5.8.8",
-        "rc-tree-select": "~5.21.0",
-        "rc-upload": "~4.5.2",
-        "rc-util": "^5.43.0",
-        "scroll-into-view-if-needed": "^3.1.0",
-        "throttle-debounce": "^5.0.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/ant-design"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/argparse": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz",
-      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
-      "dev": true
-    },
-    "node_modules/array-buffer-byte-length": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
-      "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==",
-      "dependencies": {
-        "call-bind": "^1.0.5",
-        "is-array-buffer": "^3.0.4"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/array-tree-filter": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmmirror.com/array-tree-filter/-/array-tree-filter-2.1.0.tgz",
-      "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw=="
-    },
-    "node_modules/array-union": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz",
-      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/arraybuffer.prototype.slice": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz",
-      "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==",
-      "dependencies": {
-        "array-buffer-byte-length": "^1.0.1",
-        "call-bind": "^1.0.5",
-        "define-properties": "^1.2.1",
-        "es-abstract": "^1.22.3",
-        "es-errors": "^1.2.1",
-        "get-intrinsic": "^1.2.3",
-        "is-array-buffer": "^3.0.4",
-        "is-shared-array-buffer": "^1.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/asynckit": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
-      "license": "MIT"
-    },
-    "node_modules/available-typed-arrays": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
-      "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
-      "dependencies": {
-        "possible-typed-array-names": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/axios": {
-      "version": "1.8.4",
-      "resolved": "https://registry.npmmirror.com/axios/-/axios-1.8.4.tgz",
-      "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==",
-      "license": "MIT",
-      "dependencies": {
-        "follow-redirects": "^1.15.6",
-        "form-data": "^4.0.0",
-        "proxy-from-env": "^1.1.0"
-      }
-    },
-    "node_modules/balanced-match": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
-      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
-    },
-    "node_modules/big.js": {
-      "version": "5.2.2",
-      "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
-      "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
-      "peer": true,
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
-      "dev": true,
-      "dependencies": {
-        "balanced-match": "^1.0.0"
-      }
-    },
-    "node_modules/braces": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz",
-      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
-      "dev": true,
-      "dependencies": {
-        "fill-range": "^7.1.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/browserslist": {
-      "version": "4.24.2",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz",
-      "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==",
-      "funding": [
-        {
-          "type": "opencollective",
-          "url": "https://opencollective.com/browserslist"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/funding/github/npm/browserslist"
-        },
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/ai"
-        }
-      ],
-      "peer": true,
-      "dependencies": {
-        "caniuse-lite": "^1.0.30001669",
-        "electron-to-chromium": "^1.5.41",
-        "node-releases": "^2.0.18",
-        "update-browserslist-db": "^1.1.1"
-      },
-      "bin": {
-        "browserslist": "cli.js"
-      },
-      "engines": {
-        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
-      }
-    },
-    "node_modules/bubblesets-js": {
-      "version": "2.3.4",
-      "resolved": "https://registry.npmjs.org/bubblesets-js/-/bubblesets-js-2.3.4.tgz",
-      "integrity": "sha512-DyMjHmpkS2+xcFNtyN00apJYL3ESdp9fTrkDr5+9Qg/GPqFmcWgGsK1akZnttE1XFxJ/VMy4DNNGMGYtmFp1Sg=="
-    },
-    "node_modules/buffer-from": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
-      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
-      "peer": true
-    },
-    "node_modules/call-bind": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
-      "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
-      "dependencies": {
-        "es-define-property": "^1.0.0",
-        "es-errors": "^1.3.0",
-        "function-bind": "^1.1.2",
-        "get-intrinsic": "^1.2.4",
-        "set-function-length": "^1.2.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/call-bind-apply-helpers": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
-      "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
-      "license": "MIT",
-      "dependencies": {
-        "es-errors": "^1.3.0",
-        "function-bind": "^1.1.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/callsites": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz",
-      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/camelcase": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
-      "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/camelize": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz",
-      "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==",
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/caniuse-lite": {
-      "version": "1.0.30001684",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001684.tgz",
-      "integrity": "sha512-G1LRwLIQjBQoyq0ZJGqGIJUXzJ8irpbjHLpVRXDvBEScFJ9b17sgK6vlx0GAJFE21okD7zXl08rRRUfq6HdoEQ==",
-      "funding": [
-        {
-          "type": "opencollective",
-          "url": "https://opencollective.com/browserslist"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
-        },
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/ai"
-        }
-      ],
-      "peer": true
-    },
-    "node_modules/center-align": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
-      "integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==",
-      "dependencies": {
-        "align-text": "^0.1.3",
-        "lazy-cache": "^1.0.3"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/chalk": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
-      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/chrome-trace-event": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
-      "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
-      "peer": true,
-      "engines": {
-        "node": ">=6.0"
-      }
-    },
-    "node_modules/classnames": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmmirror.com/classnames/-/classnames-2.5.1.tgz",
-      "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="
-    },
-    "node_modules/cliui": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
-      "integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==",
-      "dependencies": {
-        "center-align": "^0.1.1",
-        "right-align": "^0.1.1",
-        "wordwrap": "0.0.2"
-      }
-    },
-    "node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
-    },
-    "node_modules/color-string": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
-      "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
-      "dependencies": {
-        "color-name": "^1.0.0",
-        "simple-swizzle": "^0.2.2"
-      }
-    },
-    "node_modules/combined-stream": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
-      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
-      "license": "MIT",
-      "dependencies": {
-        "delayed-stream": "~1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/comlink": {
-      "version": "4.4.2",
-      "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.4.2.tgz",
-      "integrity": "sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g=="
-    },
-    "node_modules/commander": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
-      "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/compute-scroll-into-view": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-3.1.0.tgz",
-      "integrity": "sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg=="
-    },
-    "node_modules/concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
-    },
-    "node_modules/contour_plot": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/contour_plot/-/contour_plot-0.0.1.tgz",
-      "integrity": "sha512-Nil2HI76Xux6sVGORvhSS8v66m+/h5CwFkBJDO+U5vWaMdNC0yXNCsGDPbzPhvqOEU5koebhdEvD372LI+IyLw=="
-    },
-    "node_modules/copy-to-clipboard": {
-      "version": "3.3.3",
-      "resolved": "https://registry.npmmirror.com/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz",
-      "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==",
-      "dependencies": {
-        "toggle-selection": "^1.0.6"
-      }
-    },
-    "node_modules/cross-spawn": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz",
-      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
-      "dev": true,
-      "dependencies": {
-        "path-key": "^3.1.0",
-        "shebang-command": "^2.0.0",
-        "which": "^2.0.1"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/css-color-keywords": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz",
-      "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==",
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/css-to-react-native": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz",
-      "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==",
-      "dependencies": {
-        "camelize": "^1.0.0",
-        "css-color-keywords": "^1.0.0",
-        "postcss-value-parser": "^4.0.2"
-      }
-    },
-    "node_modules/csstype": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
-      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
-    },
-    "node_modules/d3-array": {
-      "version": "3.2.4",
-      "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz",
-      "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",
-      "dependencies": {
-        "internmap": "1 - 2"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/d3-binarytree": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/d3-binarytree/-/d3-binarytree-1.0.2.tgz",
-      "integrity": "sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw=="
-    },
-    "node_modules/d3-color": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
-      "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/d3-dispatch": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz",
-      "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==",
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/d3-dsv": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz",
-      "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==",
-      "dependencies": {
-        "commander": "7",
-        "iconv-lite": "0.6",
-        "rw": "1"
-      },
-      "bin": {
-        "csv2json": "bin/dsv2json.js",
-        "csv2tsv": "bin/dsv2dsv.js",
-        "dsv2dsv": "bin/dsv2dsv.js",
-        "dsv2json": "bin/dsv2json.js",
-        "json2csv": "bin/json2dsv.js",
-        "json2dsv": "bin/json2dsv.js",
-        "json2tsv": "bin/json2dsv.js",
-        "tsv2csv": "bin/dsv2dsv.js",
-        "tsv2json": "bin/dsv2json.js"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/d3-force": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz",
-      "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==",
-      "dependencies": {
-        "d3-dispatch": "1 - 3",
-        "d3-quadtree": "1 - 3",
-        "d3-timer": "1 - 3"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/d3-force-3d": {
-      "version": "3.0.5",
-      "resolved": "https://registry.npmjs.org/d3-force-3d/-/d3-force-3d-3.0.5.tgz",
-      "integrity": "sha512-tdwhAhoTYZY/a6eo9nR7HP3xSW/C6XvJTbeRpR92nlPzH6OiE+4MliN9feuSFd0tPtEUo+191qOhCTWx3NYifg==",
-      "dependencies": {
-        "d3-binarytree": "1",
-        "d3-dispatch": "1 - 3",
-        "d3-octree": "1",
-        "d3-quadtree": "1 - 3",
-        "d3-timer": "1 - 3"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/d3-format": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz",
-      "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==",
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/d3-geo": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz",
-      "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==",
-      "dependencies": {
-        "d3-array": "2.5.0 - 3"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/d3-hierarchy": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz",
-      "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==",
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/d3-interpolate": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
-      "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
-      "dependencies": {
-        "d3-color": "1 - 3"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/d3-octree": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/d3-octree/-/d3-octree-1.0.2.tgz",
-      "integrity": "sha512-Qxg4oirJrNXauiuC94uKMbgxwnhdda9xRLl9ihq45srlJ4Ga3CSgqGcAL8iW7N5CIv4Oz8x3E734ulxyvHPvwA=="
-    },
-    "node_modules/d3-path": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",
-      "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==",
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/d3-quadtree": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz",
-      "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==",
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/d3-scale-chromatic": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz",
-      "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==",
-      "dependencies": {
-        "d3-color": "1 - 3",
-        "d3-interpolate": "1 - 3"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/d3-shape": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",
-      "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
-      "dependencies": {
-        "d3-path": "^3.1.0"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/d3-timer": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
-      "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/dagre": {
-      "version": "0.8.5",
-      "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz",
-      "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==",
-      "dependencies": {
-        "graphlib": "^2.1.8",
-        "lodash": "^4.17.15"
-      }
-    },
-    "node_modules/data-view-buffer": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
-      "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==",
-      "dependencies": {
-        "call-bind": "^1.0.6",
-        "es-errors": "^1.3.0",
-        "is-data-view": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/data-view-byte-length": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz",
-      "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==",
-      "dependencies": {
-        "call-bind": "^1.0.7",
-        "es-errors": "^1.3.0",
-        "is-data-view": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/data-view-byte-offset": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz",
-      "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==",
-      "dependencies": {
-        "call-bind": "^1.0.6",
-        "es-errors": "^1.3.0",
-        "is-data-view": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/dayjs": {
-      "version": "1.11.11",
-      "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.11.tgz",
-      "integrity": "sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg=="
-    },
-    "node_modules/debug": {
-      "version": "4.3.5",
-      "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.5.tgz",
-      "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
-      "dev": true,
-      "dependencies": {
-        "ms": "2.1.2"
-      },
-      "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/decamelize": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-      "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/deep-equal": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz",
-      "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==",
-      "dependencies": {
-        "is-arguments": "^1.1.1",
-        "is-date-object": "^1.0.5",
-        "is-regex": "^1.1.4",
-        "object-is": "^1.1.5",
-        "object-keys": "^1.1.1",
-        "regexp.prototype.flags": "^1.5.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/deep-is": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz",
-      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
-      "dev": true
-    },
-    "node_modules/define-data-property": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
-      "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
-      "dependencies": {
-        "es-define-property": "^1.0.0",
-        "es-errors": "^1.3.0",
-        "gopd": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/define-properties": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
-      "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
-      "dependencies": {
-        "define-data-property": "^1.0.1",
-        "has-property-descriptors": "^1.0.0",
-        "object-keys": "^1.1.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/defined": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz",
-      "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==",
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/delayed-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/dir-glob": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz",
-      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
-      "dev": true,
-      "dependencies": {
-        "path-type": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/doctrine": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz",
-      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
-      "dev": true,
-      "dependencies": {
-        "esutils": "^2.0.2"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/dotignore": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz",
-      "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==",
-      "dependencies": {
-        "minimatch": "^3.0.4"
-      },
-      "bin": {
-        "ignored": "bin/ignored"
-      }
-    },
-    "node_modules/dotignore/node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dependencies": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "node_modules/dotignore/node_modules/minimatch": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
-      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-      "dependencies": {
-        "brace-expansion": "^1.1.7"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/dunder-proto": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz",
-      "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bind-apply-helpers": "^1.0.1",
-        "es-errors": "^1.3.0",
-        "gopd": "^1.2.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/electron-to-chromium": {
-      "version": "1.5.64",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.64.tgz",
-      "integrity": "sha512-IXEuxU+5ClW2IGEYFC2T7szbyVgehupCWQe5GNh+H065CD6U6IFN0s4KeAMFGNmQolRU4IV7zGBWSYMmZ8uuqQ==",
-      "peer": true
-    },
-    "node_modules/emojis-list": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
-      "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
-      "peer": true,
-      "engines": {
-        "node": ">= 4"
-      }
-    },
-    "node_modules/enhanced-resolve": {
-      "version": "5.17.1",
-      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz",
-      "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==",
-      "peer": true,
-      "dependencies": {
-        "graceful-fs": "^4.2.4",
-        "tapable": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "node_modules/es-abstract": {
-      "version": "1.23.5",
-      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz",
-      "integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==",
-      "dependencies": {
-        "array-buffer-byte-length": "^1.0.1",
-        "arraybuffer.prototype.slice": "^1.0.3",
-        "available-typed-arrays": "^1.0.7",
-        "call-bind": "^1.0.7",
-        "data-view-buffer": "^1.0.1",
-        "data-view-byte-length": "^1.0.1",
-        "data-view-byte-offset": "^1.0.0",
-        "es-define-property": "^1.0.0",
-        "es-errors": "^1.3.0",
-        "es-object-atoms": "^1.0.0",
-        "es-set-tostringtag": "^2.0.3",
-        "es-to-primitive": "^1.2.1",
-        "function.prototype.name": "^1.1.6",
-        "get-intrinsic": "^1.2.4",
-        "get-symbol-description": "^1.0.2",
-        "globalthis": "^1.0.4",
-        "gopd": "^1.0.1",
-        "has-property-descriptors": "^1.0.2",
-        "has-proto": "^1.0.3",
-        "has-symbols": "^1.0.3",
-        "hasown": "^2.0.2",
-        "internal-slot": "^1.0.7",
-        "is-array-buffer": "^3.0.4",
-        "is-callable": "^1.2.7",
-        "is-data-view": "^1.0.1",
-        "is-negative-zero": "^2.0.3",
-        "is-regex": "^1.1.4",
-        "is-shared-array-buffer": "^1.0.3",
-        "is-string": "^1.0.7",
-        "is-typed-array": "^1.1.13",
-        "is-weakref": "^1.0.2",
-        "object-inspect": "^1.13.3",
-        "object-keys": "^1.1.1",
-        "object.assign": "^4.1.5",
-        "regexp.prototype.flags": "^1.5.3",
-        "safe-array-concat": "^1.1.2",
-        "safe-regex-test": "^1.0.3",
-        "string.prototype.trim": "^1.2.9",
-        "string.prototype.trimend": "^1.0.8",
-        "string.prototype.trimstart": "^1.0.8",
-        "typed-array-buffer": "^1.0.2",
-        "typed-array-byte-length": "^1.0.1",
-        "typed-array-byte-offset": "^1.0.2",
-        "typed-array-length": "^1.0.6",
-        "unbox-primitive": "^1.0.2",
-        "which-typed-array": "^1.1.15"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/es-abstract/node_modules/object-inspect": {
-      "version": "1.13.3",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz",
-      "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/es-define-property": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz",
-      "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/es-errors": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
-      "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/es-module-lexer": {
-      "version": "1.5.4",
-      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz",
-      "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==",
-      "peer": true
-    },
-    "node_modules/es-object-atoms": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
-      "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
-      "license": "MIT",
-      "dependencies": {
-        "es-errors": "^1.3.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/es-set-tostringtag": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
-      "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
-      "license": "MIT",
-      "dependencies": {
-        "es-errors": "^1.3.0",
-        "get-intrinsic": "^1.2.6",
-        "has-tostringtag": "^1.0.2",
-        "hasown": "^2.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/es-to-primitive": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
-      "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
-      "dependencies": {
-        "is-callable": "^1.1.4",
-        "is-date-object": "^1.0.1",
-        "is-symbol": "^1.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/esbuild": {
-      "version": "0.21.5",
-      "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz",
-      "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
-      "dev": true,
-      "hasInstallScript": true,
-      "bin": {
-        "esbuild": "bin/esbuild"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "optionalDependencies": {
-        "@esbuild/aix-ppc64": "0.21.5",
-        "@esbuild/android-arm": "0.21.5",
-        "@esbuild/android-arm64": "0.21.5",
-        "@esbuild/android-x64": "0.21.5",
-        "@esbuild/darwin-arm64": "0.21.5",
-        "@esbuild/darwin-x64": "0.21.5",
-        "@esbuild/freebsd-arm64": "0.21.5",
-        "@esbuild/freebsd-x64": "0.21.5",
-        "@esbuild/linux-arm": "0.21.5",
-        "@esbuild/linux-arm64": "0.21.5",
-        "@esbuild/linux-ia32": "0.21.5",
-        "@esbuild/linux-loong64": "0.21.5",
-        "@esbuild/linux-mips64el": "0.21.5",
-        "@esbuild/linux-ppc64": "0.21.5",
-        "@esbuild/linux-riscv64": "0.21.5",
-        "@esbuild/linux-s390x": "0.21.5",
-        "@esbuild/linux-x64": "0.21.5",
-        "@esbuild/netbsd-x64": "0.21.5",
-        "@esbuild/openbsd-x64": "0.21.5",
-        "@esbuild/sunos-x64": "0.21.5",
-        "@esbuild/win32-arm64": "0.21.5",
-        "@esbuild/win32-ia32": "0.21.5",
-        "@esbuild/win32-x64": "0.21.5"
-      }
-    },
-    "node_modules/escalade": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
-      "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
-      "peer": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/escape-string-regexp": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
-      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/eslint": {
-      "version": "8.57.0",
-      "resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.57.0.tgz",
-      "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
-      "dev": true,
-      "dependencies": {
-        "@eslint-community/eslint-utils": "^4.2.0",
-        "@eslint-community/regexpp": "^4.6.1",
-        "@eslint/eslintrc": "^2.1.4",
-        "@eslint/js": "8.57.0",
-        "@humanwhocodes/config-array": "^0.11.14",
-        "@humanwhocodes/module-importer": "^1.0.1",
-        "@nodelib/fs.walk": "^1.2.8",
-        "@ungap/structured-clone": "^1.2.0",
-        "ajv": "^6.12.4",
-        "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.2.2",
-        "eslint-visitor-keys": "^3.4.3",
-        "espree": "^9.6.1",
-        "esquery": "^1.4.2",
-        "esutils": "^2.0.2",
-        "fast-deep-equal": "^3.1.3",
-        "file-entry-cache": "^6.0.1",
-        "find-up": "^5.0.0",
-        "glob-parent": "^6.0.2",
-        "globals": "^13.19.0",
-        "graphemer": "^1.4.0",
-        "ignore": "^5.2.0",
-        "imurmurhash": "^0.1.4",
-        "is-glob": "^4.0.0",
-        "is-path-inside": "^3.0.3",
-        "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.3",
-        "strip-ansi": "^6.0.1",
-        "text-table": "^0.2.0"
-      },
-      "bin": {
-        "eslint": "bin/eslint.js"
-      },
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/eslint"
-      }
-    },
-    "node_modules/eslint-plugin-react-hooks": {
-      "version": "4.6.2",
-      "resolved": "https://registry.npmmirror.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz",
-      "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "peerDependencies": {
-        "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
-      }
-    },
-    "node_modules/eslint-plugin-react-refresh": {
-      "version": "0.4.7",
-      "resolved": "https://registry.npmmirror.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.7.tgz",
-      "integrity": "sha512-yrj+KInFmwuQS2UQcg1SF83ha1tuHC1jMQbRNyuWtlEzzKRDgAl7L4Yp4NlDUZTZNlWvHEzOtJhMi40R7JxcSw==",
-      "dev": true,
-      "peerDependencies": {
-        "eslint": ">=7"
-      }
-    },
-    "node_modules/eslint-scope": {
-      "version": "7.2.2",
-      "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz",
-      "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
-      "dev": true,
-      "dependencies": {
-        "esrecurse": "^4.3.0",
-        "estraverse": "^5.2.0"
-      },
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/eslint"
-      }
-    },
-    "node_modules/eslint-visitor-keys": {
-      "version": "3.4.3",
-      "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
-      "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
-      "dev": true,
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/eslint"
-      }
-    },
-    "node_modules/eslint/node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dev": true,
-      "dependencies": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "node_modules/eslint/node_modules/minimatch": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz",
-      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-      "dev": true,
-      "dependencies": {
-        "brace-expansion": "^1.1.7"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/espree": {
-      "version": "9.6.1",
-      "resolved": "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz",
-      "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
-      "dev": true,
-      "dependencies": {
-        "acorn": "^8.9.0",
-        "acorn-jsx": "^5.3.2",
-        "eslint-visitor-keys": "^3.4.1"
-      },
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/eslint"
-      }
-    },
-    "node_modules/esquery": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.5.0.tgz",
-      "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
-      "dev": true,
-      "dependencies": {
-        "estraverse": "^5.1.0"
-      },
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
-    "node_modules/esrecurse": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz",
-      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
-      "dependencies": {
-        "estraverse": "^5.2.0"
-      },
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "node_modules/estraverse": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz",
-      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "node_modules/esutils": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz",
-      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/eventemitter3": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz",
-      "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="
-    },
-    "node_modules/events": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
-      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
-      "peer": true,
-      "engines": {
-        "node": ">=0.8.x"
-      }
-    },
-    "node_modules/fast-deep-equal": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
-    },
-    "node_modules/fast-glob": {
-      "version": "3.3.2",
-      "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz",
-      "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
-      "dev": true,
-      "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"
-      },
-      "engines": {
-        "node": ">=8.6.0"
-      }
-    },
-    "node_modules/fast-glob/node_modules/glob-parent": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
-      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
-      "dev": true,
-      "dependencies": {
-        "is-glob": "^4.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/fast-json-stable-stringify": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
-      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
-    },
-    "node_modules/fast-levenshtein": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-      "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
-      "dev": true
-    },
-    "node_modules/fastq": {
-      "version": "1.17.1",
-      "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.17.1.tgz",
-      "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
-      "dev": true,
-      "dependencies": {
-        "reusify": "^1.0.4"
-      }
-    },
-    "node_modules/fecha": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz",
-      "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw=="
-    },
-    "node_modules/file-entry-cache": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
-      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
-      "dev": true,
-      "dependencies": {
-        "flat-cache": "^3.0.4"
-      },
-      "engines": {
-        "node": "^10.12.0 || >=12.0.0"
-      }
-    },
-    "node_modules/fill-range": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz",
-      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
-      "dev": true,
-      "dependencies": {
-        "to-regex-range": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/find-up": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz",
-      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
-      "dev": true,
-      "dependencies": {
-        "locate-path": "^6.0.0",
-        "path-exists": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/flat-cache": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.2.0.tgz",
-      "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
-      "dev": true,
-      "dependencies": {
-        "flatted": "^3.2.9",
-        "keyv": "^4.5.3",
-        "rimraf": "^3.0.2"
-      },
-      "engines": {
-        "node": "^10.12.0 || >=12.0.0"
-      }
-    },
-    "node_modules/flatted": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.3.1.tgz",
-      "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
-      "dev": true
-    },
-    "node_modules/flru": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/flru/-/flru-1.0.2.tgz",
-      "integrity": "sha512-kWyh8ADvHBFz6ua5xYOPnUroZTT/bwWfrCeL0Wj1dzG4/YOmOcfJ99W8dOVyyynJN35rZ9aCOtHChqQovV7yog==",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/fmin": {
-      "version": "0.0.2",
-      "resolved": "https://registry.npmjs.org/fmin/-/fmin-0.0.2.tgz",
-      "integrity": "sha512-sSi6DzInhl9d8yqssDfGZejChO8d2bAGIpysPsvYsxFe898z89XhCZg6CPNV3nhUhFefeC/AXZK2bAJxlBjN6A==",
-      "dependencies": {
-        "contour_plot": "^0.0.1",
-        "json2module": "^0.0.3",
-        "rollup": "^0.25.8",
-        "tape": "^4.5.1",
-        "uglify-js": "^2.6.2"
-      }
-    },
-    "node_modules/fmin/node_modules/ansi-regex": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-      "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/fmin/node_modules/ansi-styles": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
-      "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/fmin/node_modules/chalk": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-      "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"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/fmin/node_modules/escape-string-regexp": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/fmin/node_modules/rollup": {
-      "version": "0.25.8",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.25.8.tgz",
-      "integrity": "sha512-a2S4Bh3bgrdO4BhKr2E4nZkjTvrJ2m2bWjMTzVYtoqSCn0HnuxosXnaJUHrMEziOWr3CzL9GjilQQKcyCQpJoA==",
-      "dependencies": {
-        "chalk": "^1.1.1",
-        "minimist": "^1.2.0",
-        "source-map-support": "^0.3.2"
-      },
-      "bin": {
-        "rollup": "bin/rollup"
-      }
-    },
-    "node_modules/fmin/node_modules/source-map": {
-      "version": "0.1.32",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz",
-      "integrity": "sha512-htQyLrrRLkQ87Zfrir4/yN+vAUd6DNjVayEjTSHXu29AYQJw57I4/xEL/M6p6E/woPNJwvZt6rVlzc7gFEJccQ==",
-      "dependencies": {
-        "amdefine": ">=0.0.4"
-      },
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/fmin/node_modules/source-map-support": {
-      "version": "0.3.3",
-      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.3.3.tgz",
-      "integrity": "sha512-9O4+y9n64RewmFoKUZ/5Tx9IHIcXM6Q+RTSw6ehnqybUz4a7iwR3Eaw80uLtqqQ5D0C+5H03D4KKGo9PdP33Gg==",
-      "dependencies": {
-        "source-map": "0.1.32"
-      }
-    },
-    "node_modules/fmin/node_modules/strip-ansi": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-      "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
-      "dependencies": {
-        "ansi-regex": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/fmin/node_modules/supports-color": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-      "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==",
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
-    "node_modules/follow-redirects": {
-      "version": "1.15.9",
-      "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.9.tgz",
-      "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
-      "funding": [
-        {
-          "type": "individual",
-          "url": "https://github.com/sponsors/RubenVerborgh"
-        }
-      ],
-      "license": "MIT",
-      "engines": {
-        "node": ">=4.0"
-      },
-      "peerDependenciesMeta": {
-        "debug": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/for-each": {
-      "version": "0.3.3",
-      "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
-      "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
-      "dependencies": {
-        "is-callable": "^1.1.3"
-      }
-    },
-    "node_modules/form-data": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.2.tgz",
-      "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==",
-      "license": "MIT",
-      "dependencies": {
-        "asynckit": "^0.4.0",
-        "combined-stream": "^1.0.8",
-        "es-set-tostringtag": "^2.1.0",
-        "mime-types": "^2.1.12"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/fs.realpath": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
-    },
-    "node_modules/fsevents": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz",
-      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
-      "dev": true,
-      "hasInstallScript": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
-      }
-    },
-    "node_modules/function-bind": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
-      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/function.prototype.name": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
-      "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "define-properties": "^1.2.0",
-        "es-abstract": "^1.22.1",
-        "functions-have-names": "^1.2.3"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/functions-have-names": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
-      "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/get-intrinsic": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
-      "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
-      "license": "MIT",
-      "dependencies": {
-        "call-bind-apply-helpers": "^1.0.2",
-        "es-define-property": "^1.0.1",
-        "es-errors": "^1.3.0",
-        "es-object-atoms": "^1.1.1",
-        "function-bind": "^1.1.2",
-        "get-proto": "^1.0.1",
-        "gopd": "^1.2.0",
-        "has-symbols": "^1.1.0",
-        "hasown": "^2.0.2",
-        "math-intrinsics": "^1.1.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/get-proto": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz",
-      "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
-      "license": "MIT",
-      "dependencies": {
-        "dunder-proto": "^1.0.1",
-        "es-object-atoms": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/get-symbol-description": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
-      "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==",
-      "dependencies": {
-        "call-bind": "^1.0.5",
-        "es-errors": "^1.3.0",
-        "get-intrinsic": "^1.2.4"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/gl-matrix": {
-      "version": "3.4.3",
-      "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz",
-      "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA=="
-    },
-    "node_modules/glob": {
-      "version": "7.2.3",
-      "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz",
-      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
-      "deprecated": "Glob versions prior to v9 are no longer supported",
-      "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"
-      },
-      "engines": {
-        "node": "*"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/glob-parent": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz",
-      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
-      "dev": true,
-      "dependencies": {
-        "is-glob": "^4.0.3"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "node_modules/glob-to-regexp": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
-      "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
-      "peer": true
-    },
-    "node_modules/glob/node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dependencies": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "node_modules/glob/node_modules/minimatch": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz",
-      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-      "dependencies": {
-        "brace-expansion": "^1.1.7"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/globals": {
-      "version": "13.24.0",
-      "resolved": "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz",
-      "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
-      "dev": true,
-      "dependencies": {
-        "type-fest": "^0.20.2"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/globalthis": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
-      "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
-      "dependencies": {
-        "define-properties": "^1.2.1",
-        "gopd": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/globby": {
-      "version": "11.1.0",
-      "resolved": "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz",
-      "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
-      "dev": true,
-      "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"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/gopd": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz",
-      "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/graceful-fs": {
-      "version": "4.2.11",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
-      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
-      "peer": true
-    },
-    "node_modules/graphemer": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz",
-      "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
-      "dev": true
-    },
-    "node_modules/graphlib": {
-      "version": "2.1.8",
-      "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz",
-      "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==",
-      "dependencies": {
-        "lodash": "^4.17.15"
-      }
-    },
-    "node_modules/has": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz",
-      "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==",
-      "engines": {
-        "node": ">= 0.4.0"
-      }
-    },
-    "node_modules/has-ansi": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
-      "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==",
-      "dependencies": {
-        "ansi-regex": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/has-ansi/node_modules/ansi-regex": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-      "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/has-bigints": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
-      "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/has-flag": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
-      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/has-property-descriptors": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
-      "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
-      "dependencies": {
-        "es-define-property": "^1.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/has-proto": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
-      "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/has-symbols": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz",
-      "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/has-tostringtag": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
-      "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
-      "dependencies": {
-        "has-symbols": "^1.0.3"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/hasown": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
-      "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
-      "dependencies": {
-        "function-bind": "^1.1.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/hull.js": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/hull.js/-/hull.js-1.0.6.tgz",
-      "integrity": "sha512-TC7e9sHYOaCVms0sn2hN7buxnaGfcl9h5EPVoVX9DTPoMpqQiS9bf3tmGDgiNaMVHBD91RAvWjCxrJ5Jx8BI5A==",
-      "deprecated": "This package is no longer published on npmjs.com, you are using a deprecated and vulnerable version. Do not use it. Check package homepage on GitHub to see how to fetch the latest version."
-    },
-    "node_modules/iconv-lite": {
-      "version": "0.6.3",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
-      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
-      "dependencies": {
-        "safer-buffer": ">= 2.1.2 < 3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/ignore": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.1.tgz",
-      "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
-      "dev": true,
-      "engines": {
-        "node": ">= 4"
-      }
-    },
-    "node_modules/import-fresh": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz",
-      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
-      "dev": true,
-      "dependencies": {
-        "parent-module": "^1.0.0",
-        "resolve-from": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/imurmurhash": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz",
-      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.8.19"
-      }
-    },
-    "node_modules/inflight": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz",
-      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
-      "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
-      "dependencies": {
-        "once": "^1.3.0",
-        "wrappy": "1"
-      }
-    },
-    "node_modules/inherits": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
-    },
-    "node_modules/internal-slot": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
-      "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==",
-      "dependencies": {
-        "es-errors": "^1.3.0",
-        "hasown": "^2.0.0",
-        "side-channel": "^1.0.4"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/internmap": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
-      "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/is-any-array": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/is-any-array/-/is-any-array-2.0.1.tgz",
-      "integrity": "sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ=="
-    },
-    "node_modules/is-arguments": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
-      "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "has-tostringtag": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-array-buffer": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
-      "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "get-intrinsic": "^1.2.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-arrayish": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
-      "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
-    },
-    "node_modules/is-async-function": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz",
-      "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==",
-      "dependencies": {
-        "has-tostringtag": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-bigint": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
-      "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
-      "dependencies": {
-        "has-bigints": "^1.0.1"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-boolean-object": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
-      "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "has-tostringtag": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-buffer": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
-    },
-    "node_modules/is-callable": {
-      "version": "1.2.7",
-      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
-      "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-core-module": {
-      "version": "2.15.1",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz",
-      "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==",
-      "dependencies": {
-        "hasown": "^2.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-data-view": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz",
-      "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==",
-      "dependencies": {
-        "is-typed-array": "^1.1.13"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-date-object": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
-      "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
-      "dependencies": {
-        "has-tostringtag": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-extglob": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-finalizationregistry": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.0.tgz",
-      "integrity": "sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==",
-      "dependencies": {
-        "call-bind": "^1.0.7"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-generator-function": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
-      "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
-      "dependencies": {
-        "has-tostringtag": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-glob": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
-      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
-      "dev": true,
-      "dependencies": {
-        "is-extglob": "^2.1.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-map": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
-      "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-negative-zero": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
-      "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-number": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz",
-      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.12.0"
-      }
-    },
-    "node_modules/is-number-object": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
-      "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
-      "dependencies": {
-        "has-tostringtag": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-path-inside": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz",
-      "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/is-regex": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
-      "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
-      "dependencies": {
-        "call-bind": "^1.0.2",
-        "has-tostringtag": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-set": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
-      "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-shared-array-buffer": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz",
-      "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==",
-      "dependencies": {
-        "call-bind": "^1.0.7"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-string": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
-      "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
-      "dependencies": {
-        "has-tostringtag": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-symbol": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
-      "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
-      "dependencies": {
-        "has-symbols": "^1.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-typed-array": {
-      "version": "1.1.13",
-      "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
-      "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
-      "dependencies": {
-        "which-typed-array": "^1.1.14"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-weakmap": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
-      "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-weakref": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
-      "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
-      "dependencies": {
-        "call-bind": "^1.0.2"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-weakset": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz",
-      "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==",
-      "dependencies": {
-        "call-bind": "^1.0.7",
-        "get-intrinsic": "^1.2.4"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/isarray": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
-      "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="
-    },
-    "node_modules/isexe": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
-      "dev": true
-    },
-    "node_modules/jest-worker": {
-      "version": "27.5.1",
-      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
-      "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
-      "peer": true,
-      "dependencies": {
-        "@types/node": "*",
-        "merge-stream": "^2.0.0",
-        "supports-color": "^8.0.0"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      }
-    },
-    "node_modules/jest-worker/node_modules/supports-color": {
-      "version": "8.1.1",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
-      "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
-      "peer": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/supports-color?sponsor=1"
-      }
-    },
-    "node_modules/js-tokens": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz",
-      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
-    },
-    "node_modules/js-yaml": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz",
-      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
-      "dev": true,
-      "dependencies": {
-        "argparse": "^2.0.1"
-      },
-      "bin": {
-        "js-yaml": "bin/js-yaml.js"
-      }
-    },
-    "node_modules/json-buffer": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz",
-      "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
-      "dev": true
-    },
-    "node_modules/json-parse-even-better-errors": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
-      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
-      "peer": true
-    },
-    "node_modules/json-schema-traverse": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
-    },
-    "node_modules/json-stable-stringify-without-jsonify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
-      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
-      "dev": true
-    },
-    "node_modules/json2module": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/json2module/-/json2module-0.0.3.tgz",
-      "integrity": "sha512-qYGxqrRrt4GbB8IEOy1jJGypkNsjWoIMlZt4bAsmUScCA507Hbc2p1JOhBzqn45u3PWafUgH2OnzyNU7udO/GA==",
-      "dependencies": {
-        "rw": "^1.3.2"
-      },
-      "bin": {
-        "json2module": "bin/json2module"
-      }
-    },
-    "node_modules/json2mq": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmmirror.com/json2mq/-/json2mq-0.2.0.tgz",
-      "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==",
-      "dependencies": {
-        "string-convert": "^0.2.0"
-      }
-    },
-    "node_modules/json5": {
-      "version": "2.2.3",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
-      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
-      "peer": true,
-      "bin": {
-        "json5": "lib/cli.js"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/keyv": {
-      "version": "4.5.4",
-      "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz",
-      "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
-      "dev": true,
-      "dependencies": {
-        "json-buffer": "3.0.1"
-      }
-    },
-    "node_modules/kind-of": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-      "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
-      "dependencies": {
-        "is-buffer": "^1.1.5"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/lazy-cache": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
-      "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/levn": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz",
-      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
-      "dev": true,
-      "dependencies": {
-        "prelude-ls": "^1.2.1",
-        "type-check": "~0.4.0"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/loader-runner": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
-      "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
-      "peer": true,
-      "engines": {
-        "node": ">=6.11.5"
-      }
-    },
-    "node_modules/loader-utils": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
-      "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
-      "peer": true,
-      "dependencies": {
-        "big.js": "^5.2.2",
-        "emojis-list": "^3.0.0",
-        "json5": "^2.1.2"
-      },
-      "engines": {
-        "node": ">=8.9.0"
-      }
-    },
-    "node_modules/locate-path": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz",
-      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
-      "dev": true,
-      "dependencies": {
-        "p-locate": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/lodash": {
-      "version": "4.17.21",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
-      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
-    },
-    "node_modules/lodash-es": {
-      "version": "4.17.21",
-      "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz",
-      "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
-    },
-    "node_modules/lodash.merge": {
-      "version": "4.6.2",
-      "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz",
-      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
-      "dev": true
-    },
-    "node_modules/longest": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
-      "integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/loose-envify": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz",
-      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
-      "dependencies": {
-        "js-tokens": "^3.0.0 || ^4.0.0"
-      },
-      "bin": {
-        "loose-envify": "cli.js"
-      }
-    },
-    "node_modules/math-intrinsics": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
-      "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/merge-stream": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
-      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
-      "peer": true
-    },
-    "node_modules/merge2": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz",
-      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
-      "dev": true,
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/micromatch": {
-      "version": "4.0.7",
-      "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.7.tgz",
-      "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==",
-      "dev": true,
-      "dependencies": {
-        "braces": "^3.0.3",
-        "picomatch": "^2.3.1"
-      },
-      "engines": {
-        "node": ">=8.6"
-      }
-    },
-    "node_modules/mime-db": {
-      "version": "1.52.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
-      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/mime-types": {
-      "version": "2.1.35",
-      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
-      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
-      "dependencies": {
-        "mime-db": "1.52.0"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/minimatch": {
-      "version": "9.0.4",
-      "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.4.tgz",
-      "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
-      "dev": true,
-      "dependencies": {
-        "brace-expansion": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=16 || 14 >=14.17"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/minimist": {
-      "version": "1.2.8",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
-      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/ml-array-max": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/ml-array-max/-/ml-array-max-1.2.4.tgz",
-      "integrity": "sha512-BlEeg80jI0tW6WaPyGxf5Sa4sqvcyY6lbSn5Vcv44lp1I2GR6AWojfUvLnGTNsIXrZ8uqWmo8VcG1WpkI2ONMQ==",
-      "dependencies": {
-        "is-any-array": "^2.0.0"
-      }
-    },
-    "node_modules/ml-array-min": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/ml-array-min/-/ml-array-min-1.2.3.tgz",
-      "integrity": "sha512-VcZ5f3VZ1iihtrGvgfh/q0XlMobG6GQ8FsNyQXD3T+IlstDv85g8kfV0xUG1QPRO/t21aukaJowDzMTc7j5V6Q==",
-      "dependencies": {
-        "is-any-array": "^2.0.0"
-      }
-    },
-    "node_modules/ml-array-rescale": {
-      "version": "1.3.7",
-      "resolved": "https://registry.npmjs.org/ml-array-rescale/-/ml-array-rescale-1.3.7.tgz",
-      "integrity": "sha512-48NGChTouvEo9KBctDfHC3udWnQKNKEWN0ziELvY3KG25GR5cA8K8wNVzracsqSW1QEkAXjTNx+ycgAv06/1mQ==",
-      "dependencies": {
-        "is-any-array": "^2.0.0",
-        "ml-array-max": "^1.2.4",
-        "ml-array-min": "^1.2.3"
-      }
-    },
-    "node_modules/ml-matrix": {
-      "version": "6.12.0",
-      "resolved": "https://registry.npmjs.org/ml-matrix/-/ml-matrix-6.12.0.tgz",
-      "integrity": "sha512-AGfR+pWaC0GmzjUnB6BfwhndPEUGz0i7QUYdqNuw1zhTov/vSRJ9pP2hs6BoGpaSbtXgrKjZz2zjD1M0xuur6A==",
-      "dependencies": {
-        "is-any-array": "^2.0.1",
-        "ml-array-rescale": "^1.3.7"
-      }
-    },
-    "node_modules/mock-property": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/mock-property/-/mock-property-1.0.3.tgz",
-      "integrity": "sha512-2emPTb1reeLLYwHxyVx993iYyCHEiRRO+y8NFXFPL5kl5q14sgTK76cXyEKkeKCHeRw35SfdkUJ10Q1KfHuiIQ==",
-      "dependencies": {
-        "define-data-property": "^1.1.1",
-        "functions-have-names": "^1.2.3",
-        "gopd": "^1.0.1",
-        "has-property-descriptors": "^1.0.0",
-        "hasown": "^2.0.0",
-        "isarray": "^2.0.5"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-      "dev": true
-    },
-    "node_modules/nanoid": {
-      "version": "3.3.7",
-      "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz",
-      "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/ai"
-        }
-      ],
-      "bin": {
-        "nanoid": "bin/nanoid.cjs"
-      },
-      "engines": {
-        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
-      }
-    },
-    "node_modules/natural-compare": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz",
-      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
-      "dev": true
-    },
-    "node_modules/neo-async": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
-      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
-      "peer": true
-    },
-    "node_modules/node-releases": {
-      "version": "2.0.18",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
-      "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
-      "peer": true
-    },
-    "node_modules/object-assign": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/object-inspect": {
-      "version": "1.12.3",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
-      "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/object-is": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz",
-      "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==",
-      "dependencies": {
-        "call-bind": "^1.0.7",
-        "define-properties": "^1.2.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/object-keys": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
-      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/object.assign": {
-      "version": "4.1.5",
-      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
-      "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
-      "dependencies": {
-        "call-bind": "^1.0.5",
-        "define-properties": "^1.2.1",
-        "has-symbols": "^1.0.3",
-        "object-keys": "^1.1.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz",
-      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
-      "dependencies": {
-        "wrappy": "1"
-      }
-    },
-    "node_modules/optionator": {
-      "version": "0.9.4",
-      "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.4.tgz",
-      "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
-      "dev": true,
-      "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.5"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/p-limit": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz",
-      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
-      "dev": true,
-      "dependencies": {
-        "yocto-queue": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/p-locate": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz",
-      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
-      "dev": true,
-      "dependencies": {
-        "p-limit": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/parent-module": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz",
-      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
-      "dev": true,
-      "dependencies": {
-        "callsites": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/path-exists": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz",
-      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/path-is-absolute": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/path-key": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz",
-      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/path-parse": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
-      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
-    },
-    "node_modules/path-type": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz",
-      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/pdfast": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/pdfast/-/pdfast-0.2.0.tgz",
-      "integrity": "sha512-cq6TTu6qKSFUHwEahi68k/kqN2mfepjkGrG9Un70cgdRRKLKY6Rf8P8uvP2NvZktaQZNF3YE7agEkLj0vGK9bA=="
-    },
-    "node_modules/picocolors": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
-      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
-    },
-    "node_modules/picomatch": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz",
-      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
-      "dev": true,
-      "engines": {
-        "node": ">=8.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/possible-typed-array-names": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
-      "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/postcss": {
-      "version": "8.4.38",
-      "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.38.tgz",
-      "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
-      "funding": [
-        {
-          "type": "opencollective",
-          "url": "https://opencollective.com/postcss/"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/funding/github/npm/postcss"
-        },
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/ai"
-        }
-      ],
-      "dependencies": {
-        "nanoid": "^3.3.7",
-        "picocolors": "^1.0.0",
-        "source-map-js": "^1.2.0"
-      },
-      "engines": {
-        "node": "^10 || ^12 || >=14"
-      }
-    },
-    "node_modules/postcss-value-parser": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
-      "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="
-    },
-    "node_modules/prelude-ls": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz",
-      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/proxy-from-env": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
-      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
-      "license": "MIT"
-    },
-    "node_modules/punycode": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz",
-      "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/qrcode.react": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmmirror.com/qrcode.react/-/qrcode.react-3.1.0.tgz",
-      "integrity": "sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q==",
-      "peerDependencies": {
-        "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
-      }
-    },
-    "node_modules/queue-microtask": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz",
-      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ]
-    },
-    "node_modules/quickselect": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz",
-      "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw=="
-    },
-    "node_modules/randombytes": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
-      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
-      "peer": true,
-      "dependencies": {
-        "safe-buffer": "^5.1.0"
-      }
-    },
-    "node_modules/rbush": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/rbush/-/rbush-3.0.1.tgz",
-      "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==",
-      "dependencies": {
-        "quickselect": "^2.0.0"
-      }
-    },
-    "node_modules/rc-cascader": {
-      "version": "3.26.0",
-      "resolved": "https://registry.npmmirror.com/rc-cascader/-/rc-cascader-3.26.0.tgz",
-      "integrity": "sha512-L1dml383TPSJD1I11YwxuVbmqaJY64psZqFp1ETlgl3LEOwDu76Cyl11fw5dmjJhMlUWwM5dECQfqJgfebhUjg==",
-      "dependencies": {
-        "@babel/runtime": "^7.12.5",
-        "array-tree-filter": "^2.1.0",
-        "classnames": "^2.3.1",
-        "rc-select": "~14.14.0",
-        "rc-tree": "~5.8.1",
-        "rc-util": "^5.37.0"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/rc-checkbox": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmmirror.com/rc-checkbox/-/rc-checkbox-3.3.0.tgz",
-      "integrity": "sha512-Ih3ZaAcoAiFKJjifzwsGiT/f/quIkxJoklW4yKGho14Olulwn8gN7hOBve0/WGDg5o/l/5mL0w7ff7/YGvefVw==",
-      "dependencies": {
-        "@babel/runtime": "^7.10.1",
-        "classnames": "^2.3.2",
-        "rc-util": "^5.25.2"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/rc-collapse": {
-      "version": "3.7.3",
-      "resolved": "https://registry.npmmirror.com/rc-collapse/-/rc-collapse-3.7.3.tgz",
-      "integrity": "sha512-60FJcdTRn0X5sELF18TANwtVi7FtModq649H11mYF1jh83DniMoM4MqY627sEKRCTm4+WXfGDcB7hY5oW6xhyw==",
-      "dependencies": {
-        "@babel/runtime": "^7.10.1",
-        "classnames": "2.x",
-        "rc-motion": "^2.3.4",
-        "rc-util": "^5.27.0"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/rc-dialog": {
-      "version": "9.5.2",
-      "resolved": "https://registry.npmmirror.com/rc-dialog/-/rc-dialog-9.5.2.tgz",
-      "integrity": "sha512-qVUjc8JukG+j/pNaHVSRa2GO2/KbV2thm7yO4hepQ902eGdYK913sGkwg/fh9yhKYV1ql3BKIN2xnud3rEXAPw==",
-      "dependencies": {
-        "@babel/runtime": "^7.10.1",
-        "@rc-component/portal": "^1.0.0-8",
-        "classnames": "^2.2.6",
-        "rc-motion": "^2.3.0",
-        "rc-util": "^5.21.0"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/rc-drawer": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmmirror.com/rc-drawer/-/rc-drawer-7.2.0.tgz",
-      "integrity": "sha512-9lOQ7kBekEJRdEpScHvtmEtXnAsy+NGDXiRWc2ZVC7QXAazNVbeT4EraQKYwCME8BJLa8Bxqxvs5swwyOepRwg==",
-      "dependencies": {
-        "@babel/runtime": "^7.23.9",
-        "@rc-component/portal": "^1.1.1",
-        "classnames": "^2.2.6",
-        "rc-motion": "^2.6.1",
-        "rc-util": "^5.38.1"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/rc-dropdown": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmmirror.com/rc-dropdown/-/rc-dropdown-4.2.0.tgz",
-      "integrity": "sha512-odM8Ove+gSh0zU27DUj5cG1gNKg7mLWBYzB5E4nNLrLwBmYEgYP43vHKDGOVZcJSVElQBI0+jTQgjnq0NfLjng==",
-      "dependencies": {
-        "@babel/runtime": "^7.18.3",
-        "@rc-component/trigger": "^2.0.0",
-        "classnames": "^2.2.6",
-        "rc-util": "^5.17.0"
-      },
-      "peerDependencies": {
-        "react": ">=16.11.0",
-        "react-dom": ">=16.11.0"
-      }
-    },
-    "node_modules/rc-field-form": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmmirror.com/rc-field-form/-/rc-field-form-2.2.1.tgz",
-      "integrity": "sha512-uoNqDoR7A4tn4QTSqoWPAzrR7ZwOK5I+vuZ/qdcHtbKx+ZjEsTg7QXm2wk/jalDiSksAQmATxL0T5LJkRREdIA==",
-      "dependencies": {
-        "@babel/runtime": "^7.18.0",
-        "@rc-component/async-validator": "^5.0.3",
-        "rc-util": "^5.32.2"
-      },
-      "engines": {
-        "node": ">=8.x"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/rc-image": {
-      "version": "7.9.0",
-      "resolved": "https://registry.npmmirror.com/rc-image/-/rc-image-7.9.0.tgz",
-      "integrity": "sha512-l4zqO5E0quuLMCtdKfBgj4Suv8tIS011F5k1zBBlK25iMjjiNHxA0VeTzGFtUZERSA45gvpXDg8/P6qNLjR25g==",
-      "dependencies": {
-        "@babel/runtime": "^7.11.2",
-        "@rc-component/portal": "^1.0.2",
-        "classnames": "^2.2.6",
-        "rc-dialog": "~9.5.2",
-        "rc-motion": "^2.6.2",
-        "rc-util": "^5.34.1"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/rc-input": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmmirror.com/rc-input/-/rc-input-1.5.1.tgz",
-      "integrity": "sha512-+nOzQJDeIfIpNP/SgY45LXSKbuMlp4Yap2y8c+ZpU7XbLmNzUd6+d5/S75sA/52jsVE6S/AkhkkDEAOjIu7i6g==",
-      "dependencies": {
-        "@babel/runtime": "^7.11.1",
-        "classnames": "^2.2.1",
-        "rc-util": "^5.18.1"
-      },
-      "peerDependencies": {
-        "react": ">=16.0.0",
-        "react-dom": ">=16.0.0"
-      }
-    },
-    "node_modules/rc-input-number": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmmirror.com/rc-input-number/-/rc-input-number-9.1.0.tgz",
-      "integrity": "sha512-NqJ6i25Xn/AgYfVxynlevIhX3FuKlMwIFpucGG1h98SlK32wQwDK0zhN9VY32McOmuaqzftduNYWWooWz8pXQA==",
-      "dependencies": {
-        "@babel/runtime": "^7.10.1",
-        "@rc-component/mini-decimal": "^1.0.1",
-        "classnames": "^2.2.5",
-        "rc-input": "~1.5.0",
-        "rc-util": "^5.40.1"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/rc-mentions": {
-      "version": "2.14.0",
-      "resolved": "https://registry.npmmirror.com/rc-mentions/-/rc-mentions-2.14.0.tgz",
-      "integrity": "sha512-qKR59FMuF8PK4ZqsbWX3UuA5P1M/snzyqV6Yt3y1DCFbCEdqUGIBgQp6vEfLCO6Z0RoRFlzXtCeSlBTcDDpg1A==",
-      "dependencies": {
-        "@babel/runtime": "^7.22.5",
-        "@rc-component/trigger": "^2.0.0",
-        "classnames": "^2.2.6",
-        "rc-input": "~1.5.0",
-        "rc-menu": "~9.14.0",
-        "rc-textarea": "~1.7.0",
-        "rc-util": "^5.34.1"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/rc-menu": {
-      "version": "9.14.1",
-      "resolved": "https://registry.npmmirror.com/rc-menu/-/rc-menu-9.14.1.tgz",
-      "integrity": "sha512-5wlRb3M8S4yGlWhSoEYJ7ZVRElyScdcpUHxgiLxkeig1tEdyKrnED3B2fhpN0Rrpdp9jyhnmZR/Lwq2fH5VvDQ==",
-      "dependencies": {
-        "@babel/runtime": "^7.10.1",
-        "@rc-component/trigger": "^2.0.0",
-        "classnames": "2.x",
-        "rc-motion": "^2.4.3",
-        "rc-overflow": "^1.3.1",
-        "rc-util": "^5.27.0"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/rc-motion": {
-      "version": "2.9.2",
-      "resolved": "https://registry.npmmirror.com/rc-motion/-/rc-motion-2.9.2.tgz",
-      "integrity": "sha512-fUAhHKLDdkAXIDLH0GYwof3raS58dtNUmzLF2MeiR8o6n4thNpSDQhOqQzWE4WfFZDCi9VEN8n7tiB7czREcyw==",
-      "dependencies": {
-        "@babel/runtime": "^7.11.1",
-        "classnames": "^2.2.1",
-        "rc-util": "^5.43.0"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/rc-notification": {
-      "version": "5.6.0",
-      "resolved": "https://registry.npmmirror.com/rc-notification/-/rc-notification-5.6.0.tgz",
-      "integrity": "sha512-TGQW5T7waOxLwgJG7fXcw8l7AQiFOjaZ7ISF5PrU526nunHRNcTMuzKihQHaF4E/h/KfOCDk3Mv8eqzbu2e28w==",
-      "dependencies": {
-        "@babel/runtime": "^7.10.1",
-        "classnames": "2.x",
-        "rc-motion": "^2.9.0",
-        "rc-util": "^5.20.1"
-      },
-      "engines": {
-        "node": ">=8.x"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/rc-overflow": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmmirror.com/rc-overflow/-/rc-overflow-1.3.2.tgz",
-      "integrity": "sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw==",
-      "dependencies": {
-        "@babel/runtime": "^7.11.1",
-        "classnames": "^2.2.1",
-        "rc-resize-observer": "^1.0.0",
-        "rc-util": "^5.37.0"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/rc-pagination": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmmirror.com/rc-pagination/-/rc-pagination-4.0.4.tgz",
-      "integrity": "sha512-GGrLT4NgG6wgJpT/hHIpL9nELv27A1XbSZzECIuQBQTVSf4xGKxWr6I/jhpRPauYEWEbWVw22ObG6tJQqwJqWQ==",
-      "dependencies": {
-        "@babel/runtime": "^7.10.1",
-        "classnames": "^2.3.2",
-        "rc-util": "^5.38.0"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/rc-picker": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmmirror.com/rc-picker/-/rc-picker-4.5.0.tgz",
-      "integrity": "sha512-suqz9bzuhBQlf7u+bZd1bJLPzhXpk12w6AjQ9BTPTiFwexVZgUKViG1KNLyfFvW6tCUZZK0HmCCX7JAyM+JnCg==",
-      "dependencies": {
-        "@babel/runtime": "^7.10.1",
-        "@rc-component/trigger": "^2.0.0",
-        "classnames": "^2.2.1",
-        "rc-overflow": "^1.3.2",
-        "rc-resize-observer": "^1.4.0",
-        "rc-util": "^5.38.1"
-      },
-      "engines": {
-        "node": ">=8.x"
-      },
-      "peerDependencies": {
-        "date-fns": ">= 2.x",
-        "dayjs": ">= 1.x",
-        "luxon": ">= 3.x",
-        "moment": ">= 2.x",
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      },
-      "peerDependenciesMeta": {
-        "date-fns": {
-          "optional": true
-        },
-        "dayjs": {
-          "optional": true
-        },
-        "luxon": {
-          "optional": true
-        },
-        "moment": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/rc-progress": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmmirror.com/rc-progress/-/rc-progress-4.0.0.tgz",
-      "integrity": "sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==",
-      "dependencies": {
-        "@babel/runtime": "^7.10.1",
-        "classnames": "^2.2.6",
-        "rc-util": "^5.16.1"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/rc-rate": {
-      "version": "2.13.0",
-      "resolved": "https://registry.npmmirror.com/rc-rate/-/rc-rate-2.13.0.tgz",
-      "integrity": "sha512-oxvx1Q5k5wD30sjN5tqAyWTvJfLNNJn7Oq3IeS4HxWfAiC4BOXMITNAsw7u/fzdtO4MS8Ki8uRLOzcnEuoQiAw==",
-      "dependencies": {
-        "@babel/runtime": "^7.10.1",
-        "classnames": "^2.2.5",
-        "rc-util": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8.x"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/rc-resize-observer": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmmirror.com/rc-resize-observer/-/rc-resize-observer-1.4.0.tgz",
-      "integrity": "sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q==",
-      "dependencies": {
-        "@babel/runtime": "^7.20.7",
-        "classnames": "^2.2.1",
-        "rc-util": "^5.38.0",
-        "resize-observer-polyfill": "^1.5.1"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/rc-segmented": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmmirror.com/rc-segmented/-/rc-segmented-2.3.0.tgz",
-      "integrity": "sha512-I3FtM5Smua/ESXutFfb8gJ8ZPcvFR+qUgeeGFQHBOvRiRKyAk4aBE5nfqrxXx+h8/vn60DQjOt6i4RNtrbOobg==",
-      "dependencies": {
-        "@babel/runtime": "^7.11.1",
-        "classnames": "^2.2.1",
-        "rc-motion": "^2.4.4",
-        "rc-util": "^5.17.0"
-      },
-      "peerDependencies": {
-        "react": ">=16.0.0",
-        "react-dom": ">=16.0.0"
-      }
-    },
-    "node_modules/rc-select": {
-      "version": "14.14.0",
-      "resolved": "https://registry.npmmirror.com/rc-select/-/rc-select-14.14.0.tgz",
-      "integrity": "sha512-Uo2wulrjoPPRLCPd7zlK4ZFVJxlTN//yp1xWP/U+TUOQCyXrT+Duvq/Si5OzVcmQyWAUSbsplc2OwNNhvbOeKQ==",
-      "dependencies": {
-        "@babel/runtime": "^7.10.1",
-        "@rc-component/trigger": "^2.1.1",
-        "classnames": "2.x",
-        "rc-motion": "^2.0.1",
-        "rc-overflow": "^1.3.1",
-        "rc-util": "^5.16.1",
-        "rc-virtual-list": "^3.5.2"
-      },
-      "engines": {
-        "node": ">=8.x"
-      },
-      "peerDependencies": {
-        "react": "*",
-        "react-dom": "*"
-      }
-    },
-    "node_modules/rc-slider": {
-      "version": "10.6.2",
-      "resolved": "https://registry.npmmirror.com/rc-slider/-/rc-slider-10.6.2.tgz",
-      "integrity": "sha512-FjkoFjyvUQWcBo1F3RgSglky3ar0+qHLM41PlFVYB4Bj3RD8E/Mv7kqMouLFBU+3aFglMzzctAIWRwajEuueSw==",
-      "dependencies": {
-        "@babel/runtime": "^7.10.1",
-        "classnames": "^2.2.5",
-        "rc-util": "^5.36.0"
-      },
-      "engines": {
-        "node": ">=8.x"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/rc-steps": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmmirror.com/rc-steps/-/rc-steps-6.0.1.tgz",
-      "integrity": "sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==",
-      "dependencies": {
-        "@babel/runtime": "^7.16.7",
-        "classnames": "^2.2.3",
-        "rc-util": "^5.16.1"
-      },
-      "engines": {
-        "node": ">=8.x"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/rc-switch": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmmirror.com/rc-switch/-/rc-switch-4.1.0.tgz",
-      "integrity": "sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==",
-      "dependencies": {
-        "@babel/runtime": "^7.21.0",
-        "classnames": "^2.2.1",
-        "rc-util": "^5.30.0"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/rc-table": {
-      "version": "7.45.7",
-      "resolved": "https://registry.npmmirror.com/rc-table/-/rc-table-7.45.7.tgz",
-      "integrity": "sha512-wi9LetBL1t1csxyGkMB2p3mCiMt+NDexMlPbXHvQFmBBAsMxrgNSAPwUci2zDLUq9m8QdWc1Nh8suvrpy9mXrg==",
-      "dependencies": {
-        "@babel/runtime": "^7.10.1",
-        "@rc-component/context": "^1.4.0",
-        "classnames": "^2.2.5",
-        "rc-resize-observer": "^1.1.0",
-        "rc-util": "^5.37.0",
-        "rc-virtual-list": "^3.14.2"
-      },
-      "engines": {
-        "node": ">=8.x"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/rc-tabs": {
-      "version": "15.1.1",
-      "resolved": "https://registry.npmmirror.com/rc-tabs/-/rc-tabs-15.1.1.tgz",
-      "integrity": "sha512-Tc7bJvpEdkWIVCUL7yQrMNBJY3j44NcyWS48jF/UKMXuUlzaXK+Z/pEL5LjGcTadtPvVmNqA40yv7hmr+tCOAw==",
-      "dependencies": {
-        "@babel/runtime": "^7.11.2",
-        "classnames": "2.x",
-        "rc-dropdown": "~4.2.0",
-        "rc-menu": "~9.14.0",
-        "rc-motion": "^2.6.2",
-        "rc-resize-observer": "^1.0.0",
-        "rc-util": "^5.34.1"
-      },
-      "engines": {
-        "node": ">=8.x"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/rc-textarea": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmmirror.com/rc-textarea/-/rc-textarea-1.7.0.tgz",
-      "integrity": "sha512-UxizYJkWkmxP3zofXgc487QiGyDmhhheDLLjIWbFtDmiru1ls30KpO8odDaPyqNUIy9ugj5djxTEuezIn6t3Jg==",
-      "dependencies": {
-        "@babel/runtime": "^7.10.1",
-        "classnames": "^2.2.1",
-        "rc-input": "~1.5.0",
-        "rc-resize-observer": "^1.0.0",
-        "rc-util": "^5.27.0"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/rc-tooltip": {
-      "version": "6.2.0",
-      "resolved": "https://registry.npmmirror.com/rc-tooltip/-/rc-tooltip-6.2.0.tgz",
-      "integrity": "sha512-iS/3iOAvtDh9GIx1ulY7EFUXUtktFccNLsARo3NPgLf0QW9oT0w3dA9cYWlhqAKmD+uriEwdWz1kH0Qs4zk2Aw==",
-      "dependencies": {
-        "@babel/runtime": "^7.11.2",
-        "@rc-component/trigger": "^2.0.0",
-        "classnames": "^2.3.1"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/rc-tree": {
-      "version": "5.8.8",
-      "resolved": "https://registry.npmmirror.com/rc-tree/-/rc-tree-5.8.8.tgz",
-      "integrity": "sha512-S+mCMWo91m5AJqjz3PdzKilGgbFm7fFJRFiTDOcoRbD7UfMOPnerXwMworiga0O2XIo383UoWuEfeHs1WOltag==",
-      "dependencies": {
-        "@babel/runtime": "^7.10.1",
-        "classnames": "2.x",
-        "rc-motion": "^2.0.1",
-        "rc-util": "^5.16.1",
-        "rc-virtual-list": "^3.5.1"
-      },
-      "engines": {
-        "node": ">=10.x"
-      },
-      "peerDependencies": {
-        "react": "*",
-        "react-dom": "*"
-      }
-    },
-    "node_modules/rc-tree-select": {
-      "version": "5.21.0",
-      "resolved": "https://registry.npmmirror.com/rc-tree-select/-/rc-tree-select-5.21.0.tgz",
-      "integrity": "sha512-w+9qEu6zh0G3wt9N/hzWNSnqYH1i9mH1Nqxo0caxLRRFXF5yZWYmpCDoDTMdQM1Y4z3Q5yj08qyrPH/d4AtumA==",
-      "dependencies": {
-        "@babel/runtime": "^7.10.1",
-        "classnames": "2.x",
-        "rc-select": "~14.14.0",
-        "rc-tree": "~5.8.1",
-        "rc-util": "^5.16.1"
-      },
-      "peerDependencies": {
-        "react": "*",
-        "react-dom": "*"
-      }
-    },
-    "node_modules/rc-upload": {
-      "version": "4.5.2",
-      "resolved": "https://registry.npmmirror.com/rc-upload/-/rc-upload-4.5.2.tgz",
-      "integrity": "sha512-QO3ne77DwnAPKFn0bA5qJM81QBjQi0e0NHdkvpFyY73Bea2NfITiotqJqVjHgeYPOJu5lLVR32TNGP084aSoXA==",
-      "dependencies": {
-        "@babel/runtime": "^7.18.3",
-        "classnames": "^2.2.5",
-        "rc-util": "^5.2.0"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/rc-util": {
-      "version": "5.43.0",
-      "resolved": "https://registry.npmmirror.com/rc-util/-/rc-util-5.43.0.tgz",
-      "integrity": "sha512-AzC7KKOXFqAdIBqdGWepL9Xn7cm3vnAmjlHqUnoQaTMZYhM4VlXGLkkHHxj/BZ7Td0+SOPKB4RGPboBVKT9htw==",
-      "dependencies": {
-        "@babel/runtime": "^7.18.3",
-        "react-is": "^18.2.0"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/rc-virtual-list": {
-      "version": "3.14.3",
-      "resolved": "https://registry.npmmirror.com/rc-virtual-list/-/rc-virtual-list-3.14.3.tgz",
-      "integrity": "sha512-6+6wiEhdqakNBnbRJymgMlh+90qpkgqherTRo1l1cX7mK6F9hWsazPczmP0lA+64yhC9/t+M9Dh5pjvDWimn8A==",
-      "dependencies": {
-        "@babel/runtime": "^7.20.0",
-        "classnames": "^2.2.6",
-        "rc-resize-observer": "^1.0.0",
-        "rc-util": "^5.36.0"
-      },
-      "engines": {
-        "node": ">=8.x"
-      },
-      "peerDependencies": {
-        "react": ">=16.9.0",
-        "react-dom": ">=16.9.0"
-      }
-    },
-    "node_modules/react": {
-      "version": "18.3.1",
-      "resolved": "https://registry.npmmirror.com/react/-/react-18.3.1.tgz",
-      "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
-      "dependencies": {
-        "loose-envify": "^1.1.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/react-dom": {
-      "version": "18.3.1",
-      "resolved": "https://registry.npmmirror.com/react-dom/-/react-dom-18.3.1.tgz",
-      "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
-      "dependencies": {
-        "loose-envify": "^1.1.0",
-        "scheduler": "^0.23.2"
-      },
-      "peerDependencies": {
-        "react": "^18.3.1"
-      }
-    },
-    "node_modules/react-is": {
-      "version": "18.3.1",
-      "resolved": "https://registry.npmmirror.com/react-is/-/react-is-18.3.1.tgz",
-      "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="
-    },
-    "node_modules/react-router": {
-      "version": "6.23.1",
-      "resolved": "https://registry.npmmirror.com/react-router/-/react-router-6.23.1.tgz",
-      "integrity": "sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ==",
-      "dependencies": {
-        "@remix-run/router": "1.16.1"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      },
-      "peerDependencies": {
-        "react": ">=16.8"
-      }
-    },
-    "node_modules/react-router-dom": {
-      "version": "6.23.1",
-      "resolved": "https://registry.npmmirror.com/react-router-dom/-/react-router-dom-6.23.1.tgz",
-      "integrity": "sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ==",
-      "dependencies": {
-        "@remix-run/router": "1.16.1",
-        "react-router": "6.23.1"
-      },
-      "engines": {
-        "node": ">=14.0.0"
-      },
-      "peerDependencies": {
-        "react": ">=16.8",
-        "react-dom": ">=16.8"
-      }
-    },
-    "node_modules/reflect.getprototypeof": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.7.tgz",
-      "integrity": "sha512-bMvFGIUKlc/eSfXNX+aZ+EL95/EgZzuwA0OBPTbZZDEJw/0AkentjMuM1oiRfwHrshqk4RzdgiTg5CcDalXN5g==",
-      "dependencies": {
-        "call-bind": "^1.0.7",
-        "define-properties": "^1.2.1",
-        "es-abstract": "^1.23.5",
-        "es-errors": "^1.3.0",
-        "get-intrinsic": "^1.2.4",
-        "gopd": "^1.0.1",
-        "which-builtin-type": "^1.1.4"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/regenerator-runtime": {
-      "version": "0.14.1",
-      "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
-      "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
-    },
-    "node_modules/regexp.prototype.flags": {
-      "version": "1.5.3",
-      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz",
-      "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==",
-      "dependencies": {
-        "call-bind": "^1.0.7",
-        "define-properties": "^1.2.1",
-        "es-errors": "^1.3.0",
-        "set-function-name": "^2.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/repeat-string": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
-      "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==",
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
-    "node_modules/resize-observer-polyfill": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmmirror.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
-      "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
-    },
-    "node_modules/resolve": {
-      "version": "1.22.8",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
-      "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
-      "dependencies": {
-        "is-core-module": "^2.13.0",
-        "path-parse": "^1.0.7",
-        "supports-preserve-symlinks-flag": "^1.0.0"
-      },
-      "bin": {
-        "resolve": "bin/resolve"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/resolve-from": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz",
-      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/reusify": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz",
-      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
-      "dev": true,
-      "engines": {
-        "iojs": ">=1.0.0",
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/right-align": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
-      "integrity": "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==",
-      "dependencies": {
-        "align-text": "^0.1.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/rimraf": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz",
-      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-      "deprecated": "Rimraf versions prior to v4 are no longer supported",
-      "dev": true,
-      "dependencies": {
-        "glob": "^7.1.3"
-      },
-      "bin": {
-        "rimraf": "bin.js"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/rollup": {
-      "version": "4.18.0",
-      "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.18.0.tgz",
-      "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==",
-      "dev": true,
-      "dependencies": {
-        "@types/estree": "1.0.5"
-      },
-      "bin": {
-        "rollup": "dist/bin/rollup"
-      },
-      "engines": {
-        "node": ">=18.0.0",
-        "npm": ">=8.0.0"
-      },
-      "optionalDependencies": {
-        "@rollup/rollup-android-arm-eabi": "4.18.0",
-        "@rollup/rollup-android-arm64": "4.18.0",
-        "@rollup/rollup-darwin-arm64": "4.18.0",
-        "@rollup/rollup-darwin-x64": "4.18.0",
-        "@rollup/rollup-linux-arm-gnueabihf": "4.18.0",
-        "@rollup/rollup-linux-arm-musleabihf": "4.18.0",
-        "@rollup/rollup-linux-arm64-gnu": "4.18.0",
-        "@rollup/rollup-linux-arm64-musl": "4.18.0",
-        "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0",
-        "@rollup/rollup-linux-riscv64-gnu": "4.18.0",
-        "@rollup/rollup-linux-s390x-gnu": "4.18.0",
-        "@rollup/rollup-linux-x64-gnu": "4.18.0",
-        "@rollup/rollup-linux-x64-musl": "4.18.0",
-        "@rollup/rollup-win32-arm64-msvc": "4.18.0",
-        "@rollup/rollup-win32-ia32-msvc": "4.18.0",
-        "@rollup/rollup-win32-x64-msvc": "4.18.0",
-        "fsevents": "~2.3.2"
-      }
-    },
-    "node_modules/run-parallel": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz",
-      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "dependencies": {
-        "queue-microtask": "^1.2.2"
-      }
-    },
-    "node_modules/rw": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",
-      "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="
-    },
-    "node_modules/safe-array-concat": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz",
-      "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==",
-      "dependencies": {
-        "call-bind": "^1.0.7",
-        "get-intrinsic": "^1.2.4",
-        "has-symbols": "^1.0.3",
-        "isarray": "^2.0.5"
-      },
-      "engines": {
-        "node": ">=0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/safe-buffer": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "peer": true
-    },
-    "node_modules/safe-regex-test": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz",
-      "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==",
-      "dependencies": {
-        "call-bind": "^1.0.6",
-        "es-errors": "^1.3.0",
-        "is-regex": "^1.1.4"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/safer-buffer": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
-    },
-    "node_modules/scheduler": {
-      "version": "0.23.2",
-      "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.2.tgz",
-      "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
-      "dependencies": {
-        "loose-envify": "^1.1.0"
-      }
-    },
-    "node_modules/schema-utils": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
-      "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
-      "peer": true,
-      "dependencies": {
-        "@types/json-schema": "^7.0.8",
-        "ajv": "^6.12.5",
-        "ajv-keywords": "^3.5.2"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      }
-    },
-    "node_modules/scroll-into-view-if-needed": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz",
-      "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==",
-      "dependencies": {
-        "compute-scroll-into-view": "^3.0.2"
-      }
-    },
-    "node_modules/semver": {
-      "version": "7.6.2",
-      "resolved": "https://registry.npmmirror.com/semver/-/semver-7.6.2.tgz",
-      "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
-      "dev": true,
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/serialize-javascript": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
-      "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
-      "peer": true,
-      "dependencies": {
-        "randombytes": "^2.1.0"
-      }
-    },
-    "node_modules/set-function-length": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
-      "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
-      "dependencies": {
-        "define-data-property": "^1.1.4",
-        "es-errors": "^1.3.0",
-        "function-bind": "^1.1.2",
-        "get-intrinsic": "^1.2.4",
-        "gopd": "^1.0.1",
-        "has-property-descriptors": "^1.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/set-function-name": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
-      "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
-      "dependencies": {
-        "define-data-property": "^1.1.4",
-        "es-errors": "^1.3.0",
-        "functions-have-names": "^1.2.3",
-        "has-property-descriptors": "^1.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/shallowequal": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
-      "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="
-    },
-    "node_modules/shebang-command": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz",
-      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
-      "dev": true,
-      "dependencies": {
-        "shebang-regex": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/shebang-regex": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz",
-      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/side-channel": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
-      "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
-      "dependencies": {
-        "call-bind": "^1.0.7",
-        "es-errors": "^1.3.0",
-        "get-intrinsic": "^1.2.4",
-        "object-inspect": "^1.13.1"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/side-channel/node_modules/object-inspect": {
-      "version": "1.13.3",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz",
-      "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/simple-swizzle": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
-      "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
-      "dependencies": {
-        "is-arrayish": "^0.3.1"
-      }
-    },
-    "node_modules/slash": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz",
-      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/source-map": {
-      "version": "0.5.7",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-      "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/source-map-js": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.0.tgz",
-      "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/source-map-support": {
-      "version": "0.5.21",
-      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
-      "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
-      "peer": true,
-      "dependencies": {
-        "buffer-from": "^1.0.0",
-        "source-map": "^0.6.0"
-      }
-    },
-    "node_modules/source-map-support/node_modules/source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "peer": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/string-convert": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmmirror.com/string-convert/-/string-convert-0.2.1.tgz",
-      "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A=="
-    },
-    "node_modules/string.prototype.trim": {
-      "version": "1.2.9",
-      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz",
-      "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==",
-      "dependencies": {
-        "call-bind": "^1.0.7",
-        "define-properties": "^1.2.1",
-        "es-abstract": "^1.23.0",
-        "es-object-atoms": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/string.prototype.trimend": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz",
-      "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==",
-      "dependencies": {
-        "call-bind": "^1.0.7",
-        "define-properties": "^1.2.1",
-        "es-object-atoms": "^1.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/string.prototype.trimstart": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
-      "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
-      "dependencies": {
-        "call-bind": "^1.0.7",
-        "define-properties": "^1.2.1",
-        "es-object-atoms": "^1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/strip-ansi": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-regex": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/strip-json-comments": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
-      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/styled-components": {
-      "version": "6.1.13",
-      "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.13.tgz",
-      "integrity": "sha512-M0+N2xSnAtwcVAQeFEsGWFFxXDftHUD7XrKla06QbpUMmbmtFBMMTcKWvFXtWxuD5qQkB8iU5gk6QASlx2ZRMw==",
-      "dependencies": {
-        "@emotion/is-prop-valid": "1.2.2",
-        "@emotion/unitless": "0.8.1",
-        "@types/stylis": "4.2.5",
-        "css-to-react-native": "3.2.0",
-        "csstype": "3.1.3",
-        "postcss": "8.4.38",
-        "shallowequal": "1.1.0",
-        "stylis": "4.3.2",
-        "tslib": "2.6.2"
-      },
-      "engines": {
-        "node": ">= 16"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/styled-components"
-      },
-      "peerDependencies": {
-        "react": ">= 16.8.0",
-        "react-dom": ">= 16.8.0"
-      }
-    },
-    "node_modules/styled-components/node_modules/@emotion/unitless": {
-      "version": "0.8.1",
-      "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz",
-      "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ=="
-    },
-    "node_modules/styled-components/node_modules/tslib": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
-      "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
-    },
-    "node_modules/stylis": {
-      "version": "4.3.2",
-      "resolved": "https://registry.npmmirror.com/stylis/-/stylis-4.3.2.tgz",
-      "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg=="
-    },
-    "node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/supports-preserve-symlinks-flag": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
-      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/svg-path-parser": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/svg-path-parser/-/svg-path-parser-1.1.0.tgz",
-      "integrity": "sha512-jGCUqcQyXpfe38R7RFfhrMyfXcBmpMNJI/B+4CE9/Unkh98UporAc461GTthv+TVDuZXsBx7/WiwJb1Oh4tt4A=="
-    },
-    "node_modules/tapable": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
-      "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
-      "peer": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/tape": {
-      "version": "4.17.0",
-      "resolved": "https://registry.npmjs.org/tape/-/tape-4.17.0.tgz",
-      "integrity": "sha512-KCuXjYxCZ3ru40dmND+oCLsXyuA8hoseu2SS404Px5ouyS0A99v8X/mdiLqsR5MTAyamMBN7PRwt2Dv3+xGIxw==",
-      "dependencies": {
-        "@ljharb/resumer": "~0.0.1",
-        "@ljharb/through": "~2.3.9",
-        "call-bind": "~1.0.2",
-        "deep-equal": "~1.1.1",
-        "defined": "~1.0.1",
-        "dotignore": "~0.1.2",
-        "for-each": "~0.3.3",
-        "glob": "~7.2.3",
-        "has": "~1.0.3",
-        "inherits": "~2.0.4",
-        "is-regex": "~1.1.4",
-        "minimist": "~1.2.8",
-        "mock-property": "~1.0.0",
-        "object-inspect": "~1.12.3",
-        "resolve": "~1.22.6",
-        "string.prototype.trim": "~1.2.8"
-      },
-      "bin": {
-        "tape": "bin/tape"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/terser": {
-      "version": "5.36.0",
-      "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz",
-      "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==",
-      "peer": true,
-      "dependencies": {
-        "@jridgewell/source-map": "^0.3.3",
-        "acorn": "^8.8.2",
-        "commander": "^2.20.0",
-        "source-map-support": "~0.5.20"
-      },
-      "bin": {
-        "terser": "bin/terser"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/terser-webpack-plugin": {
-      "version": "5.3.10",
-      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz",
-      "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==",
-      "peer": true,
-      "dependencies": {
-        "@jridgewell/trace-mapping": "^0.3.20",
-        "jest-worker": "^27.4.5",
-        "schema-utils": "^3.1.1",
-        "serialize-javascript": "^6.0.1",
-        "terser": "^5.26.0"
-      },
-      "engines": {
-        "node": ">= 10.13.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      },
-      "peerDependencies": {
-        "webpack": "^5.1.0"
-      },
-      "peerDependenciesMeta": {
-        "@swc/core": {
-          "optional": true
-        },
-        "esbuild": {
-          "optional": true
-        },
-        "uglify-js": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/terser/node_modules/commander": {
-      "version": "2.20.3",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
-      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
-      "peer": true
-    },
-    "node_modules/text-table": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz",
-      "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
-      "dev": true
-    },
-    "node_modules/throttle-debounce": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmmirror.com/throttle-debounce/-/throttle-debounce-5.0.0.tgz",
-      "integrity": "sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==",
-      "engines": {
-        "node": ">=12.22"
-      }
-    },
-    "node_modules/to-regex-range": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
-      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
-      "dev": true,
-      "dependencies": {
-        "is-number": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=8.0"
-      }
-    },
-    "node_modules/toggle-selection": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmmirror.com/toggle-selection/-/toggle-selection-1.0.6.tgz",
-      "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ=="
-    },
-    "node_modules/ts-api-utils": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
-      "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=16"
-      },
-      "peerDependencies": {
-        "typescript": ">=4.2.0"
-      }
-    },
-    "node_modules/tslib": {
-      "version": "2.8.1",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
-      "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
-    },
-    "node_modules/type-check": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz",
-      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
-      "dev": true,
-      "dependencies": {
-        "prelude-ls": "^1.2.1"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/type-fest": {
-      "version": "0.20.2",
-      "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz",
-      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/typed-array-buffer": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz",
-      "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==",
-      "dependencies": {
-        "call-bind": "^1.0.7",
-        "es-errors": "^1.3.0",
-        "is-typed-array": "^1.1.13"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/typed-array-byte-length": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz",
-      "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==",
-      "dependencies": {
-        "call-bind": "^1.0.7",
-        "for-each": "^0.3.3",
-        "gopd": "^1.0.1",
-        "has-proto": "^1.0.3",
-        "is-typed-array": "^1.1.13"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/typed-array-byte-offset": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.3.tgz",
-      "integrity": "sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==",
-      "dependencies": {
-        "available-typed-arrays": "^1.0.7",
-        "call-bind": "^1.0.7",
-        "for-each": "^0.3.3",
-        "gopd": "^1.0.1",
-        "has-proto": "^1.0.3",
-        "is-typed-array": "^1.1.13",
-        "reflect.getprototypeof": "^1.0.6"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/typed-array-length": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz",
-      "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==",
-      "dependencies": {
-        "call-bind": "^1.0.7",
-        "for-each": "^0.3.3",
-        "gopd": "^1.0.1",
-        "is-typed-array": "^1.1.13",
-        "possible-typed-array-names": "^1.0.0",
-        "reflect.getprototypeof": "^1.0.6"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/typescript": {
-      "version": "5.5.2",
-      "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.5.2.tgz",
-      "integrity": "sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==",
-      "dev": true,
-      "bin": {
-        "tsc": "bin/tsc",
-        "tsserver": "bin/tsserver"
-      },
-      "engines": {
-        "node": ">=14.17"
-      }
-    },
-    "node_modules/uglify-js": {
-      "version": "2.8.29",
-      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
-      "integrity": "sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==",
-      "dependencies": {
-        "source-map": "~0.5.1",
-        "yargs": "~3.10.0"
-      },
-      "bin": {
-        "uglifyjs": "bin/uglifyjs"
-      },
-      "engines": {
-        "node": ">=0.8.0"
-      },
-      "optionalDependencies": {
-        "uglify-to-browserify": "~1.0.0"
-      }
-    },
-    "node_modules/uglify-to-browserify": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
-      "integrity": "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==",
-      "optional": true
-    },
-    "node_modules/unbox-primitive": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
-      "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"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/undici-types": {
-      "version": "6.21.0",
-      "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz",
-      "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
-      "license": "MIT"
-    },
-    "node_modules/update-browserslist-db": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz",
-      "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==",
-      "funding": [
-        {
-          "type": "opencollective",
-          "url": "https://opencollective.com/browserslist"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/funding/github/npm/browserslist"
-        },
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/ai"
-        }
-      ],
-      "peer": true,
-      "dependencies": {
-        "escalade": "^3.2.0",
-        "picocolors": "^1.1.0"
-      },
-      "bin": {
-        "update-browserslist-db": "cli.js"
-      },
-      "peerDependencies": {
-        "browserslist": ">= 4.21.0"
-      }
-    },
-    "node_modules/uri-js": {
-      "version": "4.4.1",
-      "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz",
-      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
-      "dependencies": {
-        "punycode": "^2.1.0"
-      }
-    },
-    "node_modules/use-sync-external-store": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmmirror.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
-      "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
-      "peerDependencies": {
-        "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
-      }
-    },
-    "node_modules/vite": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmmirror.com/vite/-/vite-5.3.1.tgz",
-      "integrity": "sha512-XBmSKRLXLxiaPYamLv3/hnP/KXDai1NDexN0FpkTaZXTfycHvkRHoenpgl/fvuK/kPbB6xAgoyiryAhQNxYmAQ==",
-      "dev": true,
-      "dependencies": {
-        "esbuild": "^0.21.3",
-        "postcss": "^8.4.38",
-        "rollup": "^4.13.0"
-      },
-      "bin": {
-        "vite": "bin/vite.js"
-      },
-      "engines": {
-        "node": "^18.0.0 || >=20.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/vitejs/vite?sponsor=1"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.3"
-      },
-      "peerDependencies": {
-        "@types/node": "^18.0.0 || >=20.0.0",
-        "less": "*",
-        "lightningcss": "^1.21.0",
-        "sass": "*",
-        "stylus": "*",
-        "sugarss": "*",
-        "terser": "^5.4.0"
-      },
-      "peerDependenciesMeta": {
-        "@types/node": {
-          "optional": true
-        },
-        "less": {
-          "optional": true
-        },
-        "lightningcss": {
-          "optional": true
-        },
-        "sass": {
-          "optional": true
-        },
-        "stylus": {
-          "optional": true
-        },
-        "sugarss": {
-          "optional": true
-        },
-        "terser": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/watchpack": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz",
-      "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==",
-      "peer": true,
-      "dependencies": {
-        "glob-to-regexp": "^0.4.1",
-        "graceful-fs": "^4.1.2"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "node_modules/webpack": {
-      "version": "5.96.1",
-      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz",
-      "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==",
-      "peer": true,
-      "dependencies": {
-        "@types/eslint-scope": "^3.7.7",
-        "@types/estree": "^1.0.6",
-        "@webassemblyjs/ast": "^1.12.1",
-        "@webassemblyjs/wasm-edit": "^1.12.1",
-        "@webassemblyjs/wasm-parser": "^1.12.1",
-        "acorn": "^8.14.0",
-        "browserslist": "^4.24.0",
-        "chrome-trace-event": "^1.0.2",
-        "enhanced-resolve": "^5.17.1",
-        "es-module-lexer": "^1.2.1",
-        "eslint-scope": "5.1.1",
-        "events": "^3.2.0",
-        "glob-to-regexp": "^0.4.1",
-        "graceful-fs": "^4.2.11",
-        "json-parse-even-better-errors": "^2.3.1",
-        "loader-runner": "^4.2.0",
-        "mime-types": "^2.1.27",
-        "neo-async": "^2.6.2",
-        "schema-utils": "^3.2.0",
-        "tapable": "^2.1.1",
-        "terser-webpack-plugin": "^5.3.10",
-        "watchpack": "^2.4.1",
-        "webpack-sources": "^3.2.3"
-      },
-      "bin": {
-        "webpack": "bin/webpack.js"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/webpack"
-      },
-      "peerDependenciesMeta": {
-        "webpack-cli": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/webpack-sources": {
-      "version": "3.2.3",
-      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
-      "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
-      "peer": true,
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "node_modules/webpack/node_modules/@types/estree": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
-      "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
-      "peer": true
-    },
-    "node_modules/webpack/node_modules/eslint-scope": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
-      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
-      "peer": true,
-      "dependencies": {
-        "esrecurse": "^4.3.0",
-        "estraverse": "^4.1.1"
-      },
-      "engines": {
-        "node": ">=8.0.0"
-      }
-    },
-    "node_modules/webpack/node_modules/estraverse": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
-      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
-      "peer": true,
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "node_modules/which": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz",
-      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-      "dev": true,
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "node-which": "bin/node-which"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/which-boxed-primitive": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
-      "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"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/which-builtin-type": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.0.tgz",
-      "integrity": "sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA==",
-      "dependencies": {
-        "call-bind": "^1.0.7",
-        "function.prototype.name": "^1.1.6",
-        "has-tostringtag": "^1.0.2",
-        "is-async-function": "^2.0.0",
-        "is-date-object": "^1.0.5",
-        "is-finalizationregistry": "^1.1.0",
-        "is-generator-function": "^1.0.10",
-        "is-regex": "^1.1.4",
-        "is-weakref": "^1.0.2",
-        "isarray": "^2.0.5",
-        "which-boxed-primitive": "^1.0.2",
-        "which-collection": "^1.0.2",
-        "which-typed-array": "^1.1.15"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/which-collection": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
-      "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
-      "dependencies": {
-        "is-map": "^2.0.3",
-        "is-set": "^2.0.3",
-        "is-weakmap": "^2.0.2",
-        "is-weakset": "^2.0.3"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/which-typed-array": {
-      "version": "1.1.15",
-      "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",
-      "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==",
-      "dependencies": {
-        "available-typed-arrays": "^1.0.7",
-        "call-bind": "^1.0.7",
-        "for-each": "^0.3.3",
-        "gopd": "^1.0.1",
-        "has-tostringtag": "^1.0.2"
-      },
-      "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/window-size": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
-      "integrity": "sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==",
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/word-wrap": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz",
-      "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/wordwrap": {
-      "version": "0.0.2",
-      "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
-      "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==",
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/workerize-loader": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/workerize-loader/-/workerize-loader-2.0.2.tgz",
-      "integrity": "sha512-HoZ6XY4sHWxA2w0WpzgBwUiR3dv1oo7bS+oCwIpb6n54MclQ/7KXdXsVIChTCygyuHtVuGBO1+i3HzTt699UJQ==",
-      "peer": true,
-      "dependencies": {
-        "loader-utils": "^2.0.0"
-      },
-      "peerDependencies": {
-        "webpack": "*"
-      }
-    },
-    "node_modules/wrappy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
-    },
-    "node_modules/yargs": {
-      "version": "3.10.0",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
-      "integrity": "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==",
-      "dependencies": {
-        "camelcase": "^1.0.2",
-        "cliui": "^2.1.0",
-        "decamelize": "^1.0.0",
-        "window-size": "0.1.0"
-      }
-    },
-    "node_modules/yocto-queue": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz",
-      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/zustand": {
-      "version": "4.5.2",
-      "resolved": "https://registry.npmmirror.com/zustand/-/zustand-4.5.2.tgz",
-      "integrity": "sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==",
-      "dependencies": {
-        "use-sync-external-store": "1.2.0"
-      },
-      "engines": {
-        "node": ">=12.7.0"
-      },
-      "peerDependencies": {
-        "@types/react": ">=16.8",
-        "immer": ">=9.0.6",
-        "react": ">=16.8"
-      },
-      "peerDependenciesMeta": {
-        "@types/react": {
-          "optional": true
-        },
-        "immer": {
-          "optional": true
-        },
-        "react": {
-          "optional": true
-        }
-      }
-    }
-  }
-}

+ 16 - 8
package.json

@@ -1,37 +1,45 @@
 {
   "name": "react-admin-dashboard",
-  "private": true,
   "version": "0.0.0",
   "type": "module",
   "scripts": {
     "dev": "vite",
+    "build:test": "tsc && vite build --config vite.test.config.ts",
     "build": "tsc && vite build",
     "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
     "preview": "vite preview"
   },
   "dependencies": {
     "@ant-design/charts": "^2.2.3",
+    "@tailwindcss/cli": "^4.1.3",
     "antd": "^5.18.3",
     "axios": "^1.8.4",
     "lodash-es": "^4.17.21",
     "react": "^18.3.1",
     "react-dom": "^18.3.1",
     "react-router-dom": "^6.23.1",
-    "vite-plugin-svgr": "^4.3.0",
     "zustand": "^4.5.2"
   },
   "devDependencies": {
+    "@eslint/js": "^9.24.0",
+    "@tailwindcss/postcss": "^4.1.3",
     "@types/lodash-es": "^4.17.12",
     "@types/node": "^22.14.0",
     "@types/react": "^18.3.3",
     "@types/react-dom": "^18.3.0",
-    "@typescript-eslint/eslint-plugin": "^7.13.1",
-    "@typescript-eslint/parser": "^7.13.1",
+    "@typescript-eslint/parser": "^6.0.0",
     "@vitejs/plugin-react-swc": "^3.5.0",
-    "eslint": "^8.57.0",
-    "eslint-plugin-react-hooks": "^4.6.2",
-    "eslint-plugin-react-refresh": "^0.4.7",
+    "autoprefixer": "^10.4.21",
+    "eslint": "^8.45.0",
+    "eslint-plugin-react-hooks": "^4.6.0",
+    "eslint-plugin-react-refresh": "^0.4.3",
+    "globals": "^16.0.0",
+    "postcss": "^8.5.3",
+    "postcss-preset-env": "^10.1.5",
+    "tailwindcss": "^4.1.3",
     "typescript": "^5.2.2",
-    "vite": "^5.3.1"
+    "typescript-eslint": "^8.29.1",
+    "vite": "^5.3.1",
+    "vite-plugin-svgr": "^4.3.0"
   }
 }

+ 7 - 0
postcss.config.js

@@ -0,0 +1,7 @@
+import postcssPresetEnv from 'postcss-preset-env'
+
+export default {
+  plugins: {
+    "@tailwindcss/postcss": {},
+  }
+}

+ 22 - 0
public/logo.svg

@@ -0,0 +1,22 @@
+<svg width="40" height="22" viewBox="0 0 40 22" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M10.9837 13.96C8.8941 13.96 7.19392 12.2598 7.19392 10.1698C7.19392 8.08019 8.8941 6.38001 10.9837 6.38001C13.0734 6.38001 14.7737 8.08019 14.7737 10.1702C14.7737 12.2598 13.0734 13.96 10.9837 13.96M10.9837 1.55679C7.85482 1.55679 5.11017 3.23411 3.60178 5.73679C3.49714 5.70715 3.38696 5.69108 3.27303 5.69108C2.60714 5.69108 2.06714 6.2309 2.06714 6.89679V19.0995C2.06714 19.7654 2.60714 20.3052 3.27303 20.3052C3.9391 20.3052 4.47875 19.7654 4.47875 19.0995V15.8098C6.05928 17.6304 8.38946 18.7834 10.9837 18.7834C15.7332 18.7834 19.597 14.9197 19.597 10.1698C19.597 5.42054 15.7332 1.55679 10.9837 1.55679" fill="#DD134E"/>
+<mask id="mask0_0_145" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="18" height="21">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M7.62939e-05 0.178619H17.5299V20.3916H7.62939e-05V0.178619Z" fill="white"/>
+</mask>
+<g mask="url(#mask0_0_145)">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M17.5286 8.64969C17.4526 3.95808 13.6261 0.178619 8.9165 0.178619C5.7815 0.178619 3.03793 1.8538 1.53133 4.35773C1.42775 4.3288 1.31883 4.31291 1.20597 4.31291C0.539898 4.31291 7.62939e-05 4.85273 7.62939e-05 5.5188V19.1858C7.62939e-05 19.8517 0.539898 20.3917 1.20597 20.3917C1.87186 20.3917 2.41168 19.8517 2.41168 19.1858V14.4372C3.99079 16.2554 6.31936 17.4054 8.9165 17.4054C13.6735 17.4054 17.5299 13.5492 17.5299 8.79201L17.5286 8.64969Z" fill="#53BFD5"/>
+</g>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M9.73847 13.4661C7.64865 13.4661 5.94847 11.766 5.94847 9.67596C5.94847 7.58632 7.64865 5.88614 9.73847 5.88614C11.8281 5.88614 13.5283 7.58632 13.5283 9.67632C13.5283 11.766 11.8281 13.4661 9.73847 13.4661M9.73847 1.06274C6.63382 1.06274 3.90811 2.71399 2.39204 5.18417C2.34204 5.17774 2.29115 5.17417 2.23954 5.17417C1.57347 5.17417 1.03365 5.71399 1.03365 6.38007V19.0708C1.03365 19.7367 1.57347 20.2767 2.23954 20.2767C2.90543 20.2767 3.44525 19.7367 3.44525 19.0708V15.5504C5.01829 17.2347 7.25722 18.2895 9.73847 18.2895C14.4878 18.2895 18.3515 14.4258 18.3515 9.67596C18.3515 4.92667 14.4878 1.06274 9.73847 1.06274" fill="#160A19"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M9.73846 3.47452C6.31328 3.47452 3.53685 6.25095 3.53685 9.67595V9.6763C3.53685 13.1013 6.31328 15.8777 9.73846 15.8777C13.1635 15.8777 15.9401 13.1013 15.9401 9.6763V9.67595C15.9401 6.25095 13.1635 3.47452 9.73846 3.47452" fill="#1892CC"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M10.5628 7.8782C10.7353 7.71427 11.0078 7.72123 11.1717 7.89355C11.3322 8.06248 11.3289 8.32748 11.1667 8.4923L11.1564 8.50248L10.2151 9.3973H10.428C10.7558 9.3973 11.0224 9.65909 11.0306 9.98498L11.0308 10.0002C11.0308 10.1596 10.9678 10.3123 10.8558 10.4252L10.843 10.4375L9.4335 11.7757C9.261 11.9394 8.9885 11.9323 8.82475 11.7598C8.66421 11.5909 8.66778 11.3259 8.8301 11.1612L8.84028 11.1511L9.78046 10.2587H9.56814C9.40885 10.2587 9.25635 10.1957 9.14367 10.0837L9.13117 10.0711C8.90564 9.83391 8.91117 9.46105 9.14064 9.23052L9.15278 9.21873L10.5628 7.8782Z" fill="white"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M38.6696 5.69105C38.5555 5.69105 38.4455 5.70712 38.3409 5.73676C36.8325 3.23408 34.088 1.55676 30.9587 1.55676C26.2096 1.55676 22.3457 5.42051 22.3457 10.1702C22.3457 14.9196 26.2096 18.7834 30.9587 18.7834C33.5534 18.7834 35.8832 17.6303 37.4637 15.8098V19.0994C37.4637 19.7653 38.0037 20.3052 38.6696 20.3052C39.3355 20.3052 39.8755 19.7653 39.8755 19.0994V6.89676C39.8755 6.23087 39.3355 5.69105 38.6696 5.69105" fill="#CF1D58"/>
+<mask id="mask1_0_145" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="20" y="0" width="18" height="21">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M20.2785 0.178619H37.8084V20.3916H20.2785V0.178619Z" fill="white"/>
+</mask>
+<g mask="url(#mask1_0_145)">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M37.0037 5.89666C35.8119 2.56719 32.6257 0.178619 28.8916 0.178619C24.1425 0.178619 20.2785 4.04237 20.2785 8.79201C20.2785 13.5415 24.1425 17.4054 28.8916 17.4054C31.4862 17.4054 33.816 16.2522 35.3966 14.4317V19.1858C35.3966 19.8517 35.9364 20.3917 36.6025 20.3917C37.2684 20.3917 37.8084 19.8517 37.8084 19.1858V7.0338C37.8084 6.50862 37.4725 6.06201 37.0037 5.89666" fill="#63BECD"/>
+</g>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M37.6361 5.17426C37.4732 5.17426 37.3179 5.20676 37.1761 5.26534C35.6704 2.75034 32.9191 1.06284 29.7807 1.06284C25.0314 1.06284 21.1675 4.92659 21.1675 9.67623C21.1675 14.4257 25.0314 18.2894 29.7807 18.2894C32.4554 18.2894 34.8493 17.0641 36.4302 15.145V19.0707C36.4302 19.7368 36.9702 20.2766 37.6361 20.2766C38.302 20.2766 38.842 19.7368 38.842 19.0707V6.37998C38.842 5.71409 38.302 5.17426 37.6361 5.17426" fill="#160A19"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M29.7806 3.47452C33.2058 3.47452 35.9823 6.25095 35.9823 9.67595V9.6763C35.9823 13.1013 33.2058 15.8777 29.7806 15.8777C26.3556 15.8777 23.579 13.1013 23.579 9.6763V9.67595C23.579 6.25095 26.3556 3.47452 29.7806 3.47452" fill="#E7457C"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M30.3105 7.8782C30.4828 7.71427 30.7555 7.72123 30.9192 7.89355C31.0799 8.06248 31.0765 8.32748 30.9142 8.4923L30.9039 8.50248L29.9628 9.3973H30.1755C30.5033 9.3973 30.7701 9.65909 30.7783 9.98498L30.7785 10.0002C30.7785 10.1596 30.7155 10.3123 30.6033 10.4252L30.5906 10.4375L29.1812 11.7757C29.0085 11.9394 28.736 11.9323 28.5722 11.7598C28.4117 11.5909 28.4155 11.3259 28.5778 11.1612L28.588 11.1511L29.528 10.2587H29.3158C29.1565 10.2587 29.004 10.1957 28.8912 10.0837L28.8787 10.0711C28.6533 9.83391 28.6587 9.46105 28.8883 9.23052L28.9005 9.21873L30.3105 7.8782Z" fill="white"/>
+</svg>

+ 1 - 1
src/App.tsx

@@ -11,7 +11,7 @@ const App: React.FC = () => {
   // TODO: refactor this logic
   if (window.location.pathname === '/') {
     setTimeout(() => {
-      navigate('/demo/table')
+      navigate('/cooperationAccount/gzh')
     })
   }
 

二進制
src/assets/images/login/bg.png


二進制
src/assets/images/login/gongan.png


+ 22 - 0
src/assets/images/login/logo.svg

@@ -0,0 +1,22 @@
+<svg width="40" height="22" viewBox="0 0 40 22" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M10.9837 13.96C8.8941 13.96 7.19392 12.2598 7.19392 10.1698C7.19392 8.08019 8.8941 6.38001 10.9837 6.38001C13.0734 6.38001 14.7737 8.08019 14.7737 10.1702C14.7737 12.2598 13.0734 13.96 10.9837 13.96M10.9837 1.55679C7.85482 1.55679 5.11017 3.23411 3.60178 5.73679C3.49714 5.70715 3.38696 5.69108 3.27303 5.69108C2.60714 5.69108 2.06714 6.2309 2.06714 6.89679V19.0995C2.06714 19.7654 2.60714 20.3052 3.27303 20.3052C3.9391 20.3052 4.47875 19.7654 4.47875 19.0995V15.8098C6.05928 17.6304 8.38946 18.7834 10.9837 18.7834C15.7332 18.7834 19.597 14.9197 19.597 10.1698C19.597 5.42054 15.7332 1.55679 10.9837 1.55679" fill="#DD134E"/>
+<mask id="mask0_0_145" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="18" height="21">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M7.62939e-05 0.178619H17.5299V20.3916H7.62939e-05V0.178619Z" fill="white"/>
+</mask>
+<g mask="url(#mask0_0_145)">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M17.5286 8.64969C17.4526 3.95808 13.6261 0.178619 8.9165 0.178619C5.7815 0.178619 3.03793 1.8538 1.53133 4.35773C1.42775 4.3288 1.31883 4.31291 1.20597 4.31291C0.539898 4.31291 7.62939e-05 4.85273 7.62939e-05 5.5188V19.1858C7.62939e-05 19.8517 0.539898 20.3917 1.20597 20.3917C1.87186 20.3917 2.41168 19.8517 2.41168 19.1858V14.4372C3.99079 16.2554 6.31936 17.4054 8.9165 17.4054C13.6735 17.4054 17.5299 13.5492 17.5299 8.79201L17.5286 8.64969Z" fill="#53BFD5"/>
+</g>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M9.73847 13.4661C7.64865 13.4661 5.94847 11.766 5.94847 9.67596C5.94847 7.58632 7.64865 5.88614 9.73847 5.88614C11.8281 5.88614 13.5283 7.58632 13.5283 9.67632C13.5283 11.766 11.8281 13.4661 9.73847 13.4661M9.73847 1.06274C6.63382 1.06274 3.90811 2.71399 2.39204 5.18417C2.34204 5.17774 2.29115 5.17417 2.23954 5.17417C1.57347 5.17417 1.03365 5.71399 1.03365 6.38007V19.0708C1.03365 19.7367 1.57347 20.2767 2.23954 20.2767C2.90543 20.2767 3.44525 19.7367 3.44525 19.0708V15.5504C5.01829 17.2347 7.25722 18.2895 9.73847 18.2895C14.4878 18.2895 18.3515 14.4258 18.3515 9.67596C18.3515 4.92667 14.4878 1.06274 9.73847 1.06274" fill="#160A19"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M9.73846 3.47452C6.31328 3.47452 3.53685 6.25095 3.53685 9.67595V9.6763C3.53685 13.1013 6.31328 15.8777 9.73846 15.8777C13.1635 15.8777 15.9401 13.1013 15.9401 9.6763V9.67595C15.9401 6.25095 13.1635 3.47452 9.73846 3.47452" fill="#1892CC"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M10.5628 7.8782C10.7353 7.71427 11.0078 7.72123 11.1717 7.89355C11.3322 8.06248 11.3289 8.32748 11.1667 8.4923L11.1564 8.50248L10.2151 9.3973H10.428C10.7558 9.3973 11.0224 9.65909 11.0306 9.98498L11.0308 10.0002C11.0308 10.1596 10.9678 10.3123 10.8558 10.4252L10.843 10.4375L9.4335 11.7757C9.261 11.9394 8.9885 11.9323 8.82475 11.7598C8.66421 11.5909 8.66778 11.3259 8.8301 11.1612L8.84028 11.1511L9.78046 10.2587H9.56814C9.40885 10.2587 9.25635 10.1957 9.14367 10.0837L9.13117 10.0711C8.90564 9.83391 8.91117 9.46105 9.14064 9.23052L9.15278 9.21873L10.5628 7.8782Z" fill="white"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M38.6696 5.69105C38.5555 5.69105 38.4455 5.70712 38.3409 5.73676C36.8325 3.23408 34.088 1.55676 30.9587 1.55676C26.2096 1.55676 22.3457 5.42051 22.3457 10.1702C22.3457 14.9196 26.2096 18.7834 30.9587 18.7834C33.5534 18.7834 35.8832 17.6303 37.4637 15.8098V19.0994C37.4637 19.7653 38.0037 20.3052 38.6696 20.3052C39.3355 20.3052 39.8755 19.7653 39.8755 19.0994V6.89676C39.8755 6.23087 39.3355 5.69105 38.6696 5.69105" fill="#CF1D58"/>
+<mask id="mask1_0_145" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="20" y="0" width="18" height="21">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M20.2785 0.178619H37.8084V20.3916H20.2785V0.178619Z" fill="white"/>
+</mask>
+<g mask="url(#mask1_0_145)">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M37.0037 5.89666C35.8119 2.56719 32.6257 0.178619 28.8916 0.178619C24.1425 0.178619 20.2785 4.04237 20.2785 8.79201C20.2785 13.5415 24.1425 17.4054 28.8916 17.4054C31.4862 17.4054 33.816 16.2522 35.3966 14.4317V19.1858C35.3966 19.8517 35.9364 20.3917 36.6025 20.3917C37.2684 20.3917 37.8084 19.8517 37.8084 19.1858V7.0338C37.8084 6.50862 37.4725 6.06201 37.0037 5.89666" fill="#63BECD"/>
+</g>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M37.6361 5.17426C37.4732 5.17426 37.3179 5.20676 37.1761 5.26534C35.6704 2.75034 32.9191 1.06284 29.7807 1.06284C25.0314 1.06284 21.1675 4.92659 21.1675 9.67623C21.1675 14.4257 25.0314 18.2894 29.7807 18.2894C32.4554 18.2894 34.8493 17.0641 36.4302 15.145V19.0707C36.4302 19.7368 36.9702 20.2766 37.6361 20.2766C38.302 20.2766 38.842 19.7368 38.842 19.0707V6.37998C38.842 5.71409 38.302 5.17426 37.6361 5.17426" fill="#160A19"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M29.7806 3.47452C33.2058 3.47452 35.9823 6.25095 35.9823 9.67595V9.6763C35.9823 13.1013 33.2058 15.8777 29.7806 15.8777C26.3556 15.8777 23.579 13.1013 23.579 9.6763V9.67595C23.579 6.25095 26.3556 3.47452 29.7806 3.47452" fill="#E7457C"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M30.3105 7.8782C30.4828 7.71427 30.7555 7.72123 30.9192 7.89355C31.0799 8.06248 31.0765 8.32748 30.9142 8.4923L30.9039 8.50248L29.9628 9.3973H30.1755C30.5033 9.3973 30.7701 9.65909 30.7783 9.98498L30.7785 10.0002C30.7785 10.1596 30.7155 10.3123 30.6033 10.4252L30.5906 10.4375L29.1812 11.7757C29.0085 11.9394 28.736 11.9323 28.5722 11.7598C28.4117 11.5909 28.4155 11.3259 28.5778 11.1612L28.588 11.1511L29.528 10.2587H29.3158C29.1565 10.2587 29.004 10.1957 28.8912 10.0837L28.8787 10.0711C28.6533 9.83391 28.6587 9.46105 28.8883 9.23052L28.9005 9.21873L30.3105 7.8782Z" fill="white"/>
+</svg>

+ 1 - 0
src/assets/images/publishContent/wxCom.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1744169939010" class="icon" viewBox="0 0 1228 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2830" xmlns:xlink="http://www.w3.org/1999/xlink" width="76.75" height="64"><path d="M1045.84 747.027a153.563 153.563 0 0 0-53.156 21.515 129.094 129.094 0 0 1-58.092 35.1c2.953-19.828 12.783-37.926 27.633-51.3a191.186 191.186 0 0 0 26.452-62.142 56.953 56.953 0 1 1 57.164 56.827zM941.639 610.634a190.814 190.814 0 0 0-61.932-26.747 56.953 56.953 0 1 1 56.953-56.953 155.266 155.266 0 0 0 21.263 53.325 129.666 129.666 0 0 1 34.762 58.346 85.978 85.978 0 0 1-50.878-27.97h-0.21z m-93.826-200.728c-17.17-143.817-166.092-256.5-346.274-256.5-191.954 0-348.132 127.744-348.132 284.85a266.33 266.33 0 0 0 124.369 216.169 351.762 351.762 0 0 0 37.969 24.384l-15.44 61.636c5.568 2.616 10.968 5.4 16.663 7.805l77.963-38.981c11.39 2.953 23.372 4.851 35.268 6.876 7.594 1.35 15.188 2.742 22.993 3.67a401.119 401.119 0 0 0 145.547-8.353 281.011 281.011 0 0 0 11.474 62.185 481.153 481.153 0 0 1-108.675 12.698 472.5 472.5 0 0 1-97.621-10.758L262.46 846.21a31.219 31.219 0 0 1-33.877-3.543 31.64 31.64 0 0 1-10.926-32.316l25.312-101.925A330.075 330.075 0 0 1 90.125 438.256c0-192.29 184.19-348.131 411.413-348.131 215.746 0 392.428 140.653 409.64 319.444a276.919 276.919 0 0 0-29.91-2.953c-11.18 0.422-22.36 1.476-33.456 3.248zM716.399 634.47c18.943-3.797 36.957-11.053 53.157-21.515a129.094 129.094 0 0 1 58.134-35.016 86.358 86.358 0 0 1-27.675 51.216c-12.445 18.984-21.389 40.078-26.451 62.184a56.953 56.953 0 1 1-57.165-56.869z m102.6 137.025c18.816 12.614 39.741 21.727 61.763 27a56.953 56.953 0 1 1-56.953 56.953 154.406 154.406 0 0 0-21.094-53.409 129.558 129.558 0 0 1-34.51-58.514 85.888 85.888 0 0 1 50.794 28.308v-0.338z" p-id="2831"></path></svg>

文件差異過大導致無法顯示
+ 0 - 0
src/assets/images/publishContent/wxGzh.svg


文件差異過大導致無法顯示
+ 0 - 0
src/assets/react.svg


+ 2 - 3
src/components/layout/contentbar.tsx

@@ -1,13 +1,12 @@
 import React from 'react';
-
 import { Outlet } from 'react-router-dom';
 import { Card } from 'antd';
 
 
 const PageContent: React.FC = () => {
   return (
-    <div style={{ padding: "0 20px", height: "calc(100vh - 200px)", overflow: "auto" }}>
-      <Card style={{ height: "100%", overflow: 'auto' }}>
+    <div className='w-full px-[10px] h-[calc(100vh-64px)] overflow-auto'>
+      <Card className='w-full h-full overflow-auto rounded-[0px]'>
         <Outlet />
       </Card>
     </div>

+ 36 - 15
src/components/layout/headerbar.tsx

@@ -1,23 +1,44 @@
-
-import { Layout, Switch } from 'antd';
-import { GithubOutlined } from '@ant-design/icons';
+import { Button, Dropdown, Layout, message, Switch} from 'antd';
 import useConfigStore from '../../store/config';
+import LogoIcon from "@src/assets/images/login/logo.svg?react";
+import Icon, { UserOutlined } from "@ant-design/icons";
+import sso, { logout } from "../../http/sso";
+import { useNavigate } from 'react-router-dom';
+
 const { Header } = Layout;
 
-const Headerbar = (props: { colorBgContainer: string }) => {
-  const setAlgorithm = useConfigStore(state => state.setAlgorithm)
-  const setCompactAlgorithm = useConfigStore(state => state.setCompactAlgorithm)
+const Headerbar = () => {
+	const navigate = useNavigate()
+	const setAlgorithm = useConfigStore(state => state.setAlgorithm)
+	const userInfo = sso.getUserInfo()
+
+	const logoutHandle = async () => {
+		await logout()
+		message.success('已退出账号')
+		// TODO: 退出后跳转登录页
+		navigate('/login')
+	}
 
   return (
-    <Header title='React Admin Dashboard' style={{ padding: 0, background: props.colorBgContainer }}>
-      <div style={{ display: 'flex', alignItems: 'center', height: '100%', padding: "0 20px", justifyContent: 'space-between' }}>
-        <h2>React Admin Dashboard</h2>
-        <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>
-          <Switch checkedChildren="Light" unCheckedChildren="Dark" defaultChecked onChange={(checked) => setAlgorithm(checked ? 'default' : 'dark')} />
-          <Switch checkedChildren="Compact" unCheckedChildren="Loose" onChange={(checked) => setCompactAlgorithm(checked ? 'compact' : '')} />
-          <p style={{ marginRight: 10 }}>Yujian Xue</p>
-          <img src="https://avatars.githubusercontent.com/u/48818060?s=48&v=4" alt="avatar" style={{ width: 40, height: 40 }} />
-          <GithubOutlined style={{ fontSize: 30 }} onClick={() => window.open('https://github.com/larry-xue/react-admin-dashboard')} />
+    <Header title='票圈内容合作平台' className='bg-[#20214F] !px-1'>
+      <div className='text-[#9090a7] flex items-center justify-between h-full px-[20px] '>
+        <div className='flex items-center gap-[12px]'>
+          <Icon component={LogoIcon} className='text-[40px]' />
+          <span className='text-lg font-bold'>票圈内容合作平台</span>
+        </div>
+        <div className='flex items-center gap-[30px] cursor-pointer'>
+          <Switch 
+            checkedChildren="Light" 
+            unCheckedChildren="Dark" 
+            defaultChecked={useConfigStore.getState().themeConfig._algorithm[0] !== 'dark'} 
+            onChange={(checked) => setAlgorithm(checked ? 'default' : 'dark')} 
+          />
+					<Dropdown trigger={['hover']} menu={{items: [{label: (<Button type="primary" onClick={logoutHandle}>退出账号</Button>), key: 'logout'}]}}>
+						<div className='flex items-center gap-[10px] text-xl'>
+							<div>{userInfo.contactName || userInfo.name}</div>
+							<UserOutlined />
+						</div>
+					</Dropdown>
         </div>
       </div>
     </Header>

+ 9 - 16
src/components/layout/index.tsx

@@ -1,28 +1,21 @@
 import React from 'react';
-
-import { Layout, theme } from 'antd';
+import { Layout } from 'antd';
+// import { theme } from 'antd';
 import PageSidebar from './sidebar';
 import PageContent from './contentbar';
-import PageBreadcrumb from './breadcrumb';
 import Headerbar from './headerbar';
 
-const { Footer } = Layout;
-
 const PageLayout: React.FC = () => {
-  const {
-    token: { colorBgContainer },
-  } = theme.useToken();
+  // const {
+  //   token: { colorBgContainer },
+	// } = theme.useToken();
 
   return (
-    <Layout style={{ minHeight: '100vh' }}>
-      <PageSidebar />
-      <Layout>
-        <Headerbar colorBgContainer={colorBgContainer} />
-        <PageBreadcrumb />
+		<Layout className='w-full min-h-screen flex flex-col'>
+			<Headerbar  />
+      <Layout className='w-full'>
+				<PageSidebar />
         <PageContent></PageContent>
-        <Footer style={{ textAlign: 'center' }}>
-          React Admin Dashboard ©{new Date().getFullYear()} Created by Yujian Xue
-        </Footer>
       </Layout>
     </Layout>
   );

+ 9 - 5
src/components/layout/sidebar.tsx

@@ -10,7 +10,7 @@ const getMenuItems = (routes: AdminRouterItem[]): any[] => {
     if (!itm.meta) return null
     let children: any[] = []
     if (itm.children) children = getMenuItems(itm.children)
-    return children ? {
+    return children.length > 0 ? {
       ...itm.meta,
       children
     } : {
@@ -23,7 +23,7 @@ const getMenuItems = (routes: AdminRouterItem[]): any[] => {
 /**
  * PageSidebar
  * @param props {autoCollapse?: boolean} automatic collapes menu when click another menu
- * @returns 
+ * @returns
  */
 const PageSidebar = (props: {
   autoCollapse?: boolean
@@ -35,7 +35,7 @@ const PageSidebar = (props: {
   const [lastOpenedMenu, setLastOpenedMenu] = useState<string[]>([])
   const location = useLocation()
 
-  const onSwitchMenu = ({ key, keyPath }: { key: string; keyPath: string[] }) => {
+	const onSwitchMenu = ({ key, keyPath }: { key: string; keyPath: string[] }) => {
     if (autoCollapse && keyPath.slice(1)) setLastOpenedMenu(keyPath.slice(1))
     navigate(key)
   }
@@ -44,8 +44,12 @@ const PageSidebar = (props: {
     setLastOpenedMenu(openKeys)
   }
 
-  useEffect(() => {
-    setSelectedKeys([`${location.pathname}`])
+	useEffect(() => {
+		setSelectedKeys([`${location.pathname}`])
+		const lastOpenedMenu = location.pathname.split('/')?.[1]
+		if (lastOpenedMenu) {
+			setLastOpenedMenu([`/${lastOpenedMenu}`])
+		}
     navigate(location.pathname)
   }, [location.pathname])
 

+ 39 - 15
src/http/api.ts

@@ -1,23 +1,47 @@
-// Login
+/* 登录 */
 
 // 登录
-export const userLogin = `${import.meta.env.VITE_API_URL}/ad/platform/user/login`
+export const userLogin = `${import.meta.env.VITE_API_URL}/contentPlatform/account/login`
 
 // 获取验证码
-export const sendVerificationCode = `${import.meta.env.VITE_API_URL}/ad/platform/user/sendVerificationCode`
+export const sendVerificationCode = `${import.meta.env.VITE_API_URL}/contentPlatform/account/sendMessageVerifyCode`
 
 // 手机号登录
-export const loginPhone = `${import.meta.env.VITE_API_URL}/ad/platform/user/login/phone`
-
-// 忘记密码
-export const forgotPassword = `${import.meta.env.VITE_API_URL}/ad/platform/user/forgotPassword`
-
-// 登出
-export const userLogout = `${import.meta.env.VITE_API_URL}/ad/platform/user/logout`
-
-// 修改密码
-export const changePassword = `${import.meta.env.VITE_API_URL}/ad/platform/user/changePassword`
+export const loginPhone = `${import.meta.env.VITE_API_URL}/contentPlatform/account/login`
 
 // 获取用户信息
-export const getAgencyInfo = `${import.meta.env.VITE_API_URL}/ad/platform/user/getAgencyInfo`
-
+// export const getAgencyInfo = `${import.meta.env.VITE_API_URL}/ad/platform/user/getAgencyInfo`
+
+
+
+/* 公众号管理 */
+export const accountGetContentType = `${import.meta.env.VITE_API_URL}/contentPlatform/cooperateAccount/gzh/getContentType`
+export const accountGetAuthQrCode = `${import.meta.env.VITE_API_URL}/contentPlatform/cooperateAccount/gzh/getAuthQrCode`
+export const accountGetAuthResult = `${import.meta.env.VITE_API_URL}/contentPlatform/cooperateAccount/gzh/getAuthResult`
+export const accountList = `${import.meta.env.VITE_API_URL}/contentPlatform/cooperateAccount/gzh/list`
+export const accountSave = `${import.meta.env.VITE_API_URL}/contentPlatform/cooperateAccount/gzh/save`
+export const accountDelete = `${import.meta.env.VITE_API_URL}/contentPlatform/cooperateAccount/gzh/delete`
+
+
+/* 内容管理 */
+export const getGzhAccountOptionsApi = `${import.meta.env.VITE_API_URL}/contentPlatform/cooperateAccount/gzh/accountList`
+export const getGzhContentTypeApi = `${import.meta.env.VITE_API_URL}/contentPlatform/cooperateAccount/gzh/getContentType`
+export const getGzhPlanListApi = `${import.meta.env.VITE_API_URL}/contentPlatform/plan/gzh/list`
+export const saveGzhPlanApi = `${import.meta.env.VITE_API_URL}/contentPlatform/plan/gzh/save`
+export const deleteGzhPlanApi = `${import.meta.env.VITE_API_URL}/contentPlatform/plan/gzh/delete`
+export const getQwPlanListApi = `${import.meta.env.VITE_API_URL}/contentPlatform/plan/qw/list`
+export const saveQwPlanApi = `${import.meta.env.VITE_API_URL}/contentPlatform/plan/qw/save`
+export const deleteQwPlanApi = `${import.meta.env.VITE_API_URL}/contentPlatform/plan/qw/delete`
+export const getVideoContentCategoryListApi = `${import.meta.env.VITE_API_URL}/contentPlatform/plan/videoContentCategoryList`
+export const getVideoContentCoverFrameListApi = `${import.meta.env.VITE_API_URL}/contentPlatform/plan/videoContentCoverFrameList`
+export const getVideoContentListApi = `${import.meta.env.VITE_API_URL}/contentPlatform/plan/videoContentList`
+export const getShareQrPic = `${import.meta.env.VITE_API_URL}/contentPlatform/plan/qw/getSharePic`
+
+/* 数据统计 */
+export const gzhDataList = `${import.meta.env.VITE_API_URL}/contentPlatform/datastat/gzh`
+export const gzhDataExport = `${import.meta.env.VITE_API_URL}/contentPlatform/datastat/gzh/export`
+export const qwDataList = `${import.meta.env.VITE_API_URL}/contentPlatform/datastat/qw`
+export const qwDataExport = `${import.meta.env.VITE_API_URL}/contentPlatform/datastat/qw/export`
+
+/* 文件上传 */
+export const adFileUpload = `${import.meta.env.VITE_API_URL}/file/upload` // 文件上传

+ 6 - 8
src/http/index.ts

@@ -2,13 +2,12 @@ import axios from 'axios'
 import sso from './sso'
 import router from '@src/router/index'
 import type { AxiosInstance, CreateAxiosDefaults, AxiosRequestConfig } from 'axios'
-import { message } from 'antd'
 
 const config = {
   timeout: 60000,
 }
 
-const invalidCode = -999
+const invalidCode = 1000
 
 class Request {
   private instance: AxiosInstance
@@ -17,8 +16,10 @@ class Request {
     this.instance = axios.create(config)
 
     this.instance.interceptors.request.use(function(config) {
-      if (!config.headers.token)
-        config.headers.token = sso.getAccessToken()
+			if (!config.headers.token) {
+				const userInfo = sso.getUserInfo()
+				config.headers.token = userInfo.token
+			}
 
       return config
     }, function(error) {
@@ -31,8 +32,7 @@ class Request {
 
       // 登陆过期 || 未登陆
       if (code === invalidCode) {
-        sso.clearAccessToken()
-        sso.clearUserIsAdmin()
+        sso.clearUserInfo()
 
         const {pathname,search} = location
         if (pathname!=='/login') {
@@ -43,8 +43,6 @@ class Request {
       }
       return data
     }, function(error) {
-      const { msg = '服务器异常' } = error
-      message.error(msg)
       return Promise.reject(error)
     })
   }

+ 45 - 126
src/http/sso.ts

@@ -3,70 +3,50 @@ import router from '../router/index.tsx'
 import http from './index'
 import {
   userLogin, sendVerificationCode, loginPhone,
-  userLogout, changePassword, forgotPassword
 } from './api.ts'
 
-export function getAccessToken(): string {
-  const accessToken = localStorage.getItem('token')
-  return accessToken || ''
-}
-
-export function getMenus(): string[] {
-  const menus = localStorage.getItem('menus')
-  if (!menus)
-    return ['PROMOTION','ADR','DOC','SELF_BUILD']
-
-  try {
-    return JSON.parse(menus)
-  } catch(err) {
-    return ['PROMOTION','ADR','DOC','SELF_BUILD']
-  }
-}
-
-export function setMenus(menus: string[]): void {
-  localStorage.removeItem('menus')
-  if (Array.isArray(menus)) {
-    localStorage.setItem('menus', JSON.stringify(menus))
-  }
+type UserInfo = { 
+	channel: string,
+	contactName: string,
+	createTimestamp: number,
+	id: number,
+	identity: number,
+	name: string,
+	telNum: string,
+	token: string
 }
 
-export function setAccessToken(token: string): void {
-  localStorage.removeItem('token')
-  localStorage.setItem('token', token)
+export function getUserInfo(): UserInfo {
+  const activeUser = localStorage.getItem('userInfo')
+  return activeUser ? JSON.parse(activeUser) : {}
 }
 
-export function clearAccessToken() {
-  localStorage.removeItem('token')
+export function getAccessToken(): string {
+	const userInfo = getUserInfo()
+	return userInfo.token
 }
 
-export function setUserIsAdmin(isAdmin: boolean) {
-  localStorage.setItem('isAdmin', isAdmin+'')
+export function setUserInfo(userInfo: UserInfo): void {
+  localStorage.removeItem('userInfo')
+  localStorage.setItem('userInfo', JSON.stringify(userInfo))
 }
 
-export function getUserIsAdmin(): boolean {
-  const isAdmin = localStorage.getItem('isAdmin')
-  return isAdmin === 'true' ? true :false
+export function clearUserInfo() {
+  localStorage.removeItem('userInfo')
 }
 
-export function clearUserIsAdmin() {
-  localStorage.removeItem('isAdmin')
-}
 
-type loginType = { token: string, isAdmin: boolean, menus: string[] }
 
 export function login(account: string, password: string) {
-  return http.post(userLogin, {
-    account,
-    password
-  }).then(res => {
-    const { code, msg, data = {} } = res
-    const { token, isAdmin, menus } = data as loginType
-
+  return http.post<UserInfo>(userLogin, {
+    telNum: account,
+    password: window.btoa(password)
+  }).then((res: ApiResponse<UserInfo>) => {
+    const { code, msg, data } = res
     if (code === 0) {
       message.success('登录成功')
-      setAccessToken(token)
-      setUserIsAdmin(isAdmin)
-      setMenus(menus)
+      setUserInfo(data)
+			location.href = '/cooperationAccount/gzh'
       return true
     }
 
@@ -78,7 +58,7 @@ export function login(account: string, password: string) {
 
 export function sendCode(phone: string) {
   return http.post(sendVerificationCode, {
-    phone
+    telNum: phone
   }).then(res => {
     const { code, msg = '发送失败' } = res
 
@@ -93,101 +73,40 @@ export function sendCode(phone: string) {
   }).catch(() => {})
 }
 
-export function loginBySendCode(phone: string, verificationCode: string) {
+export function loginBySendCode(telNum: string, verifyCode: string) {
   return http.post(loginPhone, {
-    phone,
-    verificationCode
+    telNum,
+    verifyCode
   }).then(res => {
-    const { code, msg, data = {} } = res
-    const { token, isAdmin, menus } = data as loginType
-
-    if (code === 0) {
+		const { code, msg, data } = res as { code: number, msg: string, data: UserInfo }
+    if (code === 0 && data) {
       message.success('登录成功')
-      setAccessToken(token)
-      setUserIsAdmin(isAdmin)
-      setMenus(menus)
+      setUserInfo(data)
+			router.navigate('/cooperationAccount/gzh')
       return true
     }
 
     message.error(msg)
     return false
 
-  }).catch(() => {})
+	}).catch((err) => {
+		console.log(err)
+	})
 }
 
 export function logout() {
-  return http.post(userLogout).then(res => {
-    const { code, msg } = res
-
-    if (code === 0) {
-      message.success('退出登录成功')
-      clearAccessToken()
-      clearUserIsAdmin()
-      router.navigate('/login')
-      return true
-    }
-
-    message.error(msg)
-    return false
-
-  }).catch(() => {})
+	message.success('已退出登录')
+	clearUserInfo()
+	router.navigate('/login')
+	return true
 }
 
-export function changeLoginPassword(oldPassword: string, newPassword: string) {
-  return http.post(changePassword, {
-    oldPassword,
-    newPassword
-  }).then(res => {
-    const { code, msg } = res
-
-    if (code === 0) {
-      message.success('修改密码成功')
-      clearAccessToken()
-      clearUserIsAdmin()
-      router.navigate('/login')
-      return true
-    }
-
-    message.error(msg)
-    return false
-
-  }).catch(() => {})
-}
-
-export function forgotLoginPassword(phone: string, verificationCode: string, newPassword: string) {
-  return http.post(forgotPassword, {
-    phone,
-    verificationCode,
-    newPassword
-  }).then(res => {
-    const { code, msg } = res
-
-    if (code === 0) {
-      message.success('密码编辑成功')
-      clearAccessToken()
-      clearUserIsAdmin()
-      return true
-    }
-
-    message.error(msg)
-    return false
-
-  }).catch(() => {})
-}
-
-
 export default {
-  getAccessToken,
-  getMenus,
-  setAccessToken,
-  clearAccessToken,
-  getUserIsAdmin,
-  setUserIsAdmin,
-  clearUserIsAdmin,
+  getUserInfo,
+  setUserInfo,
+  clearUserInfo,
   login,
   sendCode,
   loginBySendCode,
   logout,
-  changeLoginPassword,
-  forgotLoginPassword,
 }

+ 5 - 1
src/index.css

@@ -1,3 +1,7 @@
+@layer theme, base, antd, components, utilities;
+
+@import 'tailwindcss';
+
 :root {
   font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
   line-height: 1.5;
@@ -5,7 +9,7 @@
 
   color-scheme: light dark;
   color: rgba(255, 255, 255, 0.87);
-  background-color: #242424;
+  background-color: #fff;
 
   font-synthesis: none;
   text-rendering: optimizeLegibility;

+ 2 - 3
src/main.tsx

@@ -1,11 +1,10 @@
-import React from 'react'
 import ReactDOM from 'react-dom/client'
 import router from './router/index.tsx'
 import { RouterProvider } from "react-router-dom";
 import './index.css'
 
 ReactDOM.createRoot(document.getElementById('root')!).render(
-  <React.StrictMode>
+  // <React.StrictMode>
     <RouterProvider router={router} />
-  </React.StrictMode>,
+  // </React.StrictMode>,
 )

+ 1 - 2
src/router/index.tsx

@@ -24,8 +24,7 @@ const loadRouteModules = async () => {
   })
   const routeModules: AdminRouterItem[] = []
 
-  for await (const [key, module] of Object.entries(routeModuleFiles)) {
-    console.log('key = ', key, 'module = ', module)
+  for await (const [, module] of Object.entries(routeModuleFiles)) {
 
     if (module) {
       const routes = Array.isArray(module) ? module : [module];

+ 34 - 3
src/store/config.ts

@@ -22,11 +22,32 @@ const algorithmMap: Record<string, MappingAlgorithm> = {
   compact: theme.compactAlgorithm
 }
 
+// Get theme from localStorage or use default
+const getStoredTheme = () => {
+  const storedTheme = localStorage.getItem('theme_mode')
+  return storedTheme && ['default', 'dark', 'compact'].includes(storedTheme) 
+    ? storedTheme 
+    : 'default'
+}
+
+// Initialize HTML class based on theme
+const initThemeClass = (themeName: string) => {
+  if (themeName === 'dark') {
+    document.documentElement.classList.add('dark')
+  } else {
+    document.documentElement.classList.remove('dark')
+  }
+}
+
+// Initialize theme from localStorage
+const initialTheme = getStoredTheme()
+initThemeClass(initialTheme)
+
 const useConfigStore = create<ConfigState & Actions>()((set) => ({
   themeConfig: {
-    _algorithm: ['default'],
-    algorithm: [theme.defaultAlgorithm],
-    primaryColor: '#03dac6'
+    _algorithm: initialTheme === 'default' ? ['default'] : [initialTheme],
+    algorithm: initialTheme === 'default' ? [theme.defaultAlgorithm] : [algorithmMap[initialTheme]],
+    primaryColor: '#1890ff'
   },
   themeOptions: [
     { label: 'Light', value: 'default' },
@@ -34,6 +55,16 @@ const useConfigStore = create<ConfigState & Actions>()((set) => ({
     { label: 'Compact', value: 'compact' },
   ],
   setAlgorithm: (v: string) => {
+    // Store theme in localStorage
+    localStorage.setItem('theme_mode', v)
+    
+    // Update HTML class for dark mode
+    if (v === 'dark') {
+      document.documentElement.classList.add('dark')
+    } else {
+      document.documentElement.classList.remove('dark')
+    }
+    
     set((state) => {
       const includesCompact = state.themeConfig._algorithm.includes('compact')
       const _algorithm = includesCompact ? [v, 'compact'] : [v]

+ 30 - 0
src/views/cooperationAccount/cooperationAccount.router.tsx

@@ -0,0 +1,30 @@
+import { TeamOutlined } from '@ant-design/icons'
+import { AdminRouterItem } from "../../router";
+import { Outlet } from "react-router-dom";
+import GZH from './gzh';
+
+const demoRoutes: AdminRouterItem[] = [
+  {
+    path: 'cooperationAccount',
+    element: <Outlet />,
+		meta: {
+			label: "合作账号管理",
+			title: "合作账号管理",
+			key: "/cooperationAccount",
+			icon: <TeamOutlined />,
+		},
+		children: [
+			{
+				path: 'gzh',
+				element: <GZH />,
+				meta: {
+					label: "公众号管理",
+					title: "公众号管理",
+					key: "/cooperationAccount/gzh",
+				},
+			},
+		]
+  }
+]
+
+export default demoRoutes;

文件差異過大導致無法顯示
+ 257 - 0
src/views/cooperationAccount/gzh/index.tsx


+ 0 - 79
src/views/demo/chart/index.tsx

@@ -1,79 +0,0 @@
-import React from 'react';
-import { Line, Pie } from '@ant-design/charts';
-import { Card, Space } from 'antd';
-
-const DemoChart: React.FC = () => {
-  // Mock data for line chart
-  const lineData = [
-    { year: '2019', value: 3 },
-    { year: '2020', value: 4 },
-    { year: '2021', value: 3.5 },
-    { year: '2022', value: 5 },
-    { year: '2023', value: 4.9 },
-  ];
-
-  // Mock data for pie chart
-  const pieData = [
-    { type: 'Category A', value: 27 },
-    { type: 'Category B', value: 25 },
-    { type: 'Category C', value: 18 },
-    { type: 'Category D', value: 15 },
-    { type: 'Category E', value: 15 },
-  ];
-
-  const lineConfig = {
-    data: lineData,
-    xField: 'year',
-    yField: 'value',
-    point: {
-      shapeField: 'square',
-      sizeField: 4,
-    },
-    interaction: {
-      tooltip: {
-        marker: false,
-      },
-    },
-    style: {
-      lineWidth: 2,
-    },
-  };
-
-  const pieConfig = {
-    data: pieData,
-    angleField: 'value',
-    colorField: 'type',
-    label: {
-      text: 'value',
-      style: {
-        fontWeight: 'bold',
-      },
-    },
-    legend: {
-      color: {
-        title: false,
-        position: 'right',
-        rowPadding: 5,
-      },
-    },
-  };
-
-  return (
-    <div className="p-4" style={{ width: '100%' }}>
-      <Space direction="vertical" size="large" style={{ display: 'flex', width: '100%' }}>
-        <Card title="Line Chart Demo" style={{ width: '100%' }}>
-          <div style={{ width: '100%', minHeight: '300px' }}>
-            <Line {...lineConfig} />
-          </div>
-        </Card>
-        <Card title="Pie Chart Demo" style={{ width: '100%' }}>
-          <div style={{ width: '100%', minHeight: '300px' }}>
-            <Pie {...pieConfig} />
-          </div>
-        </Card>
-      </Space>
-    </div>
-  );
-};
-
-export default DemoChart;

+ 0 - 59
src/views/demo/demo.router.tsx

@@ -1,59 +0,0 @@
-import DemoPage from "./index";
-import { DesktopOutlined } from '@ant-design/icons'
-import { AdminRouterItem } from "../../router";
-import DemoChart from "./chart";
-import DemoTable from "./table";
-import { Outlet } from "react-router-dom";
-
-const demoRoutes: AdminRouterItem[] = [
-  {
-    path: 'demo',
-    element: <DemoPage />,
-    meta: {
-      label: "Demo",
-      title: "Demo",
-      key: "/demo",
-      icon: <DesktopOutlined />,
-    },
-    children: [{
-      path: 'chart',
-      element: <DemoChart />,
-      meta: {
-        label: "chart",
-        title: "chart",
-        key: "/demo/chart",
-        icon: <DesktopOutlined />,
-      }
-    }, {
-      path: 'table',
-      element: <DemoTable />,
-      meta: {
-        label: "table",
-        title: "table",
-        key: "/demo/table",
-        icon: <DesktopOutlined />,
-      }
-    }, {
-      path: 'nested',
-      element: <Outlet />,
-      meta: {
-        label: "nested",
-        title: "nested",
-        key: "/demo/nested",
-        icon: <DesktopOutlined />,
-      },
-      children: [{
-        path: 'table',
-        element: <DemoTable />,
-        meta: {
-          label: "table",
-          title: "table",
-          key: "/demo/nested/table",
-          icon: <DesktopOutlined />,
-        }
-      }]
-    }]
-  },
-]
-
-export default demoRoutes

+ 0 - 14
src/views/demo/form/components/calendar.tsx

@@ -1,14 +0,0 @@
-import React from 'react';
-import { Calendar } from 'antd';
-import type { CalendarProps } from 'antd';
-import type { Dayjs } from 'dayjs';
-
-const CallendarCmp: React.FC = () => {
-  const onPanelChange = (value: Dayjs, mode: CalendarProps<Dayjs>['mode']) => {
-    console.log(value.format('YYYY-MM-DD'), mode);
-  };
-
-  return <Calendar onPanelChange={onPanelChange} />;
-};
-
-export default CallendarCmp;

+ 0 - 40
src/views/demo/form/form.router.tsx

@@ -1,40 +0,0 @@
-import { FormOutlined, TeamOutlined } from '@ant-design/icons'
-import { AdminRouterItem } from '../../../router'
-import FormPage from '.'
-import { Outlet } from 'react-router-dom'
-import CallendarCmp from './components/calendar'
-
-const demoRoutes: AdminRouterItem[] = [
-  {
-    path: 'form',
-    element: <FormPage />,
-    meta: {
-      label: "Form",
-      title: "Form",
-      key: "/form",
-      icon: <FormOutlined />,
-    },
-  },
-  {
-    path: 'form2',
-    element: <Outlet />,
-    meta: {
-      label: "Form2",
-      title: "Form2",
-      key: "/form2",
-      icon: <FormOutlined />,
-    },
-    children: [{
-      path: 'callendar',
-      element: <CallendarCmp />,
-      meta: {
-        label: "Callendar",
-        title: "Callendar",
-        key: "/form2/callendar",
-        icon: <TeamOutlined />,
-      }
-    }]
-  }
-]
-
-export default demoRoutes

+ 0 - 54
src/views/demo/form/index.tsx

@@ -1,54 +0,0 @@
-import React, { useState } from 'react';
-import { InfoCircleOutlined } from '@ant-design/icons';
-import { Button, Form, Input, Radio, Tag } from 'antd';
-
-type RequiredMark = boolean | 'optional' | 'customize';
-
-const customizeRequiredMark = (label: React.ReactNode, { required }: { required: boolean }) => (
-  <>
-    {required ? <Tag color="error">Required</Tag> : <Tag color="warning">optional</Tag>}
-    {label}
-  </>
-);
-
-const FormPage: React.FC = () => {
-  const [form] = Form.useForm();
-  const [requiredMark, setRequiredMarkType] = useState<RequiredMark>('optional');
-
-  const onRequiredTypeChange = ({ requiredMarkValue }: { requiredMarkValue: RequiredMark }) => {
-    setRequiredMarkType(requiredMarkValue);
-  };
-
-  return (
-    <Form
-      form={form}
-      layout="vertical"
-      initialValues={{ requiredMarkValue: requiredMark }}
-      onValuesChange={onRequiredTypeChange}
-      requiredMark={requiredMark === 'customize' ? customizeRequiredMark : requiredMark}
-    >
-      <Form.Item label="Required Mark" name="requiredMarkValue">
-        <Radio.Group>
-          <Radio.Button value>Default</Radio.Button>
-          <Radio.Button value="optional">Optional</Radio.Button>
-          <Radio.Button value={false}>Hidden</Radio.Button>
-          <Radio.Button value="customize">Customize</Radio.Button>
-        </Radio.Group>
-      </Form.Item>
-      <Form.Item label="Field A" required tooltip="This is a required field">
-        <Input placeholder="input placeholder" />
-      </Form.Item>
-      <Form.Item
-        label="Field B"
-        tooltip={{ title: 'Tooltip with customize icon', icon: <InfoCircleOutlined /> }}
-      >
-        <Input placeholder="input placeholder" />
-      </Form.Item>
-      <Form.Item>
-        <Button type="primary">Submit</Button>
-      </Form.Item>
-    </Form>
-  );
-};
-
-export default FormPage;

+ 0 - 8
src/views/demo/index.tsx

@@ -1,8 +0,0 @@
-import React from 'react';
-import { Outlet } from 'react-router-dom';
-
-const DemoPage: React.FC = () => {
-  return <Outlet />
-};
-
-export default DemoPage;

+ 0 - 88
src/views/demo/table/index.tsx

@@ -1,88 +0,0 @@
-import React from 'react';
-import { Space, Table, Tag } from 'antd';
-import type { TableProps } from 'antd';
-
-interface DataType {
-  key: string;
-  name: string;
-  age: number;
-  address: string;
-  tags: string[];
-}
-
-const columns: TableProps<DataType>['columns'] = [
-  {
-    title: 'Name',
-    dataIndex: 'name',
-    key: 'name',
-    render: (text) => <a>{text}</a>,
-  },
-  {
-    title: 'Age',
-    dataIndex: 'age',
-    key: 'age',
-  },
-  {
-    title: 'Address',
-    dataIndex: 'address',
-    key: 'address',
-  },
-  {
-    title: 'Tags',
-    key: 'tags',
-    dataIndex: 'tags',
-    render: (_, { tags }) => (
-      <>
-        {tags.map((tag) => {
-          let color = tag.length > 5 ? 'geekblue' : 'green';
-          if (tag === 'loser') {
-            color = 'volcano';
-          }
-          return (
-            <Tag color={color} key={tag}>
-              {tag.toUpperCase()}
-            </Tag>
-          );
-        })}
-      </>
-    ),
-  },
-  {
-    title: 'Action',
-    key: 'action',
-    render: (_, record) => (
-      <Space size="middle">
-        <a>Invite {record.name}</a>
-        <a>Delete</a>
-      </Space>
-    ),
-  },
-];
-
-const data: DataType[] = [
-  {
-    key: '1',
-    name: 'John Brown',
-    age: 32,
-    address: 'New York No. 1 Lake Park',
-    tags: ['nice', 'developer'],
-  },
-  {
-    key: '2',
-    name: 'Jim Green',
-    age: 42,
-    address: 'London No. 1 Lake Park',
-    tags: ['loser'],
-  },
-  {
-    key: '3',
-    name: 'Joe Black',
-    age: 32,
-    address: 'Sydney No. 1 Lake Park',
-    tags: ['cool', 'teacher'],
-  },
-];
-
-const DemoTable: React.FC = () => <Table columns={columns} dataSource={data} />;
-
-export default DemoTable;

+ 35 - 13
src/views/login/login.module.css

@@ -2,29 +2,47 @@
   display: flex;
   min-height: 100vh;
   background-color: #e8f0fe;
-  background-image: linear-gradient(to bottom, #e8f0fe 60%, #c9dbfd);
+  background-image: url('@src/assets/images/login/bg.png');
+  background-size: 100% 100%;
   position: relative;
   overflow: hidden;
+  color: #160a19;
 }
 
 .leftSection {
   flex: 1;
   display: flex;
   flex-direction: column;
-  justify-content: center;
+  justify-content: flex-start;
   padding-left: 10%;
 }
 
+.logoSection {
+  display: flex;
+  align-items: center;
+  gap: 10px;
+  font-size: 18px;
+  font-weight: 500;
+  letter-spacing: -0.11px;
+  margin: 23px 0 75px;
+}
+
 .platformTitle {
-  font-size: 2.2rem;
+  font-size: 36px;
   font-weight: bold;
-  margin-bottom: 1.5rem;
+  letter-spacing: 0.64px;
   color: #333;
+  position: relative;
 }
 
-.illustration {
-  max-width: 500px;
-  position: relative;
+.platformTitle::after {
+  content: '';
+  position: absolute;
+  bottom: -8px;
+  left: 0;
+  width: 40px;
+  height: 8px;
+  background-color: #1890FF;
 }
 
 .rightSection {
@@ -59,14 +77,14 @@
 }
 
 .phonePrefix {
-  width: 80px;
+  width: 30px;
   text-align: center;
-  color: #555;
+  color: #333;
+	text-align: left;
 }
 
 .phoneInput {
   width: 100%;
-  border-radius: 4px;
   font-size: 16px;
 }
 
@@ -76,12 +94,14 @@
 }
 
 .codeInput {
+	width: 100%;
+  font-size: 16px;
   flex: 1;
 }
 
 .getCodeBtn {
   width: 120px;
-  background-color: #f5f5f5;
+  background-color: #fff;
   border: none;
   color: #1890ff;
   font-weight: 500;
@@ -99,11 +119,13 @@
   position: absolute;
   bottom: 0;
   right: 0;
-  width: 25%;
+  width: 100%;
+	text-align: center;
+	font-size: 12px;
 }
 
 @media (max-width: 992px) {
   .leftSection {
     display: none;
   }
-} 
+}

+ 275 - 200
src/views/login/login.tsx

@@ -1,214 +1,289 @@
-import React, { useState } from 'react';
-import { Form, Input, Button, Tabs, message } from 'antd';
-import { LockOutlined, UserOutlined } from '@ant-design/icons';
-import styles from './login.module.css';
-import { sendCode, loginBySendCode, login } from '../../http/sso';
+import React, { useState } from "react";
+import { Form, Input, Button, Tabs, message } from "antd";
+import Icon from "@ant-design/icons";
+import styles from "./login.module.css";
+import { sendCode, loginBySendCode, login } from "../../http/sso";
+import LogoIcon from "@src/assets/images/login/logo.svg?react";
+import GonganIcon from "@src/assets/images/login/gongan.png";
 
 const LoginPage: React.FC = () => {
-  const [form] = Form.useForm();
-  const [loading, setLoading] = useState(false);
-  const [sendingCode, setSendingCode] = useState(false);
-  const [countdown, setCountdown] = useState(0);
-  const [accountForm] = Form.useForm();
-  const [accountLoading, setAccountLoading] = useState(false);
+	const [form] = Form.useForm();
+	const [loading, setLoading] = useState(false);
+	const [sendingCode, setSendingCode] = useState(false);
+	const [countdown, setCountdown] = useState(0);
+	const [accountForm] = Form.useForm();
+	const [accountLoading, setAccountLoading] = useState(false);
 
-  const handlePhoneLogin = async (values: any) => {
-    try {
-      setLoading(true);
-      const { phone, code } = values;
-      const success = await loginBySendCode(phone, code);
-      if (success) {
-        // Redirect will be handled by the login function
-      }
-    } catch (error) {
-      message.error('登录失败,请重试');
-    } finally {
-      setLoading(false);
-    }
-  };
+	const handlePhoneLogin = async (values: any) => {
+		try {
+			setLoading(true);
+			const { phone, code } = values;
+			const success = await loginBySendCode(phone, code);
+			if (success) {
+				// Redirect will be handled by the login function
+			}
+		} catch (error) {
+			message.error((error as Error)?.message || "登录失败,请重试");
+		} finally {
+			setLoading(false);
+		}
+	};
 
-  const handleSendCode = async () => {
-    try {
-      const phone = form.getFieldValue('phone');
-      if (!phone) {
-        message.error('请输入手机号');
-        return;
-      }
-      if (!/^1[3-9]\d{9}$/.test(phone)) {
-        message.error('请输入正确的手机号');
-        return;
-      }
+	const handleSendCode = async () => {
+		try {
+			const phone = form.getFieldValue("phone");
+			if (!phone) {
+				message.error("请输入手机号");
+				return;
+			}
+			if (!/^1[3-9]\d{9}$/.test(phone)) {
+				message.error("请输入正确的手机号");
+				return;
+			}
 
-      setSendingCode(true);
-      const success = await sendCode(phone);
-      if (success) {
-        let count = 60;
-        setCountdown(count);
-        const timer = setInterval(() => {
-          count -= 1;
-          setCountdown(count);
-          if (count <= 0) {
-            clearInterval(timer);
-            setCountdown(0);
-          }
-        }, 1000);
-      }
-    } catch (error) {
-      message.error('发送验证码失败,请重试');
-    } finally {
-      setSendingCode(false);
-    }
-  };
+			setSendingCode(true);
+			const success = await sendCode(phone);
+			if (success) {
+				let count = 60;
+				setCountdown(count);
+				const timer = setInterval(() => {
+					count -= 1;
+					setCountdown(count);
+					if (count <= 0) {
+						clearInterval(timer);
+						setCountdown(0);
+					}
+				}, 1000);
+			}
+		} catch (error) {
+			message.error(
+				(error as Error)?.message || "发送验证码失败,请重试"
+			);
+		} finally {
+			setSendingCode(false);
+		}
+	};
 
-  const handleAccountLogin = async (values: any) => {
-    try {
-      setAccountLoading(true);
-      const { account, password } = values;
-      const success = await login(account, password);
-      if (success) {
-        // Redirect will be handled by the login function
-      }
-    } catch (error) {
-      message.error('登录失败,请重试');
-    } finally {
-      setAccountLoading(false);
-    }
-  };
+	const handleAccountLogin = async (values: any) => {
+		try {
+			setAccountLoading(true);
+			const { account, password } = values;
+			const success = await login(account, password);
+			if (success) {
+				// Redirect will be handled by the login function
+			}
+		} catch (error) {
+			message.error((error as Error)?.message || "登录失败,请重试");
+		} finally {
+			setAccountLoading(false);
+		}
+	};
 
-  return (
-    <div className={styles.loginContainer}>
-      <div className={styles.leftSection}>
-        <div className={styles.platformTitle}>票圈内容合作平台</div>
-        <div className={styles.illustration}>
-          {/* You can add an illustration image here */}
-        </div>
-      </div>
-      
-      <div className={styles.rightSection}>
-        <div className={styles.loginBox}>
-          <h1 className={styles.platformTitle}>票圈内容合作平台</h1>
-          
-          <div className={styles.tabsContainer}>
-            <Tabs 
-              defaultActiveKey="phone"
-              centered
-              items={[
-                {
-                  key: 'phone',
-                  label: '验证码登录',
-                  children: (
-                    <Form
-                      form={form}
-                      name="phone_login"
-                      onFinish={handlePhoneLogin}
-                      layout="vertical"
-                      size="large"
-                    >
-                      <Form.Item
-                        name="phone"
-                        rules={[
-                          { required: true, message: '请输入手机号' },
-                          { pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号' }
-                        ]}
-                      >
-                        <Input 
-                          addonBefore={<div className={styles.phonePrefix}>+86</div>}
-                          placeholder="手机号"
-                          className={styles.phoneInput}
-                        />
-                      </Form.Item>
+	return (
+		<div className={styles.loginContainer}>
+			<div className={styles.leftSection}>
+				<div className={styles.logoSection}>
+					<Icon component={LogoIcon} />
+					<span>票圈内容合作平台</span>
+				</div>
+				<div className={styles.platformTitle}>票圈内容合作平台</div>
+			</div>
 
-                      <Form.Item
-                        name="code"
-                        rules={[{ required: true, message: '请输入验证码' }]}
-                      >
-                        <div className={styles.codeRow}>
-                          <Input 
-                            prefix={<LockOutlined />}
-                            placeholder="验证码"
-                            className={styles.codeInput}
-                          />
-                          <Button 
-                            onClick={handleSendCode}
-                            disabled={countdown > 0}
-                            loading={sendingCode}
-                            className={styles.getCodeBtn}
-                          >
-                            {countdown > 0 ? `${countdown}s` : '获取验证码'}
-                          </Button>
-                        </div>
-                      </Form.Item>
+			<div className={styles.rightSection}>
+				<div className={styles.loginBox}>
+					<div className={styles.tabsContainer}>
+						<Tabs
+							defaultActiveKey="phone"
 
-                      <Form.Item>
-                        <Button 
-                          type="primary" 
-                          htmlType="submit" 
-                          block 
-                          loading={loading}
-                          className={styles.loginBtn}
-                        >
-                          登录
-                        </Button>
-                      </Form.Item>
-                    </Form>
-                  ),
-                },
-                {
-                  key: 'account',
-                  label: '账号登录',
-                  children: (
-                    <Form
-                      form={accountForm}
-                      name="account_login"
-                      onFinish={handleAccountLogin}
-                      layout="vertical"
-                      size="large"
-                    >
-                      <Form.Item
-                        name="account"
-                        rules={[{ required: true, message: '请输入账号' }]}
-                      >
-                        <Input 
-                          prefix={<UserOutlined />}
-                          placeholder="账号"
-                        />
-                      </Form.Item>
+							items={[
+								{
+									key: "phone",
+									label: "验证码登录",
+									children: (
+										<Form
+											form={form}
+											name="phone_login"
+											onFinish={handlePhoneLogin}
+											layout="vertical"
+											size="large"
+										>
+											<Form.Item
+												name="phone"
+												rules={[
+													{
+														required: true,
+														message: "请输入手机号",
+													},
+													{
+														pattern:
+															/^1[3-9]\d{9}$/,
+														message:
+															"请输入正确的手机号",
+													},
+												]}
+											>
+												<Input
+													variant="borderless"
+													addonBefore={
+														<div
+															className={
+																styles.phonePrefix
+															}
+														>
+															+86
+														</div>
+													}
+													placeholder="手机号"
+													className={
+														styles.phoneInput +
+														" border-b-[1px] border-b-gray-400"
+													}
+												/>
+											</Form.Item>
 
-                      <Form.Item
-                        name="password"
-                        rules={[{ required: true, message: '请输入密码' }]}
-                      >
-                        <Input.Password 
-                          prefix={<LockOutlined />}
-                          placeholder="密码"
-                        />
-                      </Form.Item>
+											<Form.Item
+												name="code"
+												rules={[
+													{
+														required: true,
+														message: "请输入验证码",
+													},
+												]}
+											>
+												<div className={styles.codeRow}>
+													<Input
+														variant="borderless"
+														placeholder="验证码"
+														className={
+															styles.codeInput + ' !rounded-none !border-b-[1px] !border-b-gray-400'
+														}
+													/>
+													<Button
+														onClick={handleSendCode}
+														disabled={countdown > 0}
+														loading={sendingCode}
+														type="text"
+														className={
+															styles.getCodeBtn
+														}
+													>
+														{countdown > 0
+															? `${countdown}s`
+															: "获取验证码"}
+													</Button>
+												</div>
+											</Form.Item>
 
-                      <Form.Item>
-                        <Button 
-                          type="primary" 
-                          htmlType="submit" 
-                          block 
-                          loading={accountLoading}
-                          className={styles.loginBtn}
-                        >
-                          登录
-                        </Button>
-                      </Form.Item>
-                    </Form>
-                  ),
-                }
-              ]}
-            />
-          </div>
-        </div>
-      </div>
-      
-      <div className={styles.decorationBottom}>
-        {/* You can add a decoration image here */}
-      </div>
-    </div>
-  );
+											<Form.Item>
+												<Button
+													type="primary"
+													htmlType="submit"
+													block
+													loading={loading}
+													className={styles.loginBtn}
+												>
+													登录
+												</Button>
+											</Form.Item>
+										</Form>
+									),
+								},
+								{
+									key: "account",
+									label: "账号登录",
+									children: (
+										<Form
+											form={accountForm}
+											name="account_login"
+											onFinish={handleAccountLogin}
+											layout="vertical"
+											size="large"
+										>
+											<Form.Item
+												name="account"
+												rules={[
+													{
+														required: true,
+														message: "请输入账号",
+													},
+												]}
+											>
+												<Input
+													placeholder="账号"
+													variant="borderless"
+													className="!rounded-none !border-b-[1px] !border-b-gray-400"
+												/>
+											</Form.Item>
+
+											<Form.Item
+												name="password"
+												rules={[
+													{
+														required: true,
+														message: "请输入密码",
+													},
+												]}
+											>
+												<Input.Password
+													placeholder="密码"
+													variant="borderless"
+													className="!rounded-none !border-b-[1px] !border-b-gray-400"
+												/>
+											</Form.Item>
+
+											<Form.Item>
+												<Button
+													type="primary"
+													htmlType="submit"
+													block
+													loading={accountLoading}
+													className={styles.loginBtn}
+												>
+													登录
+												</Button>
+											</Form.Item>
+										</Form>
+									),
+								},
+							]}
+						/>
+					</div>
+				</div>
+			</div>
+
+			<div className={styles.decorationBottom}>
+				{/* You can add a decoration image here */}
+				<p>© 2020 湖南为趣时代网络科技有限公司</p>
+				<p>
+					<span className="link cursor-pointer" onClick={() => window.open('https://rescdn.yishihui.com/agreement/piaoquantvservice.html')}>
+						用户服务协议 
+					</span>
+					<span className="mx-1">|</span>
+					<span className="link cursor-pointer" onClick={() => window.open('https://rescdn.yishihui.com/agreement/piaoquantvagreement.html')}>
+						隐私政策 
+					</span>
+					<span className="mx-1">|</span>
+					<span className="link cursor-pointer" onClick={() => window.open('https://www.piaoquantv.com/upload/help')}>
+						帮助中心 
+					</span>
+					<span className="mx-1">|</span>
+					客服及举报: 0731-85679198、18974809627
+					<span className="mx-1">|</span>
+					举报邮箱:piaoquankefu@new.piaoquantv.com
+				</p>
+
+				<p className="flex items-center justify-center">
+					<span className="link cursor-pointer" onClick={() => window.open('https://beian.miit.gov.cn/')}>
+						湘ICP备16013107-06号
+					</span>
+					| <img style={{ width: '16px', height: '16px' }} src={GonganIcon} />
+					<span className="link cursor-pointer" onClick={() => window.open('https://beian.mps.gov.cn/#/query/webSearch')}>
+						湘公网安备:43019002001624
+					</span>
+				</p>
+			</div>
+		</div>
+	);
 };
 
 export default LoginPage;

+ 65 - 0
src/views/publishContent/publishContent.router.tsx

@@ -0,0 +1,65 @@
+import Icon, { DesktopOutlined } from '@ant-design/icons'
+import { AdminRouterItem } from "../../router";
+import React, { Suspense } from 'react';
+import WeComIcon from "@src/assets/images/publishContent/wxCom.svg?react";
+import WeGZHIcon from "@src/assets/images/publishContent/wxGzh.svg?react";
+import LogoIcon from "@src/assets/images/login/logo.svg?react";
+import { Outlet } from "react-router-dom";
+
+// Lazy load components
+const WeCom = React.lazy(() => import('./weCom/index'));
+const WeGZH = React.lazy(() => import('./weGZH/index'));
+
+// Loading fallback component
+// eslint-disable-next-line react-refresh/only-export-components
+const LazyLoadingFallback = () => (
+  <div className="flex items-center justify-center flex-col h-[50vh]">
+		<Icon component={LogoIcon} className="text-[50px] opacity-50" />
+		<div className="text-gray-500 text-xl">加载中</div>
+  </div>
+);
+
+// Wrapper component with Suspense
+// eslint-disable-next-line react-refresh/only-export-components
+const LazyComponent = ({ Component }: { Component: React.ComponentType<any> }) => (
+  <Suspense fallback={<LazyLoadingFallback />}>
+    <Component />
+  </Suspense>
+);
+
+const demoRoutes: AdminRouterItem[] = [
+  {
+		path: 'publishContent',
+		element: <Outlet />,
+		meta: {
+			label: "发布内容管理",
+			title: "发布内容管理",
+			key: "/publishContent",
+			icon: <DesktopOutlined />,
+		},
+		children: [
+			{
+				path: 'wegzh',
+				element: <LazyComponent Component={WeGZH} />,
+				meta: {
+					label: "公众号",
+					title: "公众号",
+					key: "/publishContent/wegzh",
+					icon: <Icon component={WeGZHIcon} className="!text-[20px]" />,
+				}
+			},
+			{
+				path: 'wecom',
+				element: <LazyComponent Component={WeCom} />,
+				meta: {
+					label: "企微",
+					title: "企微",
+					key: "/publishContent/wecom",
+					icon: <Icon component={WeComIcon} className="!text-[20px]"/>,
+				}
+			},
+		]
+	}
+]
+
+export default demoRoutes

+ 151 - 0
src/views/publishContent/weCom/components/linkDetailModal/index.tsx

@@ -0,0 +1,151 @@
+import React, { useState } from 'react';
+import { Modal, Table, Button, Space, Tooltip, message, Typography } from 'antd';
+import { CopyOutlined, PlayCircleOutlined, DownloadOutlined, LinkOutlined, QrcodeOutlined } from '@ant-design/icons';
+import { WeComPlan } from '@src/views/publishContent/weCom/type'; // Assuming type location
+import copy from 'copy-to-clipboard';
+import { getShareQrPic } from '@src/http/api';
+import http from '@src/http';
+import modal from 'antd/es/modal';
+import VideoPlayModal from '../videoPlayModal';
+// import QRCode from 'qrcode.react'; // Consider adding this dependency if not present
+
+const { Text } = Typography;
+
+interface LinkDetailModalProps {
+  visible: boolean;
+  onClose: () => void;
+  videos: WeComPlan[]; // Use the appropriate type for your video data
+}
+
+// --- Placeholder Functions (Implement actual logic later) ---
+
+
+const downloadCover = (video: WeComPlan) => {
+  if (video.cover) {
+    const link = document.createElement('a');
+    link.href = video.cover;
+    // Attempt to infer filename, might need refinement
+    const filename = video.cover.substring(video.cover.lastIndexOf('/') + 1) || `cover_${video.id}.jpg`;
+    link.download = filename;
+    link.target = '_blank'; // Open in new tab might be safer for some browsers
+    link.rel = 'noopener noreferrer';
+    document.body.appendChild(link);
+    link.click();
+    document.body.removeChild(link);
+  } else {
+     message.warning('No cover image URL available.');
+  }
+};
+
+const copyPushLink = (video: WeComPlan) => {
+  // Assuming video object might have a 'pushLink' property added by the parent component
+  const linkToCopy = video.pageUrl || 'Push link not available'; // Updated placeholder
+  if (video.pageUrl && copy(linkToCopy)) {
+    message.success('推送链接已复制');
+  } else if (!video.pageUrl) {
+    message.warning('没有可复制的推送链接');
+  } else {
+    message.error('复制失败');
+  }
+};
+
+const showQRCode = (video: WeComPlan) => {
+  http.get<string>(getShareQrPic, {
+		params: {
+			pageUrl: video.pageUrl,
+		}
+	}).then(res => {
+		modal.info({
+			title: '二维码',
+			content: <img src={res.data} alt="二维码" />,
+		});
+	}).catch(err => {
+		message.error(err.msg || '获取二维码失败');
+	});
+};
+// --- End Placeholder Functions ---
+
+
+const LinkDetailModal: React.FC<LinkDetailModalProps> = ({ visible, onClose, videos }) => {
+	const [isVideoPlayModalVisible, setIsVideoPlayModalVisible] = useState<boolean>(false);
+	const [activeVideo, setActiveVideo] = useState<WeComPlan | null>(null);
+  const columns = [
+    {
+      title: '视频标题',
+      dataIndex: 'title',
+      key: 'title',
+      render: (title: string) => (
+        <Space>
+          <Text style={{ maxWidth: 200 }} ellipsis={{ tooltip: title }}>{title}</Text>
+          <Tooltip title="复制标题">
+            <Button
+              type="text"
+              icon={<CopyOutlined />}
+              onClick={() => {
+                if (copy(title)) {
+                  message.success('标题已复制');
+                } else {
+                  message.error('复制失败');
+                }
+              }}
+              size="small"
+            />
+          </Tooltip>
+        </Space>
+      ),
+    },
+    {
+      title: '场景',
+      dataIndex: 'scene',
+      key: 'scene',
+      render: (scene: number | undefined) => (scene === 0 ? '群发' : scene === 1 ? '单发' : '未知'), // Adjust based on your scene values
+    },
+    {
+      title: '操作',
+      key: 'action',
+      render: (_: any, record: WeComPlan) => (
+        <Space wrap size="small">
+          <Button type="link" icon={<PlayCircleOutlined />} onClick={() => playVideo(record)} size="small">播放</Button>
+          <Button type="link" icon={<DownloadOutlined />} onClick={() => downloadCover(record)} size="small">下载封面</Button>
+          <Button type="link" icon={<LinkOutlined />} onClick={() => copyPushLink(record)} size="small">复制推送链接</Button>
+          <Button type="link" icon={<QrcodeOutlined />} onClick={() => showQRCode(record)} size="small">二维码</Button>
+        </Space>
+      ),
+    },
+	];
+	
+	const playVideo = (video: WeComPlan) => {
+		setActiveVideo(video);
+		setIsVideoPlayModalVisible(true);
+	};
+
+  return (
+    <Modal
+      title="链接详情"
+      open={visible}
+      onCancel={onClose}
+      footer={[
+        <Button key="close" onClick={onClose}>
+          关闭
+        </Button>,
+      ]}
+      width={800} // Adjust width as needed
+      destroyOnClose
+    >
+      <Table
+        columns={columns}
+        dataSource={videos.map(v => ({ ...v, key: v.id }))} // Ensure each item has a unique key
+        pagination={false} // Disable pagination if the list is expected to be short
+        size="small"
+			/>
+			<VideoPlayModal
+				visible={isVideoPlayModalVisible}
+				onClose={() => setIsVideoPlayModalVisible(false)}
+				videoUrl={activeVideo?.video || ''}
+				title={activeVideo?.title || ''}
+			/>
+    </Modal>
+  );
+};
+
+export default LinkDetailModal; 

+ 199 - 0
src/views/publishContent/weCom/components/planDetailModal/index.tsx

@@ -0,0 +1,199 @@
+import React, { useEffect, useState } from 'react';
+import { Modal, Button, Descriptions, Image, Space, Tooltip, message, Typography } from 'antd';
+import { CopyOutlined, PlayCircleOutlined, DownloadOutlined } from '@ant-design/icons';
+import { WeComPlan, WeComPlanType } from '@src/views/publishContent/weCom/type';
+import copy from 'copy-to-clipboard';
+import VideoPlayModal from '../videoPlayModal';
+import { getShareQrPic } from '@src/http/api';
+import http from '@src/http';
+
+const { Text } = Typography;
+
+interface PlanDetailModalProps {
+  visible: boolean;
+  onClose: () => void;
+  planData: WeComPlan | null | undefined; 
+}
+
+const PlanDetailModal: React.FC<PlanDetailModalProps> = ({ visible, onClose, planData }) => {
+	const [isVideoPlayModalVisible, setIsVideoPlayModalVisible] = useState<boolean>(false);
+	const [qrCode, setQrCode] = useState<string>('');
+	
+	useEffect(() => {
+		if (planData?.pageUrl) {
+			getShareQr(planData?.pageUrl || '');
+		}
+	}, [planData]);
+
+  if (!planData) {
+    return null; // Don't render if no data
+	}
+
+	
+	
+	const getShareQr = (pageUrl: string) => {
+		http.get<string>(getShareQrPic, {
+			params: {
+				pageUrl,
+			}
+		}).then(res => {
+			setQrCode(res.data);
+		}).catch(err => {
+			message.error(err.msg || '获取二维码失败');
+		});
+		
+	};
+
+  const handleCopy = (text: string | undefined, successMessage: string) => {
+    if (text && copy(text)) {
+      message.success(successMessage);
+    } else if (!text) {
+      message.warning('没有内容可复制');
+    } else {
+      message.error('复制失败');
+    }
+  };
+
+  const downloadFile = (url: string | undefined, filename: string) => {
+    if (!url) {
+      message.warning('无可用文件下载');
+      return;
+    }
+    const link = document.createElement('a');
+    link.href = url;
+    link.download = filename || url.substring(url.lastIndexOf('/') + 1);
+    link.target = '_blank';
+    link.rel = 'noopener noreferrer';
+    document.body.appendChild(link);
+    link.click();
+    document.body.removeChild(link);
+    message.success('开始下载...');
+  };
+
+  const playVideo = () => {
+    setIsVideoPlayModalVisible(true);
+  }
+
+  // Determine scene text based on plan type (adjust logic if needed)
+  const getSceneText = (plan: WeComPlan) => {
+    if (plan.type === +WeComPlanType.每日推送) {
+      return plan.scene === 0 ? '群发' : '单发';
+    }
+    // Add logic for other plan types if necessary
+    return '自动回复'; // Example placeholder for other types
+  }
+  
+  // Determine publish type text (adjust based on your data model)
+  const getPublishTypeText = (plan: WeComPlan) => {
+     // This field isn't directly in WeComPlan, you might need to fetch/derive it
+     // Returning a placeholder for now.
+     return plan.type === +WeComPlanType.每日推送 ? '每日推送' : '自动回复'; // Example
+  }
+  
+  // Determine account type text (adjust based on your data model)
+  const getAccountTypeText = () => {
+    // This field isn't in WeComPlan, returning placeholder.
+    return '小慧爱厨房'; // Placeholder based on image
+  }
+
+  // Determine account name text (adjust based on your data model)
+  const getAccountNameText = () => {
+      // This field isn't in WeComPlan, returning placeholder.
+      return '企微号'; // Placeholder based on image
+  }
+
+  return (
+    <Modal
+      title="内容详情"
+      open={visible}
+      onCancel={onClose}
+      footer={[
+        <Button key="close" type="primary" onClick={onClose}>
+          关闭
+        </Button>,
+      ]}
+      width={650} // Adjust width as needed
+      destroyOnClose
+    >
+      <Descriptions bordered column={1} size="small" labelStyle={{ width: '120px' }}>
+        <Descriptions.Item label="链接ID">{planData.id}</Descriptions.Item>
+        {/* Placeholder fields based on image - replace with actual data source if available */}
+        <Descriptions.Item label="发布账号类型">{getAccountTypeText()}</Descriptions.Item>
+        <Descriptions.Item label="公众号名称">{getAccountNameText()}</Descriptions.Item>
+        <Descriptions.Item label="发布场景">{getPublishTypeText(planData)}</Descriptions.Item>
+
+        <Descriptions.Item label="场景">{getSceneText(planData)}</Descriptions.Item>
+        <Descriptions.Item label="推送链接">
+          <Space>
+            <Text style={{ maxWidth: 350 }} ellipsis={{ tooltip: planData.pageUrl }}>
+              {planData.pageUrl}
+            </Text>
+            <Tooltip title="复制链接">
+              <Button
+                type="text"
+                icon={<CopyOutlined />}
+                onClick={() => handleCopy(planData.pageUrl, '推送链接已复制')}
+                size="small"
+              />
+            </Tooltip>
+          </Space>
+        </Descriptions.Item>
+        <Descriptions.Item label="视频标题">
+          <Space>
+            <Text style={{ maxWidth: 400 }} ellipsis={{ tooltip: planData.title }}>
+                {planData.title}
+            </Text>
+            <Tooltip title="复制标题">
+              <Button
+                type="text"
+                icon={<CopyOutlined />}
+                onClick={() => handleCopy(planData.title, '标题已复制')}
+                size="small"
+              />
+            </Tooltip>
+          </Space>
+        </Descriptions.Item>
+        <Descriptions.Item label="视频封面">
+          <Space direction="vertical" align="start">
+            <Image 
+              width={150} 
+              src={planData.cover} 
+              alt="视频封面" 
+              referrerPolicy="no-referrer" 
+              placeholder={ <div style={{ width: 150, height: 100, background: '#f0f0f0', display: 'flex', alignItems: 'center', justifyContent: 'center' }}>加载中...</div> }
+             />
+            <Button 
+              type="link" 
+              icon={<DownloadOutlined />} 
+              onClick={() => downloadFile(planData.cover, planData.title + '_cover.jpg')} 
+              size="small"
+            >
+              下载封面
+            </Button>
+          </Space>
+        </Descriptions.Item>
+        <Descriptions.Item label="二维码">
+          {qrCode ? (
+             <Space direction="vertical" align="start">
+                 <img style={{ width: 150, height: 150 }} src={qrCode} alt="二维码" />
+                 {/* You might want to add a logo overlay if needed */}
+             </Space>
+          ) : (
+            <Text type="secondary">无可用链接生成二维码</Text>
+          )}
+        </Descriptions.Item>
+        <Descriptions.Item label="视频内容">
+          <Button type="link" icon={<PlayCircleOutlined />} onClick={playVideo} size="small">播放</Button>
+        </Descriptions.Item>
+			</Descriptions>
+			<VideoPlayModal
+				visible={isVideoPlayModalVisible}
+				onClose={() => setIsVideoPlayModalVisible(false)}
+				videoUrl={planData.video || ''}
+				title={planData.title || ''}
+			/>
+    </Modal>
+  );
+};
+
+export default PlanDetailModal; 

+ 27 - 0
src/views/publishContent/weCom/components/videoPlayModal/index.tsx

@@ -0,0 +1,27 @@
+import React from 'react';
+import { Modal } from 'antd';
+
+interface VideoPlayModalProps {
+  visible: boolean;
+	onClose: () => void;
+	title: string;
+  videoUrl: string;
+}
+
+const VideoPlayModal: React.FC<VideoPlayModalProps> = ({ visible, onClose, title, videoUrl }) => {
+  return (
+    <Modal
+      open={visible}
+      onCancel={onClose}
+      footer={null}
+			destroyOnClose
+			title={title}
+    >
+      <video controls autoPlay className="w-full h-auto max-h-[80vh] block" src={videoUrl}>
+        Your browser does not support the video tag.
+      </video>
+    </Modal>
+  );
+};
+
+export default VideoPlayModal;

+ 265 - 0
src/views/publishContent/weCom/components/videoSelectModal/index.tsx

@@ -0,0 +1,265 @@
+import React, { useState, useEffect } from 'react';
+import {
+	Drawer,
+	Button,
+	Select,
+	Input,
+	Card,
+	Typography,
+	Pagination,
+	Space,
+	message,
+	Modal,
+} from 'antd';
+import { CheckCircleFilled, CaretRightFilled } from '@ant-design/icons';
+import { VideoListResponse } from '@src/views/publishContent/weGZH/components/types';
+import http from '@src/http';
+import { getVideoContentListApi } from '@src/http/api';
+import { useVideoCategoryOptions } from '@src/views/publishContent/weGZH/hooks/useVideoCategoryOptions';
+import { WeComPlanType, WeVideoItem } from '@src/views/publishContent/weCom/type'
+
+const { Text, Paragraph } = Typography;
+
+interface VideoSelectModalProps {
+	planType: WeComPlanType;
+	visible: boolean;
+	onClose: () => void;
+	onOk: (selectedVideos: WeVideoItem[]) => void;
+	initialSelectedIds?: number[];
+}
+
+const VideoSelectModal: React.FC<VideoSelectModalProps> = ({ planType, visible, onClose, onOk, initialSelectedIds = [] }) => {
+	const { videoCategoryOptions } = useVideoCategoryOptions();
+	const [category, setCategory] = useState<string>();
+	const [searchTerm, setSearchTerm] = useState<string>('');
+	const [currentPage, setCurrentPage] = useState(1);
+	const [pageSize, setPageSize] = useState(10);
+	const [total, setTotal] = useState(0);
+	const [loading, setLoading] = useState(false);
+	const [videoList, setVideoList] = useState<WeVideoItem[]>([]);
+	const [videoListAll, setVideoListAll] = useState<WeVideoItem[]>([]);
+	const [selectedVideoIds, setSelectedVideoIds] = useState<Set<number>>(new Set(initialSelectedIds));
+	const [playingVideo, setPlayingVideo] = useState<WeVideoItem | null>(null);
+	const MAX_SELECTION = 3;
+
+	const getVideoList = async (pageNum?: number, _pageSize?: number) => {
+		setLoading(true);
+		setCurrentPage(pageNum || currentPage);
+		setPageSize(_pageSize || pageSize);
+		const res = await http.post<VideoListResponse>(getVideoContentListApi, {
+			category,
+			title: searchTerm,
+			pageNum: pageNum || currentPage,
+			pageSize: _pageSize || pageSize,
+		}).catch(() => {
+			message.error('获取视频列表失败');
+		}).finally(() => {
+			setLoading(false);
+		});
+		if (res && res.code === 0) {
+			const mappedVideos = res.data.objs.map(video => ({ ...video, scene: 0 as const }));
+			setVideoList(mappedVideos);
+			setVideoListAll(old => [...old, ...mappedVideos]);
+			setTotal(res.data.totalSize);
+		}
+	}
+
+	useEffect(() => {
+		getVideoList();
+	}, []);
+
+	useEffect(() => {
+		if (visible) {
+			setSelectedVideoIds(new Set(initialSelectedIds));
+		}
+	}, [visible, initialSelectedIds]);
+
+	const handleSearch = () => {
+		console.log('Searching for:', { category, searchTerm });
+		setCurrentPage(1);
+		getVideoList();
+	};
+
+	const handleSelectVideo = (videoId: number) => {
+		setSelectedVideoIds(prev => {
+			const newSet = new Set(prev);
+			if (newSet.has(videoId)) {
+				newSet.delete(videoId);
+			} else {
+				if (newSet.size >= MAX_SELECTION) {
+					message.warning(`最多只能选择 ${MAX_SELECTION} 条视频`);
+					return prev;
+				}
+				newSet.add(videoId);
+			}
+			return newSet;
+		});
+	};
+
+	const handleOk = () => {
+		const selectedVideos = videoListAll.filter(video => selectedVideoIds.has(video.videoId));
+		onOk(selectedVideos);
+	};
+
+	const playVideo = (video: WeVideoItem) => {
+		setPlayingVideo(video);
+	};
+
+	const closeVideoPlayer = () => {
+		setPlayingVideo(null);
+	};
+
+	const handleChangeSelectVideo = (videoId: number, scene: number) => {
+		setVideoList((prev: WeVideoItem[]) => {
+			const newList = prev.map(video => {
+				if (video.videoId === videoId) {
+					return { ...video, scene: scene as 0 | 1 };
+				}
+				return video;
+			});
+			return newList;
+		});
+		setVideoListAll((prev: WeVideoItem[]) => {
+			const newList = prev.map(video => {
+				if (video.videoId === videoId) {
+					return { ...video, scene: scene as 0 | 1 };
+				}
+				return video;
+			});
+			return newList;
+		});
+	}
+
+	return (
+		<>
+			<Drawer
+				title="内容选取"
+				open={visible}
+				onClose={onClose}
+				width={800}
+				placement="right"
+				loading={loading}
+				styles={{ footer: { textAlign: 'right', padding: '10px 24px' } }}
+				footer={
+					<div className="flex justify-between items-center">
+						<Pagination
+							current={currentPage}
+							pageSize={pageSize}
+							total={total}
+							onChange={(page, size) => {
+								setCurrentPage(page);
+								setPageSize(size);
+								getVideoList(page, size);
+							}}
+							pageSizeOptions={['10', '20', '50']}
+							size="small"
+							showSizeChanger
+							showTotal={(total) => `共 ${total} 条`}
+						/>
+						<Space>
+							<Text>已选 {selectedVideoIds.size} / {MAX_SELECTION} 条视频</Text>
+							<Button onClick={onClose}>取消</Button>
+							<Button type="primary" onClick={handleOk}>确定</Button>
+						</Space>
+					</div>
+				}
+			>
+				<div className="flex flex-wrap gap-4 mb-6">
+					<div className="flex items-center gap-2">
+						<span className="text-gray-600">品类:</span>
+						<Select
+							placeholder="选择品类"
+							style={{ width: 180 }}
+							value={category}
+							allowClear
+							onChange={setCategory}
+							options={videoCategoryOptions.map(option => ({ label: option, value: option }))}
+						/>
+					</div>
+					<div className="flex items-center gap-2">
+						<span className="text-gray-600">视频标题:</span>
+						<Input
+							placeholder="搜索视频标题"
+							style={{ width: 200 }}
+							value={searchTerm}
+							onChange={e => setSearchTerm(e.target.value)}
+						/>
+					</div>
+					<Button type="primary" onClick={handleSearch}>搜索</Button>
+				</div>
+
+				<div className="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-4">
+					{videoList.map((video) => {
+						const isSelected = selectedVideoIds.has(video.videoId);
+						const isDisabled = !isSelected && selectedVideoIds.size >= MAX_SELECTION;
+						return (
+							<Card
+								key={video.videoId}
+								className={`relative ${isDisabled ? 'opacity-50' : 'cursor-pointer'} ${isSelected ? 'border-blue-500 border-2 bg-blue-50 shadow-md' : 'hover:shadow-sm'}`}
+								styles={{ body: { padding: 0 } }}
+								onClick={() => !isDisabled && handleSelectVideo(video.videoId)}
+							>
+								<div className="p-3">
+									<Text type="secondary" className="text-xs">票圈 | 3亿人喜欢的视频平台</Text>
+									<Paragraph className="mt-1 !mb-1" ellipsis={{ rows: 2, tooltip: true }} title={video.title}>{video.title}</Paragraph>
+								</div>
+								<div
+									className="relative"
+									style={{ paddingBottom: '79.8%' }}
+									onClick={(e) => { e.stopPropagation(); playVideo(video); }}
+								>
+									<img src={video.cover} alt={video.title} referrerPolicy="no-referrer" className="absolute inset-0 w-full h-full object-cover" />
+									<div className="absolute inset-0 flex justify-center items-center cursor-pointer">
+										<CaretRightFilled className="!text-white text-4xl bg-black/20 rounded-full p-1 pl-2" />
+									</div>
+								</div>
+								<div className="p-3 flex justify-between items-center">
+									<Text type="secondary" className="text-xs">传播效率: {video.score?.toFixed(2)}</Text>
+									{isSelected ? (
+										<CheckCircleFilled className="text-green-500 text-xl" />
+									) : (
+										<div className={`w-5 h-5 border-2 ${isDisabled ? 'border-gray-200 bg-gray-100' : 'border-gray-300' } rounded-full`}></div>
+									)}
+								</div>
+								{isSelected && (
+									<div className="p-3 flex justify-between items-center relative z-10">
+										<Select
+											placeholder="选择场景"
+											style={{ width: 180 }}
+											defaultValue={video.scene || 0}
+											value={video.scene}
+											onChange={(value) => handleChangeSelectVideo(video.videoId, value)}
+											options={ planType === WeComPlanType.每日推送 ?
+												[{ label: '群发', value: 0 }, { label: '单发', value: 1 }]
+												: [{ label: '关注回复', value: 0 }]
+											}
+											onClick={(e) => e.stopPropagation()}
+										/>
+									</div>
+								)}
+							</Card>
+						);
+					})}
+				</div>
+			</Drawer>
+
+			<Modal
+				open={!!playingVideo}
+				onCancel={closeVideoPlayer}
+				title={playingVideo?.title}
+				footer={null}
+				destroyOnClose
+				width={720}
+				styles={{ body: { padding: 0, background: '#000' } }}
+			>
+				{playingVideo && (
+					<video controls autoPlay className="w-full h-auto max-h-[80vh] block" src={playingVideo.video}>
+						Your browser does not support the video tag.
+					</video>
+				)}
+			</Modal>
+		</>
+	);
+};
+
+export default VideoSelectModal;

+ 5 - 0
src/views/publishContent/weCom/index.module.css

@@ -0,0 +1,5 @@
+.antTable {
+	:global(.ant-table-title) {
+		padding: 0;
+	}
+}

+ 296 - 0
src/views/publishContent/weCom/index.tsx

@@ -0,0 +1,296 @@
+import React, { useEffect, useState } from 'react';
+import { Space, Table, Button, Input, Select, Tabs, message, Spin } from 'antd';
+import type { TableProps } from 'antd';
+import styles from './index.module.css';
+import { WeComPlan, WeComPlanListResponse, WeComPlanType, WeVideoItem } from './type';
+import request from '@src/http/index';
+import { deleteQwPlanApi, getQwPlanListApi, getShareQrPic, saveQwPlanApi } from "@src/http/api"
+import VideoSelectModal from './components/videoSelectModal';
+import LinkDetailModal from './components/linkDetailModal';
+import PlanDetailModal from './components/planDetailModal';
+import http from '@src/http/index';
+import copy from 'copy-to-clipboard';
+import VideoPlayModal from './components/videoPlayModal';
+import modal from 'antd/es/modal';
+// Define a type for the expected API response (adjust if needed based on actual API)
+const TableHeight = window.innerHeight - 380;
+const WeGZHContent: React.FC = () => {
+	// 状态管理
+	const [videoTitle, setVideoTitle] = useState<string>('');
+	const [selectedPublisher, setSelectedPublisher] = useState<number>();
+	const [isShowAddPunlishPlan, setIsShowAddPunlishPlan] = useState<boolean>(false);
+	const [editPlanData, setEditPlanData] = useState<WeComPlan>();
+	const [activeKey, setActiveKey] = useState<WeComPlanType>(WeComPlanType.每日推送);
+
+	const [tableData, setTableData] = useState<WeComPlan[]>([]);
+	const [totalSize, setTotalSize] = useState<number>(0);
+	const [pageNum, setPageNum] = useState<number>(1);
+	const [isLoading, setIsLoading] = useState<boolean>(false);
+	// State for the new modal
+	const [isLinkDetailModalVisible, setIsLinkDetailModalVisible] = useState<boolean>(false);
+	const [createdVideoLinks, setCreatedVideoLinks] = useState<WeComPlan[]>([]);
+	
+	// State for the Plan Detail modal
+	const [isPlanDetailModalVisible, setIsPlanDetailModalVisible] = useState<boolean>(false);
+
+	const [isVideoPlayModalVisible, setIsVideoPlayModalVisible] = useState<boolean>(false);
+
+	const getTableData = (_pageNum?: number) => {
+		setPageNum(_pageNum || 1);
+		request.post<WeComPlanListResponse>(getQwPlanListApi, {
+				pageNum: _pageNum || pageNum,
+				pageSize: 10,
+				scene: selectedPublisher,
+				title: videoTitle,
+				type: +activeKey,
+			}
+		).then(res => {
+			setTableData(res.data.objs || []);
+			setTotalSize(res.data.totalSize);
+		}).catch(err => {
+			message.error(err.msg || '获取数据失败');
+		});
+	}
+
+	useEffect(() => {
+		getTableData(1);
+	}, [activeKey]);
+
+	// 表格列配置
+	const columns: TableProps<WeComPlan>['columns'] = [
+		{
+			title: '创建时间',
+			dataIndex: 'createTimestamp',
+			key: 'createTimestamp',
+			width: 200,
+			render: (_, record) => {
+				return record.createTimestamp ? new Date(record.createTimestamp).toLocaleString() : '';
+			}
+		},
+		{
+			title: '视频标题',
+			dataIndex: 'title',
+			key: 'title',
+			ellipsis: true,
+		},
+		{
+			title: '场景',
+			dataIndex: 'scene',
+			key: 'scene',
+			width: 100,
+			render: (_, record) => {
+				if (activeKey === WeComPlanType.每日推送) {
+					return record.scene === 0 ? '群发' : '单发';
+				} else {
+					return '自动回复';
+				}
+			}
+		},
+		{
+			title: '操作',
+			key: 'action',
+			width: 550,
+			fixed: 'right',
+			render: (_, record) => (
+				<Space size="middle" wrap>
+					<Button type="link" onClick={() => playVideo(record)}>播放</Button>
+					<Button type="link" onClick={() => downloadFile(record.cover, record.title + '_cover')}>下载封面</Button>
+					<Button type="link" onClick={() => showQrCodeModal(record.pageUrl)}>二维码</Button>
+					<Button type="link" onClick={() => copyToClipboard(record.pageUrl)}>复制链接</Button>
+					<Button type="link" onClick={() => showDetailModal(record)}>详情</Button>
+					<Button type="link" onClick={() => deletePlan(record)}>删除</Button>
+				</Space>
+			),
+		},
+	];
+
+	const deletePlan = (record: WeComPlan) => {
+		setIsLoading(true);
+		http.post(deleteQwPlanApi, {
+			id: record.id,
+		}).then(res => {
+			if (res.code === 0) {
+				message.success('删除成功');
+				getTableData();
+			} else {
+				message.error(res.msg || '删除失败');
+			}
+		}).catch(err => {
+			message.error(err.msg || '删除失败');
+		}).finally(() => {
+			setIsLoading(false);
+		});
+	}
+
+	const playVideo = (record: WeComPlan) => {
+		setEditPlanData(record);
+		setIsVideoPlayModalVisible(true);
+	}
+
+	const showDetailModal = (record: WeComPlan) => {
+		setEditPlanData(record);
+		setIsPlanDetailModalVisible(true);
+	}
+
+	const copyToClipboard = (text: string) => {
+		copy(text);
+		message.success('复制成功');
+	};
+
+	const downloadFile = (url: string, filename: string) => {
+		if (!url) {
+			message.warning('无可用文件下载');
+			return;
+		}
+		const link = document.createElement('a');
+		link.href = url;
+		link.download = filename || url.substring(url.lastIndexOf('/') + 1);
+		link.target = '_blank';
+		link.rel = 'noopener noreferrer';
+		document.body.appendChild(link);
+		link.click();
+		document.body.removeChild(link);
+		message.success('开始下载...');
+	};
+
+	const showQrCodeModal = (pageUrl: string) => {
+		http.get<string>(getShareQrPic, {
+			params: {
+				pageUrl,
+			}
+		}).then(res => {
+			modal.info({
+				title: '二维码',
+				content: <img src={res.data} alt="二维码" />,
+			});
+		}).catch(err => {
+			message.error(err.msg || '获取二维码失败');
+		});
+		
+	};
+
+	const addPunlishPlan = () => {
+		setIsShowAddPunlishPlan(true);
+	}
+
+	const handleOk = (selectedVideos: WeVideoItem[]) => {
+		http.post<WeComPlan[]>(saveQwPlanApi, {
+			type: +activeKey,
+			videoList: selectedVideos,
+		}).then(res => {			
+			if (res.code === 0) {
+				message.success('创建成功');
+				setCreatedVideoLinks(res.data);
+				setIsLinkDetailModalVisible(true);
+				setIsShowAddPunlishPlan(false);
+				getTableData();
+			} else {
+				message.error(res.msg || '创建失败');
+			}
+		}).catch(err => {
+			message.error(err.msg || '创建失败');
+		});
+	}
+
+	return (
+		<Spin spinning={isLoading}>
+			<div className="rounded-lg">
+				<div className="text-lg font-medium mb-3">企业微信内容库</div>
+				
+				{/* 搜索区域 */}
+				<div className="flex flex-wrap gap-4 mb-3">
+
+					<div className="flex items-center gap-2">
+						<span className="text-gray-600">视频标题:</span>
+						<Input
+							placeholder="搜索视频标题"
+							style={{ width: 200 }}
+							value={videoTitle}
+							allowClear
+							onPressEnter={() => getTableData(1)}
+							onChange={e => setVideoTitle(e.target.value)}
+						/>
+					</div>
+
+					<div className="flex items-center gap-2">
+						<span className="text-gray-600">场景:</span>
+						<Select
+							placeholder="筛选场景"
+							style={{ width: 200 }}
+							value={selectedPublisher}
+							onChange={setSelectedPublisher}
+							allowClear
+							options={activeKey === WeComPlanType.每日推送 ? [
+								{ label: '群发', value: 0 },
+								{ label: '单发', value: 1 },
+							] : [
+								{ label: '关注回复', value: 0 },
+							]}
+						/>
+					</div>
+
+					<Button type="primary" className="ml-2" onClick={() => getTableData(1)}>搜索</Button>
+				</div>
+				<Tabs
+					defaultActiveKey="1"
+					type="card"
+					size="large"
+					items={[
+						{ label: '每日推送', key: WeComPlanType.每日推送 },
+						{ label: '自动回复', key: WeComPlanType.自动回复 },
+					]}
+					activeKey={activeKey}
+					onChange={(key: string) => setActiveKey(key as WeComPlanType)}
+					tabBarExtraContent={
+						{ right: <Button type="primary" onClick={addPunlishPlan}>+ 创建发布</Button> }}
+				/>		
+				{/* 表格区域 */}
+				<Table
+					rowKey={(record) => record.id}
+					className={styles.antTable}
+					columns={columns}
+					dataSource={tableData}
+					scroll={{ x: 'max-content', y: TableHeight }}
+					pagination={{
+						current: pageNum,
+						total: totalSize,
+						pageSize: 10,
+						showTotal: (total) => `共 ${total} 条`,
+						onChange: (page) => getTableData(page),
+					}}
+				/>
+				<VideoSelectModal
+					visible={isShowAddPunlishPlan}
+					onClose={() => {
+						setIsShowAddPunlishPlan(false);
+						setEditPlanData(undefined);
+					}}
+					onOk={handleOk}
+					initialSelectedIds={editPlanData ? [editPlanData.id] : []}
+					planType={activeKey}
+				/>
+				<LinkDetailModal
+					visible={isLinkDetailModalVisible}
+					onClose={() => setIsLinkDetailModalVisible(false)}
+					videos={createdVideoLinks}
+				/>
+				<PlanDetailModal 
+					visible={isPlanDetailModalVisible}
+					onClose={() => {
+						setIsPlanDetailModalVisible(false);
+						setEditPlanData(undefined);
+					}}
+					planData={editPlanData}
+				/>
+				<VideoPlayModal
+					visible={isVideoPlayModalVisible}
+					onClose={() => setIsVideoPlayModalVisible(false)}
+					videoUrl={editPlanData?.video || ''}
+					title={editPlanData?.title || ''}
+				/>
+			</div>
+		</Spin>
+	);
+};
+
+export default WeGZHContent;

+ 29 - 0
src/views/publishContent/weCom/type.ts

@@ -0,0 +1,29 @@
+export interface WeComPlan {
+	cover: string;
+	createTimestamp: number;
+	id: number;
+	pageUrl: string;
+	scene: number;
+	title: string;
+	type: number;
+	video: string;
+}
+
+export interface WeComPlanListResponse {
+	objs: WeComPlan[];
+	totalSize: number;
+}
+
+export enum WeComPlanType {
+	自动回复 = '0',
+	每日推送 = '1',
+}
+
+export interface WeVideoItem {
+	videoId: number;
+	video: string;
+	title: string;
+	cover: string;
+	score: number,
+	scene?: 0 | 1;
+}

+ 48 - 0
src/views/publishContent/weGZH/components/PunlishPlanDetailModal/index.tsx

@@ -0,0 +1,48 @@
+import React from 'react';
+import { Modal, Descriptions } from 'antd';
+import { GzhPlanType } from '../../hooks/useGzhPlanList';
+import dayjs from 'dayjs';
+interface PunlishPlanDetailModalProps {
+  visible: boolean;
+  onCancel: () => void;
+  planData: GzhPlanType;
+}
+
+const PunlishPlanDetailModal: React.FC<PunlishPlanDetailModalProps> = ({
+  visible,
+  onCancel,
+  planData,
+}) => {
+
+  return (
+    planData && visible && <Modal
+      title="发布计划详情"
+			open={true}
+			destroyOnClose
+      onCancel={onCancel}
+      footer={null}
+      width={800}
+    >
+      <Descriptions column={1} bordered>
+				<Descriptions.Item label="场景">{planData?.scene === 0 ? '关注回复' : '自动回复'}</Descriptions.Item>
+        <Descriptions.Item label="公众号名称">{planData.accountName}</Descriptions.Item>
+        <Descriptions.Item label="视频列表">
+          {planData.videoList?.map((video, index) => (
+            <div key={video.videoId} style={{ marginBottom: '16px' }}>
+              <p>视频 {index + 1}: {video.customTitle || video.title}</p>
+              <img 
+                src={video.customCover || video.cover} 
+                alt={`视频${index + 1}封面`} 
+                style={{ maxWidth: '150px' }} 
+              />
+            </div>
+          ))}
+        </Descriptions.Item>
+        <Descriptions.Item label="发布时间">{dayjs(planData.createTimestamp).format('YYYY-MM-DD HH:mm:ss')}</Descriptions.Item>
+        <Descriptions.Item label="发布方">{planData.publishStage === 0 ? '平台发布' : '用户发布'}</Descriptions.Item>
+			</Descriptions>
+    </Modal>
+  );
+};
+
+export default PunlishPlanDetailModal; 

+ 289 - 0
src/views/publishContent/weGZH/components/editTitleCoverModal/index.tsx

@@ -0,0 +1,289 @@
+import React, { useState, useEffect } from 'react';
+import {
+	Modal,
+	Form,
+	Radio,
+	Input,
+	Upload,
+	Image,
+	Space,
+	message,
+} from 'antd';
+import { PlusOutlined, CheckCircleFilled } from '@ant-design/icons';
+import type { RadioChangeEvent } from 'antd';
+import type { UploadFile, UploadProps } from 'antd/es/upload/interface';
+import { VideoItem } from '../types';
+import { getAccessToken } from '@src/http/sso';
+import { adFileUpload, getVideoContentCoverFrameListApi } from '@src/http/api';
+import http from '@src/http';
+import { isNil } from 'lodash-es';
+
+const { TextArea } = Input;
+
+interface EditTitleCoverModalProps {
+	visible: boolean;
+	onCancel: () => void;
+	onOk: (updatedVideoData: Partial<VideoItem>) => void;
+	video: VideoItem | null;
+}
+
+const EditTitleCoverModal: React.FC<EditTitleCoverModalProps> = ({ visible, onCancel, onOk, video }) => {
+	const [form] = Form.useForm();
+	const [titleType, setTitleType] = useState<'original' | 'custom'>('original');
+	const [coverType, setCoverType] = useState<'original' | 'screenshot' | 'upload'>('original');
+	const [selectedScreenshot, setSelectedScreenshot] = useState<string | null>(null);
+	const [fileList, setFileList] = useState<UploadFile[]>([]);
+	const [screenshotImagesList, setScreenshotImagesList] = useState<string[]>([]);
+	useEffect(() => {
+		if (visible) { 
+			getScreenshotImagesList()
+		}
+	}, [visible])
+	useEffect(() => {
+		if (video && visible) {
+			// Reset form based on incoming video data
+			const hasCustomTitle = !isNil(video.customTitle) || video.customTitle === '';
+			const isCustomCover = video.customCoverType === 1 || video.customCoverType === 2;
+			const isScreenshotCover = video.customCoverType === 1;
+
+			const initialTitleType = hasCustomTitle ? 'custom' : 'original';
+			let initialCoverType: 'original' | 'screenshot' | 'upload' = 'original';
+			if (isCustomCover) {
+				if (isScreenshotCover) {
+					initialCoverType = 'screenshot';
+					setSelectedScreenshot(video.customCover || null);
+					setFileList([]);
+				} else {
+					initialCoverType = 'upload';
+					setSelectedScreenshot(null);
+					// Assume customThumbnail for upload is a URL, create UploadFile structure
+					setFileList([{ uid: '-1', name: 'custom_cover.png', status: 'done', url: video.customCover }]);
+				}
+			} else {
+				initialCoverType = 'original';
+				setSelectedScreenshot(null);
+				setFileList([]);
+			}
+
+			setTitleType(initialTitleType);
+			setCoverType(initialCoverType);
+			form.setFieldsValue({
+				titleType: initialTitleType,
+				title: video.title,
+				cover: video.cover,
+				coverType: initialCoverType,
+				customCover: video.customCover,
+				customCoverType: video.customCoverType,
+				customTitle: video.customTitle,
+			});
+		} else {
+			// Reset form when modal closes or no video
+			form.resetFields();
+			setTitleType('original');
+			setCoverType('original');
+			setSelectedScreenshot(null);
+			setFileList([]);
+		}
+	}, [video, visible, form, screenshotImagesList]);
+
+	const getScreenshotImagesList = async () => {
+		const res = await http.post<string[]>(getVideoContentCoverFrameListApi, {
+			videoId: video?.videoId
+		})
+		if (res.code === 0) { 
+			setScreenshotImagesList(res.data || [])
+		}
+	}
+	const handleOk = () => {
+		form.validateFields().then(values => {
+			const updatedData: Partial<VideoItem> = {};
+
+			// Handle Title
+			if (values.titleType === 'custom') {
+				updatedData.customTitle = values.customTitle || '';
+			} else {
+				updatedData.customTitle = '';
+				updatedData.title = video?.title; // Revert to original if selected
+			}
+
+			// Handle Cover
+			if (values.coverType === 'screenshot') {
+				if (!selectedScreenshot) {
+					message.error('请选择一个视频截图作为封面');
+					return;
+				}
+				updatedData.customCoverType = 1;
+				updatedData.customCover = selectedScreenshot;
+			} else if (values.coverType === 'upload') {
+				if (fileList.length === 0 || !fileList[0].url) {
+					// If using status, check for 'done' status and response URL
+					message.error('请上传自定义封面图片');
+					return;
+				}
+				// Assuming the upload process directly provides the final URL in fileList[0].url
+				// In a real app, you might get this from upload response
+				updatedData.customCover = fileList[0].url;
+				updatedData.customCoverType = 2;
+			} else { // Original
+				updatedData.customCover = '';
+				updatedData.customCoverType = 0;
+				updatedData.cover = video?.cover; // Revert to original
+			}
+
+			onOk(updatedData);
+		}).catch(info => {
+			console.log('Validate Failed:', info);
+		});
+	};
+
+	const handleUploadChange: UploadProps['onChange'] = ({ fileList: newFileList }) => {
+		// Only keep the latest file
+		setFileList(newFileList.slice(-1));
+		// If upload is successful, manually set coverType to 'upload'
+		if (newFileList.length > 0 && newFileList[0].status === 'done') {
+			setCoverType('upload');
+			form.setFieldsValue({ coverType: 'upload' });
+			// In a real app, you would get the URL from the response
+			// For demo: assuming the file object gets a url property after upload
+			if (!newFileList[0].url) {
+				newFileList[0].url = newFileList[0].response.data.fileUrl; // Placeholder URL
+			}
+		}
+	};
+
+	const handleTitleTypeChange = (e: RadioChangeEvent) => {
+		setTitleType(e.target.value);
+	};
+
+	const handleCoverTypeChange = (e: RadioChangeEvent) => {
+		setCoverType(e.target.value);
+		// Reset other cover selections when type changes
+		if (e.target.value !== 'screenshot') setSelectedScreenshot(null);
+		if (e.target.value !== 'upload') setFileList([]);
+	};
+
+	const handleSelectScreenshot = (imgUrl: string) => {
+		setSelectedScreenshot(imgUrl);
+		setCoverType('screenshot');
+		form.setFieldsValue({ coverType: 'screenshot' });
+		setFileList([]); // Clear upload list if screenshot selected
+	};
+
+	const uploadButton = (
+		<button style={{ border: 0, background: 'none' }} type="button">
+			<PlusOutlined />
+			<div style={{ marginTop: 8 }}>上传封面</div>
+		</button>
+	);
+	const checkFile = (file:UploadFile) => {
+		if ((file.size || 0) > 5 * 1024 * 1024) {
+			message.error('图片大小不能超过5MB')
+			return Upload.LIST_IGNORE // 阻止上传,如果返回false,该文件还是会出现在fileList中
+		}
+		
+		return true // 允许上传
+	}
+	
+	const headers = {
+		token: getAccessToken()
+	}
+
+	return (
+		<Modal
+			title="编辑标题/封面"
+			open={visible}
+			onCancel={onCancel}
+			onOk={handleOk}
+			width={600}
+			destroyOnClose
+			zIndex={20}
+			forceRender // Keep form instance even when closed
+		>
+			<Form form={form} layout="horizontal" labelCol={{ span: 4 }} wrapperCol={{ span: 20 }} labelAlign="left">
+				{/* Title Section */}
+				<Form.Item label="标题" name="titleType" initialValue="original">
+					<Radio.Group onChange={handleTitleTypeChange}>
+						<Radio value="original">原始标题</Radio>
+						<Radio value="custom">自定义标题</Radio>
+					</Radio.Group>
+				</Form.Item>
+
+				{titleType === 'custom' ? (
+					<Form.Item
+						label="自定义标题"
+						name="customTitle"
+						rules={[{ required: true, message: '请输入自定义标题' }]}
+					>
+						<TextArea rows={2} maxLength={50} showCount placeholder="请输入标题" />
+					</Form.Item>
+				) : (
+					<Form.Item
+						label="自定义标题"
+						name="title"
+						rules={[{ required: true, message: '请输入自定义标题' }]}
+					>
+						<TextArea disabled rows={2} maxLength={50} showCount placeholder="请输入标题" />
+					</Form.Item>
+				)}
+
+				{/* Cover Section */}
+				<Form.Item label="封面" name="coverType" initialValue="original">
+					<Radio.Group onChange={handleCoverTypeChange}>
+						<Radio value="original">原始封面</Radio>
+						<Radio value="screenshot">视频截图</Radio>
+						<Radio value="upload">自定义上传</Radio>
+					</Radio.Group>
+				</Form.Item>
+
+				{ 
+					coverType === 'original' && (
+						<img src={video?.cover} referrerPolicy="no-referrer" className="w-200 h-100 object-cover" />
+					)
+				}
+
+				{/* Screenshot Selection */}
+				{coverType === 'screenshot' && (
+					<Form.Item label="视频截图" wrapperCol={{ offset: 4, span: 20 }}>
+						<Space wrap>
+							{screenshotImagesList.map((imgUrl, index) => (
+								<div
+									key={index}
+									className={`relative w-24 h-24 border-2 cursor-pointer ${selectedScreenshot === imgUrl ? 'border-blue-500' : 'border-transparent'}`}
+									onClick={() => handleSelectScreenshot(imgUrl)}
+								>
+									<Image width="100%" height="100%" src={imgUrl} preview={false} style={{ objectFit: 'cover' }} />
+									{selectedScreenshot === imgUrl && (
+										<CheckCircleFilled className="absolute top-1 right-1 text-green-500 bg-white rounded-full text-lg" />
+									)}
+								</div>
+							))}
+						</Space>
+					</Form.Item>
+				)}
+
+				{/* Custom Upload */}
+				{coverType === 'upload' && (
+					<Form.Item label="自定义上传" wrapperCol={{ offset: 4, span: 20 }}>
+						<Upload
+							// Replace with your actual upload endpoint
+							action={adFileUpload}
+							headers={headers}
+							accept="image/*"
+							listType="picture-card"
+							beforeUpload={checkFile}
+							onChange={handleUploadChange}
+							fileList={fileList}
+							showUploadList={{ showPreviewIcon: false }}
+							maxCount={1}
+							data={{ fileType: 'PICTURE' }}
+						>
+							{fileList.length >= 1 ? null : uploadButton}
+						</Upload>
+					</Form.Item>
+				)}
+			</Form>
+		</Modal>
+	);
+};
+
+export default EditTitleCoverModal; 

+ 0 - 0
src/views/publishContent/weGZH/components/publishPlanModal/index.module.css


+ 278 - 0
src/views/publishContent/weGZH/components/publishPlanModal/index.tsx

@@ -0,0 +1,278 @@
+import React, { useEffect, useState } from 'react';
+import { Modal, Form, Select, Button, Card, Typography, message } from 'antd';
+import { CloseOutlined, PlusOutlined, EditOutlined, CaretRightFilled } from '@ant-design/icons';
+import VideoSelectModal from '../videoSelectModal';
+import EditTitleCoverModal from '../editTitleCoverModal';
+import { VideoItem } from '../types'; // Import from common types
+import { GzhPlanType } from '../../hooks/useGzhPlanList';
+import { useAccountOptions } from '../../hooks/useAccountOptions';
+
+const { Option } = Select;
+const { Paragraph } = Typography;
+
+interface AddPunlishPlanModalProps {
+	visible: boolean;
+	onCancel: () => void;
+	onOk: (values: GzhPlanType) => void; // Pass form values on OK
+	actionType: 'add' | 'edit';
+	editPlanData?: GzhPlanType;
+	isSubmiting?: boolean;
+}
+
+const AddPunlishPlanModal: React.FC<AddPunlishPlanModalProps> = ({ visible, isSubmiting, onCancel, onOk, actionType, editPlanData }) => {
+	const [form] = Form.useForm();
+	const [selectedVideos, setSelectedVideos] = useState<VideoItem[]>([]);
+	const [isVideoSelectVisible, setIsVideoSelectVisible] = useState(false);
+	const [playingVideo, setPlayingVideo] = useState<VideoItem | null>(null); // State for video player modal
+	const [editingVideo, setEditingVideo] = useState<VideoItem | null>(null); // State for editing modal
+	const { accountOptions } = useAccountOptions();
+
+	useEffect(() => {
+		if (actionType === 'edit') {
+			form.setFieldsValue(editPlanData);
+			setSelectedVideos(editPlanData?.videoList || []);
+		}
+	}, [actionType, editPlanData]);
+
+	const handleOk = () => {
+		form
+			.validateFields()
+			.then((values) => {
+				// Ensure at least one video is selected before submitting
+				if (selectedVideos.length === 0) {
+					message.error('请至少选择一个视频'); // Use Antd message
+					return;
+				}
+				onOk({ ...values, scene: 0, videoList: selectedVideos });
+			})
+			.catch((info) => {
+				console.log('Validate Failed:', info);
+			});
+	};
+
+	const removeVideo = (idToRemove: number) => {
+		setSelectedVideos(currentVideos => currentVideos.filter(video => video.videoId !== idToRemove));
+	};
+
+	const openVideoSelector = () => {
+		setIsVideoSelectVisible(true);
+	};
+
+	const handleVideoSelectionOk = (newlySelectedVideos: VideoItem[]) => {
+		// Merge existing custom data with newly selected videos
+		const currentCustomData = new Map<number, Partial<VideoItem>>();
+		selectedVideos.forEach(v => {
+			if (v.videoId) {
+				currentCustomData.set(v.videoId, { customTitle: v.customTitle, customCover: v.customCover, customCoverType: v.customCoverType });
+			}
+		});
+
+		const mergedVideos = newlySelectedVideos.map(newVideo => {
+			const customData = currentCustomData.get(newVideo.videoId);
+			return { ...newVideo, ...customData };
+		});
+
+		setSelectedVideos(mergedVideos);
+		setIsVideoSelectVisible(false);
+	};
+
+	const handleVideoSelectionCancel = () => {
+		setIsVideoSelectVisible(false);
+	};
+
+	const playVideo = (video: VideoItem) => {
+		setPlayingVideo(video);
+	};
+
+	const closeVideoPlayer = () => {
+		setPlayingVideo(null);
+	};
+
+	const openEditModal = (video: VideoItem) => {
+		setEditingVideo(video);
+	};
+
+	const handleEditOk = (updatedData: Partial<VideoItem>) => {
+		console.log('updatedData', updatedData);
+		setSelectedVideos(currentVideos =>
+			currentVideos.map(v =>
+				v.videoId === editingVideo?.videoId ? { ...v, ...updatedData } : v
+			)
+		);
+		setEditingVideo(null); // Close modal
+	};
+
+	const handleEditCancel = () => {
+		setEditingVideo(null);
+	};
+
+	return (
+		<>
+			<Modal
+				title="创建发布计划"
+				open={visible}
+				destroyOnClose
+				onCancel={onCancel}
+				width={900} // Adjust width as needed
+				footer={[
+					<Button key="back" onClick={onCancel}>
+						取消
+					</Button>,
+					<Button key="submit" type="primary" loading={isSubmiting} onClick={handleOk}>
+						确定
+					</Button>,
+				]}
+				zIndex={10}
+			>
+				<Form form={form} layout="vertical">
+					<Form.Item
+						name="id"
+						label="计划ID"
+						hidden
+					>
+					</Form.Item>
+					<Form.Item
+						name="publishStage"
+						label="发布方"
+						labelCol={{ span: 4 }}
+						labelAlign='left'
+						layout="horizontal"
+						rules={[{ required: true, message: '请选择发布方' }]}
+					>
+						<Select placeholder="选择发布方" allowClear className='!w-50'>
+							<Option value={0}>平台发布</Option>
+							<Option value={1}>用户发布</Option>
+						</Select>
+					</Form.Item>
+					<Form.Item
+						name="accountId"
+						label="公众号名称"
+						labelCol={{ span: 4 }}
+						labelAlign='left'
+						layout="horizontal"
+						rules={[{ required: true, message: '请选择公众号' }]}
+					>
+						<Select
+							placeholder="选择公众号"
+							allowClear
+							disabled={actionType === 'edit'}
+							className='!w-50'
+							options={accountOptions.map(option => ({ label: option.name, value: option.id }))}>
+						</Select>
+					</Form.Item>
+					<Form.Item
+						name="scene"
+						label="发布场景"
+						layout="horizontal"
+						labelCol={{ span: 4 }}
+						labelAlign='left'
+						initialValue={0}
+					>
+						<Select
+							placeholder="发布场景"
+							className='!w-50'
+							options={[{ label: '关注回复', value: 0 }]}>
+						</Select>
+					</Form.Item>
+
+					<Form.Item label="发布内容" required>
+						<div className="flex flex-wrap gap-4">
+							{selectedVideos.map((video) => (
+								<Card
+									key={video.videoId}
+									className="w-[240px] relative group"
+								>
+									<Button
+										shape="circle"
+										icon={<CloseOutlined />}
+										className="!absolute top-1 right-1 z-10 bg-gray-400 bg-opacity-50 border-none text-white hidden group-hover:inline-flex justify-center items-center"
+										size="small"
+										onClick={() => removeVideo(video.videoId)}
+									/>
+									<div className="p-0">
+										<Paragraph className="mt-1 !mb-1" ellipsis={{ rows: 2, tooltip: true }} title={video.customTitle || video.title}>{video.customTitle || video.title}</Paragraph>
+									</div>
+									<div
+										className="relative"
+										style={{ paddingBottom: '79.8%' }}
+										onClick={(e) => {
+											e.stopPropagation(); // Prevent card selection if clicking thumbnail/play
+											playVideo(video);
+										}}
+									>
+										<img src={video.customCover || video.cover} referrerPolicy="no-referrer" className="absolute inset-0 w-full h-full object-cover" />
+										<div className="absolute inset-0 flex justify-center items-center cursor-pointer">
+											<CaretRightFilled className="!text-white text-4xl bg-black/20 rounded-full p-1 pl-2" />
+										</div>
+									</div>
+									<div className="p-3">
+										<Button
+											icon={<EditOutlined />}
+											className="w-full mt-2"
+											onClick={() => openEditModal(video)} // Open edit modal
+										>
+											编辑标题/封面
+										</Button>
+									</div>
+								</Card>
+							))}
+
+							{/* Add Video Button - Conditionally Rendered */}
+							{selectedVideos.length < 3 && (
+								<div
+									className="w-[240px] h-[316px] flex flex-col justify-center items-center  border border-dashed border-gray-300 rounded cursor-pointer dark:border-gray-600  hover:border-blue-500 hover:text-blue-500"
+									onClick={openVideoSelector} // Open the drawer on click
+								>
+									<PlusOutlined className="text-2xl mb-2" />
+									<Typography.Text>添加视频</Typography.Text>
+								</div>
+							)}
+						</div>
+					</Form.Item>
+				</Form>
+			</Modal>
+
+			{/* Video Selection Drawer */}
+			<VideoSelectModal
+				visible={isVideoSelectVisible}
+				onClose={handleVideoSelectionCancel}
+				onOk={handleVideoSelectionOk}
+				selectedVideos={selectedVideos}
+				initialSelectedIds={selectedVideos.map(v => v.videoId)} // Pass current selection IDs
+			/>
+
+			{/* Video Player Modal */}
+			<Modal
+				open={!!playingVideo}
+				onCancel={closeVideoPlayer}
+				title={playingVideo?.customTitle || playingVideo?.title}
+				footer={null}
+				destroyOnClose // Unmount video element when closed
+				width={720} // Adjust as needed
+				styles={{ body: { padding: 0, background: '#000' } }}
+				zIndex={20}
+			>
+				{playingVideo && (
+					<video
+						controls
+						autoPlay
+						className="w-full h-auto max-h-[80vh] block"
+						src={playingVideo.video}
+					>
+						Your browser does not support the video tag.
+					</video>
+				)}
+			</Modal>
+
+			{/* Edit Title/Cover Modal */}
+			<EditTitleCoverModal
+				visible={!!editingVideo}
+				onCancel={handleEditCancel}
+				onOk={handleEditOk}
+				video={editingVideo}
+			/>
+		</>
+	);
+};
+
+export default AddPunlishPlanModal;

+ 15 - 0
src/views/publishContent/weGZH/components/types.ts

@@ -0,0 +1,15 @@
+export interface VideoItem {
+	cover: string,
+	customCover: string,
+	customCoverType: number,
+	score: number,
+	title: string,
+	customTitle: string,
+	video: string,
+	videoId: number,
+} 
+
+export interface VideoListResponse {
+	objs: VideoItem[],
+	totalSize: number
+}

+ 231 - 0
src/views/publishContent/weGZH/components/videoSelectModal/index.tsx

@@ -0,0 +1,231 @@
+import React, { useState, useEffect } from 'react';
+import {
+	Drawer,
+	Button,
+	Select,
+	Input,
+	Card,
+	Typography,
+	Pagination,
+	Space,
+	message,
+	Modal,
+} from 'antd';
+import { CheckCircleFilled, CaretRightFilled } from '@ant-design/icons';
+import { VideoItem, VideoListResponse } from '../types';
+import http from '@src/http';
+import { getVideoContentListApi } from '@src/http/api';
+import { useVideoCategoryOptions } from '../../hooks/useVideoCategoryOptions';
+
+const { Paragraph, Text } = Typography;
+
+interface VideoSelectModalProps {
+	visible: boolean;
+	onClose: () => void;
+	onOk: (selectedVideos: VideoItem[]) => void;
+	initialSelectedIds?: number[];
+	selectedVideos?: VideoItem[];
+}
+
+const VideoSelectModal: React.FC<VideoSelectModalProps> = ({ visible, onClose, onOk, initialSelectedIds = [], selectedVideos = [] }) => {
+	const { videoCategoryOptions } = useVideoCategoryOptions();
+	const [category, setCategory] = useState<string>();
+	const [searchTerm, setSearchTerm] = useState<string>('');
+	const [currentPage, setCurrentPage] = useState(1);
+	const [pageSize, setPageSize] = useState(10);
+	const [total, setTotal] = useState(0);
+	const [loading, setLoading] = useState(false);
+	const [videoList, setVideoList] = useState<VideoItem[]>([]);
+	const [videoListAll, setVideoListAll] = useState<VideoItem[]>([]);
+	const [selectedVideoIds, setSelectedVideoIds] = useState<Set<number>>(new Set(initialSelectedIds));
+	const [playingVideo, setPlayingVideo] = useState<VideoItem | null>(null);
+	const MAX_SELECTION = 3;
+
+	const getVideoList = async (pageNum?: number, _pageSize?: number) => {
+		setLoading(true);
+		setCurrentPage(pageNum || currentPage);
+		setPageSize(_pageSize || pageSize);
+		const res = await http.post<VideoListResponse>(getVideoContentListApi, {
+			category,
+			title: searchTerm,
+			pageNum: pageNum || currentPage,
+			pageSize: _pageSize || pageSize,
+		}).catch(() => {
+			message.error('获取视频列表失败');
+		}).finally(() => {
+			setLoading(false);
+		});
+		if (res && res.code === 0) {
+			setVideoList([...selectedVideos, ...res.data.objs.filter(v => !selectedVideos.find(ov => ov.videoId === v.videoId))]);
+			setVideoListAll(old => [...old, ...res.data.objs.filter(v => !old.find(ov => ov.videoId === v.videoId))]);
+			setTotal(res.data.totalSize);
+		}
+	}
+
+	useEffect(() => {
+		if (visible) {
+			setVideoList(selectedVideos);
+			setVideoListAll(selectedVideos);
+			getVideoList(0);
+		}
+	}, [visible]);
+
+	useEffect(() => {
+		if (visible) {
+			setSelectedVideoIds(new Set(initialSelectedIds));
+		}
+	}, [visible, initialSelectedIds]);
+
+	const handleSearch = () => {
+		console.log('Searching for:', { category, searchTerm });
+		setCurrentPage(1);
+		getVideoList();
+	};
+
+	const handleSelectVideo = (videoId: number) => {
+		setSelectedVideoIds(prev => {
+			const newSet = new Set(prev);
+			if (newSet.has(videoId)) {
+				newSet.delete(videoId);
+			} else {
+				if (newSet.size >= MAX_SELECTION) {
+					message.warning(`最多只能选择 ${MAX_SELECTION} 条视频`);
+					return prev;
+				}
+				newSet.add(videoId);
+			}
+			return newSet;
+		});
+	};
+
+	const handleOk = () => {
+		const _selectedVideos = videoListAll.filter(video => selectedVideoIds.has(video.videoId));
+		onOk(_selectedVideos);
+		onClose();
+	};
+
+	const playVideo = (video: VideoItem) => {
+		setPlayingVideo(video);
+	};
+
+	const closeVideoPlayer = () => {
+		setPlayingVideo(null);
+	};
+
+	return (
+		<>
+			<Drawer
+				title="内容选取"
+				open={visible}
+				onClose={onClose}
+				width={800}
+				placement="right"
+				loading={loading}
+				styles={{ footer: { textAlign: 'right', padding: '10px 24px' } }}
+				footer={
+					<div className="flex justify-between items-center">
+						<Pagination
+							current={currentPage}
+							pageSize={pageSize}
+							total={total}
+							onChange={(page, size) => {
+								setCurrentPage(page);
+								setPageSize(size);
+								getVideoList(page, size);
+							}}
+							pageSizeOptions={['10', '20', '50']}
+							size="small"
+							showSizeChanger
+							showTotal={(total) => `共 ${total} 条`}
+						/>
+						<Space>
+							<Text>已选 {selectedVideoIds.size} / {MAX_SELECTION} 条视频</Text>
+							<Button onClick={onClose}>取消</Button>
+							<Button type="primary" onClick={handleOk}>确定</Button>
+						</Space>
+					</div>
+				}
+			>
+				<div className="flex flex-wrap gap-4 mb-6">
+					<div className="flex items-center gap-2">
+						<span className="text-gray-600">品类:</span>
+						<Select
+							placeholder="选择品类"
+							style={{ width: 180 }}
+							value={category}
+							allowClear
+							onChange={setCategory}
+							options={videoCategoryOptions.map(option => ({ label: option, value: option }))}
+						/>
+					</div>
+					<div className="flex items-center gap-2">
+						<span className="text-gray-600">视频标题:</span>
+						<Input
+							placeholder="搜索视频标题"
+							style={{ width: 200 }}
+							value={searchTerm}
+							onChange={e => setSearchTerm(e.target.value)}
+						/>
+					</div>
+					<Button type="primary" onClick={handleSearch}>搜索</Button>
+				</div>
+
+				<div className="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-4">
+					{videoList.map((video) => {
+						const isSelected = selectedVideoIds.has(video.videoId);
+						const isDisabled = !isSelected && selectedVideoIds.size >= MAX_SELECTION;
+						return (
+							<Card
+								key={video.videoId}
+								className={`relative ${isDisabled ? 'opacity-50' : 'cursor-pointer'} ${isSelected ? 'border-blue-500 border-2' : ''}`}
+								styles={{ body: { padding: 0 } }}
+								onClick={() => !isDisabled && handleSelectVideo(video.videoId)}
+							>
+								<div className="p-2">
+									<Text type="secondary" className="text-xs">票圈 | 3亿人喜欢的视频平台</Text>
+									<Paragraph className="mt-1 !mb-1" ellipsis={{ rows: 2, tooltip: true }} title={video.customTitle || video.title}>{video.customTitle || video.title}</Paragraph>
+								</div>
+								<div
+									className="relative"
+									style={{ paddingBottom: '79.8%' }}
+									onClick={(e) => { e.stopPropagation(); playVideo(video); }}
+								>
+									<img src={video.customCover || video.cover} alt={video.customTitle || video.title} referrerPolicy="no-referrer" className="absolute inset-0 w-full h-full object-cover" />
+									<div className="absolute inset-0 flex justify-center items-center cursor-pointer">
+										<CaretRightFilled className="!text-white text-4xl bg-black/20 rounded-full p-1 pl-2" />
+									</div>
+								</div>
+								<div className="p-3 flex justify-between items-center">
+									<Text type="secondary" className="text-xs">传播效率: {video.score?.toFixed(2)}</Text>
+									{isSelected ? (
+										<CheckCircleFilled className="text-green-500 text-xl" />
+									) : (
+										<div className={`w-5 h-5 border-2 ${isDisabled ? 'border-gray-200 bg-gray-100' : 'border-gray-300' } rounded-full`}></div>
+									)}
+								</div>
+							</Card>
+						);
+					})}
+				</div>
+			</Drawer>
+
+			<Modal
+				open={!!playingVideo}
+				onCancel={closeVideoPlayer}
+				title={playingVideo?.title}
+				footer={null}
+				destroyOnClose
+				width={720}
+				styles={{ body: { padding: 0, background: '#000' } }}
+			>
+				{playingVideo && (
+					<video controls autoPlay className="w-full h-auto max-h-[80vh] block" src={playingVideo.video}>
+						Your browser does not support the video tag.
+					</video>
+				)}
+			</Modal>
+		</>
+	);
+};
+
+export default VideoSelectModal;

+ 39 - 0
src/views/publishContent/weGZH/hooks/useAccountOptions.ts

@@ -0,0 +1,39 @@
+import { useState, useEffect } from 'react';
+import { getGzhAccountOptionsApi } from '@src/http/api';
+import request from '@src/http/index';
+
+interface Account {
+  id: string;
+  name: string;
+  // Add other account properties as needed
+}
+
+export const useAccountOptions = () => {
+  const [accountOptions, setAccountOptions] = useState<Account[]>([]);
+  const [loading, setLoading] = useState(false);
+  const [error, setError] = useState<string | null>(null);
+
+  const getAccountList = async () => {
+    try {
+      setLoading(true);
+      setError(null);
+			const data = await request.get(getGzhAccountOptionsApi);
+      setAccountOptions(data.data as Account[]);
+    } catch (err) {
+      setError(err instanceof Error ? err.message : 'Failed to fetch accounts');
+    } finally {
+      setLoading(false);
+    }
+  };
+
+  useEffect(() => {
+    getAccountList();
+  }, []);
+
+  return {
+    accountOptions,
+    getAccountList,
+    loading,
+    error
+  };
+}; 

+ 76 - 0
src/views/publishContent/weGZH/hooks/useGzhPlanList.ts

@@ -0,0 +1,76 @@
+import { useState } from 'react';
+import { getGzhPlanListApi } from '@src/http/api';
+import request from '@src/http/index';
+import { VideoItem } from '../components/types';
+
+export interface GzhPlanType {
+  accountId: number;
+  accountName: string;
+  createTimestamp: number;
+  id: number;
+  publishStage: number;
+  scene: number;
+  title: string[];
+	videoCount: number;
+	videoList: VideoItem[];
+}
+
+interface GzhPlanListParams {
+	accountId?: number;
+	createTimestampEnd?: number;
+	createTimestampStart?: number;
+	publishStage?: number;
+	title?: string;
+	pageNum: number;
+	pageSize: number;
+}
+
+interface GzhPlanListResponse {
+	objs: GzhPlanType[];
+	totalSize: number;
+}
+
+export const useGzhPlanList = () => {
+  const [gzhPlanList, setGzhPlanList] = useState<GzhPlanType[]>([]);
+  const [loading, setLoading] = useState(false);
+	const [error, setError] = useState<string | null>(null);
+	const [totalSize, setTotalSize] = useState(0);
+
+	const getGzhPlanList = async ({
+		accountId,
+		createTimestampEnd,
+		createTimestampStart,
+		publishStage,
+		title,
+		pageNum,
+		pageSize
+	}: GzhPlanListParams) => {
+    try {
+      setLoading(true);
+      setError(null);
+			const data = await request.post<GzhPlanListResponse>(getGzhPlanListApi, {
+				accountId: accountId,
+				createTimestampEnd,
+				createTimestampStart,
+				publishStage,
+				title,
+				pageNum,
+				pageSize,
+			});
+      setGzhPlanList(data.data.objs as GzhPlanType[]);
+			setTotalSize(data.data.totalSize);
+    } catch (err) {
+      setError(err instanceof Error ? err.message : 'Failed to fetch accounts');
+    } finally {
+      setLoading(false);
+    }
+  };
+
+  return {
+    gzhPlanList,
+		getGzhPlanList,
+		totalSize,
+    loading,
+    error
+  };
+}; 

+ 33 - 0
src/views/publishContent/weGZH/hooks/useVideoCategoryOptions.ts

@@ -0,0 +1,33 @@
+import { useState, useEffect } from 'react';
+import { getVideoContentCategoryListApi } from '@src/http/api';
+import request from '@src/http/index';
+
+export const useVideoCategoryOptions = () => {
+  const [videoCategoryOptions, setVideoCategoryOptions] = useState<string[]>([]);
+  const [loading, setLoading] = useState(false);
+  const [error, setError] = useState<string | null>(null);
+
+  const getVideoCategoryList = async () => {
+    try {
+      setLoading(true);
+      setError(null);
+			const data = await request.get(getVideoContentCategoryListApi);
+      setVideoCategoryOptions(data.data as string[]);
+    } catch (err) {
+      setError(err instanceof Error ? err.message : 'Failed to fetch accounts');
+    } finally {
+      setLoading(false);
+    }
+  };
+
+  useEffect(() => {
+    getVideoCategoryList();
+  }, []);
+
+  return {
+    videoCategoryOptions,
+    getVideoCategoryList,
+    loading,
+    error
+  };
+}; 

+ 9 - 0
src/views/publishContent/weGZH/index.module.css

@@ -0,0 +1,9 @@
+.antTable {
+	border-top: none;
+}
+
+.antTableTab {
+	:global(.ant-tabs-nav) {
+		margin-bottom: 0;
+	}
+}

+ 286 - 0
src/views/publishContent/weGZH/index.tsx

@@ -0,0 +1,286 @@
+import React, { useEffect, useState } from 'react';
+import { Space, Table, Button, Input, Select, DatePicker, Tabs, message, Typography, Spin } from 'antd';
+import type { TableProps } from 'antd';
+import dayjs, { Dayjs } from 'dayjs';
+import styles from './index.module.css';
+import PunlishPlanModal from './components/publishPlanModal';
+const { RangePicker } = DatePicker;
+import { useAccountOptions } from '@src/views/publishContent/weGZH/hooks/useAccountOptions';
+import { useGzhPlanList, GzhPlanType } from '@src/views/publishContent/weGZH/hooks/useGzhPlanList';
+import http from '@src/http';
+import { deleteGzhPlanApi, saveGzhPlanApi } from '@src/http/api';
+import PunlishPlanDetailModal from './components/PunlishPlanDetailModal';
+
+const TableHeight = window.innerHeight - 380;
+
+const WeGZHContent: React.FC = () => {
+	// 状态管理
+	const [selectedAccount, setSelectedAccount] = useState<string>();
+	const [videoTitle, setVideoTitle] = useState<string>('');
+	const [selectedPublisher, setSelectedPublisher] = useState<number>();
+	const [dateRange, setDateRange] = useState<[Dayjs | null, Dayjs | null]>();
+	const [isShowAddPunlishPlan, setIsShowAddPunlishPlan] = useState<boolean>(false);
+	const [actionType, setActionType] = useState<'add' | 'edit'>('add');
+	const [editPlanData, setEditPlanData] = useState<GzhPlanType>();
+	const [activeKey, setActiveKey] = useState<string>('1');
+	const [isSubmiting, setIsSubmiting] = useState<boolean>(false);
+	const [isLoading, setIsLoading] = useState<boolean>(false);
+	const { accountOptions } = useAccountOptions();
+	const { gzhPlanList, getGzhPlanList, totalSize } = useGzhPlanList();
+
+	const [isShowAddPunlishDetailPlan, setIsShowAddPunlishDetailPlan] = useState<boolean>(false);
+
+	// 表格列配置
+	const columns: TableProps<GzhPlanType>['columns'] = [
+		{
+			title: '公众号名称',
+			dataIndex: 'accountName',
+			key: 'accountName',
+			width: 160,
+		},
+		{
+			title: '场景',
+			dataIndex: 'scene',
+			key: 'scene',
+			width: 120,
+			render: (_, record) => {
+				return record.scene === 0 ? '关注回复' : '自动回复';
+			}
+		},
+		{
+			title: '视频数量',
+			dataIndex: 'videoCount',
+			key: 'videoCount',
+			width: 100,
+		},
+		{
+			title: '视频标题',
+			dataIndex: 'title',
+			key: 'title',
+			ellipsis: true,
+			render: (_, record) => {
+				return record.videoList.map(video => {
+					return <Typography.Paragraph style={{ maxWidth: '300px' }} ellipsis={{ rows: 1, tooltip: true }} key={video.videoId}>{video.customTitle || video.title}</Typography.Paragraph>
+				})
+			}
+		},
+		{
+			title: '计划创建时间',
+			dataIndex: 'createTimestamp',
+			key: 'createTimestamp',
+			width: 200,
+			render: (_, record) => {
+				return record.createTimestamp ? dayjs(record.createTimestamp).format('YYYY-MM-DD HH:mm:ss') : '';
+			}
+		},
+		{
+			title: '发布方',
+			dataIndex: 'publishStage',
+			key: 'publishStage',
+			width: 120,
+			render: (_, record) => {
+				return record.publishStage === 0 ? '平台发布' : '用户发布';
+			}
+		},
+		{
+			title: '操作',
+			key: 'action',
+			fixed: 'right',
+			render: (_, record) => (
+				<Space size="middle">
+					<Button type="link" onClick={() => editPlan(record)}>编辑</Button>
+					<Button type="link" onClick={() => editPlanDetail(record)}>详情</Button>
+					<Button type="link" onClick={() => deletePlan(record)}>删除</Button>
+				</Space>
+			),
+		},
+	];
+
+	const deletePlan = async (record: GzhPlanType) => {
+		setIsLoading(true);
+		const res = await http.post(deleteGzhPlanApi, {
+			id: record.id,
+		}).catch(err => {
+			message.error(err?.msg || '删除失败');
+		})
+		if (res?.code === 0) {
+			message.success('删除成功');
+			getGzhPlanList({
+				pageNum: 1,
+				pageSize: 10,
+			});
+		} else {
+			message.error(res?.msg || '删除失败');
+		}
+		setIsLoading(false);
+	}
+
+	const editPlan = (record: GzhPlanType) => {
+		setEditPlanData(record);
+		setActionType('edit');
+		setIsShowAddPunlishPlan(true);
+	};
+
+	const editPlanDetail = (record: GzhPlanType) => {
+		setEditPlanData(record);
+		setActionType('edit');
+		setIsShowAddPunlishDetailPlan(true);
+	}
+
+	const addPunlishPlan = () => {
+		setActionType('add');
+		setEditPlanData(undefined);
+		setIsShowAddPunlishPlan(true);
+	}
+
+	const handleAddPunlishPlan = async (params: GzhPlanType) => {
+		setIsSubmiting(true);
+		const res = await http.post<GzhPlanType>(saveGzhPlanApi, params)
+			.catch(err => {
+				message.error(err.msg);
+			})
+			.finally(() => {
+				setIsSubmiting(false);
+			});
+		if (res?.code === 0) {
+			message.success('发布计划创建成功');
+			getGzhPlanList({
+				pageNum: 1,
+				pageSize: 10,
+			});
+			setIsShowAddPunlishPlan(false);
+		} else {
+			message.error(res?.msg);
+		}
+	}
+
+	useEffect(() => {
+		getGzhPlanList({
+			pageNum: 1,
+			pageSize: 10,
+		});
+	}, []);
+
+	const handleSearch = () => {
+		getGzhPlanList({
+			pageNum: 1,
+			pageSize: 10,
+			title: videoTitle,
+			accountId: selectedAccount ? parseInt(selectedAccount) : undefined,
+			publishStage: selectedPublisher,
+			createTimestampStart: dateRange?.[0]?.unix() ? dateRange[0].unix() * 1000 : undefined,
+			createTimestampEnd: dateRange?.[1]?.unix() ? dateRange[1].unix() * 1000 : undefined,
+		});
+	}
+
+	return (
+		<Spin spinning={isLoading || isSubmiting}>
+			<div className="rounded-lg">
+				<div className="text-lg font-medium mb-3">公众号内容</div>
+				
+				{/* 搜索区域 */}
+				<div className="flex flex-wrap gap-4 mb-3">
+					<div className="flex items-center gap-2">
+						<span className="text-gray-600">公众号名称:</span>
+						<Select
+							placeholder="选择公众号"
+							style={{ width: 200 }}
+							value={selectedAccount}
+							onChange={setSelectedAccount}
+							allowClear
+							options={accountOptions.map(item => ({ label: item.name, value: item.id }))}
+						/>
+					</div>
+
+					<div className="flex items-center gap-2">
+						<span className="text-gray-600">视频标题:</span>
+						<Input
+							placeholder="搜索视频标题"
+							style={{ width: 200 }}
+							value={videoTitle}
+							allowClear
+							onPressEnter={handleSearch}
+							onChange={e => setVideoTitle(e.target.value)}
+						/>
+					</div>
+
+					<div className="flex items-center gap-2">
+						<span className="text-gray-600">发布方:</span>
+						<Select
+							placeholder="选择发布方"
+							style={{ width: 200 }}
+							value={selectedPublisher}
+							onChange={setSelectedPublisher}
+							allowClear
+							options={[
+								{ label: '平台发布', value: 0 },
+								{ label: '用户发布', value: 1 },
+							]}
+						/>
+					</div>
+
+					<div className="flex items-center gap-2">
+						<RangePicker
+							placeholder={['开始时间', '结束时间']}
+							style={{ width: 400 }}
+							allowClear
+							value={dateRange}
+							onChange={(dates) => {
+								setDateRange(dates || undefined);
+							}}
+						/>
+					</div>
+
+					<Button type="primary" className="ml-2" onClick={ handleSearch}>搜索</Button>
+				</div>
+				<Tabs
+					defaultActiveKey="1"
+					type="card"
+					size="large"
+					className={styles.antTableTab}
+					items={[
+						{ label: '自动回复', key: '1' },
+					]}
+					activeKey={activeKey}
+					onChange={setActiveKey}
+					tabBarExtraContent={
+						{ right: <Button type="primary" onClick={addPunlishPlan}>+ 创建发布</Button> }}
+				/>
+				{/* 表格区域 */}
+				<Table
+					rowKey={(record) => record.id}
+					className={styles.antTable}
+					columns={columns}
+					dataSource={gzhPlanList}
+					scroll={{ x: 'max-content', y: TableHeight }}
+					pagination={{
+						total: totalSize,
+						pageSize: 10,
+						showTotal: (total) => `共 ${total} 条`,
+					}}
+				/>
+				<PunlishPlanModal
+					visible={isShowAddPunlishPlan}
+					onCancel={() => { 
+						setEditPlanData(undefined);
+						setIsShowAddPunlishPlan(false);
+					} }
+					onOk={handleAddPunlishPlan}
+					actionType={actionType}
+					editPlanData={editPlanData}
+					isSubmiting={isSubmiting}
+				/>
+				<PunlishPlanDetailModal
+					visible={isShowAddPunlishDetailPlan}
+					onCancel={() => { 
+						setEditPlanData(undefined);
+						setIsShowAddPunlishDetailPlan(false);
+					}}
+					planData={editPlanData as GzhPlanType}
+				/>
+			</div>
+		</Spin>
+	);
+};
+
+export default WeGZHContent;

+ 0 - 12
src/views/test/index.tsx

@@ -1,12 +0,0 @@
-import React from 'react';
-
-const TestPage: React.FC = () => {
-  return (
-    <div>
-      <h1>Test Page</h1>
-    </div>
-  );
-};
-
-export default TestPage;
-

+ 209 - 0
src/views/weData/gzh/index.tsx

@@ -0,0 +1,209 @@
+import { useState, useEffect } from 'react';
+import { Tabs, Table, Button, message } from "antd";
+import type { TableProps } from 'antd';
+import { DownloadOutlined } from '@ant-design/icons';
+import http from '@src/http';
+import { gzhDataList, gzhDataExport } from '@src/http/api.ts';
+
+interface GzhDataItem {
+  dateStr: string;
+  fansIncreaseCount: number;
+  firstLevel: number;
+  name: string;
+  openRate: number;
+  score: number;
+}
+
+interface GzhDataResponse {
+  curPageFirstRecNum: number;
+  curPageLastRecNum: number;
+  currentPage: number;
+  nextPage: number;
+  obj: GzhDataItem;
+  objs: GzhDataItem[];
+  offset: number;
+  pageSize: number;
+  prePage: number;
+  totalPage: number;
+  totalSize: number;
+}
+
+const Gzh: React.FC = () => {
+  const [allDataSource, setAllDataSource] = useState<GzhDataItem[]>([]);
+  const [separateDataSource, setSeparateDataSource] = useState<GzhDataItem[]>([]);
+  const [loading, setLoading] = useState<boolean>(false);
+  const [downloadLoading, setDownloadLoading] = useState<boolean>(false);
+  const [pagination, setPagination] = useState({
+    current: 1,
+    pageSize: 10,
+    total: 0
+  });
+  const [activeKey, setActiveKey] = useState("0");
+
+  const columns:TableProps['columns'] = [
+    {
+      title: '日期',
+      dataIndex: 'dateStr',
+      key: 'dateStr',
+    },
+    {
+      title: '新增粉丝',
+      dataIndex: 'fansIncreaseCount',
+      key: 'fansIncreaseCount',
+    },
+    {
+      title: '小程序访问人数',
+      dataIndex: 'firstLevel',
+      key: 'firstLevel',
+    },
+    {
+      title: '打开率',
+      dataIndex: 'openRate',
+      key: 'openRate',
+      render: (text) => `${text}%`
+    },
+    {
+      title: '传播得分',
+      dataIndex: 'score',
+      key: 'score',
+    },
+  ];
+
+  const fetchGzhData = async (page = 1, pageSize = 10, type = 0) => {
+    try {
+      setLoading(true);
+      const res = await http.post<GzhDataResponse>(gzhDataList, {
+        pageNum: page,
+        pageSize: pageSize,
+        type: type
+      });
+      
+      if (res.success && res.data) {
+        if (type === 0) {
+          setAllDataSource(res.data.objs || []);
+        } else {
+          setSeparateDataSource(res.data.objs || []);
+        }
+
+        setPagination({
+          current: res.data.currentPage,
+          pageSize: res.data.pageSize,
+          total: res.data.totalSize
+        });
+      }
+    } catch (error) {
+      console.error('获取公众号数据失败:', error);
+    } finally {
+      setLoading(false);
+    }
+  };
+
+  useEffect(() => {
+    fetchGzhData(1, 10, 0);
+  }, []);
+
+  const onChange = (key: string) => {
+    console.log(key);
+    fetchGzhData(1, 10, Number(key));
+  };
+
+  const handleTableChange = (pagination: any) => {
+    const { current, pageSize } = pagination;
+    fetchGzhData(current, pageSize, activeKey === "0" ? 0 : 1);
+  };
+
+  const handleDownload = async () => {
+    try {
+      setDownloadLoading(true);
+      // 根据当前选中的标签页设置type参数
+      const type = activeKey === "0" ? 0 : 1;
+
+      // 使用当前分页信息
+      const response = await http.post(gzhDataExport, {
+        pageNum: pagination.current,
+        pageSize: pagination.pageSize,
+        type: type
+      });
+
+      if (response.success && response.data) {
+        window.open(response.data as string);
+      } else {
+        message.error('下载失败');
+      }
+    } catch {
+      message.error('下载失败');
+    } finally {
+      setDownloadLoading(false);
+    }
+  };
+
+  return (
+    <>
+      <div className={"flex mb-[10px]"}>
+        <div className={"flex-1 leading-[32px]"}>公众号数据统计</div>
+      </div>
+      <Tabs
+        defaultActiveKey="0"
+        type="card"
+        tabBarExtraContent={{
+          right: <Button
+            type="link"
+            icon={<DownloadOutlined />}
+            loading={downloadLoading}
+            onClick={handleDownload}
+          >
+            下载数据
+          </Button>
+        }}
+        onChange={(key) => {
+          setActiveKey(key);
+          onChange(key);
+        }}
+        items={[
+          {
+            key: "0",
+            label: "账号累计",
+            children: (
+              <Table
+                dataSource={allDataSource}
+                columns={columns}
+                rowKey="dateStr"
+                loading={loading}
+                pagination={{
+                  current: pagination.current,
+                  pageSize: pagination.pageSize,
+                  total: pagination.total,
+                  showSizeChanger: true,
+                  showTotal: (total) => `共 ${total} 条`,
+                }}
+                onChange={handleTableChange}
+              />
+            ),
+          },
+          {
+            key: "1",
+            label: "分账号",
+            children: (
+              <Table
+                dataSource={separateDataSource}
+                columns={columns}
+                rowKey="dateStr"
+                loading={loading}
+                pagination={{
+                  current: pagination.current,
+                  pageSize: pagination.pageSize,
+                  total: pagination.total,
+                  showSizeChanger: true,
+                  showTotal: (total) => `共 ${total} 条`,
+                }}
+                onChange={handleTableChange}
+              />
+            ),
+          },
+        ]}
+      />
+    </>
+  )
+}
+
+export default Gzh

+ 275 - 0
src/views/weData/qw/index.tsx

@@ -0,0 +1,275 @@
+import { useState, useEffect } from 'react';
+import { Tabs, Table, Button, message } from "antd";
+import type { TableProps } from 'antd';
+import { DownloadOutlined } from '@ant-design/icons';
+import http from '@src/http';
+import { qwDataList, qwDataExport } from '@src/http/api.ts';
+
+interface QwDataItem {
+  dateStr: string;
+  fansIncreaseCount: number;
+  firstLevel: number;
+  name: string;
+  openRate: number;
+  score: number;
+}
+
+interface QwDataResponse {
+  curPageFirstRecNum: number;
+  curPageLastRecNum: number;
+  currentPage: number;
+  nextPage: number;
+  obj: QwDataItem;
+  objs: QwDataItem[];
+  offset: number;
+  pageSize: number;
+  prePage: number;
+  totalPage: number;
+  totalSize: number;
+}
+
+const Qw: React.FC = () => {
+  const [dataSource, setDataSource] = useState<QwDataItem[]>([]);
+  const [loading, setLoading] = useState<boolean>(false);
+  const [downloadLoading, setDownloadLoading] = useState<boolean>(false);
+  const [pagination, setPagination] = useState({
+    current: 1,
+    pageSize: 10,
+    total: 0
+  });
+  const [activeKey, setActiveKey] = useState("0");
+
+  const columns:TableProps['columns'] = [
+    {
+      title: '日期',
+      dataIndex: 'dateStr',
+      key: 'dateStr',
+    },
+    {
+      title: '小程序访问人数',
+      dataIndex: 'firstLevel',
+      key: 'firstLevel',
+    },
+    {
+      title: '传播得分',
+      dataIndex: 'score',
+      key: 'score',
+    },
+  ];
+
+  const specialColumns:TableProps['columns'] = [
+    {
+      title: '日期',
+      dataIndex: 'dateStr',
+      key: 'dateStr',
+    },
+    {
+      title: '视频标题',
+      dataIndex: 'title',
+      key: 'title',
+    },
+    {
+      title: '视频ID',
+      dataIndex: 'videoId',
+      key: 'videoId',
+    },
+    {
+      title: '传播得分',
+      dataIndex: 'score',
+      key: 'score',
+    },
+  ];
+
+  const fetchQwData = async (page = 1, pageSize = 10, type = 0) => {
+    try {
+      setLoading(true);
+      const res = await http.post<QwDataResponse>(qwDataList, {
+        pageNum: page,
+        pageSize: pageSize,
+        type: type
+      });
+
+      if (res.success && res.data) {
+        setDataSource(res.data.objs || []);
+        setPagination({
+          current: res.data.currentPage,
+          pageSize: res.data.pageSize,
+          total: res.data.totalSize
+        });
+      }
+    } catch (error) {
+      console.error('获取企微数据失败:', error);
+    } finally {
+      setLoading(false);
+    }
+  };
+
+  useEffect(() => {
+    fetchQwData(1, 10, 0);
+  }, []);
+
+  const onChange = (key: string) => {
+    console.log(key);
+    fetchQwData(1, 10, Number(key));
+  };
+
+  const handleTableChange = (pagination: any) => {
+    const { current, pageSize } = pagination;
+    fetchQwData(current, pageSize, Number(activeKey));
+  };
+
+  const handleDownload = async () => {
+    try {
+      setDownloadLoading(true);
+      // 根据当前选中的标签页设置type参数
+      const type = Number(activeKey);
+
+      // 使用当前分页信息
+      const response = await http.post(qwDataExport, {
+        pageNum: pagination.current,
+        pageSize: pagination.pageSize,
+        type: type
+      });
+
+      if (response.success && response.data) {
+        window.open(response.data as string);
+      } else {
+        message.error('下载失败');
+      }
+    } catch {
+      message.error('下载失败');
+    } finally {
+      setDownloadLoading(false);
+    }
+  };
+
+  return (
+    <>
+      <div className={"flex mb-[10px]"}>
+        <div className={"flex-1 leading-[32px]"}>企微数据统计</div>
+      </div>
+      <Tabs
+        defaultActiveKey="0"
+        type="card"
+        tabBarExtraContent={{
+          right: <Button
+            type="link"
+            icon={<DownloadOutlined />}
+            loading={downloadLoading}
+            onClick={handleDownload}
+          >
+            下载数据
+          </Button>
+        }}
+        onChange={(key) => {
+          setActiveKey(key);
+          onChange(key);
+        }}
+        items={[
+          {
+            key: "0",
+            label: "总体",
+            children: (
+              <Table
+                dataSource={dataSource}
+                columns={columns}
+                rowKey="dateStr"
+                loading={loading}
+                pagination={{
+                  current: pagination.current,
+                  pageSize: pagination.pageSize,
+                  total: pagination.total,
+                  showSizeChanger: true,
+                  showTotal: (total) => `共 ${total} 条`,
+                }}
+                onChange={handleTableChange}
+              />
+            ),
+          },
+          {
+            key: "1",
+            label: "群发",
+            children: (
+              <Table
+                dataSource={dataSource}
+                columns={columns}
+                rowKey="dateStr"
+                loading={loading}
+                pagination={{
+                  current: pagination.current,
+                  pageSize: pagination.pageSize,
+                  total: pagination.total,
+                  showSizeChanger: true,
+                  showTotal: (total) => `共 ${total} 条`,
+                }}
+                onChange={handleTableChange}
+              />
+            ),
+          },
+          {
+            key: "2",
+            label: "私发",
+            children: (
+              <Table
+                dataSource={dataSource}
+                columns={columns}
+                rowKey="dateStr"
+                loading={loading}
+                pagination={{
+                  current: pagination.current,
+                  pageSize: pagination.pageSize,
+                  total: pagination.total,
+                  showSizeChanger: true,
+                  showTotal: (total) => `共 ${total} 条`,
+                }}
+                onChange={handleTableChange}
+              />
+            ),
+          },
+          {
+            key: "3",
+            label: "自动回复",
+            children: (
+              <Table
+                dataSource={dataSource}
+                columns={columns}
+                rowKey="dateStr"
+                loading={loading}
+                pagination={{
+                  current: pagination.current,
+                  pageSize: pagination.pageSize,
+                  total: pagination.total,
+                  showSizeChanger: true,
+                  showTotal: (total) => `共 ${total} 条`,
+                }}
+                onChange={handleTableChange}
+              />
+            ),
+          },
+          {
+            key: "4",
+            label: "分链接",
+            children: (
+              <Table
+                dataSource={dataSource}
+                columns={specialColumns}
+                rowKey="dateStr"
+                loading={loading}
+                pagination={{
+                  current: pagination.current,
+                  pageSize: pagination.pageSize,
+                  total: pagination.total,
+                  showSizeChanger: true,
+                  showTotal: (total) => `共 ${total} 条`,
+                }}
+                onChange={handleTableChange}
+              />
+            ),
+          },
+        ]}
+      />
+    </>
+  )
+}
+
+export default Qw

+ 40 - 0
src/views/weData/weData.router.tsx

@@ -0,0 +1,40 @@
+import { TeamOutlined } from '@ant-design/icons'
+import { AdminRouterItem } from "../../router";
+import { Outlet } from "react-router-dom";
+import GZH from './gzh';
+import QW from './qw';
+
+const demoRoutes: AdminRouterItem[] = [
+  {
+    path: 'weData',
+    element: <Outlet />,
+		meta: {
+			label: "数据统计",
+			title: "数据统计",
+			key: "/weData",
+			icon: <TeamOutlined />,
+		},
+		children: [
+			{
+				path: 'gzh',
+				element: <GZH />,
+				meta: {
+					label: "公众号",
+					title: "公众号",
+					key: "/weData/gzh",
+				},
+			},
+			{
+				path: 'qw',
+				element: <QW />,
+				meta: {
+					label: "企微",
+					title: "企微",
+					key: "/weData/qw",
+				},
+			}
+		]
+  }
+]
+
+export default demoRoutes;

+ 12 - 0
tailwind.config.js

@@ -0,0 +1,12 @@
+/** @type {import('tailwindcss').Config} */
+export default {
+		darkMode: 'selector',
+    content: [
+      "./index.html",
+      "./src/**/*.{js,ts,jsx,tsx}",
+    ],
+    theme: {
+      extend: {},
+    },
+    plugins: [],
+  }

+ 0 - 31
tsconfig.app.json

@@ -1,31 +0,0 @@
-{
-  "compilerOptions": {
-    "composite": true,
-    "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
-    "target": "ES2020",
-    "useDefineForClassFields": true,
-    "lib": ["ES2020", "DOM", "DOM.Iterable"],
-    "module": "ESNext",
-    "skipLibCheck": true,
-
-    /* Bundler mode */
-    "moduleResolution": "bundler",
-    "allowImportingTsExtensions": true,
-    "resolveJsonModule": true,
-    "isolatedModules": true,
-    "moduleDetection": "force",
-    "noEmit": true,
-    "jsx": "react-jsx",
-
-    /* Linting */
-    "strict": true,
-    "noUnusedLocals": true,
-    "noUnusedParameters": true,
-    "noFallthroughCasesInSwitch": true,
-    "baseUrl": ".",
-    "paths": {
-      "@/*": ["src/*"]
-    }
-  },
-  "include": ["src"]
-}

+ 1 - 1
types/http/index.d.ts

@@ -1,6 +1,6 @@
 interface ApiResponse<T> {
   msg:string, 
-  data?:T
+  data:T
   code: number
   success: boolean
 }

+ 5 - 1
vite.config.ts

@@ -2,13 +2,17 @@ import { defineConfig } from 'vite'
 import react from '@vitejs/plugin-react-swc'
 import path, { resolve } from 'path'
 import { fileURLToPath } from 'node:url'
+import svgr from 'vite-plugin-svgr'
 
 const __filename = fileURLToPath(import.meta.url)
 const __dirname = path.dirname(__filename)
 
 // https://vitejs.dev/config/
 export default defineConfig({
-  plugins: [react()],
+  plugins: [
+    react(),
+    svgr({ svgrOptions: { icon: true } })
+  ],
   build: {
     target: "esnext",
   },

+ 38 - 0
vite.test.config.ts

@@ -0,0 +1,38 @@
+import { defineConfig } from 'vite'
+import react from '@vitejs/plugin-react-swc'
+import path, { resolve } from 'path'
+import { fileURLToPath } from 'node:url'
+import svgr from 'vite-plugin-svgr'
+
+const __filename = fileURLToPath(import.meta.url)
+const __dirname = path.dirname(__filename)
+
+// https://vitejs.dev/config/
+export default defineConfig({
+	mode: 'development',
+  plugins: [
+    react(),
+    svgr({ svgrOptions: { icon: true } })
+  ],
+  build: {
+    target: "esnext",
+  },
+  resolve: {
+    alias: {
+      '@src': resolve(__dirname, 'src'),
+      '@assets': resolve(__dirname, 'assets'),
+      '@': resolve(__dirname, '.'),
+    }
+  },
+  server: {
+    host: '0.0.0.0',
+    port: 3305,
+    proxy: {
+      '/api': {
+        target: 'https://testadmin.piaoquantv.com/',
+        changeOrigin: true,
+        rewrite: (path) => path.replace(/^\/api/, ''),
+      }
+    }
+  }
+})

文件差異過大導致無法顯示
+ 726 - 95
yarn.lock


部分文件因文件數量過多而無法顯示