瀏覽代碼

first commit

BaiLuoYan 1 月之前
當前提交
a5f74b1af8
共有 89 個文件被更改,包括 15112 次插入0 次删除
  1. 20 0
      .env
  2. 6 0
      .env.development
  3. 3 0
      .env.production
  4. 3 0
      .env.test
  5. 23 0
      .gitignore
  6. 7 0
      .markdownlint.json
  7. 9 0
      .npmrc
  8. 1 0
      .nvmrc
  9. 9 0
      .prettierrc
  10. 94 0
      .stylelintrc.mjs
  11. 53 0
      .vscode/settings.json
  12. 753 0
      README.md
  13. 61 0
      build/buildInfo.ts
  14. 60 0
      build/compress.ts
  15. 100 0
      build/svgConvert.ts
  16. 132 0
      build/utils.ts
  17. 29 0
      commitlint.config.js
  18. 115 0
      eslint.config.js
  19. 13 0
      index.html
  20. 129 0
      package.json
  21. 9174 0
      pnpm-lock.yaml
  22. 7 0
      postcss.config.js
  23. 1 0
      public/vite.svg
  24. 37 0
      src/App.tsx
  25. 5 0
      src/assets/iconify/multi-color/logo.svg
  26. 4 0
      src/assets/iconify/single-color/home.svg
  27. 4 0
      src/assets/iconify/single-color/user.svg
  28. 0 0
      src/assets/react.svg
  29. 21 0
      src/components/LanguageSwitch.tsx
  30. 33 0
      src/config/index.ts
  31. 68 0
      src/config/request/authHeaderInterceptor.ts
  32. 63 0
      src/config/request/encryptionInterceptors.ts
  33. 27 0
      src/config/request/index.ts
  34. 132 0
      src/config/request/requestErrorConfig.ts
  35. 26 0
      src/config/types.ts
  36. 7 0
      src/defines/errorShowType.ts
  37. 1 0
      src/defines/index.ts
  38. 64 0
      src/firebase.tsx
  39. 192 0
      src/i18n/index.ts
  40. 344 0
      src/i18n/langMap.ts
  41. 21 0
      src/layouts/BasicLayout.tsx
  42. 12 0
      src/locales/en-US.ts
  43. 1 0
      src/locales/en-US/common.ts
  44. 1 0
      src/locales/en-US/components.ts
  45. 7 0
      src/locales/en-US/menus.ts
  46. 31 0
      src/locales/en-US/pages.ts
  47. 12 0
      src/locales/fa-IR.ts
  48. 1 0
      src/locales/fa-IR/common.ts
  49. 1 0
      src/locales/fa-IR/components.ts
  50. 7 0
      src/locales/fa-IR/menus.ts
  51. 31 0
      src/locales/fa-IR/pages.ts
  52. 69 0
      src/main.tsx
  53. 42 0
      src/models/userModel.ts
  54. 23 0
      src/pages/error/403.tsx
  55. 23 0
      src/pages/error/404.tsx
  56. 23 0
      src/pages/error/500.tsx
  57. 311 0
      src/pages/home/index.tsx
  58. 92 0
      src/pages/routeDemo/index.tsx
  59. 43 0
      src/router/index.tsx
  60. 66 0
      src/router/routes.tsx
  61. 78 0
      src/router/titles.ts
  62. 10 0
      src/router/types.ts
  63. 39 0
      src/services/login/index.ts
  64. 45 0
      src/services/login/typings.d.ts
  65. 4 0
      src/styles/antd.scss
  66. 379 0
      src/styles/global.scss
  67. 67 0
      src/styles/tailwind.css
  68. 108 0
      src/styles/variables.scss
  69. 76 0
      src/utils/authUtils.ts
  70. 25 0
      src/utils/clipboard.ts
  71. 146 0
      src/utils/crypto/index.ts
  72. 74 0
      src/utils/localUtils.ts
  73. 10 0
      src/utils/model/autoImportModels.ts
  74. 24 0
      src/utils/model/createModel.tsx
  75. 18 0
      src/utils/model/model.tsx
  76. 108 0
      src/utils/numberUtils.ts
  77. 150 0
      src/utils/request/index.ts
  78. 60 0
      src/utils/request/types.ts
  79. 35 0
      src/utils/requestUtils.ts
  80. 36 0
      src/utils/routerUtils.ts
  81. 74 0
      src/utils/sessionUtils.ts
  82. 247 0
      src/utils/storage/index.ts
  83. 95 0
      src/utils/stringUtils.ts
  84. 308 0
      src/utils/timeUtils.ts
  85. 18 0
      tailwind.config.js
  86. 35 0
      tsconfig.json
  87. 45 0
      types/typings.d.ts
  88. 59 0
      types/vite-env.d.ts
  89. 92 0
      vite.config.ts

+ 20 - 0
.env

@@ -0,0 +1,20 @@
+VITE_APP_ENV="production"
+
+# 构建配置
+VITE_BUILD_PUBLIC_PATH="/"
+VITE_BUILD_COMPRESSION="gzip"
+
+# 应用基础配置
+VITE_APP_TITLE="Visa Card H5"
+VITE_APP_VERSION="1.0.0"
+VITE_ROUTER_MODE="history"
+VITE_STORAGE_NAME_SPACE="visa-card-h5-"
+
+# 安全配置
+VITE_ENABLE_REQUEST_ENCRYPTION="false"
+VITE_REQUEST_ENCRYPTION_KEY="NL-VisaCard-H5_RequestK"
+VITE_ENABLE_STORAGE_ENCRYPTION="true"
+VITE_STORAGE_ENCRYPTION_KEY="NL-VisaCard-H5_StorageK"
+
+# API 配置
+VITE_API_BASE_URL="/api/v1"

+ 6 - 0
.env.development

@@ -0,0 +1,6 @@
+VITE_APP_ENV="development"
+
+VITE_DEV_PORT=8848
+
+VITE_API_BASE_URL="/dev/api/v1"
+VITE_DEV_PROXY_TARGET_API_BASE_URL="https://testactivity.jumpjump.io/api/v1"

+ 3 - 0
.env.production

@@ -0,0 +1,3 @@
+VITE_APP_ENV="production"
+
+VITE_API_BASE_URL="/api/v1"

+ 3 - 0
.env.test

@@ -0,0 +1,3 @@
+VITE_APP_ENV="test"
+
+VITE_API_BASE_URL="https://testactivity.jumpjump.io/api/v1"

+ 23 - 0
.gitignore

@@ -0,0 +1,23 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?

+ 7 - 0
.markdownlint.json

@@ -0,0 +1,7 @@
+{
+    "MD029": false,
+    "MD031": false,
+    "MD040": false,
+    "MD024": false,
+    "MD013": false
+}

+ 9 - 0
.npmrc

@@ -0,0 +1,9 @@
+# 安装时,package.json 中 保存精确的版本号,不使用 ^ 或 ~ 等模糊匹配
+save-exact=true
+# CI 环境强制使用 frozen-lockfile (pnpm 严格按照 lockfile 安装依赖)
+frozen-lockfile=true
+
+# 安装时,将 @ant-design 的所有依赖都提升到根目录下(解决依赖的依赖无法 import 的问题)
+public-hoist-pattern[]=*@ant-design*
+# 或者直接将所有依赖都提升到根目录下
+# shamefully-hoist=true

+ 1 - 0
.nvmrc

@@ -0,0 +1 @@
+18.20.8

+ 9 - 0
.prettierrc

@@ -0,0 +1,9 @@
+{
+    "semi": true,
+    "tabWidth": 4,
+    "printWidth": 100,
+    "singleQuote": true,
+    "trailingComma": "es5",
+    "bracketSpacing": true,
+    "endOfLine": "auto"
+}

+ 94 - 0
.stylelintrc.mjs

@@ -0,0 +1,94 @@
+export default {
+    extends: [
+        'stylelint-config-standard',
+        'stylelint-config-standard-scss',
+        'stylelint-config-recommended-less',
+    ],
+    plugins: ['stylelint-order'],
+    ignoreFiles: ['dist/**/*', 'public/**/*', '**/node_modules/**/*'],
+    rules: {
+        'selector-class-pattern': null,
+        'selector-pseudo-class-no-unknown': [
+            true,
+            {
+                ignorePseudoClasses: ['global'],
+            },
+        ],
+        'selector-pseudo-element-no-unknown': [
+            true,
+            {
+                ignorePseudoElements: ['v-deep'],
+            },
+        ],
+        'at-rule-no-unknown': null,
+        'scss/at-rule-no-unknown': [
+            true,
+            {
+                ignoreAtRules: [
+                    'tailwind',
+                    'apply',
+                    'variants',
+                    'responsive',
+                    'screen',
+                    'function',
+                    'if',
+                    'each',
+                    'include',
+                    'mixin',
+                    'layer',
+                ],
+            },
+        ],
+        'no-empty-source': null,
+        'string-quotes': null,
+        'named-grid-areas-no-invalid': null,
+        'no-descending-specificity': null,
+        'font-family-no-missing-generic-family-keyword': null,
+        'rule-empty-line-before': [
+            'always',
+            {
+                ignore: ['after-comment', 'first-nested'],
+            },
+        ],
+        'unit-no-unknown': [true, { ignoreUnits: ['rpx'] }],
+        'order/order': [
+            [
+                'dollar-variables',
+                'custom-properties',
+                'at-rules',
+                'declarations',
+                {
+                    type: 'at-rule',
+                    name: 'supports',
+                },
+                {
+                    type: 'at-rule',
+                    name: 'media',
+                },
+                'rules',
+            ],
+            { severity: 'warning' },
+        ],
+        'color-function-notation': null,
+        'alpha-value-notation': null,
+        'scss/dollar-variable-colon-space-after': 'always-single-line',
+        'scss/dollar-variable-empty-line-before': null,
+        'less/color-no-invalid-hex': null,
+    },
+    overrides: [
+        {
+            files: ['*.less', '**/*.less'],
+            customSyntax: 'postcss-less',
+            rules: {
+                'at-rule-no-unknown': null,
+            },
+        },
+        {
+            files: ['*.scss', '**/*.scss'],
+            customSyntax: 'postcss-scss',
+            rules: {
+                'at-rule-no-unknown': null,
+            },
+        },
+    ],
+};

+ 53 - 0
.vscode/settings.json

@@ -0,0 +1,53 @@
+{
+    "typescript.tsdk": "node_modules/typescript/lib",
+    "i18n-ally.localesPaths": [
+        "src/locales"
+    ],
+    "i18n-ally.keystyle": "nested",
+    "i18n-ally.sourceLanguage": "en-US",
+    "i18n-ally.displayLanguage": "en-US",
+    "i18n-ally.sortKeys": true,
+    "i18n-ally.pathMatcher": "{locale}/{namespace}.ts",
+    "i18n-ally.namespace": true,
+    "i18n-ally.enabledFrameworks": [
+        "react"
+    ],
+    "i18n-ally.enabledParsers": [
+        "json",
+        "yaml",
+        "ts"
+    ],
+    "i18n-ally.parsers.typescript.compilerOptions": {
+        "module": "commonjs",
+        "moduleResolution": "node",
+        "target": "es2015",
+        "allowJs": true,
+        "esModuleInterop": true,
+        "allowSyntheticDefaultImports": true
+    },
+    "editor.codeActionsOnSave": {
+        "source.fixAll.stylelint": "explicit",
+        "source.fixAll.eslint": "explicit"
+    },
+    "stylelint.validate": [
+        "css",
+        "less",
+        "scss",
+        "sass"
+    ],
+    "stylelint.configFile": ".stylelintrc.mjs",
+    "stylelint.config": null,
+    "stylelint.ignoreDisables": false,
+    "stylelint.enable": true,
+    "css.validate": false,
+    "less.validate": false,
+    "scss.validate": false,
+    "eslint.validate": [
+        "javascript",
+        "javascriptreact",
+        "typescript",
+        "typescriptreact"
+    ],
+    "eslint.format.enable": true,
+    "eslint.run": "onSave"
+}

+ 753 - 0
README.md

@@ -0,0 +1,753 @@
+# Visa Card H5
+
+这是一个基于 React + TypeScript + Vite 的现代化 H5 项目。
+
+## 环境要求
+
+- Node.js >= 18.20.7
+- pnpm >= 9
+- 现代浏览器支持
+
+## 浏览器支持
+
+- Chrome >= 87
+- Firefox >= 78
+- Safari >= 14
+- Edge >= 88
+- Android >= 4.4
+- iOS >= 9
+
+## 技术栈
+
+- **核心框架**:React 18 + TypeScript
+- **构建工具**:Vite 6
+- **包管理器**:pnpm
+- **UI 框架**:Ant Design 5
+- **路由**:React Router 7
+- **状态管理**:
+  - 基于 React Context + Hooks 的自定义方案,类似 UmiJS max 中的 model
+- **样式解决方案**:
+  - Tailwind CSS
+  - SCSS
+  - Less
+- **国际化**:i18next
+- **HTTP 客户端**:Axios
+- **工具库**:
+  - lodash-es
+  - ramda
+  - dayjs
+- **图标解决方案**:
+  - @iconify/react
+  - 自定义 Vite 插件(SVG 转 Iconify)
+  - Ant Design Icon
+- **代码规范**:
+  - ESLint
+  - Prettier
+  - Stylelint
+  - Commitlint
+- **Git 工作流**:
+  - Husky
+  - lint-staged
+
+## 开发命令
+
+```bash
+# 安装依赖
+pnpm install --frozen-lockfile
+
+# 启动开发服务器
+pnpm dev
+
+# 构建生产环境
+pnpm build
+
+# 构建测试环境
+pnpm build:test
+
+# 预览构建结果
+pnpm preview
+
+# 代码检查
+pnpm lint           # 检查 TypeScript/JavaScript 代码
+pnpm lint:fix       # 自动修复 TypeScript/JavaScript 代码问题
+pnpm stylelint      # 检查样式文件
+pnpm stylelint:fix  # 自动修复样式文件问题
+```
+
+## 开发规范
+
+- 遵循 TypeScript 严格模式
+- 使用 ESLint 和 Prettier 进行代码格式化
+- 使用 Conventional Commits 规范提交信息
+- 组件采用函数式组件和 Hooks
+- 样式优先使用 Tailwind CSS,必要时使用 SCSS 或 Less
+
+## 部署
+
+项目支持多环境部署,通过 `.env` 文件配置不同环境的变量:
+
+- `.env.development` - 开发环境
+- `.env.test` - 测试环境
+- `.env.production` - 生产环境
+
+## 项目结构
+
+```
+├── build/          # 构建相关配置和脚本
+├── public/         # 静态资源目录
+│   ├── favicon.ico # 网站图标
+│   └── index.html  # HTML 模板
+├── src/
+│   ├── assets/     # 项目资源文件
+│   │   ├── single-color/  # 单色图标
+│   │   └── multi-color/   # 多色图标
+│   ├── components/ # 公共组件
+│   ├── config/     # 配置文件
+│   │   └── request/      # 请求相关配置
+│   │       ├── index.ts  # 请求基础配置
+│   │       ├── authHeaderInterceptor.ts  # 认证拦截器
+│   │       ├── encryptionInterceptors.ts # 加密解密拦截器
+│   │       └── errorHandler.ts # 错误处理
+│   ├── defines/    # 枚举和常量定义
+│   │   ├── index.ts  # 导出入口
+│   │   ├── errorShowType.ts # 错误展示类型枚举
+│   │   └── ...  # 其他常量/枚举定义文件
+│   ├── firebase.tsx # Firebase 配置
+│   ├── i18n/       # 国际化配置
+│   ├── layouts/    # 布局组件
+│   ├── locales/    # 国际化语言包
+│   ├── main.tsx    # 应用入口
+│   ├── models/     # 数据模型
+│   ├── pages/      # 页面组件
+│   ├── router/     # 路由配置
+│   ├── services/   # API 服务
+│   ├── styles/     # 全局样式
+│   ├── utils/      # 工具函数
+│   └── App.tsx     # 根组件
+├── types/          # TypeScript 类型定义
+└── dist/           # 构建输出目录
+```
+
+### 目录说明
+
+- **build/** - 包含构建相关的配置文件和脚本
+  - 构建脚本
+  - 环境配置
+  - 部署配置
+
+- **public/** - 静态资源目录
+  - 存放不需要通过构建工具处理的静态文件
+  - 包含网站图标、HTML 模板等
+  - 构建时会被直接复制到输出目录
+
+- **src/** - 源代码目录
+  - 包含所有需要编译的源代码
+  - 按功能模块组织代码结构
+
+- **src/pages/** - 页面组件目录
+  - 遵循"一个页面一个目录"的原则
+  - 每个页面的目录结构应该类似下面的结构:
+    ```
+    pages/
+    ├── home/                # 首页
+    │   ├── index.tsx       # 页面主组件
+    │   ├── components/     # 页面级组件
+    │   ├── hooks/         # 页面级 Hooks
+    │   ├── styles/        # 页面级样式
+    │   └── types.ts       # 页面级类型定义
+    ├── about/             # 关于页面
+    │   ├── index.tsx
+    │   ├── components/
+    │   ├── hooks/
+    │   ├── styles/
+    │   └── types.ts
+    └── ...
+    ```
+  - 页面级组件、Hooks、样式等资源应放在对应页面目录下
+  - 页面间共享的组件应放在 `src/components` 目录下
+
+- **types/** - TypeScript 类型定义目录
+  - 存放全局类型声明文件
+  - 第三方库的类型定义
+
+- **dist/** - 构建输出目录
+  - 存放构建后的生产环境代码
+  - 包含优化后的静态资源
+  - 部署时使用此目录的内容
+
+## 状态管理
+
+项目使用基于 React Context 和 Hooks 的 Model 方案进行状态管理,类似 UmiJS Max 的 model 方案。
+
+### 目录结构
+
+```
+src/
+  └── models/              # 模型目录
+      ├── userModel.ts    # 用户模型
+      └── ...            # 其他模型
+```
+
+#### 使用示例
+
+1. 创建模型:
+
+```typescript
+// src/models/userModel.ts
+import { useState } from 'react';
+import { createModel } from '@/utils/model/createModel';
+
+// 定义状态类型
+interface UserState {
+    name: string;
+    age: number;
+}
+
+// 创建自定义 Hook
+const useUserModel = () => {
+    const [state, setState] = useState<UserState>({
+        name: 'John Doe',
+        age: 30
+    });
+
+    const updateName = (name: string) => {
+        setState(prev => ({ ...prev, name }));
+    };
+
+    const updateAge = (age: number) => {
+        setState(prev => ({ ...prev, age }));
+    };
+
+    const incrementAge = () => {
+        setState(prev => ({ ...prev, age: prev.age + 1 }));
+    };
+
+    return {
+        ...state,
+        updateName,
+        updateAge,
+        incrementAge
+    };
+};
+
+// 创建 model
+export const userModel = createModel(useUserModel, 'user');
+```
+
+2. 在组件中使用:
+
+```typescript
+// src/pages/home/index.tsx
+import { userModel } from '@/models/userModel';
+
+const Home = () => {
+    const user = userModel.useModel();
+    
+    return (
+        <div>
+            <h1>Hello, {user.name}!</h1>
+            <p>Age: {user.age}</p>
+            <button onClick={() => user.updateName('张三')}>修改名字</button>
+            <button onClick={() => user.incrementAge()}>年龄+1</button>
+        </div>
+    );
+};
+```
+
+## 图标使用说明
+
+项目使用了自定义的 Vite 插件,可以将指定目录的 SVG 图标转换为 Iconify 格式。
+
+### 使用方法
+
+1. 将需要转换的图标文件存放在以下目录:
+
+- `src/assets/single-color/` - 单色图标
+- `src/assets/multi-color/` - 多色图标
+
+2. 直接导入图标:
+
+```tsx
+import singleColorIcon from '@/assets/single-color/icon.svg';
+import multiColorIcon from '@/assets/multi-color/icon.svg';
+```
+
+3. 在组件中使用:
+
+```tsx
+import { Icon } from '@iconify/react';
+
+// 单色图标
+<Icon icon={singleColorIcon} className="text-red-500" />
+
+// 多色图标
+<Icon icon={multiColorIcon} />
+```
+
+### 图标特性
+
+- 单色图标可以通过 `className` 或 `color` 属性修改颜色
+- 多色图标保持原始颜色
+- 支持自定义大小(通过 `width` 和 `height` 属性)
+- 支持所有 Iconify 组件的属性
+
+## 多语言使用说明
+
+项目使用 i18next 实现多语言支持,目前支持英文和波斯语。
+
+### 目录结构
+
+```
+src/
+├── i18n/           # i18n 配置
+│   └── index.ts    # i18n 初始化配置
+└── locales/        # 语言包
+    ├── en-US.ts    # 英文语言包入口
+    ├── fa-IR.ts    # 波斯语语言包入口
+    ├── en-US/      # 英文语言包模块
+    │   ├── common.ts     # 通用翻译
+    │   ├── components.ts # 组件相关翻译
+    │   ├── menus.ts      # 菜单相关翻译
+    │   └── pages.ts      # 页面相关翻译
+    └── fa-IR/      # 波斯语语言包模块
+        ├── common.ts     # 通用翻译
+        ├── components.ts # 组件相关翻译
+        ├── menus.ts      # 菜单相关翻译
+        └── pages.ts      # 页面相关翻译
+```
+
+### 翻译文件说明
+
+1. **common.ts** - 通用翻译
+   - 包含按钮文本、提示信息、错误信息等通用文案
+   - 适用于整个应用的共享文本
+
+2. **components.ts** - 组件相关翻译
+   - 包含各个组件的标签、提示、占位符等文本
+   - 按组件名称组织翻译 key
+
+3. **menus.ts** - 菜单相关翻译
+   - 包含导航菜单、侧边栏等菜单项的文本
+   - 按菜单层级组织翻译 key
+
+4. **pages.ts** - 页面相关翻译
+   - 包含各个页面的标题、描述、提示等文本
+   - 按页面名称组织翻译 key
+
+### 使用方法
+
+1. 在组件中使用:
+
+```tsx
+import { useTranslation } from 'react-i18next';
+
+const MyComponent = () => {
+  const { t } = useTranslation();
+  
+  return (
+    <div>
+      <h1>{t('common.title')}</h1>
+      <p>{t('common.description')}</p>
+    </div>
+  );
+};
+```
+
+2. 语言包格式示例:
+
+```typescript
+// en-US/common.ts
+export default {
+  yes: 'Yes',
+  no: 'No',
+  ok: 'OK',
+  cancel: 'Cancel',
+  loading: 'Loading...'
+};
+```
+
+### 注意事项
+
+- 所有用户可见的文本都应该使用翻译函数
+- 动态内容使用插值语法:`t('key', { value: dynamicValue })`
+- 复数形式使用:`t('key', { count: number })`
+- 默认语言为英文
+- 波斯语文本需要从右到左(RTL)显示,注意布局适配
+
+## 网络请求使用说明
+
+项目使用 Axios 作为 HTTP 客户端,并封装了一套完整的请求工具。
+
+### 目录结构
+
+```
+src/
+├── config/
+│   └── request/           # 请求配置
+│       ├── index.ts       # 基础配置
+│       ├── authHeaderInterceptor.ts  # 认证拦截器
+│       ├── encryptionInterceptors.ts # 加密解密拦截器
+│       └── requestErrorConfig.ts # 错误处理配置
+├── services/             # API 服务
+│   ├── login/           # 登录相关接口
+│   │   ├── index.ts     # 接口实现
+│   │   └── typings.d.ts # 类型定义
+│   └── ...             # 其他模块接口
+└── utils/
+    └── request/        # 请求工具
+        ├── index.ts    # 请求实例
+        └── types.ts    # 类型定义
+```
+
+### 配置说明
+
+1. **基础配置** (`config/request/index.ts`)
+
+```typescript
+import { stringify } from 'qs';
+import { RequestConfig } from '@/utils/request/types';
+import { authHeaderInterceptor } from './authHeaderInterceptor';
+import { requestEncryptionInterceptor, responseDecryptionInterceptor } from './encryptionInterceptors';
+import { errorConfig } from './requestErrorConfig';
+
+const config: RequestConfig = {
+    baseURL: import.meta.env.VITE_API_BASE_URL!,
+    timeout: 15000,
+    headers: {
+        Accept: 'application/json, text/plain, */*',
+        'Content-Type': 'application/json',
+        'X-Requested-With': 'XMLHttpRequest',
+    },
+    paramsSerializer: (params) => stringify(params),
+    ...errorConfig,
+    requestInterceptors: [authHeaderInterceptor, requestEncryptionInterceptor],
+    responseInterceptors: [responseDecryptionInterceptor],
+};
+```
+
+2. **认证拦截器** (`config/request/authHeaderInterceptor.ts`)
+
+用于处理请求认证,自动添加 token 等认证信息。
+
+3. **加密解密配置**
+
+通过环境变量配置加密密钥:
+
+```env
+VITE_REQUEST_ENCRYPTION_KEY=your-encryption-key
+VITE_ENABLE_REQUEST_ENCRYPTION=true
+```
+
+4. **加密解密拦截器** (`config/request/encryptionInterceptors.ts`)
+
+用于处理请求和响应的数据加密解密。可以通过请求配置选项控制单个请求是否启用加密:
+
+```typescript
+// 单个请求启用加密
+request('/api/data', {
+    encryption: {
+        enabled: true,
+        key: 'custom-key' // 可选,使用自定义密钥
+    }
+});
+
+// 单个请求禁用加密
+request('/api/data', {
+    encryption: {
+        enabled: false
+    }
+});
+```
+
+5. **错误处理配置** (`config/request/requestErrorConfig.ts`)
+
+统一处理请求错误,包括网络错误、业务错误等。
+
+可以通过配置 `skipErrorHandler: true` 来跳过默认的错误处理,自行处理错误。
+
+### API 服务定义
+
+在 `services` 目录下按模块定义 API 服务,每个模块包含类型定义和接口实现:
+
+1. **类型定义** (`services/[module]/typings.d.ts`)
+
+```typescript
+declare namespace API {
+    // 用户信息类型
+    type UserInfo = {
+        accessToken?: string;
+        refreshToken?: string;
+        expires?: number;
+        username?: string;
+        nickname?: string;
+        avatar?: string;
+        roles?: Array<string>;
+        permissions?: Array<string>;
+    };
+
+    // 登录参数类型
+    type LoginParams = {
+        username: string;
+        password: string;
+        captchaId: string;
+        captchaCode: string;
+    };
+
+    // 登录结果类型
+    type LoginResult = Result<UserInfo>;
+}
+```
+
+2. **接口实现** (`services/[module]/index.ts`)
+
+```typescript
+import { request } from '@/utils/request';
+
+// 登录接口
+export async function fetchLogin(body: API.LoginParams, options?: { [key: string]: any }) {
+    return request<API.LoginResult>('/user/login', {
+        method: 'POST',
+        data: body,
+        ...(options || {}),
+        requireToken: false,
+    });
+}
+
+// 获取验证码
+export async function fetchCaptcha(options?: { [key: string]: any }) {
+    return request<API.CaptchaResult>('/captcha/get', {
+        method: 'POST',
+        ...(options || {}),
+        requireToken: false,
+    });
+}
+```
+
+### 使用示例
+
+1. **在组件中使用**
+
+```typescript
+import { fetchLogin, fetchCaptcha } from '@/services/login';
+
+const LoginPage = () => {
+    const handleLogin = async () => {
+        try {
+            // 获取验证码
+            const captchaResult = await fetchCaptcha();
+            
+            // 登录
+            const result = await fetchLogin({
+                username: 'test',
+                password: '123456',
+                captchaId: captchaResult.id,
+                captchaCode: '1234',
+            });
+            
+            // 处理登录成功
+            // 注意:request 已经处理了 success 判断,这里直接使用返回的数据
+            console.log('登录成功:', result);
+            
+        } catch (error) {
+            // 处理错误
+        }
+    };
+};
+```
+
+2. **在 Model 中使用**
+
+```typescript
+// models/userModel.ts
+import { fetchLogin, fetchCaptcha } from '@/services/login';
+
+const useUserModel = () => {
+    const login = async (params: API.LoginParams) => {
+        try {
+            const result = await fetchLogin(params);
+            // 直接使用返回的数据,不需要判断 success
+            return result;
+        } catch (error) {
+            // 处理错误
+            throw error;
+        }
+    };
+
+    const getCaptcha = async () => {
+        return fetchCaptcha();
+    };
+
+    return {
+        login,
+        getCaptcha,
+    };
+};
+```
+
+### 请求配置选项
+
+```typescript
+interface IRequestOptions {
+    method?: 'GET' | 'POST' | 'PUT' | 'DELETE';
+    data?: any;
+    params?: any;
+    headers?: Record<string, string>;
+    timeout?: number;
+    getResponse?: boolean;  // 是否返回完整响应
+    requireToken?: boolean; // 是否需要 token
+    skipErrorHandler?: boolean; // 是否跳过默认的错误处理
+    requestInterceptors?: IRequestInterceptorTuple[];  // 请求拦截器
+    responseInterceptors?: IResponseInterceptorTuple[];  // 响应拦截器
+}
+```
+
+### 错误处理
+
+项目提供了统一的错误处理机制:
+
+1. 网络错误(如超时、断网等)
+2. HTTP 错误(如 404、500 等)
+3. 业务错误(后端返回的错误信息)
+
+可以通过配置 `skipErrorHandler: true` 来跳过默认的错误处理,自行处理错误。
+
+### 响应数据
+
+默认情况下,请求会直接返回服务器响应的数据。如果需要获取完整的响应信息(包括状态码、响应头等),可以配置 `getResponse: true`。
+
+示例:
+```typescript
+// 获取完整响应信息
+const response = await request('/api/data', {
+    getResponse: true,
+});
+// response 包含完整的响应信息
+console.log(response.status); // HTTP 状态码
+console.log(response.headers); // 响应头
+console.log(response.data); // 响应数据
+```
+
+### 注意事项
+
+1. 所有 API 请求都应该在 `services` 目录下按模块组织
+2. 每个模块包含 `typings.d.ts`(类型定义)和 `index.ts`(接口实现)
+3. 使用 TypeScript 类型定义请求参数和响应数据
+4. 需要认证的接口设置 `requireToken: true`
+5. 支持请求和响应拦截器,可以针对特定请求添加自定义拦截器
+
+## 本地存储使用说明
+
+项目提供了统一的本地存储工具,支持 localStorage 和 sessionStorage,并支持数据加密存储。
+
+### 目录结构
+
+```
+src/
+└── utils/
+    ├── storage/        # 存储工具
+    │   ├── index.ts    # 存储工具入口
+    │   └── types.ts    # 类型定义
+    ├── localUtils.ts   # localStorage 工具
+    └── sessionUtils.ts # sessionStorage 工具
+```
+
+### 配置说明
+
+1. **加密配置**
+
+通过环境变量配置加密密钥:
+```env
+VITE_STORAGE_ENCRYPTION_KEY=your-encryption-key
+```
+
+2. **命名空间配置**
+
+通过环境变量配置存储命名空间:
+```env
+VITE_APP_STORAGE_NAMESPACE=your-app-namespace
+```
+
+### 使用示例
+
+1. **创建存储工具实例**
+
+```typescript
+import { createLocalTools, createSessionTools } from '@/utils/localUtils';
+
+// 创建 localStorage 工具实例
+const ls = createLocalTools({
+    encryptKey: true,  // 是否加密 key
+    encryptValue: true,  // 是否加密 value
+});
+
+// 创建 sessionStorage 工具实例
+const ss = createSessionTools({
+    encryptKey: true,
+    encryptValue: true,
+});
+```
+
+2. **使用 localStorage**
+
+```typescript
+// 存储数据
+ls.setLocal('userInfo', { name: 'John', age: 30 });
+
+// 获取数据
+const userInfo = ls.getLocal<{ name: string; age: number }>('userInfo');
+
+// 删除数据
+ls.removeLocal('userInfo');
+
+// 清除所有数据
+ls.clearLocal();
+```
+
+3. **使用 sessionStorage**
+
+```typescript
+// 存储数据
+ss.setSession('tempData', { id: 1, status: 'pending' });
+
+// 获取数据
+const tempData = ss.getSession<{ id: number; status: string }>('tempData');
+
+// 删除数据
+ss.removeSession('tempData');
+
+// 清除所有数据
+ss.clearSession();
+```
+
+### 注意事项
+
+1. 所有存储的 key 都会自动添加应用命名空间前缀
+2. 加密存储的配置(key 和 value 是否加密)由创建存储工具实例时的参数决定
+3. 清除操作会清除所有属于当前应用的数据(包括加密和未加密的数据)
+4. 对于敏感数据,建议在创建存储工具实例时启用加密选项
+5. 每个存储操作都可以通过 opts 参数覆盖全局配置
+6. 建议在应用初始化时创建存储工具实例,并在整个应用中复用
+
+### 类型定义
+
+```typescript
+interface StorageOptions {
+    expire?: number;         // 过期时间,单位秒
+    encryptKey?: boolean;    // 是否加密 key
+    encryptValue?: boolean;  // 是否加密 value
+}
+
+interface LocalStorageInstance {
+    setLocal: <T = any>(key: string, value: T, opts?: StorageOptions) => void;
+    getLocal: <T = any>(key: string, opts?: StorageOptions) => T | null;
+    removeLocal: (key: string, opts?: StorageOptions) => void;
+    clearLocal: () => void;
+}
+
+interface SessionStorageInstance {
+    setSession: <T = any>(key: string, value: T, opts?: StorageOptions) => void;
+    getSession: <T = any>(key: string, opts?: StorageOptions) => T | null;
+    removeSession: (key: string, opts?: StorageOptions) => void;
+    clearSession: () => void;
+}
+```

+ 61 - 0
build/buildInfo.ts

@@ -0,0 +1,61 @@
+import boxen from 'boxen';
+import dayjs from 'dayjs';
+import duration from 'dayjs/plugin/duration';
+import gradient from 'gradient-string';
+
+import { getPackageSize } from './utils';
+
+import type { Options as BoxenOptions } from 'boxen';
+import type { Dayjs } from 'dayjs';
+import type { Plugin } from 'vite';
+
+dayjs.extend(duration);
+
+const welcomeMessage = gradient(['cyan', 'magenta']).multiline(`正在打包...`);
+
+const boxenOptions: BoxenOptions = {
+    padding: 0.5,
+    borderColor: 'cyan',
+    borderStyle: 'round',
+};
+
+export function viteBuildInfo(): Plugin {
+    let config: { command: string };
+    let startTime: Dayjs;
+    let endTime: Dayjs;
+    let outDir: string;
+    return {
+        name: 'vite:buildInfo',
+        configResolved(resolvedConfig) {
+            config = resolvedConfig;
+            outDir = resolvedConfig.build?.outDir ?? 'dist';
+        },
+        buildStart() {
+            if (config.command === 'build') {
+                console.log('\n' + boxen(welcomeMessage, boxenOptions));
+                startTime = dayjs(new Date());
+            }
+        },
+        closeBundle() {
+            if (config.command === 'build') {
+                endTime = dayjs(new Date());
+                getPackageSize({
+                    folder: outDir,
+                    callback: (size: string | number) => {
+                        console.log(
+                            '\n' +
+                                boxen(
+                                    gradient(['cyan', 'magenta']).multiline(
+                                        `🎉 恭喜打包完成\n` +
+                                            `总用时:${dayjs.duration(endTime.diff(startTime)).format('mm分ss秒')}\n` +
+                                            `打包后的大小为:${size}`
+                                    ),
+                                    boxenOptions
+                                )
+                        );
+                    },
+                });
+            }
+        },
+    };
+}

+ 60 - 0
build/compress.ts

@@ -0,0 +1,60 @@
+import { isArray } from 'lodash-es';
+import compressPlugin from 'vite-plugin-compression';
+
+import type { Plugin } from 'vite';
+
+export const configCompressPlugin = (compress: BuildCompression): Plugin | Plugin[] | null => {
+    if (compress === 'none') return null;
+
+    const gz = {
+        // 生成的压缩包后缀
+        ext: '.gz',
+        // 体积大于threshold才会被压缩
+        threshold: 0,
+        // 默认压缩.js|mjs|json|css|html后缀文件,设置成true,压缩全部文件
+        filter: () => true,
+        // 压缩后是否删除原始文件
+        deleteOriginFile: false,
+    };
+    const br = {
+        ext: '.br',
+        algorithm: 'brotliCompress',
+        threshold: 0,
+        filter: () => true,
+        deleteOriginFile: false,
+    };
+
+    const codeList = [
+        { k: 'gzip', v: gz },
+        { k: 'brotli', v: br },
+        { k: 'both', v: [gz, br] },
+    ];
+
+    const plugins: Plugin[] = [];
+
+    codeList.forEach((item) => {
+        if (compress.includes(item.k)) {
+            if (compress.includes('clear')) {
+                if (isArray(item.v)) {
+                    item.v.forEach((vItem) => {
+                        plugins.push(
+                            compressPlugin(Object.assign(vItem, { deleteOriginFile: true }))
+                        );
+                    });
+                } else {
+                    plugins.push(compressPlugin(Object.assign(item.v, { deleteOriginFile: true })));
+                }
+            } else {
+                if (isArray(item.v)) {
+                    item.v.forEach((vItem) => {
+                        plugins.push(compressPlugin(vItem));
+                    });
+                } else {
+                    plugins.push(compressPlugin(item.v));
+                }
+            }
+        }
+    });
+
+    return plugins;
+};

+ 100 - 0
build/svgConvert.ts

@@ -0,0 +1,100 @@
+import fs from 'fs';
+
+import { SVG, cleanupSVG, parseColors, /*runSVGO,*/ isEmptyColor } from '@iconify/tools';
+import { Plugin } from 'vite';
+
+interface Options {
+    singleColorIconDir?: string;
+    multiColorIconDir?: string;
+}
+
+export default function svgConvert(options: Options = {}): Plugin {
+    const {
+        singleColorIconDir = 'src/assets/iconify/single-color',
+        multiColorIconDir = 'src/assets/iconify/multi-color',
+    } = options;
+
+    return {
+        name: 'vite-plugin-svg-convert',
+        async transform(_, id) {
+            // 只处理 SVG 文件
+            if (!id.endsWith('.svg')) return null;
+
+            // 检查是否是目标目录下的文件
+            const isSingleColor = id.includes(singleColorIconDir);
+            const isMultiColor = id.includes(multiColorIconDir);
+
+            if (!isSingleColor && !isMultiColor) return null;
+
+            // 读取 SVG 文件内容
+            const svgContent = await fs.promises.readFile(id, 'utf-8');
+
+            // 检查是否包含 image 标签
+            if (svgContent.includes('<image')) {
+                // 如果是多色图标且包含 image 标签,直接返回原始内容
+                if (isMultiColor) {
+                    const viewBox = svgContent.match(/viewBox="([^"]+)"/)?.[1] || '0 0 1 1';
+                    const [, , width, height] = viewBox.split(' ').map(Number);
+                    // 提取 SVG 标签内的内容
+                    const innerContent = svgContent.replace(/<svg[^>]*>([\s\S]*)<\/svg>/i, '$1');
+                    return {
+                        code: `export default {width: ${width}, height: ${height}, body: ${JSON.stringify(innerContent)}}`,
+                    };
+                }
+            }
+
+            // 创建 SVG 实例
+            const svg = new SVG(svgContent);
+
+            // 清理 SVG
+            await cleanupSVG(svg);
+
+            // 根据目录类型选择不同的处理方式
+            if (isSingleColor) {
+                // 单色图标处理
+                parseColors(svg, {
+                    defaultColor: 'currentColor',
+                    callback: (_, colorStr, color) => {
+                        return !color || isEmptyColor(color) ? colorStr : 'currentColor';
+                    },
+                });
+            }
+
+            // 获取优化后的 SVG 内容
+            const width = svg.viewBox.width;
+            const height = svg.viewBox.height;
+            // const aspectRatio = height / width;
+            // const newWidth = '1rem';
+            // const newHeight = `${aspectRatio}rem`;
+
+            // // 运行 SVGO 优化
+            // await runSVGO(svg, {
+            //     plugins: [
+            //         {
+            //             name: 'removeAttrs',
+            //             params: {
+            //                 attrs: ['width', 'height'],
+            //             },
+            //         },
+            //         {
+            //             name: 'addAttributesToSVGElement',
+            //             params: {
+            //                 attributes: [{ width: newWidth }, { height: newHeight }],
+            //             },
+            //         },
+            //     ],
+            // });
+
+            // 获取优化后的 SVG 内容
+            const optimizedSvg = svg.toMinifiedString();
+
+            // 提取 SVG 标签内的内容
+            const innerContent = optimizedSvg.replace(/<svg[^>]*>([\s\S]*)<\/svg>/i, '$1');
+
+            // 返回转换后的代码
+            return {
+                code: `export default {width: ${width}, height: ${height}, body: ${JSON.stringify(innerContent)}}`,
+            };
+        },
+    };
+}

+ 132 - 0
build/utils.ts

@@ -0,0 +1,132 @@
+import { readdir, stat } from 'node:fs';
+import { dirname, resolve } from 'node:path';
+import { fileURLToPath } from 'node:url';
+
+/** 启动`node`进程时所在工作目录的绝对路径 */
+const root: string = process.cwd();
+
+/**
+ * @description 根据可选的路径片段生成一个新的绝对路径
+ * @param dir 路径片段,默认`build`
+ * @param metaUrl 模块的完整`url`,如果在`build`目录外调用必传`import.meta.url`
+ */
+const pathResolve = (dir = '.', metaUrl = import.meta.url) => {
+    // 当前文件目录的绝对路径
+    const currentFileDir = dirname(fileURLToPath(metaUrl));
+    // build 目录的绝对路径
+    const buildDir = resolve(currentFileDir, 'build');
+    // 解析的绝对路径
+    const resolvedPath = resolve(currentFileDir, dir);
+    // 检查解析的绝对路径是否在 build 目录内
+    if (resolvedPath.startsWith(buildDir)) {
+        // 在 build 目录内,返回当前文件路径
+        return fileURLToPath(metaUrl);
+    }
+    // 不在 build 目录内,返回解析后的绝对路径
+    return resolvedPath;
+};
+
+/** 设置别名 */
+const alias: Record<string, string> = {
+    '@': pathResolve('../src'),
+    '@build': pathResolve(),
+};
+
+/** 处理环境变量 */
+const wrapperEnv = (envConf: Recordable): ImportMetaEnv => {
+    // 默认值
+    let ret: ImportMetaEnv = {};
+
+    ret = Object.assign(ret, envConf);
+
+    const setEnv = (envName: string, envValue: string | object) => {
+        if (!envName.startsWith('VITE_DEV_')) return;
+        if (!envName.startsWith('VITE_BUILD_')) return;
+        if (typeof envValue === 'string') {
+            process.env[envName] = envValue;
+        } else if (typeof envValue === 'object') {
+            process.env[envName] = JSON.stringify(envValue);
+        }
+    };
+
+    // 先设置默认值到 process.env
+    for (const envName of Object.keys(ret)) {
+        setEnv(envName, ret[envName]);
+    }
+
+    // 然后用环境变量覆盖默认值
+    for (const envName of Object.keys(envConf)) {
+        let envValue = envConf[envName].replace(/\\n/g, '\n');
+        envValue = envValue === 'true' ? true : envValue === 'false' ? false : envValue;
+        if (envName === 'VITE_DEV_PORT') {
+            envValue = Number(envValue);
+        }
+        ret[envName] = envValue;
+        setEnv(envName, envValue);
+    }
+    return ret;
+};
+
+const fileListTotal: number[] = [];
+
+/**
+ * @description 计算数组元素之和
+ * @param arr 数字数组
+ * @returns 数组元素之和
+ */
+const sum = (arr: number[]): number => arr.reduce((a, b) => a + b, 0);
+
+/**
+ * @description 将字节单位智能转化成 Bytes 、 KB 、 MB 、 GB 、 TB 、 PB 、 EB 、 ZB 、 YB 其中的一种
+ * @param byte — 字节
+ * @param digits — 四舍五入保留几位小数(默认四舍五入保留两位小数)
+ * @returns — 智能转化字节单位后的值
+ */
+const formatBytes = (byte: number, digits = 2): string => {
+    if (byte === 0) return '0 Bytes';
+
+    const k = 1024;
+    const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
+    const i = Math.floor(Math.log(byte) / Math.log(k));
+
+    return `${parseFloat((byte / Math.pow(k, i)).toFixed(digits))} ${sizes[i]}`;
+};
+
+interface PackageSizeOptions {
+    folder?: string;
+    callback: (size: string | number) => void;
+    format?: boolean;
+}
+
+/** 获取指定文件夹中所有文件的总大小 */
+const getPackageSize = (options: PackageSizeOptions) => {
+    const { folder = 'dist', callback, format = true } = options;
+    readdir(folder, (err, files: string[]) => {
+        if (err) throw err;
+        let count = 0;
+        const checkEnd = () => {
+            if (++count === files.length) {
+                callback(format ? formatBytes(sum(fileListTotal)) : sum(fileListTotal));
+            }
+        };
+        files.forEach((item: string) => {
+            stat(`${folder}/${item}`, async (err, stats) => {
+                if (err) throw err;
+                if (stats.isFile()) {
+                    fileListTotal.push(stats.size);
+                    checkEnd();
+                } else if (stats.isDirectory()) {
+                    getPackageSize({
+                        folder: `${folder}/${item}/`,
+                        callback: checkEnd,
+                    });
+                }
+            });
+        });
+        if (files.length === 0) {
+            callback(0);
+        }
+    });
+};
+
+export { root, pathResolve, alias, wrapperEnv, getPackageSize, formatBytes };

+ 29 - 0
commitlint.config.js

@@ -0,0 +1,29 @@
+export default {
+    extends: ['@commitlint/config-conventional'],
+    rules: {
+        'type-enum': [
+            2,
+            'always',
+            [
+                'feat', // 新功能
+                'fix', // 修复bug
+                'docs', // 文档更新
+                'style', // 代码格式(不影响代码运行的变动)
+                'refactor', // 重构(既不是新增功能,也不是修改bug的代码变动)
+                'perf', // 性能优化
+                'test', // 增加测试
+                'chore', // 构建过程或辅助工具的变动
+                'revert', // 回退
+                'build', // 打包
+                'ci', // CI 相关变动
+            ],
+        ],
+        'type-case': [2, 'always', 'lower'],
+        'type-empty': [2, 'never'],
+        'scope-case': [2, 'always', 'lower'],
+        'subject-case': [2, 'always', 'lower'],
+        'subject-empty': [2, 'never'],
+        'subject-full-stop': [2, 'never', '.'],
+        'header-max-length': [2, 'always', 72],
+    },
+};

+ 115 - 0
eslint.config.js

@@ -0,0 +1,115 @@
+import js from '@eslint/js';
+import globals from 'globals';
+import reactHooks from 'eslint-plugin-react-hooks';
+import reactRefresh from 'eslint-plugin-react-refresh';
+import tseslint from 'typescript-eslint';
+import react from 'eslint-plugin-react';
+import importPlugin from 'eslint-plugin-import';
+import jsxA11y from 'eslint-plugin-jsx-a11y';
+
+export default [
+    { ignores: ['dist/**/*', 'node_modules/**/*', 'public/**/*'] },
+    js.configs.recommended,
+    ...tseslint.configs.recommended,
+    {
+        files: ['**/*.{ts,tsx}'],
+        languageOptions: {
+            ecmaVersion: 2020,
+            globals: {
+                ...globals.browser,
+                ...globals.node,
+                Recordable: 'readonly',
+                ImportMetaEnv: 'readonly',
+                BuildCompression: 'readonly',
+            },
+            parser: tseslint.parser,
+            parserOptions: {
+                ecmaFeatures: {
+                    jsx: true,
+                },
+                sourceType: 'module',
+                project: ['./tsconfig.json'],
+                tsconfigRootDir: '.',
+            },
+        },
+        plugins: {
+            'react-hooks': reactHooks,
+            'react-refresh': reactRefresh,
+            react: react,
+            import: importPlugin,
+            'jsx-a11y': jsxA11y,
+            '@typescript-eslint': tseslint.plugin,
+        },
+        rules: {
+            ...reactHooks.configs.recommended.rules,
+            'react-refresh/only-export-components': ['warn', { allowConstantExport: true }],
+            'react/react-in-jsx-scope': 'off',
+            'react/prop-types': 'off',
+            '@typescript-eslint/explicit-module-boundary-types': 'off',
+            '@typescript-eslint/no-explicit-any': 'off',
+            '@typescript-eslint/no-unused-vars': [
+                'warn',
+                {
+                    argsIgnorePattern: '^_',
+                    varsIgnorePattern: '^_',
+                    ignoreRestSiblings: true,
+                },
+            ],
+            'import/order': [
+                'error',
+                {
+                    groups: [
+                        'builtin',
+                        'external',
+                        'internal',
+                        'parent',
+                        'sibling',
+                        'index',
+                        'object',
+                        'type',
+                    ],
+                    pathGroups: [
+                        {
+                            pattern: 'react',
+                            group: 'external',
+                            position: 'before',
+                        },
+                        {
+                            pattern: '@/**',
+                            group: 'internal',
+                            position: 'before',
+                        },
+                    ],
+                    pathGroupsExcludedImportTypes: ['react'],
+                    'newlines-between': 'always',
+                    alphabetize: {
+                        order: 'asc',
+                        caseInsensitive: true,
+                    },
+                    distinctGroup: true,
+                },
+            ],
+            indent: [
+                'error',
+                4,
+                {
+                    SwitchCase: 1,
+                    ignoredNodes: ['ConditionalExpression'],
+                },
+            ],
+            'no-unused-vars': 'off',
+            'no-redeclare': 'off',
+            'prefer-const': 'error',
+        },
+        settings: {
+            react: {
+                version: 'detect',
+            },
+            'import/resolver': {
+                typescript: {
+                    project: ['./tsconfig.json'],
+                },
+            },
+        },
+    },
+];

+ 13 - 0
index.html

@@ -0,0 +1,13 @@
+<!doctype html>
+<html lang="en">
+    <head>
+        <meta charset="UTF-8" />
+        <link rel="icon" type="image/svg+xml" href="/vite.svg" />
+        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+        <title>%VITE_APP_TITLE%</title>
+    </head>
+    <body>
+        <div id="root"></div>
+        <script type="module" src="/src/main.tsx"></script>
+    </body>
+</html>

+ 129 - 0
package.json

@@ -0,0 +1,129 @@
+{
+  "name": "visa-card-h5",
+  "private": true,
+  "version": "0.0.1",
+  "type": "module",
+  "browserslist": [
+    "> 0.5%",
+    "last 2 versions",
+    "not dead",
+    "not op_mini all",
+    "android >= 4.4",
+    "ios >= 9"
+  ],
+  "scripts": {
+    "dev": "vite",
+    "build": "npm run build:prod",
+    "build:prod": "tsc && vite build --mode production",
+    "build:test": "tsc && vite build --mode test",
+    "preview": "vite preview",
+    "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
+    "lint:fix": "eslint . --ext ts,tsx --fix",
+    "stylelint": "stylelint \"src/**/*.{css,less,scss}\"",
+    "stylelint:fix": "stylelint \"src/**/*.{css,less,scss}\" --fix",
+    "prepare": "husky install"
+  },
+  "dependencies": {
+    "@ant-design/icons": "^5.6.1",
+    "@iconify-icons/bi": "^1.2.19",
+    "@iconify-icons/carbon": "^1.2.20",
+    "@iconify-icons/ep": "^1.2.12",
+    "@iconify-icons/fa": "^1.2.4",
+    "@iconify-icons/mdi": "^1.2.48",
+    "@iconify-icons/ri": "^1.2.10",
+    "@iconify/react": "^5.2.0",
+    "@types/node": "^22.13.10",
+    "antd": "^5.24.4",
+    "async-validator": "^4.2.5",
+    "axios": "^1.8.4",
+    "copy-to-clipboard": "^3.3.3",
+    "crypto-js": "^4.2.0",
+    "dayjs": "^1.11.13",
+    "file-saver": "^2.0.5",
+    "firebase": "^11.5.0",
+    "husky": "^9.1.7",
+    "i18next": "^23.10.0",
+    "i18next-browser-languagedetector": "^8.0.4",
+    "js-cookie": "^3.0.5",
+    "less": "^4.2.2",
+    "lint-staged": "^15.5.0",
+    "lodash-es": "^4.17.21",
+    "qs": "^6.14.0",
+    "ramda": "^0.30.1",
+    "react": "^18.2.0",
+    "react-dom": "^18.2.0",
+    "react-i18next": "^14.0.5",
+    "react-router-dom": "^7.4.0"
+  },
+  "devDependencies": {
+    "@commitlint/cli": "^19.8.0",
+    "@commitlint/config-conventional": "^19.8.0",
+    "@eslint/js": "^9.21.0",
+    "@iconify/tools": "^4.1.2",
+    "@types/crypto-js": "^4.2.2",
+    "@types/file-saver": "^2.0.7",
+    "@types/js-cookie": "^3.0.6",
+    "@types/lodash-es": "^4.17.12",
+    "@types/qs": "^6.9.18",
+    "@types/ramda": "^0.30.2",
+    "@types/react": "^18.2.0",
+    "@types/react-dom": "^18.2.0",
+    "@typescript-eslint/eslint-plugin": "^8.27.0",
+    "@typescript-eslint/parser": "^8.27.0",
+    "@vitejs/plugin-react": "^4.3.4",
+    "autoprefixer": "10.4.17",
+    "boxen": "^8.0.1",
+    "consola": "^3.4.2",
+    "cross-env": "^7.0.3",
+    "eslint": "^9.22.0",
+    "eslint-import-resolver-typescript": "^4.2.2",
+    "eslint-plugin-import": "^2.31.0",
+    "eslint-plugin-jsx-a11y": "^6.10.2",
+    "eslint-plugin-react": "^7.37.4",
+    "eslint-plugin-react-hooks": "^5.2.0",
+    "eslint-plugin-react-refresh": "^0.4.19",
+    "globals": "^15.15.0",
+    "gradient-string": "^3.0.0",
+    "postcss": "8.4.35",
+    "postcss-nesting": "^13.0.1",
+    "postcss-scss": "^4.0.9",
+    "prettier": "^3.5.3",
+    "stylelint": "^15.11.0",
+    "stylelint-config-recommended-less": "2.0.0",
+    "stylelint-config-standard": "^30.0.0",
+    "stylelint-config-standard-scss": "^7.0.1",
+    "stylelint-order": "^6.0.4",
+    "stylelint-prettier": "^2.0.0",
+    "svgo": "^3.3.2",
+    "tailwindcss": "3.4.1",
+    "typescript": "^5.7.3",
+    "typescript-eslint": "^8.24.1",
+    "vite": "^6.2.2",
+    "vite-plugin-compression": "^0.5.1",
+    "vite-plugin-remove-console": "^2.2.0",
+    "vite-plugin-style-import": "^2.0.0"
+  },
+  "packageManager": "[email protected]",
+  "engines": {
+    "node": ">=18.20.7",
+    "pnpm": ">=9"
+  },
+  "lint-staged": {
+    "src/**/*.{ts,tsx,js,jsx}": [
+      "eslint --fix",
+      "prettier --write"
+    ],
+    "src/**/*.{css,scss,less}": [
+      "stylelint --fix",
+      "prettier --write"
+    ]
+  },
+  "pnpm": {
+    "onlyBuiltDependencies": [
+      "@firebase/util",
+      "@parcel/watcher",
+      "esbuild",
+      "protobufjs"
+    ]
+  }
+}

+ 9174 - 0
pnpm-lock.yaml

@@ -0,0 +1,9174 @@
+lockfileVersion: '9.0'
+
+settings:
+  autoInstallPeers: true
+  excludeLinksFromLockfile: false
+
+importers:
+
+  .:
+    dependencies:
+      '@ant-design/icons':
+        specifier: ^5.6.1
+        version: 5.6.1([email protected]([email protected]))([email protected])
+      '@iconify-icons/bi':
+        specifier: ^1.2.19
+        version: 1.2.19
+      '@iconify-icons/carbon':
+        specifier: ^1.2.20
+        version: 1.2.20
+      '@iconify-icons/ep':
+        specifier: ^1.2.12
+        version: 1.2.12
+      '@iconify-icons/fa':
+        specifier: ^1.2.4
+        version: 1.2.4
+      '@iconify-icons/mdi':
+        specifier: ^1.2.48
+        version: 1.2.48
+      '@iconify-icons/ri':
+        specifier: ^1.2.10
+        version: 1.2.10
+      '@iconify/react':
+        specifier: ^5.2.0
+        version: 5.2.0([email protected])
+      '@types/node':
+        specifier: ^22.13.10
+        version: 22.13.10
+      antd:
+        specifier: ^5.24.4
+        version: 5.24.4([email protected])([email protected])([email protected]([email protected]))([email protected])
+      async-validator:
+        specifier: ^4.2.5
+        version: 4.2.5
+      axios:
+        specifier: ^1.8.4
+        version: 1.8.4
+      copy-to-clipboard:
+        specifier: ^3.3.3
+        version: 3.3.3
+      crypto-js:
+        specifier: ^4.2.0
+        version: 4.2.0
+      dayjs:
+        specifier: ^1.11.13
+        version: 1.11.13
+      file-saver:
+        specifier: ^2.0.5
+        version: 2.0.5
+      firebase:
+        specifier: ^11.5.0
+        version: 11.5.0
+      husky:
+        specifier: ^9.1.7
+        version: 9.1.7
+      i18next:
+        specifier: ^23.10.0
+        version: 23.16.8
+      i18next-browser-languagedetector:
+        specifier: ^8.0.4
+        version: 8.0.4
+      js-cookie:
+        specifier: ^3.0.5
+        version: 3.0.5
+      less:
+        specifier: ^4.2.2
+        version: 4.2.2
+      lint-staged:
+        specifier: ^15.5.0
+        version: 15.5.0
+      lodash-es:
+        specifier: ^4.17.21
+        version: 4.17.21
+      qs:
+        specifier: ^6.14.0
+        version: 6.14.0
+      ramda:
+        specifier: ^0.30.1
+        version: 0.30.1
+      react:
+        specifier: ^18.2.0
+        version: 18.3.1
+      react-dom:
+        specifier: ^18.2.0
+        version: 18.3.1([email protected])
+      react-i18next:
+        specifier: ^14.0.5
+        version: 14.1.3([email protected])([email protected]([email protected]))([email protected])
+      react-router-dom:
+        specifier: ^7.4.0
+        version: 7.4.0([email protected]([email protected]))([email protected])
+    devDependencies:
+      '@commitlint/cli':
+        specifier: ^19.8.0
+        version: 19.8.0(@types/[email protected])([email protected])
+      '@commitlint/config-conventional':
+        specifier: ^19.8.0
+        version: 19.8.0
+      '@eslint/js':
+        specifier: ^9.21.0
+        version: 9.22.0
+      '@iconify/tools':
+        specifier: ^4.1.2
+        version: 4.1.2
+      '@types/crypto-js':
+        specifier: ^4.2.2
+        version: 4.2.2
+      '@types/file-saver':
+        specifier: ^2.0.7
+        version: 2.0.7
+      '@types/js-cookie':
+        specifier: ^3.0.6
+        version: 3.0.6
+      '@types/lodash-es':
+        specifier: ^4.17.12
+        version: 4.17.12
+      '@types/qs':
+        specifier: ^6.9.18
+        version: 6.9.18
+      '@types/ramda':
+        specifier: ^0.30.2
+        version: 0.30.2
+      '@types/react':
+        specifier: ^18.2.0
+        version: 18.3.19
+      '@types/react-dom':
+        specifier: ^18.2.0
+        version: 18.3.5(@types/[email protected])
+      '@typescript-eslint/eslint-plugin':
+        specifier: ^8.27.0
+        version: 8.27.0(@typescript-eslint/[email protected]([email protected]([email protected]))([email protected]))([email protected]([email protected]))([email protected])
+      '@typescript-eslint/parser':
+        specifier: ^8.27.0
+        version: 8.27.0([email protected]([email protected]))([email protected])
+      '@vitejs/plugin-react':
+        specifier: ^4.3.4
+        version: 4.3.4([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected]))
+      autoprefixer:
+        specifier: 10.4.17
+        version: 10.4.17([email protected])
+      boxen:
+        specifier: ^8.0.1
+        version: 8.0.1
+      consola:
+        specifier: ^3.4.2
+        version: 3.4.2
+      cross-env:
+        specifier: ^7.0.3
+        version: 7.0.3
+      eslint:
+        specifier: ^9.22.0
+        version: 9.22.0([email protected])
+      eslint-import-resolver-typescript:
+        specifier: ^4.2.2
+        version: 4.2.2([email protected])([email protected]([email protected]))
+      eslint-plugin-import:
+        specifier: ^2.31.0
+        version: 2.31.0(@typescript-eslint/[email protected]([email protected]([email protected]))([email protected]))([email protected])([email protected]([email protected]))
+      eslint-plugin-jsx-a11y:
+        specifier: ^6.10.2
+        version: 6.10.2([email protected]([email protected]))
+      eslint-plugin-react:
+        specifier: ^7.37.4
+        version: 7.37.4([email protected]([email protected]))
+      eslint-plugin-react-hooks:
+        specifier: ^5.2.0
+        version: 5.2.0([email protected]([email protected]))
+      eslint-plugin-react-refresh:
+        specifier: ^0.4.19
+        version: 0.4.19([email protected]([email protected]))
+      globals:
+        specifier: ^15.15.0
+        version: 15.15.0
+      gradient-string:
+        specifier: ^3.0.0
+        version: 3.0.0
+      postcss:
+        specifier: 8.4.35
+        version: 8.4.35
+      postcss-nesting:
+        specifier: ^13.0.1
+        version: 13.0.1([email protected])
+      postcss-scss:
+        specifier: ^4.0.9
+        version: 4.0.9([email protected])
+      prettier:
+        specifier: ^3.5.3
+        version: 3.5.3
+      stylelint:
+        specifier: ^15.11.0
+        version: 15.11.0([email protected])
+      stylelint-config-recommended-less:
+        specifier: 2.0.0
+        version: 2.0.0([email protected])([email protected]([email protected]))
+      stylelint-config-standard:
+        specifier: ^30.0.0
+        version: 30.0.1([email protected]([email protected]))
+      stylelint-config-standard-scss:
+        specifier: ^7.0.1
+        version: 7.0.1([email protected])([email protected]([email protected]))
+      stylelint-order:
+        specifier: ^6.0.4
+        version: 6.0.4([email protected]([email protected]))
+      stylelint-prettier:
+        specifier: ^2.0.0
+        version: 2.0.0([email protected])([email protected]([email protected]))
+      svgo:
+        specifier: ^3.3.2
+        version: 3.3.2
+      tailwindcss:
+        specifier: 3.4.1
+        version: 3.4.1
+      typescript:
+        specifier: ^5.7.3
+        version: 5.7.3
+      typescript-eslint:
+        specifier: ^8.24.1
+        version: 8.27.0([email protected]([email protected]))([email protected])
+      vite:
+        specifier: ^6.2.2
+        version: 6.2.2(@types/[email protected])([email protected])([email protected])([email protected])([email protected])
+      vite-plugin-compression:
+        specifier: ^0.5.1
+        version: 0.5.1([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected]))
+      vite-plugin-remove-console:
+        specifier: ^2.2.0
+        version: 2.2.0
+      vite-plugin-style-import:
+        specifier: ^2.0.0
+        version: 2.0.0([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected]))
+
+packages:
+
+  '@alloc/[email protected]':
+    resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
+    engines: {node: '>=10'}
+
+  '@ampproject/[email protected]':
+    resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
+    engines: {node: '>=6.0.0'}
+
+  '@ant-design/[email protected]':
+    resolution: {integrity: sha512-bjTObSnZ9C/O8MB/B4OUtd/q9COomuJAR2SYfhxLyHvCKn4EKwCN3e+fWGMo7H5InAyV0wL17jdE9ALrdOW/6A==}
+
+  '@ant-design/[email protected]':
+    resolution: {integrity: sha512-nOoQMLW1l+xR1Co8NFVYiP8pZp3VjIIzqV6D6ShYF2ljtdwWJn5WSsH+7kvCktXL/yhEtWURKOfH5Xz/gzlwsg==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  '@ant-design/[email protected]':
+    resolution: {integrity: sha512-7GAg9bD/iC9ikWatU9ym+P9ugJhi/WbsTWzcKN6T4gU0aehsprtke1UAaaSxxkjjmkJb3llet/rbUSLPgwlY4w==}
+    peerDependencies:
+      react: '>=16.0.0'
+      react-dom: '>=16.0.0'
+
+  '@ant-design/[email protected]':
+    resolution: {integrity: sha512-y2217gk4NqL35giHl72o6Zzqji9O7vHh9YmhUVkPtAOpoTCH4uWxo/pr4VE8t0+ChEPs0qo4eJRC5Q1eXWo3vA==}
+    engines: {node: '>=8.x'}
+
+  '@ant-design/[email protected]':
+    resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==}
+
+  '@ant-design/[email protected]':
+    resolution: {integrity: sha512-0/xS39c91WjPAZOWsvi1//zjx6kAp4kxWwctR6kuU6p133w8RU0D2dSCvZC19uQyharg/sAvYxGYWl01BbZZfg==}
+    engines: {node: '>=8'}
+    peerDependencies:
+      react: '>=16.0.0'
+      react-dom: '>=16.0.0'
+
+  '@ant-design/[email protected]':
+    resolution: {integrity: sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==}
+    peerDependencies:
+      react: '>=16.9.0'
+
+  '@antfu/[email protected]':
+    resolution: {integrity: sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw==}
+
+  '@antfu/[email protected]':
+    resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==}
+
+  '@babel/[email protected]':
+    resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/[email protected]':
+    resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/[email protected]':
+    resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/[email protected]':
+    resolution: {integrity: sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/[email protected]':
+    resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/[email protected]':
+    resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/[email protected]':
+    resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+
+  '@babel/[email protected]':
+    resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/[email protected]':
+    resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/[email protected]':
+    resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/[email protected]':
+    resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/[email protected]':
+    resolution: {integrity: sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/[email protected]':
+    resolution: {integrity: sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==}
+    engines: {node: '>=6.0.0'}
+    hasBin: true
+
+  '@babel/[email protected]':
+    resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/[email protected]':
+    resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+
+  '@babel/[email protected]':
+    resolution: {integrity: sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/[email protected]':
+    resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/[email protected]':
+    resolution: {integrity: sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==}
+    engines: {node: '>=6.9.0'}
+
+  '@babel/[email protected]':
+    resolution: {integrity: sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==}
+    engines: {node: '>=6.9.0'}
+
+  '@commitlint/[email protected]':
+    resolution: {integrity: sha512-t/fCrLVu+Ru01h0DtlgHZXbHV2Y8gKocTR5elDOqIRUzQd0/6hpt2VIWOj9b3NDo7y4/gfxeR2zRtXq/qO6iUg==}
+    engines: {node: '>=v18'}
+    hasBin: true
+
+  '@commitlint/[email protected]':
+    resolution: {integrity: sha512-9I2kKJwcAPwMoAj38hwqFXG0CzS2Kj+SAByPUQ0SlHTfb7VUhYVmo7G2w2tBrqmOf7PFd6MpZ/a1GQJo8na8kw==}
+    engines: {node: '>=v18'}
+
+  '@commitlint/[email protected]':
+    resolution: {integrity: sha512-+r5ZvD/0hQC3w5VOHJhGcCooiAVdynFlCe2d6I9dU+PvXdV3O+fU4vipVg+6hyLbQUuCH82mz3HnT/cBQTYYuA==}
+    engines: {node: '>=v18'}
+
+  '@commitlint/[email protected]':
+    resolution: {integrity: sha512-kNiNU4/bhEQ/wutI1tp1pVW1mQ0QbAjfPRo5v8SaxoVV+ARhkB8Wjg3BSseNYECPzWWfg/WDqQGIfV1RaBFQZg==}
+    engines: {node: '>=v18'}
+
+  '@commitlint/[email protected]':
+    resolution: {integrity: sha512-fuLeI+EZ9x2v/+TXKAjplBJWI9CNrHnyi5nvUQGQt4WRkww/d95oVRsc9ajpt4xFrFmqMZkd/xBQHZDvALIY7A==}
+    engines: {node: '>=v18'}
+
+  '@commitlint/[email protected]':
+    resolution: {integrity: sha512-EOpA8IERpQstxwp/WGnDArA7S+wlZDeTeKi98WMOvaDLKbjptuHWdOYYr790iO7kTCif/z971PKPI2PkWMfOxg==}
+    engines: {node: '>=v18'}
+
+  '@commitlint/[email protected]':
+    resolution: {integrity: sha512-L2Jv9yUg/I+jF3zikOV0rdiHUul9X3a/oU5HIXhAJLE2+TXTnEBfqYP9G5yMw/Yb40SnR764g4fyDK6WR2xtpw==}
+    engines: {node: '>=v18'}
+
+  '@commitlint/[email protected]':
+    resolution: {integrity: sha512-+/NZKyWKSf39FeNpqhfMebmaLa1P90i1Nrb1SrA7oSU5GNN/lksA4z6+ZTnsft01YfhRZSYMbgGsARXvkr/VLQ==}
+    engines: {node: '>=v18'}
+
+  '@commitlint/[email protected]':
+    resolution: {integrity: sha512-4rvmm3ff81Sfb+mcWT5WKlyOa+Hd33WSbirTVUer0wjS1Hv/Hzr07Uv1ULIV9DkimZKNyOwXn593c+h8lsDQPQ==}
+    engines: {node: '>=v18'}
+
+  '@commitlint/[email protected]':
+    resolution: {integrity: sha512-qs/5Vi9bYjf+ZV40bvdCyBn5DvbuelhR6qewLE8Bh476F7KnNyLfdM/ETJ4cp96WgeeHo6tesA2TMXS0sh5X4A==}
+    engines: {node: '>=v18'}
+
+  '@commitlint/[email protected]':
+    resolution: {integrity: sha512-YNIKAc4EXvNeAvyeEnzgvm1VyAe0/b3Wax7pjJSwXuhqIQ1/t2hD3OYRXb6D5/GffIvaX82RbjD+nWtMZCLL7Q==}
+    engines: {node: '>=v18'}
+
+  '@commitlint/[email protected]':
+    resolution: {integrity: sha512-6ywxOGYajcxK1y1MfzrOnwsXO6nnErna88gRWEl3qqOOP8MDu/DTeRkGLXBFIZuRZ7mm5yyxU5BmeUvMpNte5w==}
+    engines: {node: '>=v18'}
+
+  '@commitlint/[email protected]':
+    resolution: {integrity: sha512-CLanRQwuG2LPfFVvrkTrBR/L/DMy3+ETsgBqW1OvRxmzp/bbVJW0Xw23LnnExgYcsaFtos967lul1CsbsnJlzQ==}
+    engines: {node: '>=v18'}
+
+  '@commitlint/[email protected]':
+    resolution: {integrity: sha512-IZ5IE90h6DSWNuNK/cwjABLAKdy8tP8OgGVGbXe1noBEX5hSsu00uRlLu6JuruiXjWJz2dZc+YSw3H0UZyl/mA==}
+    engines: {node: '>=v18'}
+
+  '@commitlint/[email protected]':
+    resolution: {integrity: sha512-3CKLUw41Cur8VMjh16y8LcsOaKbmQjAKCWlXx6B0vOUREplp6em9uIVhI8Cv934qiwkbi2+uv+mVZPnXJi1o9A==}
+    engines: {node: '>=v18'}
+
+  '@commitlint/[email protected]':
+    resolution: {integrity: sha512-Rphgoc/omYZisoNkcfaBRPQr4myZEHhLPx2/vTXNLjiCw4RgfPR1wEgUpJ9OOmDCiv5ZyIExhprNLhteqH4FuQ==}
+    engines: {node: '>=v18'}
+
+  '@commitlint/[email protected]':
+    resolution: {integrity: sha512-LRjP623jPyf3Poyfb0ohMj8I3ORyBDOwXAgxxVPbSD0unJuW2mJWeiRfaQinjtccMqC5Wy1HOMfa4btKjbNxbg==}
+    engines: {node: '>=v18'}
+
+  '@csstools/[email protected]':
+    resolution: {integrity: sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw==}
+    engines: {node: ^14 || ^16 || >=18}
+    peerDependencies:
+      '@csstools/css-tokenizer': ^2.4.1
+
+  '@csstools/[email protected]':
+    resolution: {integrity: sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==}
+    engines: {node: ^14 || ^16 || >=18}
+
+  '@csstools/[email protected]':
+    resolution: {integrity: sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA==}
+    engines: {node: ^14 || ^16 || >=18}
+    peerDependencies:
+      '@csstools/css-parser-algorithms': ^2.7.1
+      '@csstools/css-tokenizer': ^2.4.1
+
+  '@csstools/[email protected]':
+    resolution: {integrity: sha512-ZoK24Yku6VJU1gS79a5PFmC8yn3wIapiKmPgun0hZgEI5AOqgH2kiPRsPz1qkGv4HL+wuDLH83yQyk6inMYrJQ==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      postcss-selector-parser: ^7.0.0
+
+  '@csstools/[email protected]':
+    resolution: {integrity: sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==}
+    engines: {node: ^14 || ^16 || >=18}
+    peerDependencies:
+      postcss-selector-parser: ^6.0.13
+
+  '@csstools/[email protected]':
+    resolution: {integrity: sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      postcss-selector-parser: ^7.0.0
+
+  '@emnapi/[email protected]':
+    resolution: {integrity: sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==}
+
+  '@emnapi/[email protected]':
+    resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==}
+
+  '@emnapi/[email protected]':
+    resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==}
+
+  '@emotion/[email protected]':
+    resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==}
+
+  '@emotion/[email protected]':
+    resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==}
+
+  '@esbuild/[email protected]':
+    resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==}
+    engines: {node: '>=18'}
+    cpu: [ppc64]
+    os: [aix]
+
+  '@esbuild/[email protected]':
+    resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [android]
+
+  '@esbuild/[email protected]':
+    resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==}
+    engines: {node: '>=18'}
+    cpu: [arm]
+    os: [android]
+
+  '@esbuild/[email protected]':
+    resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [android]
+
+  '@esbuild/[email protected]':
+    resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@esbuild/[email protected]':
+    resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [darwin]
+
+  '@esbuild/[email protected]':
+    resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [freebsd]
+
+  '@esbuild/[email protected]':
+    resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@esbuild/[email protected]':
+    resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [linux]
+
+  '@esbuild/[email protected]':
+    resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==}
+    engines: {node: '>=18'}
+    cpu: [arm]
+    os: [linux]
+
+  '@esbuild/[email protected]':
+    resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==}
+    engines: {node: '>=18'}
+    cpu: [ia32]
+    os: [linux]
+
+  '@esbuild/[email protected]':
+    resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==}
+    engines: {node: '>=18'}
+    cpu: [loong64]
+    os: [linux]
+
+  '@esbuild/[email protected]':
+    resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==}
+    engines: {node: '>=18'}
+    cpu: [mips64el]
+    os: [linux]
+
+  '@esbuild/[email protected]':
+    resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==}
+    engines: {node: '>=18'}
+    cpu: [ppc64]
+    os: [linux]
+
+  '@esbuild/[email protected]':
+    resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==}
+    engines: {node: '>=18'}
+    cpu: [riscv64]
+    os: [linux]
+
+  '@esbuild/[email protected]':
+    resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==}
+    engines: {node: '>=18'}
+    cpu: [s390x]
+    os: [linux]
+
+  '@esbuild/[email protected]':
+    resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [linux]
+
+  '@esbuild/[email protected]':
+    resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [netbsd]
+
+  '@esbuild/[email protected]':
+    resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [netbsd]
+
+  '@esbuild/[email protected]':
+    resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [openbsd]
+
+  '@esbuild/[email protected]':
+    resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [openbsd]
+
+  '@esbuild/[email protected]':
+    resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [sunos]
+
+  '@esbuild/[email protected]':
+    resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==}
+    engines: {node: '>=18'}
+    cpu: [arm64]
+    os: [win32]
+
+  '@esbuild/[email protected]':
+    resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==}
+    engines: {node: '>=18'}
+    cpu: [ia32]
+    os: [win32]
+
+  '@esbuild/[email protected]':
+    resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==}
+    engines: {node: '>=18'}
+    cpu: [x64]
+    os: [win32]
+
+  '@eslint-community/[email protected]':
+    resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+
+  '@eslint-community/[email protected]':
+    resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
+    engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+  '@eslint/[email protected]':
+    resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@eslint/[email protected]':
+    resolution: {integrity: sha512-kLrdPDJE1ckPo94kmPPf9Hfd0DU0Jw6oKYrhe+pwSC0iTUInmTa+w6fw8sGgcfkFJGNdWOUeOaDM4quW4a7OkA==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@eslint/[email protected]':
+    resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@eslint/[email protected]':
+    resolution: {integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@eslint/[email protected]':
+    resolution: {integrity: sha512-vLFajx9o8d1/oL2ZkpMYbkLv8nDB6yaIwFNt7nI4+I80U/z03SxmfOMsLbvWr3p7C+Wnoh//aOu2pQW8cS0HCQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@eslint/[email protected]':
+    resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@eslint/[email protected]':
+    resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-Hw9mzsSMZaQu6wrTbi3kYYwGw9nBqOHr47pVLxfr5v8CalsdrG5gfs9XUlPOZjHRVISp3oQrh1j7d3E+ulHPjQ==}
+    peerDependencies:
+      '@firebase/app-compat': 0.x
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-VrIp/d8iq2g501qO46uGz3hjbDb8xzYMrbu8Tp0ovzIzrvJZ2fvmj649gTjge/b7cCCcjT0H37g1gVtlNhnkbg==}
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-iDCGnw6qdFqwI5ywkgece99WADJNoymu+nLIQI4fZM/vCZ3bEo4wlpEetW71s1HqGpI0hQStiPhqVjFxDb2yyw==}
+    peerDependencies:
+      '@firebase/app': 0.x
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-/twgmlnNAaZ/wbz3kcQrL/26b+X+zUX+lBmu5LwwEcWcpnb+mrVEAKhD7/ttm52dxYiSWtLDeuXy3FXBhqBC5A==}
+    engines: {node: '>=18.0.0'}
+    peerDependencies:
+      '@firebase/app-compat': 0.x
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-gAlxfPLT2j8bTI/qfe3ahl2I2YcBQ8cFIBdhAQA4I2f3TndcO+22YizyGYuttLHPQEpWkhmpFW60VCFEPg4g5A==}
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-hyl5rKSj0QmwPdsAxrI5x1otDlByQ7bvNvVt8G/XPO2CSwE++rmSVf3VEhaeOR4J8ZFaF0Z0NDSmLejPweZ3ng==}
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-ONsgml8/dplUOAP42JQO6hhiWDEwR9+RUTLenxAN9S8N6gel/sDQ9Ci721Py1oASMGdDU8v9R7xAZxzvOX5lPg==}
+    engines: {node: '>=18.0.0'}
+    peerDependencies:
+      '@firebase/app': 0.x
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-0p/l1KiwhwwYTcPWoleFQHftOnYzeXvyVf3WNZyKFBAoQMpCVW6bVm/uO1bXF91AwU1JN0og888Y6Sc8avqZ+A==}
+    engines: {node: '>=18.0.0'}
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==}
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-QlTZl/RcqPSonYxB87n8KgAUW2L6ZZz0W4D91PVmQ1tJPsKsKPrWAFHL0ii2cQW6FxTxfNjbZ7kucuIcKXk3tw==}
+    engines: {node: '>=18.0.0'}
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-v898POphOIBJliKF76SiGOXh4EdhO5fM6S9a2ZKf/8wHdBea/qwxwZoVVya4DW6Mi7vWyp1lIzHbFgwRz8G9TA==}
+    engines: {node: '>=18.0.0'}
+    peerDependencies:
+      '@firebase/app-compat': 0.x
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-JPgcXKCuO+CWqGDnigBtvo09HeBs5u/Ktc2GaFj2m01hLarbxthLNm7Fk8iOP1aqAtXV+fnnGj7U28xmk7IwVA==}
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-S/PuIjni0AQRLF+l9ck0YpsMOdE8GO2KU6ubmBB7P+7TJUCQDa3R1dlgYm9UzGbbePMZsp0xzB93f2b/CgxMOg==}
+    peerDependencies:
+      '@firebase/app-types': 0.x
+      '@firebase/util': 1.x
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-9KKo5SNVkyJzftsW+daS+PGDbeJ+MFJWXQFHDqqPPH3acWHtiNnGHH5HGpIJErEELrsm9xMPie5zfZ0XpGU8+w==}
+    engines: {node: '>=18.0.0'}
+    peerDependencies:
+      '@firebase/app': 0.x
+      '@react-native-async-storage/async-storage': ^1.18.1
+    peerDependenciesMeta:
+      '@react-native-async-storage/async-storage':
+        optional: true
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-I/Eg1NpAtZ8AAfq8mpdfXnuUpcLxIDdCDtTzWSh+FXnp/9eCKJ3SNbOCKrUCyhLzNa2SiPJYruei0sxVjaOTeg==}
+    engines: {node: '>=18.0.0'}
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-PYG55JRTmvYrUuXXmYBsZexwKVP9aR3mIRRHxB9V2bQeRDZky6JtRZnH3GLhf4ZsxZy5Ewd8ul/jTOYR4gpD9w==}
+    peerDependencies:
+      '@firebase/app': 0.x
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-CNf1UbvWh6qIaSf4sn6sx2DTDz/em/D7QxULH1LTxxDQHr9+CeYGvlAqrKnk4ZH0P0eIHyQFQU7RwkUJI0B9gQ==}
+    engines: {node: '>=18.0.0'}
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-mH6RC1E9/Pv8jf1/p+M8YFTX+iu+iHDN89hecvyO7wHrI4R1V0TXjxOHvX3nLJN1sfh0CWG6CHZ0VlrSmK/cwg==}
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-9nxYtkHAG02/Nh2Ssms1T4BbWPPjiwohCvkHDUl4hNxnki1kPgsLo5xe9kXNzbacOStmVys+RUXvwzynQSKmUQ==}
+    engines: {node: '>=18.0.0'}
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-uRvi7AYPmsDl7UZwPyV7jgDGYusEZ2+U2g7MndbQHKIA8fNHpYC6QrzMs58+/IjX+kF/lkUn67Vrr0AkVjlY+Q==}
+    engines: {node: '>=18.0.0'}
+    peerDependencies:
+      '@firebase/app-compat': 0.x
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-hD2jGdiWRxB/eZWF89xcK9gF8wvENDJkzpVFb4aGkzfEaKxVRD1kjz1t1Wj8VZEp2LCB53Yx1zD8mrhQu87R6Q==}
+    peerDependencies:
+      '@firebase/app-types': 0.x
+      '@firebase/util': 1.x
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-6nKsyo2U+jYSCcSE5sjMdDNA23DMUvYPUvsYGg09CNvcTO8GGKsPs7SpOhspsB91mbacq+u627CDAx3FUhPSSQ==}
+    engines: {node: '>=18.0.0'}
+    peerDependencies:
+      '@firebase/app': 0.x
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-iIudmYDAML6n3c7uXO2YTlzra2/J6lnMzmJTXNthvrKVMgNMaseNoQP1wKfchK84hMuSF8EkM4AvufwbJ+Juew==}
+    engines: {node: '>=18.0.0'}
+    peerDependencies:
+      '@firebase/app-compat': 0.x
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-EZoDKQLUHFKNx6VLipQwrSMh01A1SaL3Wg6Hpi//x6/fJ6Ee4hrAeswK99I5Ht8roiniKHw4iO0B1Oxj5I4plg==}
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-Wv7JZMUkKLb1goOWRtsu3t7m97uK6XQvjQLPvn8rncY91+VgdU72crqnaYCDI/ophNuBEmuK8mn0/pAnjUeA6A==}
+    engines: {node: '>=18.0.0'}
+    peerDependencies:
+      '@firebase/app': 0.x
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-f/o6MqCI7LD/ulY9gvgkv6w5k6diaReD8BFHd/y/fEdpsXmFWYS/g28GXCB72bRVBOgPpkOUNl+VsMvDwlRKmw==}
+    peerDependencies:
+      '@firebase/app-compat': 0.x
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-2FJI7gkLqIE0iYsNQ1P751lO3hER+Umykel+TkLwHj6plzWVxqvfclPUZhcKFVQObqloEBTmpi2Ozn7EkCABAA==}
+    peerDependencies:
+      '@firebase/app-types': 0.x
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-6ZpkUiaygPFwgVneYxuuOuHnSPnTA4KefLEaw/sKk/rNYgC7X6twaGfYb0sYLpbi9xV4i5jXsqZ3WO+yaguNgg==}
+    peerDependencies:
+      '@firebase/app': 0.x
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-mH0PEh1zoXGnaR8gD1DeGeNZtWFKbnz9hDO91dIml3iou1gpOnLqXQ2dJfB71dj6dpmUjcQ6phY3ZZJbjErr9g==}
+    engines: {node: '>=18.0.0'}
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-5Q+9IG7FuedusdWHVQRjpA3OVD9KUWp/IPegcv0s5qSqRLBjib7FlAeWxN+VL0Ew43tuPJBY2HKhEecuizmO1Q==}
+    peerDependencies:
+      '@firebase/app-compat': 0.x
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-xfzFaJpzcmtDjycpDeCUj0Ge10ATFi/VHVIvEEjDNc3hodVBQADZ7BWQU7CuFpjSHE+eLuBI13z5F/9xOoGX8Q==}
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-W3CnGhTm6Nx8XGb6E5/+jZTuxX/EK8Vur4QXvO1DwZta/t0xqWMRgO9vNsZFMYBqFV4o3j4F9qK/iddGYwWS6g==}
+    peerDependencies:
+      '@firebase/app': 0.x
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-wUxsw7hGBEMN6XfvYQqwPIQp5LcJXawWM5tmYp6L7ClCoTQuEiCKHWWVurJgN8Q1YHzoHVgjNfPQAOVu29iMVg==}
+    peerDependencies:
+      '@firebase/app-compat': 0.x
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-IgkyTz6QZVPAq8GSkLYJvwSLr3LS9+V6vNPQr0x4YozZJiLF5jYixj0amDtATf1X0EtYHqoPO48a9ija8GocxQ==}
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-DXLLp0R0jdxH/yTmv+WTkOzsLl8YYecXh4lGZE0dzqC0IV8k+AxpLSSWvOTCkAETze8yEU/iF+PtgYVlGjfMMQ==}
+    peerDependencies:
+      '@firebase/app': 0.x
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-UmHoO7TxAEJPIZf8e1Hy6CeFGMeyjqSCpgoBkQZYXFI2JHhzxIyDpr8jVKJJN1dmAePKZ5EX7dC13CmcdTOl7Q==}
+    peerDependencies:
+      '@firebase/app-compat': 0.x
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-7p3mRE/ldCNYt8fmWMQ/MSGRmXYlJ15Rvs9Rk17t8p0WwZDbeK7eRmoI1tvCPaDzn9Oqh+yD6Lw+sGLsLg4kKg==}
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-Yrk4l5+6FJLPHC6irNHMzgTtJ3NfHXlAXVChCBdNFtgmzyGmufNs/sr8oA0auEfIJ5VpXCaThRh3P4OdQxiAlQ==}
+    peerDependencies:
+      '@firebase/app': 0.x
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-CBlODWEZ5b6MJWVh21VZioxwxNwVfPA9CAdsk+ZgVocJQQbE2oDW1XJoRcgthRY1HOitgbn4cVrM+NlQtuUYhw==}
+    engines: {node: '>=18.0.0'}
+    peerDependencies:
+      '@firebase/app-compat': 0.x
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-+Muk7g9uwngTpd8xn9OdF/D48uiQ7I1Fae7ULsWPuKoCH3HU7bfFPhxtJYzyhjdniowhuDpQcfPmuNRAqZEfvg==}
+    peerDependencies:
+      '@firebase/app-types': 0.x
+      '@firebase/util': 1.x
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-FkRyc24rK+Y6EaQ1tYFm3TevBnnfSNA0VyTfew2hrYyL/aYfatBg7HOgktUdB4kWMHNA9VoTotzZTGoLuK92wg==}
+    engines: {node: '>=18.0.0'}
+    peerDependencies:
+      '@firebase/app': 0.x
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-PzSrhIr++KI6y4P6C/IdgBNMkEx0Ex6554/cYd0Hm+ovyFSJtJXqb/3OSIdnBoa2cpwZT1/GW56EmRc5qEc5fQ==}
+    engines: {node: '>=18.0.0'}
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-WUYIzFpOipjFXT2i0hT26wivJoIximizQptVs3KAxFAqbVlO8sjKPsMkgz0bh+tdKlqP4SUDda71fMUZXUKHgA==}
+    engines: {node: '>=18.0.0'}
+    peerDependencies:
+      '@firebase/app': 0.x
+      '@firebase/app-types': 0.x
+
+  '@firebase/[email protected]':
+    resolution: {integrity: sha512-2xCRM9q9FlzGZCdgDMJwc0gyUkWFtkosy7Xxr6sFgQwn+wMNIWd7xIvYNauU1r64B5L5rsGKy/n9TKJ0aAFeqQ==}
+
+  '@grpc/[email protected]':
+    resolution: {integrity: sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ==}
+    engines: {node: ^8.13.0 || >=10.10.0}
+
+  '@grpc/[email protected]':
+    resolution: {integrity: sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==}
+    engines: {node: '>=6'}
+    hasBin: true
+
+  '@humanfs/[email protected]':
+    resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
+    engines: {node: '>=18.18.0'}
+
+  '@humanfs/[email protected]':
+    resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==}
+    engines: {node: '>=18.18.0'}
+
+  '@humanwhocodes/[email protected]':
+    resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+    engines: {node: '>=12.22'}
+
+  '@humanwhocodes/[email protected]':
+    resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==}
+    engines: {node: '>=18.18'}
+
+  '@humanwhocodes/[email protected]':
+    resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==}
+    engines: {node: '>=18.18'}
+
+  '@iconify-icons/[email protected]':
+    resolution: {integrity: sha512-XXBRRsqgQqACKFVs8Caludf9w4EimplsCJ0rXmKDhqalzD9IvCqMae5TZDHPE1FkeqbxRGq6awxLSxnwdAIC+Q==}
+
+  '@iconify-icons/[email protected]':
+    resolution: {integrity: sha512-QCsqNX5VRK8ZqAnwDhUHdJFdRIDCHM3bF+72DUCIi1bQ6L8n5amOP4ZND2q1TadtAjP7g6DEnS2a6780iPjx9Q==}
+
+  '@iconify-icons/[email protected]':
+    resolution: {integrity: sha512-8EJULn048sQq3fvytpQ5j40omnVOdBKpo+sXdYM35NRrqCe1BihxBesMcCOLWaocqkWia6uTQ3cnRHff4ZA11w==}
+
+  '@iconify-icons/[email protected]':
+    resolution: {integrity: sha512-c0/7T/d7QjzW1U7IhoUwAhT16HzaldFz9sBK/a+LJpZgO1s71jjabUu6RbA3DiWwc+z8mWuHy7KvzQebTNaKSg==}
+
+  '@iconify-icons/[email protected]':
+    resolution: {integrity: sha512-51bfNoRLhYDfxSu0Nyi/uRVq6q/tP4TyEc0vvuNwImrXpxrRJUAWJF2A36CfBkXm3hO9IBlph/CD/XNDJKgG6w==}
+
+  '@iconify-icons/[email protected]':
+    resolution: {integrity: sha512-wNaXsQYK55WDUWCbcjvnwnODV4Jtsp+VC0duPanibEVu876TUYf6kdgTGtH7/GErBCNdJuJJbncG7vbOaeQi7w==}
+
+  '@iconify/[email protected]':
+    resolution: {integrity: sha512-7Sdjrqq3fkkQNks9SY3adGC37NQTHsBJL2PRKlQd455PoDi9s+Es9AUTY+vGLFOYs5yO9w9yCE42pmxCwG26WA==}
+    peerDependencies:
+      react: '>=16'
+
+  '@iconify/[email protected]':
+    resolution: {integrity: sha512-q6NzLQYEN9zkDfcyBqD3vItHcZw97w/s++3H3TBxUORr57EfHxj6tOW6fyufDjMq+Vl56WXWaPx1csBPYlI5CA==}
+
+  '@iconify/[email protected]':
+    resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
+
+  '@iconify/[email protected]':
+    resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==}
+
+  '@isaacs/[email protected]':
+    resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
+    engines: {node: '>=12'}
+
+  '@jridgewell/[email protected]':
+    resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
+    engines: {node: '>=6.0.0'}
+
+  '@jridgewell/[email protected]':
+    resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+    engines: {node: '>=6.0.0'}
+
+  '@jridgewell/[email protected]':
+    resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
+    engines: {node: '>=6.0.0'}
+
+  '@jridgewell/[email protected]':
+    resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
+
+  '@jridgewell/[email protected]':
+    resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
+
+  '@napi-rs/[email protected]':
+    resolution: {integrity: sha512-5yximcFK5FNompXfJFoWanu5l8v1hNGqNHh9du1xETp9HWk/B/PzvchX55WYOPaIeNglG8++68AAiauBAtbnzw==}
+
+  '@nodelib/[email protected]':
+    resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+    engines: {node: '>= 8'}
+
+  '@nodelib/[email protected]':
+    resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+    engines: {node: '>= 8'}
+
+  '@nodelib/[email protected]':
+    resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+    engines: {node: '>= 8'}
+
+  '@parcel/[email protected]':
+    resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm64]
+    os: [android]
+
+  '@parcel/[email protected]':
+    resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@parcel/[email protected]':
+    resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [x64]
+    os: [darwin]
+
+  '@parcel/[email protected]':
+    resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@parcel/[email protected]':
+    resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm]
+    os: [linux]
+
+  '@parcel/[email protected]':
+    resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm]
+    os: [linux]
+
+  '@parcel/[email protected]':
+    resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm64]
+    os: [linux]
+
+  '@parcel/[email protected]':
+    resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm64]
+    os: [linux]
+
+  '@parcel/[email protected]':
+    resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [x64]
+    os: [linux]
+
+  '@parcel/[email protected]':
+    resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [x64]
+    os: [linux]
+
+  '@parcel/[email protected]':
+    resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [arm64]
+    os: [win32]
+
+  '@parcel/[email protected]':
+    resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [ia32]
+    os: [win32]
+
+  '@parcel/[email protected]':
+    resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==}
+    engines: {node: '>= 10.0.0'}
+    cpu: [x64]
+    os: [win32]
+
+  '@parcel/[email protected]':
+    resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==}
+    engines: {node: '>= 10.0.0'}
+
+  '@pkgjs/[email protected]':
+    resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
+    engines: {node: '>=14'}
+
+  '@protobufjs/[email protected]':
+    resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==}
+
+  '@protobufjs/[email protected]':
+    resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==}
+
+  '@protobufjs/[email protected]':
+    resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==}
+
+  '@protobufjs/[email protected]':
+    resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==}
+
+  '@protobufjs/[email protected]':
+    resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==}
+
+  '@protobufjs/[email protected]':
+    resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==}
+
+  '@protobufjs/[email protected]':
+    resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==}
+
+  '@protobufjs/[email protected]':
+    resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==}
+
+  '@protobufjs/[email protected]':
+    resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==}
+
+  '@protobufjs/[email protected]':
+    resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==}
+
+  '@rc-component/[email protected]':
+    resolution: {integrity: sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==}
+    engines: {node: '>=14.x'}
+
+  '@rc-component/[email protected]':
+    resolution: {integrity: sha512-WcZYwAThV/b2GISQ8F+7650r5ZZJ043E57aVBFkQ+kSY4C6wdofXgB0hBx+GPGpIU0Z81eETNoDUJMr7oy/P8Q==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  '@rc-component/[email protected]':
+    resolution: {integrity: sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  '@rc-component/[email protected]':
+    resolution: {integrity: sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==}
+    engines: {node: '>=8.x'}
+
+  '@rc-component/[email protected]':
+    resolution: {integrity: sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  '@rc-component/[email protected]':
+    resolution: {integrity: sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  '@rc-component/[email protected]':
+    resolution: {integrity: sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  '@rc-component/[email protected]':
+    resolution: {integrity: sha512-Tr2t7J1DKZUpfJuDZWHxyxWpfmj8EZrqSgyMZ+BCdvKZ6r1UDsfU46M/iWAAFBy961Ssfom2kv5f3UcjIL2CmQ==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  '@rc-component/[email protected]':
+    resolution: {integrity: sha512-/9zuTnWwhQ3S3WT1T8BubuFTT46kvnXgaERR9f4BTKyn61/wpf/BvbImzYBubzJibU707FxwbKszLlHjcLiv1Q==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  '@rollup/[email protected]':
+    resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==}
+    engines: {node: '>= 8.0.0'}
+
+  '@rollup/[email protected]':
+    resolution: {integrity: sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w==}
+    cpu: [arm]
+    os: [android]
+
+  '@rollup/[email protected]':
+    resolution: {integrity: sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg==}
+    cpu: [arm64]
+    os: [android]
+
+  '@rollup/[email protected]':
+    resolution: {integrity: sha512-JQ1Jk5G4bGrD4pWJQzWsD8I1n1mgPXq33+/vP4sk8j/z/C2siRuxZtaUA7yMTf71TCZTZl/4e1bfzwUmFb3+rw==}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@rollup/[email protected]':
+    resolution: {integrity: sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA==}
+    cpu: [x64]
+    os: [darwin]
+
+  '@rollup/[email protected]':
+    resolution: {integrity: sha512-KXVsijKeJXOl8QzXTsA+sHVDsFOmMCdBRgFmBb+mfEb/7geR7+C8ypAml4fquUt14ZyVXaw2o1FWhqAfOvA4sg==}
+    cpu: [arm64]
+    os: [freebsd]
+
+  '@rollup/[email protected]':
+    resolution: {integrity: sha512-dVeWq1ebbvByI+ndz4IJcD4a09RJgRYmLccwlQ8bPd4olz3Y213uf1iwvc7ZaxNn2ab7bjc08PrtBgMu6nb4pQ==}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@rollup/[email protected]':
+    resolution: {integrity: sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg==}
+    cpu: [arm]
+    os: [linux]
+
+  '@rollup/[email protected]':
+    resolution: {integrity: sha512-JFIQrDJYrxOnyDQGYkqnNBtjDwTgbasdbUiQvcU8JmGDfValfH1lNpng+4FWlhaVIR4KPkeddYjsVVbmJYvDcg==}
+    cpu: [arm]
+    os: [linux]
+
+  '@rollup/[email protected]':
+    resolution: {integrity: sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A==}
+    cpu: [arm64]
+    os: [linux]
+
+  '@rollup/[email protected]':
+    resolution: {integrity: sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw==}
+    cpu: [arm64]
+    os: [linux]
+
+  '@rollup/[email protected]':
+    resolution: {integrity: sha512-1ZPyEDWF8phd4FQtTzMh8FQwqzvIjLsl6/84gzUxnMNFBtExBtpL51H67mV9xipuxl1AEAerRBgBwFNpkw8+Lg==}
+    cpu: [loong64]
+    os: [linux]
+
+  '@rollup/[email protected]':
+    resolution: {integrity: sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg==}
+    cpu: [ppc64]
+    os: [linux]
+
+  '@rollup/[email protected]':
+    resolution: {integrity: sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA==}
+    cpu: [riscv64]
+    os: [linux]
+
+  '@rollup/[email protected]':
+    resolution: {integrity: sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag==}
+    cpu: [s390x]
+    os: [linux]
+
+  '@rollup/[email protected]':
+    resolution: {integrity: sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ==}
+    cpu: [x64]
+    os: [linux]
+
+  '@rollup/[email protected]':
+    resolution: {integrity: sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ==}
+    cpu: [x64]
+    os: [linux]
+
+  '@rollup/[email protected]':
+    resolution: {integrity: sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A==}
+    cpu: [arm64]
+    os: [win32]
+
+  '@rollup/[email protected]':
+    resolution: {integrity: sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ==}
+    cpu: [ia32]
+    os: [win32]
+
+  '@rollup/[email protected]':
+    resolution: {integrity: sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw==}
+    cpu: [x64]
+    os: [win32]
+
+  '@rtsao/[email protected]':
+    resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
+
+  '@trysound/[email protected]':
+    resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
+    engines: {node: '>=10.13.0'}
+
+  '@tybys/[email protected]':
+    resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==}
+
+  '@types/[email protected]':
+    resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
+
+  '@types/[email protected]':
+    resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==}
+
+  '@types/[email protected]':
+    resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
+
+  '@types/[email protected]':
+    resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==}
+
+  '@types/[email protected]':
+    resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==}
+
+  '@types/[email protected]':
+    resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==}
+
+  '@types/[email protected]':
+    resolution: {integrity: sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==}
+
+  '@types/[email protected]':
+    resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
+
+  '@types/[email protected]':
+    resolution: {integrity: sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==}
+
+  '@types/[email protected]':
+    resolution: {integrity: sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==}
+
+  '@types/[email protected]':
+    resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+  '@types/[email protected]':
+    resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
+
+  '@types/[email protected]':
+    resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==}
+
+  '@types/[email protected]':
+    resolution: {integrity: sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==}
+
+  '@types/[email protected]':
+    resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==}
+
+  '@types/[email protected]':
+    resolution: {integrity: sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==}
+
+  '@types/[email protected]':
+    resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
+
+  '@types/[email protected]':
+    resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==}
+
+  '@types/[email protected]':
+    resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==}
+
+  '@types/[email protected]':
+    resolution: {integrity: sha512-PyzHvjCalm2BRYjAU6nIB3TprYwMNOUY/7P/N8bSzp9W/yM2YrtGtAnnVtaCNSeOZ8DzKyFDvaqQs7LnWwwmBA==}
+
+  '@types/[email protected]':
+    resolution: {integrity: sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==}
+    peerDependencies:
+      '@types/react': ^18.0.0
+
+  '@types/[email protected]':
+    resolution: {integrity: sha512-fcdJqaHOMDbiAwJnXv6XCzX0jDW77yI3tJqYh1Byn8EL5/S628WRx9b/y3DnNe55zTukUQKrfYxiZls2dHcUMw==}
+
+  '@types/[email protected]':
+    resolution: {integrity: sha512-IznnlmU5f4WcGTh2ltRu/Ijpmk8wiWXfF0VA4s+HPjHZgvFggk1YaIkbo5krX/zUCzWF8N/l4+W/LNxnvAJ8nw==}
+
+  '@types/[email protected]':
+    resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==}
+
+  '@types/[email protected]':
+    resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
+
+  '@typescript-eslint/[email protected]':
+    resolution: {integrity: sha512-4henw4zkePi5p252c8ncBLzLce52SEUz2Ebj8faDnuUXz2UuHEONYcJ+G0oaCF+bYCWVZtrGzq3FD7YXetmnSA==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
+      eslint: ^8.57.0 || ^9.0.0
+      typescript: '>=4.8.4 <5.9.0'
+
+  '@typescript-eslint/[email protected]':
+    resolution: {integrity: sha512-XGwIabPallYipmcOk45DpsBSgLC64A0yvdAkrwEzwZ2viqGqRUJ8eEYoPz0CWnutgAFbNMPdsGGvzjSmcWVlEA==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0
+      typescript: '>=4.8.4 <5.9.0'
+
+  '@typescript-eslint/[email protected]':
+    resolution: {integrity: sha512-8oI9GwPMQmBryaaxG1tOZdxXVeMDte6NyJA4i7/TWa4fBwgnAXYlIQP+uYOeqAaLJ2JRxlG9CAyL+C+YE9Xknw==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@typescript-eslint/[email protected]':
+    resolution: {integrity: sha512-wVArTVcz1oJOIEJxui/nRhV0TXzD/zMSOYi/ggCfNq78EIszddXcJb7r4RCp/oBrjt8n9A0BSxRMKxHftpDxDA==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0
+      typescript: '>=4.8.4 <5.9.0'
+
+  '@typescript-eslint/[email protected]':
+    resolution: {integrity: sha512-/6cp9yL72yUHAYq9g6DsAU+vVfvQmd1a8KyA81uvfDE21O2DwQ/qxlM4AR8TSdAu+kJLBDrEHKC5/W2/nxsY0A==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@typescript-eslint/[email protected]':
+    resolution: {integrity: sha512-BnKq8cqPVoMw71O38a1tEb6iebEgGA80icSxW7g+kndx0o6ot6696HjG7NdgfuAVmVEtwXUr3L8R9ZuVjoQL6A==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      typescript: '>=4.8.4 <5.9.0'
+
+  '@typescript-eslint/[email protected]':
+    resolution: {integrity: sha512-njkodcwH1yvmo31YWgRHNb/x1Xhhq4/m81PhtvmRngD8iHPehxffz1SNCO+kwaePhATC+kOa/ggmvPoPza5i0Q==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0
+      typescript: '>=4.8.4 <5.9.0'
+
+  '@typescript-eslint/[email protected]':
+    resolution: {integrity: sha512-WsXQwMkILJvffP6z4U3FYJPlbf/j07HIxmDjZpbNvBJkMfvwXj5ACRkkHwBDvLBbDbtX5TdU64/rcvKJ/vuInQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  '@unrs/[email protected]':
+    resolution: {integrity: sha512-i7z0B+C0P8Q63O/5PXJAzeFtA1ttY3OR2VSJgGv18S+PFNwD98xHgAgPOT1H5HIV6jlQP8Avzbp09qxJUdpPNw==}
+    cpu: [arm64]
+    os: [darwin]
+
+  '@unrs/[email protected]':
+    resolution: {integrity: sha512-YEdFzPjIbDUCfmehC6eS+AdJYtFWY35YYgWUnqqTM2oe/N58GhNy5yRllxYhxwJ9GcfHoNc6Ubze1yjkNv+9Qg==}
+    cpu: [x64]
+    os: [darwin]
+
+  '@unrs/[email protected]':
+    resolution: {integrity: sha512-TU4ntNXDgPN2giQyyzSnGWf/dVCem5lvwxg0XYvsvz35h5H19WrhTmHgbrULMuypCB3aHe1enYUC9rPLDw45mA==}
+    cpu: [x64]
+    os: [freebsd]
+
+  '@unrs/[email protected]':
+    resolution: {integrity: sha512-ik3w4/rU6RujBvNWiDnKdXi1smBhqxEDhccNi/j2rHaMjm0Fk49KkJ6XKsoUnD2kZ5xaMJf9JjailW/okfUPIw==}
+    cpu: [arm]
+    os: [linux]
+
+  '@unrs/[email protected]':
+    resolution: {integrity: sha512-fp4Azi8kHz6TX8SFmKfyScZrMLfp++uRm2srpqRjsRZIIBzH74NtSkdEUHImR4G7f7XJ+sVZjCc6KDDK04YEpQ==}
+    cpu: [arm64]
+    os: [linux]
+
+  '@unrs/[email protected]':
+    resolution: {integrity: sha512-gMiG3DCFioJxdGBzhlL86KcFgt9HGz0iDhw0YVYPsShItpN5pqIkNrI+L/Q/0gfDiGrfcE0X3VANSYIPmqEAlQ==}
+    cpu: [arm64]
+    os: [linux]
+
+  '@unrs/[email protected]':
+    resolution: {integrity: sha512-n/4n2CxaUF9tcaJxEaZm+lqvaw2gflfWQ1R9I7WQgYkKEKbRKbpG/R3hopYdUmLSRI4xaW1Cy0Bz40eS2Yi4Sw==}
+    cpu: [x64]
+    os: [linux]
+
+  '@unrs/[email protected]':
+    resolution: {integrity: sha512-cHyhAr6rlYYbon1L2Ag449YCj3p6XMfcYTP0AQX+KkQo025d1y/VFtPWvjMhuEsE2lLvtHm7GdJozj6BOMtzVg==}
+    cpu: [x64]
+    os: [linux]
+
+  '@unrs/[email protected]':
+    resolution: {integrity: sha512-eogDKuICghDLGc32FtP+WniG38IB1RcGOGz0G3z8406dUdjJvxfHGuGs/dSlM9YEp/v0lEqhJ4mBu6X2nL9pog==}
+    engines: {node: '>=14.0.0'}
+    cpu: [wasm32]
+
+  '@unrs/[email protected]':
+    resolution: {integrity: sha512-7sWRJumhpXSi2lccX8aQpfFXHsSVASdWndLv8AmD8nDRA/5PBi8IplQVZNx2mYRx6+Bp91Z00kuVqpXO9NfCTg==}
+    cpu: [arm64]
+    os: [win32]
+
+  '@unrs/[email protected]':
+    resolution: {integrity: sha512-hewo/UMGP1a7O6FG/ThcPzSJdm/WwrYDNkdGgWl6M18H6K6MSitklomWpT9MUtT5KGj++QJb06va/14QBC4pvw==}
+    cpu: [x64]
+    os: [win32]
+
+  '@vitejs/[email protected]':
+    resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==}
+    engines: {node: ^14.18.0 || >=16.0.0}
+    peerDependencies:
+      vite: ^4.2.0 || ^5.0.0 || ^6.0.0
+
+  [email protected]:
+    resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+    peerDependencies:
+      acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+  [email protected]:
+    resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==}
+    engines: {node: '>=0.4.0'}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+
+  [email protected]:
+    resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
+
+  [email protected]:
+    resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==}
+
+  [email protected]:
+    resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==}
+    engines: {node: '>=18'}
+
+  [email protected]:
+    resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==}
+    engines: {node: '>=12'}
+
+  [email protected]:
+    resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
+    engines: {node: '>=12'}
+
+  [email protected]:
+    resolution: {integrity: sha512-s89666DcoWeekJFaIqbtz2vRlIvgPR28GuDYYGUpW1mVP08bV7HZAPBH5lFJKYNGKrN3dHbZGgRK5aNRD2iPHg==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
+
+  [email protected]:
+    resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+    engines: {node: '>= 8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+  [email protected]:
+    resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==}
+
+  [email protected]:
+    resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==}
+    engines: {node: '>=0.10.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+
+  [email protected]:
+    resolution: {integrity: sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==}
+    engines: {node: ^10 || ^12 || >=14}
+    hasBin: true
+    peerDependencies:
+      postcss: ^8.1.0
+
+  [email protected]:
+    resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==}
+    engines: {node: '>=4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==}
+
+  [email protected]:
+    resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+
+  [email protected]:
+    resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==}
+    engines: {node: '>=18'}
+
+  [email protected]:
+    resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+
+  [email protected]:
+    resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+
+  [email protected]:
+    resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==}
+    engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+    engines: {node: '>=6'}
+
+  [email protected]:
+    resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
+    engines: {node: '>= 6'}
+
+  [email protected]:
+    resolution: {integrity: sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==}
+    engines: {node: '>=12'}
+
+  [email protected]:
+    resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
+    engines: {node: '>=10'}
+
+  [email protected]:
+    resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==}
+    engines: {node: '>=16'}
+
+  [email protected]:
+    resolution: {integrity: sha512-3ZczoTApMAZwPKYWmwVbQMFpXBDds3/0VciVoUwPUbldlYyVLmRVuRs/PcUZtHpbLRpzzDvrvnFuREsGt6lUug==}
+
+  [email protected]:
+    resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==}
+
+  [email protected]:
+    resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+    engines: {node: '>=10'}
+
+  [email protected]:
+    resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==}
+    engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+
+  [email protected]:
+    resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==}
+
+  [email protected]:
+    resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==}
+
+  [email protected]:
+    resolution: {integrity: sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==}
+    engines: {node: '>=18.17'}
+
+  [email protected]:
+    resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+    engines: {node: '>= 8.10.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
+    engines: {node: '>= 14.16.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==}
+    engines: {node: '>=10'}
+
+  [email protected]:
+    resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==}
+
+  [email protected]:
+    resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==}
+    engines: {node: '>=10'}
+
+  [email protected]:
+    resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==}
+    engines: {node: '>=18'}
+
+  [email protected]:
+    resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==}
+    engines: {node: '>=18'}
+
+  [email protected]:
+    resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
+    engines: {node: '>=12'}
+
+  [email protected]:
+    resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+    engines: {node: '>=7.0.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+  [email protected]:
+    resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
+
+  [email protected]:
+    resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+    engines: {node: '>= 0.8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==}
+    engines: {node: '>=18'}
+
+  [email protected]:
+    resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
+    engines: {node: '>= 6'}
+
+  [email protected]:
+    resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
+    engines: {node: '>= 10'}
+
+  [email protected]:
+    resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==}
+
+  [email protected]:
+    resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
+
+  [email protected]:
+    resolution: {integrity: sha512-hkT3yDPFbs95mNCy1+7qNKC6Pro+/ibzYxtM2iqEigpf0sVw+bg4Zh9/snjsBcf990vfIsg5+1U7VyiyBb3etg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==}
+    engines: {node: ^14.18.0 || >=16.10.0}
+
+  [email protected]:
+    resolution: {integrity: sha512-+JSDwGunA4MTEgAV/4VBKwUHonP8CzJ/6GIuwPi6acKFqFfHUdSGCm89ZxZ5FfGWdZfkdgAroy5bJ5FSeN/t4g==}
+
+  [email protected]:
+    resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==}
+    engines: {node: '>=16'}
+
+  [email protected]:
+    resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==}
+    engines: {node: '>=16'}
+
+  [email protected]:
+    resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==}
+    engines: {node: '>=16'}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==}
+    engines: {node: '>=18'}
+
+  [email protected]:
+    resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==}
+
+  [email protected]:
+    resolution: {integrity: sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==}
+    engines: {node: '>=v18'}
+    peerDependencies:
+      '@types/node': '*'
+      cosmiconfig: '>=9'
+      typescript: '>=5'
+
+  [email protected]:
+    resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      typescript: '>=4.9.5'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  [email protected]:
+    resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      typescript: '>=4.9.5'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+
+  [email protected]:
+    resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==}
+    engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+    engines: {node: '>= 8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==}
+
+  [email protected]:
+    resolution: {integrity: sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==}
+    engines: {node: '>=12 || >=16'}
+
+  [email protected]:
+    resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==}
+    engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==}
+    engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
+
+  [email protected]:
+    resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
+    engines: {node: '>= 6'}
+
+  [email protected]:
+    resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+    engines: {node: '>=4'}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==}
+    engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
+
+  [email protected]:
+    resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==}
+    engines: {node: '>=12'}
+
+  [email protected]:
+    resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==}
+    engines: {node: '>=0.11'}
+
+  [email protected]:
+    resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
+
+  [email protected]:
+    resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==}
+    engines: {node: '>=6.0'}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
+
+  [email protected]:
+    resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==}
+    engines: {node: '>=0.10.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==}
+    engines: {node: '>=0.10.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==}
+    engines: {node: '>=10'}
+
+  [email protected]:
+    resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+    engines: {node: '>=0.4.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
+    engines: {node: '>=0.10'}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
+
+  [email protected]:
+    resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
+    engines: {node: '>=0.10.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
+    engines: {node: '>= 4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
+
+  [email protected]:
+    resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+
+  [email protected]:
+    resolution: {integrity: sha512-oTUp3gfX1gZI+xfD2djr2rzQdHCwHzPQrrK0CD7WpTdF0nPdQ/INcRVjWgLdCT4a9W3jFObR9DAfsuyFQnI8CQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+  [email protected]:
+    resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
+
+  [email protected]:
+    resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+    engines: {node: '>=0.12'}
+
+  [email protected]:
+    resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
+    engines: {node: '>=6'}
+
+  [email protected]:
+    resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==}
+    engines: {node: '>=18'}
+
+  [email protected]:
+    resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
+
+  [email protected]:
+    resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==}
+    engines: {node: '>=18'}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+    engines: {node: '>=6'}
+
+  [email protected]:
+    resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+    engines: {node: '>=10'}
+
+  [email protected]:
+    resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
+
+  [email protected]:
+    resolution: {integrity: sha512-Rg1YEsb9UKLQ8BOv27cS3TZ6LhEAKQVgVOXArcE/sQrlnX8+FjmJRSC29ij1qrn+eurFuMsCFUcs7/+27T0vqQ==}
+    engines: {node: ^16.17.0 || >=18.6.0}
+    peerDependencies:
+      eslint: '*'
+      eslint-plugin-import: '*'
+      eslint-plugin-import-x: '*'
+      is-bun-module: '*'
+    peerDependenciesMeta:
+      eslint-plugin-import:
+        optional: true
+      eslint-plugin-import-x:
+        optional: true
+      is-bun-module:
+        optional: true
+
+  [email protected]:
+    resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==}
+    engines: {node: '>=4'}
+    peerDependencies:
+      '@typescript-eslint/parser': '*'
+      eslint: '*'
+      eslint-import-resolver-node: '*'
+      eslint-import-resolver-typescript: '*'
+      eslint-import-resolver-webpack: '*'
+    peerDependenciesMeta:
+      '@typescript-eslint/parser':
+        optional: true
+      eslint:
+        optional: true
+      eslint-import-resolver-node:
+        optional: true
+      eslint-import-resolver-typescript:
+        optional: true
+      eslint-import-resolver-webpack:
+        optional: true
+
+  [email protected]:
+    resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==}
+    engines: {node: '>=4'}
+    peerDependencies:
+      '@typescript-eslint/parser': '*'
+      eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9
+    peerDependenciesMeta:
+      '@typescript-eslint/parser':
+        optional: true
+
+  [email protected]:
+    resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==}
+    engines: {node: '>=4.0'}
+    peerDependencies:
+      eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9
+
+  [email protected]:
+    resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==}
+    engines: {node: '>=10'}
+    peerDependencies:
+      eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0
+
+  [email protected]:
+    resolution: {integrity: sha512-eyy8pcr/YxSYjBoqIFSrlbn9i/xvxUFa8CjzAYo9cFjgGXqq1hyjihcpZvxRLalpaWmueWR81xn7vuKmAFijDQ==}
+    peerDependencies:
+      eslint: '>=8.40'
+
+  [email protected]:
+    resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==}
+    engines: {node: '>=4'}
+    peerDependencies:
+      eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7
+
+  [email protected]:
+    resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  [email protected]:
+    resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+  [email protected]:
+    resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  [email protected]:
+    resolution: {integrity: sha512-9V/QURhsRN40xuHXWjV64yvrzMjcz7ZyNoF2jJFmy9j/SLk0u1OLSZgXi28MrXjymnjEGSR80WCdab3RGMDveQ==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    hasBin: true
+    peerDependencies:
+      jiti: '*'
+    peerDependenciesMeta:
+      jiti:
+        optional: true
+
+  [email protected]:
+    resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+  [email protected]:
+    resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
+    engines: {node: '>=0.10'}
+
+  [email protected]:
+    resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+    engines: {node: '>=4.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+    engines: {node: '>=4.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
+  [email protected]:
+    resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+    engines: {node: '>=0.10.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
+
+  [email protected]:
+    resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
+    engines: {node: '>=16.17'}
+
+  [email protected]:
+    resolution: {integrity: sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==}
+    engines: {node: '>= 10.17.0'}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+  [email protected]:
+    resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
+    engines: {node: '>=8.6.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==}
+    engines: {node: '>= 4.9.1'}
+
+  [email protected]:
+    resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==}
+    engines: {node: '>=0.8.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==}
+
+  [email protected]:
+    resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==}
+    peerDependencies:
+      picomatch: ^3 || ^4
+    peerDependenciesMeta:
+      picomatch:
+        optional: true
+
+  [email protected]:
+    resolution: {integrity: sha512-TfW7/1iI4Cy7Y8L6iqNdZQVvdXn0f8B4QcIXmkIbtTIe/Okm/nSlHb4IwGzRVOd3WfSieCgvf5cMzEfySAIl0g==}
+    engines: {node: '>=12.0.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
+    engines: {node: '>=16.0.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==}
+
+  [email protected]:
+    resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+    engines: {node: '>=10'}
+
+  [email protected]:
+    resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==}
+    engines: {node: '>=18'}
+
+  [email protected]:
+    resolution: {integrity: sha512-ZTpO/zD5nYqY02bGpXCg1dRNLggTXPQZdLQeSeur3jYH270p1QkAZZJsm/lrKZ2W4ZjBlafTxxs4OwN38Vyocw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==}
+    engines: {node: ^10.12.0 || >=12.0.0}
+
+  [email protected]:
+    resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
+    engines: {node: '>=16'}
+
+  [email protected]:
+    resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
+    engines: {node: '>=4.0'}
+    peerDependencies:
+      debug: '*'
+    peerDependenciesMeta:
+      debug:
+        optional: true
+
+  [email protected]:
+    resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==}
+    engines: {node: '>=14'}
+
+  [email protected]:
+    resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==}
+    engines: {node: '>= 6'}
+
+  [email protected]:
+    resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==}
+
+  [email protected]:
+    resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
+    engines: {node: '>=12'}
+
+  [email protected]:
+    resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==}
+    engines: {node: '>= 8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+    engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+    os: [darwin]
+
+  [email protected]:
+    resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+  [email protected]:
+    resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+    engines: {node: '>=6.9.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+    engines: {node: 6.* || 8.* || >= 10.*}
+
+  [email protected]:
+    resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==}
+    engines: {node: '>=18'}
+
+  [email protected]:
+    resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
+    engines: {node: '>=16'}
+
+  [email protected]:
+    resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==}
+
+  [email protected]:
+    resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==}
+    engines: {node: '>=16'}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+    engines: {node: '>= 6'}
+
+  [email protected]:
+    resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+    engines: {node: '>=10.13.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+    deprecated: Glob versions prior to v9 are no longer supported
+
+  [email protected]:
+    resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==}
+    engines: {node: '>=18'}
+
+  [email protected]:
+    resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==}
+    engines: {node: '>=6'}
+
+  [email protected]:
+    resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==}
+    engines: {node: '>=6'}
+
+  [email protected]:
+    resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
+    engines: {node: '>=4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
+    engines: {node: '>=18'}
+
+  [email protected]:
+    resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==}
+    engines: {node: '>=18'}
+
+  [email protected]:
+    resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
+    engines: {node: '>=10'}
+
+  [email protected]:
+    resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-frdKI4Qi8Ihp4C6wZNB565de/THpIaw3DjP5ku87M+N9rNSGmPTjfkq61SdRXB7eCaL8O1hkKDvf6CDMtOzIAg==}
+    engines: {node: '>=14'}
+
+  [email protected]:
+    resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+
+  [email protected]:
+    resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==}
+    engines: {node: '>=6'}
+
+  [email protected]:
+    resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==}
+
+  [email protected]:
+    resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==}
+    engines: {node: '>=10'}
+
+  [email protected]:
+    resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
+    engines: {node: '>=16.17.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==}
+    engines: {node: '>=18'}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-f3frU3pIxD50/Tz20zx9TD9HobKYg47fmAETb117GKGPrhwcSSPJDoCposXlVycVebQ9GQohC3Efbpq7/nnJ5w==}
+
+  [email protected]:
+    resolution: {integrity: sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
+    engines: {node: '>=0.10.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+    engines: {node: '>= 4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==}
+    engines: {node: '>=0.10.0'}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
+    engines: {node: '>=6'}
+
+  [email protected]:
+    resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+    engines: {node: '>=0.8.19'}
+
+  [email protected]:
+    resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==}
+    engines: {node: '>=12'}
+
+  [email protected]:
+    resolution: {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.
+
+  [email protected]:
+    resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
+
+  [email protected]:
+    resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==}
+    engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+  [email protected]:
+    resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+    engines: {node: '>=0.10.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==}
+    engines: {node: '>=12'}
+
+  [email protected]:
+    resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==}
+    engines: {node: '>=18'}
+
+  [email protected]:
+    resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+    engines: {node: '>=0.10.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+    engines: {node: '>=0.12.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==}
+    engines: {node: '>=0.10.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
+    engines: {node: '>=0.10.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+  [email protected]:
+    resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==}
+
+  [email protected]:
+    resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==}
+    engines: {node: '>=14'}
+
+  [email protected]:
+    resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
+    engines: {node: '>=6'}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+
+  [email protected]:
+    resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+
+  [email protected]:
+    resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==}
+
+  [email protected]:
+    resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+    engines: {node: '>=6'}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==}
+    engines: {'0': node >= 0.2.0}
+
+  [email protected]:
+    resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==}
+    engines: {node: '>=4.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
+    engines: {node: '>=0.10.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==}
+    engines: {node: '>=0.10'}
+
+  [email protected]:
+    resolution: {integrity: sha512-tkuLHQlvWUTeQ3doAqnHbNn8T6WX1KA8yvbKG9x4VtKtIjHsVKQZCH11zRgAfbDAXC2UNIg/K9BYAAcEzUIrNg==}
+    engines: {node: '>=6'}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+    engines: {node: '>= 0.8.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
+    engines: {node: '>=10'}
+
+  [email protected]:
+    resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
+    engines: {node: '>=14'}
+
+  [email protected]:
+    resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-WyCzSbfYGhK7cU+UuDDkzUiytbfbi0ZdPy2orwtM75P3WTtQBzmG40cCxIa8Ii2+XjfxzLH6Be46tUfWS85Xfg==}
+    engines: {node: '>=18.12.0'}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==}
+    engines: {node: '>=18.0.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==}
+    engines: {node: '>=14'}
+
+  [email protected]:
+    resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==}
+    engines: {node: '>=14'}
+
+  [email protected]:
+    resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+    engines: {node: '>=10'}
+
+  [email protected]:
+    resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+  [email protected]:
+    resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
+
+  [email protected]:
+    resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
+
+  [email protected]:
+    resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==}
+
+  [email protected]:
+    resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==}
+    engines: {node: '>=18'}
+
+  [email protected]:
+    resolution: {integrity: sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==}
+
+  [email protected]:
+    resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
+  [email protected]:
+    resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
+    engines: {node: '>=10'}
+
+  [email protected]:
+    resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==}
+    engines: {node: '>=6'}
+
+  [email protected]:
+    resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==}
+    engines: {node: '>=0.10.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==}
+
+  [email protected]:
+    resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
+
+  [email protected]:
+    resolution: {integrity: sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+  [email protected]:
+    resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==}
+    engines: {node: '>=16.10'}
+
+  [email protected]:
+    resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+
+  [email protected]:
+    resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+    engines: {node: '>= 8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+    engines: {node: '>=8.6'}
+
+  [email protected]:
+    resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+    engines: {node: '>= 0.6'}
+
+  [email protected]:
+    resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+    engines: {node: '>= 0.6'}
+
+  [email protected]:
+    resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
+    engines: {node: '>=4'}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
+    engines: {node: '>=12'}
+
+  [email protected]:
+    resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==}
+    engines: {node: '>=18'}
+
+  [email protected]:
+    resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
+    engines: {node: '>=4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
+    engines: {node: '>=16 || 14 >=14.17'}
+
+  [email protected]:
+    resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==}
+    engines: {node: '>= 6'}
+
+  [email protected]:
+    resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+  [email protected]:
+    resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
+    engines: {node: '>=16 || 14 >=14.17'}
+
+  [email protected]:
+    resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==}
+    engines: {node: '>= 8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
+    engines: {node: '>=10'}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==}
+
+  [email protected]:
+    resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+  [email protected]:
+    resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
+
+  [email protected]:
+    resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
+    engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==}
+    engines: {node: '>= 4.4.x'}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==}
+    engines: {node: '>=10'}
+
+  [email protected]:
+    resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+    engines: {node: '>=0.10.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
+    engines: {node: '>=0.10.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+  [email protected]:
+    resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+
+  [email protected]:
+    resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+    engines: {node: '>=0.10.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
+    engines: {node: '>= 6'}
+
+  [email protected]:
+    resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+
+  [email protected]:
+    resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
+    engines: {node: '>=12'}
+
+  [email protected]:
+    resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
+    engines: {node: '>=18'}
+
+  [email protected]:
+    resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
+    engines: {node: '>= 0.8.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+    engines: {node: '>=10'}
+
+  [email protected]:
+    resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+  [email protected]:
+    resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+    engines: {node: '>=10'}
+
+  [email protected]:
+    resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+  [email protected]:
+    resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==}
+
+  [email protected]:
+    resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+    engines: {node: '>=6'}
+
+  [email protected]:
+    resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==}
+    engines: {node: '>= 0.10'}
+
+  [email protected]:
+    resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==}
+
+  [email protected]:
+    resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==}
+
+  [email protected]:
+    resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==}
+
+  [email protected]:
+    resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+  [email protected]:
+    resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+    engines: {node: '>=0.10.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
+    engines: {node: '>=12'}
+
+  [email protected]:
+    resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
+    engines: {node: '>=16 || 14 >=14.18'}
+
+  [email protected]:
+    resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+
+  [email protected]:
+    resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+  [email protected]:
+    resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+    engines: {node: '>=8.6'}
+
+  [email protected]:
+    resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
+    engines: {node: '>=12'}
+
+  [email protected]:
+    resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==}
+    engines: {node: '>=0.10'}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
+    engines: {node: '>=0.10.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
+    engines: {node: '>=6'}
+
+  [email protected]:
+    resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
+    engines: {node: '>= 6'}
+
+  [email protected]:
+    resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==}
+
+  [email protected]:
+    resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
+    engines: {node: '>=14.0.0'}
+    peerDependencies:
+      postcss: ^8.0.0
+
+  [email protected]:
+    resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
+    engines: {node: ^12 || ^14 || >= 16}
+    peerDependencies:
+      postcss: ^8.4.21
+
+  [email protected]:
+    resolution: {integrity: sha512-FPX16mQLyEjLzEuuJtxA8X3ejDLNGGEG503d2YGZR5Ask1SpDN8KmZUMpzCvyalWRywAn1n1VOA5dcqfCLo5rg==}
+    engines: {node: '>=12'}
+    peerDependencies:
+      postcss: ^8.3.5
+
+  [email protected]:
+    resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==}
+    engines: {node: '>= 14'}
+    peerDependencies:
+      postcss: '>=8.0.9'
+      ts-node: '>=9.0.0'
+    peerDependenciesMeta:
+      postcss:
+        optional: true
+      ts-node:
+        optional: true
+
+  [email protected]:
+    resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==}
+
+  [email protected]:
+    resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==}
+    engines: {node: '>=12.0'}
+    peerDependencies:
+      postcss: ^8.2.14
+
+  [email protected]:
+    resolution: {integrity: sha512-VbqqHkOBOt4Uu3G8Dm8n6lU5+9cJFxiuty9+4rcoyRPO9zZS1JIs6td49VIoix3qYqELHlJIn46Oih9SAKo+yQ==}
+    engines: {node: '>=18'}
+    peerDependencies:
+      postcss: ^8.4
+
+  [email protected]:
+    resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==}
+    engines: {node: '>=12.0'}
+    peerDependencies:
+      postcss: ^8.3.3
+
+  [email protected]:
+    resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==}
+    engines: {node: '>=12.0'}
+    peerDependencies:
+      postcss: ^8.4.29
+
+  [email protected]:
+    resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
+    engines: {node: '>=4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==}
+    engines: {node: '>=4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q==}
+    peerDependencies:
+      postcss: ^8.4.20
+
+  [email protected]:
+    resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==}
+    engines: {node: ^10 || ^12 || >=14}
+
+  [email protected]:
+    resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==}
+    engines: {node: ^10 || ^12 || >=14}
+
+  [email protected]:
+    resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+    engines: {node: '>= 0.8.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
+    engines: {node: '>=6.0.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==}
+    engines: {node: '>=14'}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==}
+    engines: {node: '>=12.0.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+    engines: {node: '>=6'}
+
+  [email protected]:
+    resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==}
+    engines: {node: '>=0.6'}
+
+  [email protected]:
+    resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==}
+
+  [email protected]:
+    resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+  [email protected]:
+    resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==}
+    engines: {node: '>=10'}
+
+  [email protected]:
+    resolution: {integrity: sha512-tEF5I22zJnuclswcZMc8bDIrwRHRzf+NqVEmqg50ShAZMP7MWeR/RGDthfM/p+BlqvF2fXAzpn8i+SJcYD3alw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-Kyl4EJ7ZfCBuidmZVieegcbFw0RcU5bHHSbtEdmuLYd0fYHCAiYKZ6zon7fWAVyC6rWWOOib0XKdTSf7ElC9rg==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-aOAQc3E98HteIIsSqm6Xk2FPKIER6+5vyEFMZfo73TqM+VVAIqOkHoPjgKLqSNtVLWScoaM7vY2ZrGEheI79yg==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-swDdz4QZ4dFTo4RAUMLL50qP0EY62N2kvmk2We5xYdRwcRn8WcYtuetCJpwpaCbUfUt5+huLpVxhvmnK+PHrkA==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-ApoVi9Z8PaCQg6FsUzS8yvBEQy0ZL2PkuvAgrmohPkN3okps5WZ5WQWPc1RNuiOKaAYv8B97ACdsFU5LizzCqg==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-9lOQ7kBekEJRdEpScHvtmEtXnAsy+NGDXiRWc2ZVC7QXAazNVbeT4EraQKYwCME8BJLa8Bxqxvs5swwyOepRwg==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-YDAlXsPv3I1n42dv1JpdM7wJ+gSUBfeyPK59ZpBD9jQhK9jVuxpjj3NmWQHOBceA1zEPVX84T2wbdb2SD0UjmA==}
+    peerDependencies:
+      react: '>=16.11.0'
+      react-dom: '>=16.11.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-hgKsCay2taxzVnBPZl+1n4ZondsV78G++XVsMIJCAoioMjlMQR9YwAp7JZDIECzIu2Z66R+f4SFIRrO2DjDNAA==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-XuoWx4KUXg7hNy5mRTy1i8c8p3K8boWg6UajbHpDXS5AlRVucNfTi5YxTtPBTBzegxAZpvuLfh3emXFt6ybUdA==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-Tiy4DcXcFXAf9wDhN8aUAyMeCLHJUHA/VA/t7Hj8ZEx5ETvxG7MArDOSE6psbiSCo+vJPm4E3fGN710ITVn6GA==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-A5w4egJq8+4JzlQ55FfQjDnPvOaAbzwC3VLOAdOytyek3TboSOP9qxN+Gifup+shVXfvecBLBbWBpWxmk02SWQ==}
+    peerDependencies:
+      react: '>=16.0.0'
+      react-dom: '>=16.0.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-KK3bAc/bPFI993J3necmaMXD2reZTzytZdlTvkeBbp50IGH1BDPDvxLdHDUrpQx2b2TGaVJsn+86BvYa03kGqA==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-ghHx6/6Dvp+fw8CJhDUHFHDJ84hJE3BXNCzSgLdmNiFErWSOaZNsihDAsKq9ByTALo/xkNIwtDFGIl6r+RPXBg==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-w+XTUrfh7ArbYEd2582uDrEhmBHwK1ZENJiSJVb7uRxdE7qJSYjbO2eksRXmndqyKqKoYPc9ClpPh5242mV1vA==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-42szwnn8VYQoT6GnjO00i1iwqV9D1TTMvxObWsuLwgl0TsOokzhkYiufdtQBsJMFjJravS1hfDKVMHLKLcPE4g==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-3MoPQQPV1uKyOMVNd6SZfONi+f3st0r8PksexIdBTeIYbMX0Jr+k7pHEDvsXtR4BpCv90/Pv2MovVNhktKrwvw==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-8416Yip/+eclTFdHXLKTxZvn70duYVGTvUUWbckCCZoIl3jagqke3GLsFrMs0bsQBikiYpZLD9206Ej4SOdOXQ==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-MJ5teb7FlNE0NFHTncxXQ62Y5lytq6sh5nUw0iH8OkHL/TjARSEvSHpr940pWgjGANpjCwyMdvsEV55l5tYNSg==}
+    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
+
+  [email protected]:
+    resolution: {integrity: sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-QUhQ9ivQ8Gy7mtMZPAjLbxBt5y9GRp65VcUyGUMF3N3fhiftivPHdpuDIaWIMOTEprAjZPC08bls1dQB+I1F2Q==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-YZLjUbyIWox8E9i9C3Tm7ia+W7euPItNWSPX5sCcQTYbnwDb5uNpnLHQCG1f22oZWUhLw4Mv2tFmeWe68CDQRQ==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-liijAjXz+KnTRVnxxXG2sYDGd6iLL7VpGGdR8gwoxAXy2KglviKCxLWZdjKYJzYzGSUwKDSTdYk8brj54Bn5BA==}
+    peerDependencies:
+      react: '>=16.0.0'
+      react-dom: '>=16.0.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-YPMtRPqfZWOm2XGTbx5/YVr1HT0vn//8QS77At0Gjb3Lv+Lbut0IORJPKLWu1hQ3u4GsA0SrDzs7nI8JG7Zmyg==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '*'
+      react-dom: '*'
+
+  [email protected]:
+    resolution: {integrity: sha512-2gg/72YFSpKP+Ja5AjC5DPL1YnV8DEITDQrcc1eASrUYjl0esptaBVJBh5nLTXCCp15eD8EuGjwezVGSHhs9tQ==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-Y+YuncnQqoS5e7yHvfvlv8BmCvwDYDX/2VixTBEhkMDk9itS9aBINp4nhzXFKiBP/frG4w0pS9d9Rgisl0T1Bw==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-yiWivLAjEo5d1v2xlseB2dQocsOhkoVSfo1krS8v8r+02K+TBUjSjXIf7dgyVSxp6wRIPv5pMi5hanNUlQMgUA==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-dQW/Bc/MriPBTugj2Kx9PMS5eXCCGn2cxoIaichjbNvOiARlaHdI99j4DTxLl/V8+PIfW06uFy7kjfUIDDKyxQ==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-kqyivim5cp8I5RkHmpsp1Nn/Wk+1oeloMv9c7LXNgDxUpGm+RbXJGL+OPvDlcRnx9DBeOe4wyOIl4OKUERyH1g==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-2qTBTzwIT7LRI1o7zLyrCzmo5tQanmyGbSaGTIf7sYimCklAToVVfpMC6OAldSKolcnjorBYPNSKQqJmN3TCww==}
+    peerDependencies:
+      react: '*'
+      react-dom: '*'
+
+  [email protected]:
+    resolution: {integrity: sha512-FNhIefhftobCdUJshO7M8uZTA9F4OPGVXqGfZkkD/5soDeOhwO06T/aKTrg0WD8gRg/pyfq+ql3aMymLHCTC4A==}
+    engines: {node: '>=10.x'}
+    peerDependencies:
+      react: '*'
+      react-dom: '*'
+
+  [email protected]:
+    resolution: {integrity: sha512-toEAhwl4hjLAI1u8/CgKWt30BR06ulPa4iGQSMvSXoHzO88gPCslxqV/mnn4gJU7PDoltGIC9Eh+wkeudqgHyw==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-qkurwgc4Je4xJaYe1DprDl2fwtfEZcuC4UhsJRiX2YZ6wSZAUPQXH/lIX+ZRtNEWmz3pzSBQ7NX3Csjp0wCtcg==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
+    peerDependencies:
+      react: ^18.3.1
+
+  [email protected]:
+    resolution: {integrity: sha512-wZnpfunU6UIAiJ+bxwOiTmBOAaB14ha97MjOEnLGac2RJ+h/maIYXZuTHlmyqQVX1UVHmU1YDTQ5vxLmwfXTjw==}
+    peerDependencies:
+      i18next: '>= 23.2.3'
+      react: '>= 16.8.0'
+      react-dom: '*'
+      react-native: '*'
+    peerDependenciesMeta:
+      react-dom:
+        optional: true
+      react-native:
+        optional: true
+
+  [email protected]:
+    resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==}
+    engines: {node: '>=0.10.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-VlksBPf3n2bijPvnA7nkTsXxMAKOj+bWp4R9c3i+bnwlSOFAGOkJkKhzy/OsRkWaBMICqcAl1JDzh9ZSOze9CA==}
+    engines: {node: '>=20.0.0'}
+    peerDependencies:
+      react: '>=18'
+      react-dom: '>=18'
+
+  [email protected]:
+    resolution: {integrity: sha512-Y2g5ObjkvX3VFeVt+0CIPuYd9PpgqCslG7ASSIdN73LwA1nNWzcMLaoMRJfP3prZFI92svxFwbn7XkLJ+UPQ6A==}
+    engines: {node: '>=20.0.0'}
+    peerDependencies:
+      react: '>=18'
+      react-dom: '>=18'
+    peerDependenciesMeta:
+      react-dom:
+        optional: true
+
+  [email protected]:
+    resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
+    engines: {node: '>=0.10.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
+
+  [email protected]:
+    resolution: {integrity: sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==}
+    engines: {node: '>=12'}
+
+  [email protected]:
+    resolution: {integrity: sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==}
+    engines: {node: '>=12'}
+
+  [email protected]:
+    resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+    engines: {node: '>=8.10.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
+    engines: {node: '>= 14.18.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==}
+    engines: {node: '>=12'}
+
+  [email protected]:
+    resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+    engines: {node: '>=0.10.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+    engines: {node: '>=0.10.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+    engines: {node: '>=4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==}
+    engines: {node: '>= 0.4'}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==}
+    engines: {node: '>=18'}
+
+  [email protected]:
+    resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
+    engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
+
+  [email protected]:
+    resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
+    deprecated: Rimraf versions prior to v4 are no longer supported
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q==}
+    engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-Fwc19jMBA3g+fxDJH2B4WxwZjE0VaaOL7OX/A4Wn5Zv7bOD/vyPZhzXfaO73Xc2GAlfi96g5fGUa378WbIGfFw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
+  [email protected]:
+    resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==}
+    engines: {node: '>=0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-zV8vGUld/+mP4KbMLJMX7TyGCuUp7hnkOScgCMsWuHtns8CWBoz+vmEhoGMXsaJrbUP8gj+F1dLvVe79sK8UdA==}
+    engines: {node: '>=14.0.0'}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==}
+    engines: {node: '>=10'}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
+    engines: {node: '>=14'}
+
+  [email protected]:
+    resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==}
+    engines: {node: '>=10'}
+
+  [email protected]:
+    resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==}
+    engines: {node: '>=12'}
+
+  [email protected]:
+    resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==}
+    engines: {node: '>=18'}
+
+  [email protected]:
+    resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+    engines: {node: '>=0.10.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+    engines: {node: '>=0.10.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==}
+    deprecated: Please use @jridgewell/sourcemap-codec instead
+
+  [email protected]:
+    resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==}
+
+  [email protected]:
+    resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==}
+
+  [email protected]:
+    resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
+
+  [email protected]:
+    resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
+    engines: {node: '>= 10.x'}
+
+  [email protected]:
+    resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==}
+
+  [email protected]:
+    resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
+    engines: {node: '>=0.6.19'}
+
+  [email protected]:
+    resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==}
+
+  [email protected]:
+    resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
+    engines: {node: '>=12'}
+
+  [email protected]:
+    resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
+    engines: {node: '>=18'}
+
+  [email protected]:
+    resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==}
+
+  [email protected]:
+    resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
+    engines: {node: '>=12'}
+
+  [email protected]:
+    resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
+    engines: {node: '>=4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
+    engines: {node: '>=12'}
+
+  [email protected]:
+    resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==}
+    engines: {node: '>=12'}
+
+  [email protected]:
+    resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-6X5A9kdusuLzS/9yfkQfzYg5ry43KHXMnUmiPCIidwQEW/cegn44CtRPfN+9SLcVkUVcRNpuLYfHtbLtoUHgkA==}
+    peerDependencies:
+      postcss: ^8.3.3
+      stylelint: ^15.10.2
+    peerDependenciesMeta:
+      postcss:
+        optional: true
+
+  [email protected]:
+    resolution: {integrity: sha512-qAmz/TdrqslwiMTuLM3QXeISUkfEDUXGMfRBCHm/xrkCJNnQefv+mzG2mWTsWkqcVk8HAyUkug10dwAcYp2fCQ==}
+    peerDependencies:
+      postcss: ^8.3.3
+      stylelint: ^15.0.0
+    peerDependenciesMeta:
+      postcss:
+        optional: true
+
+  [email protected]:
+    resolution: {integrity: sha512-TQ4xQ48tW4QSlODcti7pgSRqBZcUaBzuh0jPpfiMhwJKBPkqzTIAU+IrSWL/7BgXlOM90DjB7YaNgFpx8QWhuA==}
+    peerDependencies:
+      stylelint: ^15.0.0
+
+  [email protected]:
+    resolution: {integrity: sha512-EH+yRj6h3GAe/fRiyaoO2F9l9Tgg50AOFhaszyfov9v6ayXJ1IkSHwTxd7lB48FmOeSGDPLjatjO11fJpmarkQ==}
+    engines: {node: ^14.13.1 || >=16.0.0}
+    peerDependencies:
+      stylelint: ^15.10.0
+
+  [email protected]:
+    resolution: {integrity: sha512-m5sRdtsB1F5fnC1Ozla7ryftU47wVpO+HWd+JQTqeoG0g/oPh5EfbWfcVHbNCEtuoHfALIySiUWS20pz2hX6jA==}
+    peerDependencies:
+      postcss: ^8.3.3
+      stylelint: ^15.0.0
+    peerDependenciesMeta:
+      postcss:
+        optional: true
+
+  [email protected]:
+    resolution: {integrity: sha512-NbeHOmpRQhjZh5XB1B/S4MLRWvz4xxAxeDBjzl0tY2xEcayNhLbaRGF0ZQzq+DQZLCcPpOHeS2Ru1ydbkhkmLg==}
+    peerDependencies:
+      stylelint: ^15.0.0
+
+  [email protected]:
+    resolution: {integrity: sha512-HwRdAdrNDBg64BzIOP3SSHFPJHvRJEpqFn8Kp5m5Enw6pf7kI9XoNT3jn1S2zvfzaK/7hdwy6La3cyJT78fK3A==}
+    peerDependencies:
+      postcss: ^8.4.14
+      stylelint: ^15.10.3
+
+  [email protected]:
+    resolution: {integrity: sha512-0UuKo4+s1hgQ/uAxlYU4h0o0HS4NiQDud0NAUNI0aa8FJdmYHA5ZZTFHiV5FpmE3071e9pZx5j0QpVJW5zOCUA==}
+    peerDependencies:
+      stylelint: ^14.0.0 || ^15.0.0 || ^16.0.1
+
+  [email protected]:
+    resolution: {integrity: sha512-jvT3G+9lopkeB0ARmDPszyfaOnvnIF+30QCjZxyt7E6fynI1T9mOKgYDNb9bXX17M7PXMZaX3j/26wqakjp1tw==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      prettier: '>=2.0.0'
+      stylelint: '>=14.0.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-TSUgIeS0H3jqDZnby1UO1Qv3poi1N8wUYIJY6D1tuUq2MN3lwp/rITVo0wD+1SWTmRm0tNmGO0b7nKInnqF6Hg==}
+    peerDependencies:
+      stylelint: ^14.5.1 || ^15.0.0
+
+  [email protected]:
+    resolution: {integrity: sha512-78O4c6IswZ9TzpcIiQJIN49K3qNoXTM8zEJzhaTE/xRTCZswaovSEVIa/uwbOltZrk16X4jAxjaOhzz/hTm1Kw==}
+    engines: {node: ^14.13.1 || >=16.0.0}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==}
+    engines: {node: '>=16 || 14 >=14.17'}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==}
+    engines: {node: '>=14.18'}
+
+  [email protected]:
+    resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==}
+
+  [email protected]:
+    resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==}
+    engines: {node: '>=14.0.0'}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==}
+    engines: {node: '>=10.0.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==}
+    engines: {node: '>=14.0.0'}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==}
+    engines: {node: '>=10'}
+
+  [email protected]:
+    resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==}
+    engines: {node: '>=8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
+    engines: {node: '>=0.8'}
+
+  [email protected]:
+    resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==}
+    engines: {node: '>=12.22'}
+
+  [email protected]:
+    resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
+
+  [email protected]:
+    resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==}
+    engines: {node: '>=12.0.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-8nIfc2vgQ4TeLnk2lFj4tRLvvJwEfQuabdsmvDdQPT0xlk9TaNtpGd6nNRxXoK6vQhN6RSzj+Cnp5tTQmpxmbw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+    engines: {node: '>=8.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==}
+    engines: {node: '>=12'}
+
+  [email protected]:
+    resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==}
+    engines: {node: '>=18.12'}
+    peerDependencies:
+      typescript: '>=4.8.4'
+
+  [email protected]:
+    resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
+
+  [email protected]:
+    resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==}
+
+  [email protected]:
+    resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+  [email protected]:
+    resolution: {integrity: sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==}
+
+  [email protected]:
+    resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+    engines: {node: '>= 0.8.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==}
+    engines: {node: '>=10'}
+
+  [email protected]:
+    resolution: {integrity: sha512-S/5/0kFftkq27FPNye0XM1e2NsnoD/3FS+pBmbjmmtLT6I+i344KoOf7pvXreaFsDamWeaJX55nczA1m5PsBDg==}
+    engines: {node: '>=16'}
+
+  [email protected]:
+    resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-1HTsf5/QVRmLzcGfldPFvkVsAdi1db1BBKzi7iW3KBUlOICg/nKnFS+jGqDJS3YD8VsWbAh7JiHeBvbsw8RPxA==}
+
+  [email protected]:
+    resolution: {integrity: sha512-ZZ/8+Y0rRUMuW1gJaPtLWe4ryHbsPLzzibk5Sq+IFa2aOH1Vo0gPr1fbA6pOnzBke7zC2Da4w8AyCgxKXo3lqA==}
+    engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+    peerDependencies:
+      eslint: ^8.57.0 || ^9.0.0
+      typescript: '>=4.8.4 <5.9.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==}
+    engines: {node: '>=14.17'}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-uROZWze0R0itiAKVPsYhFov9LxrPMHLMEQFszeI2gCN6bnIIZ8twzBCJcN2LJrBBLfrP0t1FW0g+JmKVl8Vk1g==}
+    engines: {node: '>=18.17'}
+
+  [email protected]:
+    resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==}
+    engines: {node: '>=18'}
+
+  [email protected]:
+    resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
+    engines: {node: '>= 10.0.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==}
+    hasBin: true
+    peerDependencies:
+      browserslist: '>= 4.21.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+
+  [email protected]:
+    resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
+
+  [email protected]:
+    resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==}
+    peerDependencies:
+      vite: '>=2.0.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-qgjh5pz75MdE9Kzs8J0kBwaCfifHV0ezRbB9rpGsIOxam+ilcGV7WOk91vFJXquzRmiKrFh3Hxlh0JJWAmXTbQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-qtoHQae5dSUQPo/rYz/8p190VU5y19rtBaeV7ryLa/AYAU/e9CG89NrN/3+k7MR8mJy/GPIu91iJ3zk9foUOSA==}
+    peerDependencies:
+      vite: '>=2.0.0'
+
+  [email protected]:
+    resolution: {integrity: sha512-yW7PeMM+LkDzc7CgJuRLMW2Jz0FxMOsVJ8Lv3gpgW9WLcb9cTW+121UEr1hvmfR7w3SegR5ItvYyzVz1vxNJgQ==}
+    engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+    hasBin: true
+    peerDependencies:
+      '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
+      jiti: '>=1.21.0'
+      less: '*'
+      lightningcss: ^1.21.0
+      sass: '*'
+      sass-embedded: '*'
+      stylus: '*'
+      sugarss: '*'
+      terser: ^5.16.0
+      tsx: ^4.8.1
+      yaml: ^2.4.2
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+      jiti:
+        optional: true
+      less:
+        optional: true
+      lightningcss:
+        optional: true
+      sass:
+        optional: true
+      sass-embedded:
+        optional: true
+      stylus:
+        optional: true
+      sugarss:
+        optional: true
+      terser:
+        optional: true
+      tsx:
+        optional: true
+      yaml:
+        optional: true
+
+  [email protected]:
+    resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==}
+    engines: {node: '>=0.10.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==}
+
+  [email protected]:
+    resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==}
+    engines: {node: '>=0.8.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==}
+    engines: {node: '>=0.8.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
+    engines: {node: '>=18'}
+
+  [email protected]:
+    resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==}
+    engines: {node: '>=18'}
+
+  [email protected]:
+    resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==}
+    engines: {node: '>= 0.4'}
+
+  [email protected]:
+    resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+    engines: {node: '>= 8'}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==}
+    engines: {node: '>=18'}
+
+  [email protected]:
+    resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+    engines: {node: '>=0.10.0'}
+
+  [email protected]:
+    resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+    engines: {node: '>=10'}
+
+  [email protected]:
+    resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
+    engines: {node: '>=12'}
+
+  [email protected]:
+    resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==}
+    engines: {node: '>=18'}
+
+  [email protected]:
+    resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+  [email protected]:
+    resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==}
+    engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+
+  [email protected]:
+    resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+    engines: {node: '>=10'}
+
+  [email protected]:
+    resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
+  [email protected]:
+    resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+
+  [email protected]:
+    resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==}
+    engines: {node: '>= 14'}
+    hasBin: true
+
+  [email protected]:
+    resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
+    engines: {node: '>=10'}
+
+  [email protected]:
+    resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+    engines: {node: '>=12'}
+
+  [email protected]:
+    resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
+    engines: {node: '>=12'}
+
+  [email protected]:
+    resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==}
+
+  [email protected]:
+    resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+    engines: {node: '>=10'}
+
+  [email protected]:
+    resolution: {integrity: sha512-KHBC7z61OJeaMGnF3wqNZj+GGNXOyypZviiKpQeiHirG5Ib1ImwcLBH70rbMSkKfSmUNBsdf2PwaEJtKvgmkNw==}
+    engines: {node: '>=12.20'}
+
+snapshots:
+
+  '@alloc/[email protected]': {}
+
+  '@ampproject/[email protected]':
+    dependencies:
+      '@jridgewell/gen-mapping': 0.3.8
+      '@jridgewell/trace-mapping': 0.3.25
+
+  '@ant-design/[email protected]':
+    dependencies:
+      '@ant-design/fast-color': 2.0.6
+
+  '@ant-design/[email protected]([email protected]([email protected]))([email protected])':
+    dependencies:
+      '@ant-design/cssinjs': 1.23.0([email protected]([email protected]))([email protected])
+      '@babel/runtime': 7.26.10
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  '@ant-design/[email protected]([email protected]([email protected]))([email protected])':
+    dependencies:
+      '@babel/runtime': 7.26.10
+      '@emotion/hash': 0.8.0
+      '@emotion/unitless': 0.7.5
+      classnames: 2.5.1
+      csstype: 3.1.3
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+      stylis: 4.3.6
+
+  '@ant-design/[email protected]':
+    dependencies:
+      '@babel/runtime': 7.26.10
+
+  '@ant-design/[email protected]': {}
+
+  '@ant-design/[email protected]([email protected]([email protected]))([email protected])':
+    dependencies:
+      '@ant-design/colors': 7.2.0
+      '@ant-design/icons-svg': 4.4.2
+      '@babel/runtime': 7.26.10
+      classnames: 2.5.1
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  '@ant-design/[email protected]([email protected])':
+    dependencies:
+      '@babel/runtime': 7.26.10
+      classnames: 2.5.1
+      json2mq: 0.2.0
+      react: 18.3.1
+      resize-observer-polyfill: 1.5.1
+      throttle-debounce: 5.0.2
+
+  '@antfu/[email protected]':
+    dependencies:
+      package-manager-detector: 0.2.11
+      tinyexec: 0.3.2
+
+  '@antfu/[email protected]': {}
+
+  '@babel/[email protected]':
+    dependencies:
+      '@babel/helper-validator-identifier': 7.25.9
+      js-tokens: 4.0.0
+      picocolors: 1.1.1
+
+  '@babel/[email protected]': {}
+
+  '@babel/[email protected]':
+    dependencies:
+      '@ampproject/remapping': 2.3.0
+      '@babel/code-frame': 7.26.2
+      '@babel/generator': 7.26.10
+      '@babel/helper-compilation-targets': 7.26.5
+      '@babel/helper-module-transforms': 7.26.0(@babel/[email protected])
+      '@babel/helpers': 7.26.10
+      '@babel/parser': 7.26.10
+      '@babel/template': 7.26.9
+      '@babel/traverse': 7.26.10
+      '@babel/types': 7.26.10
+      convert-source-map: 2.0.0
+      debug: 4.4.0
+      gensync: 1.0.0-beta.2
+      json5: 2.2.3
+      semver: 6.3.1
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/[email protected]':
+    dependencies:
+      '@babel/parser': 7.26.10
+      '@babel/types': 7.26.10
+      '@jridgewell/gen-mapping': 0.3.8
+      '@jridgewell/trace-mapping': 0.3.25
+      jsesc: 3.1.0
+
+  '@babel/[email protected]':
+    dependencies:
+      '@babel/compat-data': 7.26.8
+      '@babel/helper-validator-option': 7.25.9
+      browserslist: 4.24.4
+      lru-cache: 5.1.1
+      semver: 6.3.1
+
+  '@babel/[email protected]':
+    dependencies:
+      '@babel/traverse': 7.26.10
+      '@babel/types': 7.26.10
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/[email protected](@babel/[email protected])':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-module-imports': 7.25.9
+      '@babel/helper-validator-identifier': 7.25.9
+      '@babel/traverse': 7.26.10
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/[email protected]': {}
+
+  '@babel/[email protected]': {}
+
+  '@babel/[email protected]': {}
+
+  '@babel/[email protected]': {}
+
+  '@babel/[email protected]':
+    dependencies:
+      '@babel/template': 7.26.9
+      '@babel/types': 7.26.10
+
+  '@babel/[email protected]':
+    dependencies:
+      '@babel/types': 7.26.10
+
+  '@babel/[email protected](@babel/[email protected])':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/[email protected](@babel/[email protected])':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/helper-plugin-utils': 7.26.5
+
+  '@babel/[email protected]':
+    dependencies:
+      regenerator-runtime: 0.14.1
+
+  '@babel/[email protected]':
+    dependencies:
+      '@babel/code-frame': 7.26.2
+      '@babel/parser': 7.26.10
+      '@babel/types': 7.26.10
+
+  '@babel/[email protected]':
+    dependencies:
+      '@babel/code-frame': 7.26.2
+      '@babel/generator': 7.26.10
+      '@babel/parser': 7.26.10
+      '@babel/template': 7.26.9
+      '@babel/types': 7.26.10
+      debug: 4.4.0
+      globals: 11.12.0
+    transitivePeerDependencies:
+      - supports-color
+
+  '@babel/[email protected]':
+    dependencies:
+      '@babel/helper-string-parser': 7.25.9
+      '@babel/helper-validator-identifier': 7.25.9
+
+  '@commitlint/[email protected](@types/[email protected])([email protected])':
+    dependencies:
+      '@commitlint/format': 19.8.0
+      '@commitlint/lint': 19.8.0
+      '@commitlint/load': 19.8.0(@types/[email protected])([email protected])
+      '@commitlint/read': 19.8.0
+      '@commitlint/types': 19.8.0
+      tinyexec: 0.3.2
+      yargs: 17.7.2
+    transitivePeerDependencies:
+      - '@types/node'
+      - typescript
+
+  '@commitlint/[email protected]':
+    dependencies:
+      '@commitlint/types': 19.8.0
+      conventional-changelog-conventionalcommits: 7.0.2
+
+  '@commitlint/[email protected]':
+    dependencies:
+      '@commitlint/types': 19.8.0
+      ajv: 8.17.1
+
+  '@commitlint/[email protected]':
+    dependencies:
+      '@commitlint/types': 19.8.0
+      lodash.camelcase: 4.3.0
+      lodash.kebabcase: 4.1.1
+      lodash.snakecase: 4.1.1
+      lodash.startcase: 4.4.0
+      lodash.upperfirst: 4.3.1
+
+  '@commitlint/[email protected]': {}
+
+  '@commitlint/[email protected]':
+    dependencies:
+      '@commitlint/types': 19.8.0
+      chalk: 5.4.1
+
+  '@commitlint/[email protected]':
+    dependencies:
+      '@commitlint/types': 19.8.0
+      semver: 7.7.1
+
+  '@commitlint/[email protected]':
+    dependencies:
+      '@commitlint/is-ignored': 19.8.0
+      '@commitlint/parse': 19.8.0
+      '@commitlint/rules': 19.8.0
+      '@commitlint/types': 19.8.0
+
+  '@commitlint/[email protected](@types/[email protected])([email protected])':
+    dependencies:
+      '@commitlint/config-validator': 19.8.0
+      '@commitlint/execute-rule': 19.8.0
+      '@commitlint/resolve-extends': 19.8.0
+      '@commitlint/types': 19.8.0
+      chalk: 5.4.1
+      cosmiconfig: 9.0.0([email protected])
+      cosmiconfig-typescript-loader: 6.1.0(@types/[email protected])([email protected]([email protected]))([email protected])
+      lodash.isplainobject: 4.0.6
+      lodash.merge: 4.6.2
+      lodash.uniq: 4.5.0
+    transitivePeerDependencies:
+      - '@types/node'
+      - typescript
+
+  '@commitlint/[email protected]': {}
+
+  '@commitlint/[email protected]':
+    dependencies:
+      '@commitlint/types': 19.8.0
+      conventional-changelog-angular: 7.0.0
+      conventional-commits-parser: 5.0.0
+
+  '@commitlint/[email protected]':
+    dependencies:
+      '@commitlint/top-level': 19.8.0
+      '@commitlint/types': 19.8.0
+      git-raw-commits: 4.0.0
+      minimist: 1.2.8
+      tinyexec: 0.3.2
+
+  '@commitlint/[email protected]':
+    dependencies:
+      '@commitlint/config-validator': 19.8.0
+      '@commitlint/types': 19.8.0
+      global-directory: 4.0.1
+      import-meta-resolve: 4.1.0
+      lodash.mergewith: 4.6.2
+      resolve-from: 5.0.0
+
+  '@commitlint/[email protected]':
+    dependencies:
+      '@commitlint/ensure': 19.8.0
+      '@commitlint/message': 19.8.0
+      '@commitlint/to-lines': 19.8.0
+      '@commitlint/types': 19.8.0
+
+  '@commitlint/[email protected]': {}
+
+  '@commitlint/[email protected]':
+    dependencies:
+      find-up: 7.0.0
+
+  '@commitlint/[email protected]':
+    dependencies:
+      '@types/conventional-commits-parser': 5.0.1
+      chalk: 5.4.1
+
+  '@csstools/[email protected](@csstools/[email protected])':
+    dependencies:
+      '@csstools/css-tokenizer': 2.4.1
+
+  '@csstools/[email protected]': {}
+
+  '@csstools/[email protected](@csstools/[email protected](@csstools/[email protected]))(@csstools/[email protected])':
+    dependencies:
+      '@csstools/css-parser-algorithms': 2.7.1(@csstools/[email protected])
+      '@csstools/css-tokenizer': 2.4.1
+
+  '@csstools/[email protected]([email protected])':
+    dependencies:
+      postcss-selector-parser: 7.1.0
+
+  '@csstools/[email protected]([email protected])':
+    dependencies:
+      postcss-selector-parser: 6.1.2
+
+  '@csstools/[email protected]([email protected])':
+    dependencies:
+      postcss-selector-parser: 7.1.0
+
+  '@emnapi/[email protected]':
+    dependencies:
+      '@emnapi/wasi-threads': 1.0.1
+      tslib: 2.8.1
+    optional: true
+
+  '@emnapi/[email protected]':
+    dependencies:
+      tslib: 2.8.1
+    optional: true
+
+  '@emnapi/[email protected]':
+    dependencies:
+      tslib: 2.8.1
+    optional: true
+
+  '@emotion/[email protected]': {}
+
+  '@emotion/[email protected]': {}
+
+  '@esbuild/[email protected]':
+    optional: true
+
+  '@esbuild/[email protected]':
+    optional: true
+
+  '@esbuild/[email protected]':
+    optional: true
+
+  '@esbuild/[email protected]':
+    optional: true
+
+  '@esbuild/[email protected]':
+    optional: true
+
+  '@esbuild/[email protected]':
+    optional: true
+
+  '@esbuild/[email protected]':
+    optional: true
+
+  '@esbuild/[email protected]':
+    optional: true
+
+  '@esbuild/[email protected]':
+    optional: true
+
+  '@esbuild/[email protected]':
+    optional: true
+
+  '@esbuild/[email protected]':
+    optional: true
+
+  '@esbuild/[email protected]':
+    optional: true
+
+  '@esbuild/[email protected]':
+    optional: true
+
+  '@esbuild/[email protected]':
+    optional: true
+
+  '@esbuild/[email protected]':
+    optional: true
+
+  '@esbuild/[email protected]':
+    optional: true
+
+  '@esbuild/[email protected]':
+    optional: true
+
+  '@esbuild/[email protected]':
+    optional: true
+
+  '@esbuild/[email protected]':
+    optional: true
+
+  '@esbuild/[email protected]':
+    optional: true
+
+  '@esbuild/[email protected]':
+    optional: true
+
+  '@esbuild/[email protected]':
+    optional: true
+
+  '@esbuild/[email protected]':
+    optional: true
+
+  '@esbuild/[email protected]':
+    optional: true
+
+  '@esbuild/[email protected]':
+    optional: true
+
+  '@eslint-community/[email protected]([email protected]([email protected]))':
+    dependencies:
+      eslint: 9.22.0([email protected])
+      eslint-visitor-keys: 3.4.3
+
+  '@eslint-community/[email protected]': {}
+
+  '@eslint/[email protected]':
+    dependencies:
+      '@eslint/object-schema': 2.1.6
+      debug: 4.4.0
+      minimatch: 3.1.2
+    transitivePeerDependencies:
+      - supports-color
+
+  '@eslint/[email protected]': {}
+
+  '@eslint/[email protected]':
+    dependencies:
+      '@types/json-schema': 7.0.15
+
+  '@eslint/[email protected]':
+    dependencies:
+      ajv: 6.12.6
+      debug: 4.4.0
+      espree: 10.3.0
+      globals: 14.0.0
+      ignore: 5.3.2
+      import-fresh: 3.3.1
+      js-yaml: 4.1.0
+      minimatch: 3.1.2
+      strip-json-comments: 3.1.1
+    transitivePeerDependencies:
+      - supports-color
+
+  '@eslint/[email protected]': {}
+
+  '@eslint/[email protected]': {}
+
+  '@eslint/[email protected]':
+    dependencies:
+      '@eslint/core': 0.12.0
+      levn: 0.4.1
+
+  '@firebase/[email protected](@firebase/[email protected])(@firebase/[email protected])':
+    dependencies:
+      '@firebase/analytics': 0.10.12(@firebase/[email protected])
+      '@firebase/analytics-types': 0.8.3
+      '@firebase/app-compat': 0.2.52
+      '@firebase/component': 0.6.13
+      '@firebase/util': 1.11.0
+      tslib: 2.8.1
+    transitivePeerDependencies:
+      - '@firebase/app'
+
+  '@firebase/[email protected]': {}
+
+  '@firebase/[email protected](@firebase/[email protected])':
+    dependencies:
+      '@firebase/app': 0.11.3
+      '@firebase/component': 0.6.13
+      '@firebase/installations': 0.6.13(@firebase/[email protected])
+      '@firebase/logger': 0.4.4
+      '@firebase/util': 1.11.0
+      tslib: 2.8.1
+
+  '@firebase/[email protected](@firebase/[email protected])(@firebase/[email protected])':
+    dependencies:
+      '@firebase/app-check': 0.8.13(@firebase/[email protected])
+      '@firebase/app-check-types': 0.5.3
+      '@firebase/app-compat': 0.2.52
+      '@firebase/component': 0.6.13
+      '@firebase/logger': 0.4.4
+      '@firebase/util': 1.11.0
+      tslib: 2.8.1
+    transitivePeerDependencies:
+      - '@firebase/app'
+
+  '@firebase/[email protected]': {}
+
+  '@firebase/[email protected]': {}
+
+  '@firebase/[email protected](@firebase/[email protected])':
+    dependencies:
+      '@firebase/app': 0.11.3
+      '@firebase/component': 0.6.13
+      '@firebase/logger': 0.4.4
+      '@firebase/util': 1.11.0
+      tslib: 2.8.1
+
+  '@firebase/[email protected]':
+    dependencies:
+      '@firebase/app': 0.11.3
+      '@firebase/component': 0.6.13
+      '@firebase/logger': 0.4.4
+      '@firebase/util': 1.11.0
+      tslib: 2.8.1
+
+  '@firebase/[email protected]': {}
+
+  '@firebase/[email protected]':
+    dependencies:
+      '@firebase/component': 0.6.13
+      '@firebase/logger': 0.4.4
+      '@firebase/util': 1.11.0
+      idb: 7.1.1
+      tslib: 2.8.1
+
+  '@firebase/[email protected](@firebase/[email protected])(@firebase/[email protected])(@firebase/[email protected])':
+    dependencies:
+      '@firebase/app-compat': 0.2.52
+      '@firebase/auth': 1.9.1(@firebase/[email protected])
+      '@firebase/auth-types': 0.13.0(@firebase/[email protected])(@firebase/[email protected])
+      '@firebase/component': 0.6.13
+      '@firebase/util': 1.11.0
+      tslib: 2.8.1
+    transitivePeerDependencies:
+      - '@firebase/app'
+      - '@firebase/app-types'
+      - '@react-native-async-storage/async-storage'
+
+  '@firebase/[email protected]': {}
+
+  '@firebase/[email protected](@firebase/[email protected])(@firebase/[email protected])':
+    dependencies:
+      '@firebase/app-types': 0.9.3
+      '@firebase/util': 1.11.0
+
+  '@firebase/[email protected](@firebase/[email protected])':
+    dependencies:
+      '@firebase/app': 0.11.3
+      '@firebase/component': 0.6.13
+      '@firebase/logger': 0.4.4
+      '@firebase/util': 1.11.0
+      tslib: 2.8.1
+
+  '@firebase/[email protected]':
+    dependencies:
+      '@firebase/util': 1.11.0
+      tslib: 2.8.1
+
+  '@firebase/[email protected](@firebase/[email protected])':
+    dependencies:
+      '@firebase/app': 0.11.3
+      '@firebase/auth-interop-types': 0.2.4
+      '@firebase/component': 0.6.13
+      '@firebase/logger': 0.4.4
+      '@firebase/util': 1.11.0
+      tslib: 2.8.1
+
+  '@firebase/[email protected]':
+    dependencies:
+      '@firebase/component': 0.6.13
+      '@firebase/database': 1.0.14
+      '@firebase/database-types': 1.0.10
+      '@firebase/logger': 0.4.4
+      '@firebase/util': 1.11.0
+      tslib: 2.8.1
+
+  '@firebase/[email protected]':
+    dependencies:
+      '@firebase/app-types': 0.9.3
+      '@firebase/util': 1.11.0
+
+  '@firebase/[email protected]':
+    dependencies:
+      '@firebase/app-check-interop-types': 0.3.3
+      '@firebase/auth-interop-types': 0.2.4
+      '@firebase/component': 0.6.13
+      '@firebase/logger': 0.4.4
+      '@firebase/util': 1.11.0
+      faye-websocket: 0.11.4
+      tslib: 2.8.1
+
+  '@firebase/[email protected](@firebase/[email protected])(@firebase/[email protected])(@firebase/[email protected])':
+    dependencies:
+      '@firebase/app-compat': 0.2.52
+      '@firebase/component': 0.6.13
+      '@firebase/firestore': 4.7.10(@firebase/[email protected])
+      '@firebase/firestore-types': 3.0.3(@firebase/[email protected])(@firebase/[email protected])
+      '@firebase/util': 1.11.0
+      tslib: 2.8.1
+    transitivePeerDependencies:
+      - '@firebase/app'
+      - '@firebase/app-types'
+
+  '@firebase/[email protected](@firebase/[email protected])(@firebase/[email protected])':
+    dependencies:
+      '@firebase/app-types': 0.9.3
+      '@firebase/util': 1.11.0
+
+  '@firebase/[email protected](@firebase/[email protected])':
+    dependencies:
+      '@firebase/app': 0.11.3
+      '@firebase/component': 0.6.13
+      '@firebase/logger': 0.4.4
+      '@firebase/util': 1.11.0
+      '@firebase/webchannel-wrapper': 1.0.3
+      '@grpc/grpc-js': 1.9.15
+      '@grpc/proto-loader': 0.7.13
+      tslib: 2.8.1
+
+  '@firebase/[email protected](@firebase/[email protected])(@firebase/[email protected])':
+    dependencies:
+      '@firebase/app-compat': 0.2.52
+      '@firebase/component': 0.6.13
+      '@firebase/functions': 0.12.3(@firebase/[email protected])
+      '@firebase/functions-types': 0.6.3
+      '@firebase/util': 1.11.0
+      tslib: 2.8.1
+    transitivePeerDependencies:
+      - '@firebase/app'
+
+  '@firebase/[email protected]': {}
+
+  '@firebase/[email protected](@firebase/[email protected])':
+    dependencies:
+      '@firebase/app': 0.11.3
+      '@firebase/app-check-interop-types': 0.3.3
+      '@firebase/auth-interop-types': 0.2.4
+      '@firebase/component': 0.6.13
+      '@firebase/messaging-interop-types': 0.2.3
+      '@firebase/util': 1.11.0
+      tslib: 2.8.1
+
+  '@firebase/[email protected](@firebase/[email protected])(@firebase/[email protected])(@firebase/[email protected])':
+    dependencies:
+      '@firebase/app-compat': 0.2.52
+      '@firebase/component': 0.6.13
+      '@firebase/installations': 0.6.13(@firebase/[email protected])
+      '@firebase/installations-types': 0.5.3(@firebase/[email protected])
+      '@firebase/util': 1.11.0
+      tslib: 2.8.1
+    transitivePeerDependencies:
+      - '@firebase/app'
+      - '@firebase/app-types'
+
+  '@firebase/[email protected](@firebase/[email protected])':
+    dependencies:
+      '@firebase/app-types': 0.9.3
+
+  '@firebase/[email protected](@firebase/[email protected])':
+    dependencies:
+      '@firebase/app': 0.11.3
+      '@firebase/component': 0.6.13
+      '@firebase/util': 1.11.0
+      idb: 7.1.1
+      tslib: 2.8.1
+
+  '@firebase/[email protected]':
+    dependencies:
+      tslib: 2.8.1
+
+  '@firebase/[email protected](@firebase/[email protected])(@firebase/[email protected])':
+    dependencies:
+      '@firebase/app-compat': 0.2.52
+      '@firebase/component': 0.6.13
+      '@firebase/messaging': 0.12.17(@firebase/[email protected])
+      '@firebase/util': 1.11.0
+      tslib: 2.8.1
+    transitivePeerDependencies:
+      - '@firebase/app'
+
+  '@firebase/[email protected]': {}
+
+  '@firebase/[email protected](@firebase/[email protected])':
+    dependencies:
+      '@firebase/app': 0.11.3
+      '@firebase/component': 0.6.13
+      '@firebase/installations': 0.6.13(@firebase/[email protected])
+      '@firebase/messaging-interop-types': 0.2.3
+      '@firebase/util': 1.11.0
+      idb: 7.1.1
+      tslib: 2.8.1
+
+  '@firebase/[email protected](@firebase/[email protected])(@firebase/[email protected])':
+    dependencies:
+      '@firebase/app-compat': 0.2.52
+      '@firebase/component': 0.6.13
+      '@firebase/logger': 0.4.4
+      '@firebase/performance': 0.7.2(@firebase/[email protected])
+      '@firebase/performance-types': 0.2.3
+      '@firebase/util': 1.11.0
+      tslib: 2.8.1
+    transitivePeerDependencies:
+      - '@firebase/app'
+
+  '@firebase/[email protected]': {}
+
+  '@firebase/[email protected](@firebase/[email protected])':
+    dependencies:
+      '@firebase/app': 0.11.3
+      '@firebase/component': 0.6.13
+      '@firebase/installations': 0.6.13(@firebase/[email protected])
+      '@firebase/logger': 0.4.4
+      '@firebase/util': 1.11.0
+      tslib: 2.8.1
+      web-vitals: 4.2.4
+
+  '@firebase/[email protected](@firebase/[email protected])(@firebase/[email protected])':
+    dependencies:
+      '@firebase/app-compat': 0.2.52
+      '@firebase/component': 0.6.13
+      '@firebase/logger': 0.4.4
+      '@firebase/remote-config': 0.6.0(@firebase/[email protected])
+      '@firebase/remote-config-types': 0.4.0
+      '@firebase/util': 1.11.0
+      tslib: 2.8.1
+    transitivePeerDependencies:
+      - '@firebase/app'
+
+  '@firebase/[email protected]': {}
+
+  '@firebase/[email protected](@firebase/[email protected])':
+    dependencies:
+      '@firebase/app': 0.11.3
+      '@firebase/component': 0.6.13
+      '@firebase/installations': 0.6.13(@firebase/[email protected])
+      '@firebase/logger': 0.4.4
+      '@firebase/util': 1.11.0
+      tslib: 2.8.1
+
+  '@firebase/[email protected](@firebase/[email protected])(@firebase/[email protected])(@firebase/[email protected])':
+    dependencies:
+      '@firebase/app-compat': 0.2.52
+      '@firebase/component': 0.6.13
+      '@firebase/storage': 0.13.7(@firebase/[email protected])
+      '@firebase/storage-types': 0.8.3(@firebase/[email protected])(@firebase/[email protected])
+      '@firebase/util': 1.11.0
+      tslib: 2.8.1
+    transitivePeerDependencies:
+      - '@firebase/app'
+      - '@firebase/app-types'
+
+  '@firebase/[email protected](@firebase/[email protected])(@firebase/[email protected])':
+    dependencies:
+      '@firebase/app-types': 0.9.3
+      '@firebase/util': 1.11.0
+
+  '@firebase/[email protected](@firebase/[email protected])':
+    dependencies:
+      '@firebase/app': 0.11.3
+      '@firebase/component': 0.6.13
+      '@firebase/util': 1.11.0
+      tslib: 2.8.1
+
+  '@firebase/[email protected]':
+    dependencies:
+      tslib: 2.8.1
+
+  '@firebase/[email protected](@firebase/[email protected])(@firebase/[email protected])':
+    dependencies:
+      '@firebase/app': 0.11.3
+      '@firebase/app-check-interop-types': 0.3.3
+      '@firebase/app-types': 0.9.3
+      '@firebase/component': 0.6.13
+      '@firebase/logger': 0.4.4
+      '@firebase/util': 1.11.0
+      tslib: 2.8.1
+
+  '@firebase/[email protected]': {}
+
+  '@grpc/[email protected]':
+    dependencies:
+      '@grpc/proto-loader': 0.7.13
+      '@types/node': 22.13.10
+
+  '@grpc/[email protected]':
+    dependencies:
+      lodash.camelcase: 4.3.0
+      long: 5.3.1
+      protobufjs: 7.4.0
+      yargs: 17.7.2
+
+  '@humanfs/[email protected]': {}
+
+  '@humanfs/[email protected]':
+    dependencies:
+      '@humanfs/core': 0.19.1
+      '@humanwhocodes/retry': 0.3.1
+
+  '@humanwhocodes/[email protected]': {}
+
+  '@humanwhocodes/[email protected]': {}
+
+  '@humanwhocodes/[email protected]': {}
+
+  '@iconify-icons/[email protected]':
+    dependencies:
+      '@iconify/types': 2.0.0
+
+  '@iconify-icons/[email protected]':
+    dependencies:
+      '@iconify/types': 2.0.0
+
+  '@iconify-icons/[email protected]':
+    dependencies:
+      '@iconify/types': 2.0.0
+
+  '@iconify-icons/[email protected]':
+    dependencies:
+      '@iconify/types': 2.0.0
+
+  '@iconify-icons/[email protected]':
+    dependencies:
+      '@iconify/types': 2.0.0
+
+  '@iconify-icons/[email protected]':
+    dependencies:
+      '@iconify/types': 2.0.0
+
+  '@iconify/[email protected]([email protected])':
+    dependencies:
+      '@iconify/types': 2.0.0
+      react: 18.3.1
+
+  '@iconify/[email protected]':
+    dependencies:
+      '@iconify/types': 2.0.0
+      '@iconify/utils': 2.3.0
+      '@types/tar': 6.1.13
+      axios: 1.8.4
+      cheerio: 1.0.0
+      domhandler: 5.0.3
+      extract-zip: 2.0.1
+      local-pkg: 0.5.1
+      pathe: 1.1.2
+      svgo: 3.3.2
+      tar: 6.2.1
+    transitivePeerDependencies:
+      - debug
+      - supports-color
+
+  '@iconify/[email protected]': {}
+
+  '@iconify/[email protected]':
+    dependencies:
+      '@antfu/install-pkg': 1.0.0
+      '@antfu/utils': 8.1.1
+      '@iconify/types': 2.0.0
+      debug: 4.4.0
+      globals: 15.15.0
+      kolorist: 1.8.0
+      local-pkg: 1.1.1
+      mlly: 1.7.4
+    transitivePeerDependencies:
+      - supports-color
+
+  '@isaacs/[email protected]':
+    dependencies:
+      string-width: 5.1.2
+      string-width-cjs: [email protected]
+      strip-ansi: 7.1.0
+      strip-ansi-cjs: [email protected]
+      wrap-ansi: 8.1.0
+      wrap-ansi-cjs: [email protected]
+
+  '@jridgewell/[email protected]':
+    dependencies:
+      '@jridgewell/set-array': 1.2.1
+      '@jridgewell/sourcemap-codec': 1.5.0
+      '@jridgewell/trace-mapping': 0.3.25
+
+  '@jridgewell/[email protected]': {}
+
+  '@jridgewell/[email protected]': {}
+
+  '@jridgewell/[email protected]': {}
+
+  '@jridgewell/[email protected]':
+    dependencies:
+      '@jridgewell/resolve-uri': 3.1.2
+      '@jridgewell/sourcemap-codec': 1.5.0
+
+  '@napi-rs/[email protected]':
+    dependencies:
+      '@emnapi/core': 1.3.1
+      '@emnapi/runtime': 1.3.1
+      '@tybys/wasm-util': 0.9.0
+    optional: true
+
+  '@nodelib/[email protected]':
+    dependencies:
+      '@nodelib/fs.stat': 2.0.5
+      run-parallel: 1.2.0
+
+  '@nodelib/[email protected]': {}
+
+  '@nodelib/[email protected]':
+    dependencies:
+      '@nodelib/fs.scandir': 2.1.5
+      fastq: 1.19.1
+
+  '@parcel/[email protected]':
+    optional: true
+
+  '@parcel/[email protected]':
+    optional: true
+
+  '@parcel/[email protected]':
+    optional: true
+
+  '@parcel/[email protected]':
+    optional: true
+
+  '@parcel/[email protected]':
+    optional: true
+
+  '@parcel/[email protected]':
+    optional: true
+
+  '@parcel/[email protected]':
+    optional: true
+
+  '@parcel/[email protected]':
+    optional: true
+
+  '@parcel/[email protected]':
+    optional: true
+
+  '@parcel/[email protected]':
+    optional: true
+
+  '@parcel/[email protected]':
+    optional: true
+
+  '@parcel/[email protected]':
+    optional: true
+
+  '@parcel/[email protected]':
+    optional: true
+
+  '@parcel/[email protected]':
+    dependencies:
+      detect-libc: 1.0.3
+      is-glob: 4.0.3
+      micromatch: 4.0.8
+      node-addon-api: 7.1.1
+    optionalDependencies:
+      '@parcel/watcher-android-arm64': 2.5.1
+      '@parcel/watcher-darwin-arm64': 2.5.1
+      '@parcel/watcher-darwin-x64': 2.5.1
+      '@parcel/watcher-freebsd-x64': 2.5.1
+      '@parcel/watcher-linux-arm-glibc': 2.5.1
+      '@parcel/watcher-linux-arm-musl': 2.5.1
+      '@parcel/watcher-linux-arm64-glibc': 2.5.1
+      '@parcel/watcher-linux-arm64-musl': 2.5.1
+      '@parcel/watcher-linux-x64-glibc': 2.5.1
+      '@parcel/watcher-linux-x64-musl': 2.5.1
+      '@parcel/watcher-win32-arm64': 2.5.1
+      '@parcel/watcher-win32-ia32': 2.5.1
+      '@parcel/watcher-win32-x64': 2.5.1
+    optional: true
+
+  '@pkgjs/[email protected]':
+    optional: true
+
+  '@protobufjs/[email protected]': {}
+
+  '@protobufjs/[email protected]': {}
+
+  '@protobufjs/[email protected]': {}
+
+  '@protobufjs/[email protected]': {}
+
+  '@protobufjs/[email protected]':
+    dependencies:
+      '@protobufjs/aspromise': 1.1.2
+      '@protobufjs/inquire': 1.1.0
+
+  '@protobufjs/[email protected]': {}
+
+  '@protobufjs/[email protected]': {}
+
+  '@protobufjs/[email protected]': {}
+
+  '@protobufjs/[email protected]': {}
+
+  '@protobufjs/[email protected]': {}
+
+  '@rc-component/[email protected]':
+    dependencies:
+      '@babel/runtime': 7.26.10
+
+  '@rc-component/[email protected]([email protected]([email protected]))([email protected])':
+    dependencies:
+      '@ant-design/fast-color': 2.0.6
+      '@babel/runtime': 7.26.10
+      classnames: 2.5.1
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  '@rc-component/[email protected]([email protected]([email protected]))([email protected])':
+    dependencies:
+      '@babel/runtime': 7.26.10
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  '@rc-component/[email protected]':
+    dependencies:
+      '@babel/runtime': 7.26.10
+
+  '@rc-component/[email protected]([email protected]([email protected]))([email protected])':
+    dependencies:
+      '@babel/runtime': 7.26.10
+      classnames: 2.5.1
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  '@rc-component/[email protected]([email protected]([email protected]))([email protected])':
+    dependencies:
+      '@babel/runtime': 7.26.10
+      classnames: 2.5.1
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  '@rc-component/[email protected]([email protected]([email protected]))([email protected])':
+    dependencies:
+      '@babel/runtime': 7.26.10
+      classnames: 2.5.1
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  '@rc-component/[email protected]([email protected]([email protected]))([email protected])':
+    dependencies:
+      '@babel/runtime': 7.26.10
+      '@rc-component/portal': 1.1.2([email protected]([email protected]))([email protected])
+      '@rc-component/trigger': 2.2.6([email protected]([email protected]))([email protected])
+      classnames: 2.5.1
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  '@rc-component/[email protected]([email protected]([email protected]))([email protected])':
+    dependencies:
+      '@babel/runtime': 7.26.10
+      '@rc-component/portal': 1.1.2([email protected]([email protected]))([email protected])
+      classnames: 2.5.1
+      rc-motion: 2.9.5([email protected]([email protected]))([email protected])
+      rc-resize-observer: 1.4.3([email protected]([email protected]))([email protected])
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  '@rollup/[email protected]':
+    dependencies:
+      estree-walker: 2.0.2
+      picomatch: 2.3.1
+
+  '@rollup/[email protected]':
+    optional: true
+
+  '@rollup/[email protected]':
+    optional: true
+
+  '@rollup/[email protected]':
+    optional: true
+
+  '@rollup/[email protected]':
+    optional: true
+
+  '@rollup/[email protected]':
+    optional: true
+
+  '@rollup/[email protected]':
+    optional: true
+
+  '@rollup/[email protected]':
+    optional: true
+
+  '@rollup/[email protected]':
+    optional: true
+
+  '@rollup/[email protected]':
+    optional: true
+
+  '@rollup/[email protected]':
+    optional: true
+
+  '@rollup/[email protected]':
+    optional: true
+
+  '@rollup/[email protected]':
+    optional: true
+
+  '@rollup/[email protected]':
+    optional: true
+
+  '@rollup/[email protected]':
+    optional: true
+
+  '@rollup/[email protected]':
+    optional: true
+
+  '@rollup/[email protected]':
+    optional: true
+
+  '@rollup/[email protected]':
+    optional: true
+
+  '@rollup/[email protected]':
+    optional: true
+
+  '@rollup/[email protected]':
+    optional: true
+
+  '@rtsao/[email protected]': {}
+
+  '@trysound/[email protected]': {}
+
+  '@tybys/[email protected]':
+    dependencies:
+      tslib: 2.8.1
+    optional: true
+
+  '@types/[email protected]':
+    dependencies:
+      '@babel/parser': 7.26.10
+      '@babel/types': 7.26.10
+      '@types/babel__generator': 7.6.8
+      '@types/babel__template': 7.4.4
+      '@types/babel__traverse': 7.20.6
+
+  '@types/[email protected]':
+    dependencies:
+      '@babel/types': 7.26.10
+
+  '@types/[email protected]':
+    dependencies:
+      '@babel/parser': 7.26.10
+      '@babel/types': 7.26.10
+
+  '@types/[email protected]':
+    dependencies:
+      '@babel/types': 7.26.10
+
+  '@types/[email protected]':
+    dependencies:
+      '@types/node': 22.13.10
+
+  '@types/[email protected]': {}
+
+  '@types/[email protected]': {}
+
+  '@types/[email protected]': {}
+
+  '@types/[email protected]': {}
+
+  '@types/[email protected]': {}
+
+  '@types/[email protected]': {}
+
+  '@types/[email protected]': {}
+
+  '@types/[email protected]':
+    dependencies:
+      '@types/lodash': 4.17.16
+
+  '@types/[email protected]': {}
+
+  '@types/[email protected]': {}
+
+  '@types/[email protected]':
+    dependencies:
+      undici-types: 6.20.0
+
+  '@types/[email protected]': {}
+
+  '@types/[email protected]': {}
+
+  '@types/[email protected]': {}
+
+  '@types/[email protected]':
+    dependencies:
+      types-ramda: 0.30.1
+
+  '@types/[email protected](@types/[email protected])':
+    dependencies:
+      '@types/react': 18.3.19
+
+  '@types/[email protected]':
+    dependencies:
+      '@types/prop-types': 15.7.14
+      csstype: 3.1.3
+
+  '@types/[email protected]':
+    dependencies:
+      '@types/node': 22.13.10
+      minipass: 4.2.8
+
+  '@types/[email protected]': {}
+
+  '@types/[email protected]':
+    dependencies:
+      '@types/node': 22.13.10
+    optional: true
+
+  '@typescript-eslint/[email protected](@typescript-eslint/[email protected]([email protected]([email protected]))([email protected]))([email protected]([email protected]))([email protected])':
+    dependencies:
+      '@eslint-community/regexpp': 4.12.1
+      '@typescript-eslint/parser': 8.27.0([email protected]([email protected]))([email protected])
+      '@typescript-eslint/scope-manager': 8.27.0
+      '@typescript-eslint/type-utils': 8.27.0([email protected]([email protected]))([email protected])
+      '@typescript-eslint/utils': 8.27.0([email protected]([email protected]))([email protected])
+      '@typescript-eslint/visitor-keys': 8.27.0
+      eslint: 9.22.0([email protected])
+      graphemer: 1.4.0
+      ignore: 5.3.2
+      natural-compare: 1.4.0
+      ts-api-utils: 2.0.1([email protected])
+      typescript: 5.7.3
+    transitivePeerDependencies:
+      - supports-color
+
+  '@typescript-eslint/[email protected]([email protected]([email protected]))([email protected])':
+    dependencies:
+      '@typescript-eslint/scope-manager': 8.27.0
+      '@typescript-eslint/types': 8.27.0
+      '@typescript-eslint/typescript-estree': 8.27.0([email protected])
+      '@typescript-eslint/visitor-keys': 8.27.0
+      debug: 4.4.0
+      eslint: 9.22.0([email protected])
+      typescript: 5.7.3
+    transitivePeerDependencies:
+      - supports-color
+
+  '@typescript-eslint/[email protected]':
+    dependencies:
+      '@typescript-eslint/types': 8.27.0
+      '@typescript-eslint/visitor-keys': 8.27.0
+
+  '@typescript-eslint/[email protected]([email protected]([email protected]))([email protected])':
+    dependencies:
+      '@typescript-eslint/typescript-estree': 8.27.0([email protected])
+      '@typescript-eslint/utils': 8.27.0([email protected]([email protected]))([email protected])
+      debug: 4.4.0
+      eslint: 9.22.0([email protected])
+      ts-api-utils: 2.0.1([email protected])
+      typescript: 5.7.3
+    transitivePeerDependencies:
+      - supports-color
+
+  '@typescript-eslint/[email protected]': {}
+
+  '@typescript-eslint/[email protected]([email protected])':
+    dependencies:
+      '@typescript-eslint/types': 8.27.0
+      '@typescript-eslint/visitor-keys': 8.27.0
+      debug: 4.4.0
+      fast-glob: 3.3.3
+      is-glob: 4.0.3
+      minimatch: 9.0.5
+      semver: 7.7.1
+      ts-api-utils: 2.0.1([email protected])
+      typescript: 5.7.3
+    transitivePeerDependencies:
+      - supports-color
+
+  '@typescript-eslint/[email protected]([email protected]([email protected]))([email protected])':
+    dependencies:
+      '@eslint-community/eslint-utils': 4.5.1([email protected]([email protected]))
+      '@typescript-eslint/scope-manager': 8.27.0
+      '@typescript-eslint/types': 8.27.0
+      '@typescript-eslint/typescript-estree': 8.27.0([email protected])
+      eslint: 9.22.0([email protected])
+      typescript: 5.7.3
+    transitivePeerDependencies:
+      - supports-color
+
+  '@typescript-eslint/[email protected]':
+    dependencies:
+      '@typescript-eslint/types': 8.27.0
+      eslint-visitor-keys: 4.2.0
+
+  '@unrs/[email protected]':
+    optional: true
+
+  '@unrs/[email protected]':
+    optional: true
+
+  '@unrs/[email protected]':
+    optional: true
+
+  '@unrs/[email protected]':
+    optional: true
+
+  '@unrs/[email protected]':
+    optional: true
+
+  '@unrs/[email protected]':
+    optional: true
+
+  '@unrs/[email protected]':
+    optional: true
+
+  '@unrs/[email protected]':
+    optional: true
+
+  '@unrs/[email protected]':
+    dependencies:
+      '@napi-rs/wasm-runtime': 0.2.7
+    optional: true
+
+  '@unrs/[email protected]':
+    optional: true
+
+  '@unrs/[email protected]':
+    optional: true
+
+  '@vitejs/[email protected]([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected]))':
+    dependencies:
+      '@babel/core': 7.26.10
+      '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/[email protected])
+      '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/[email protected])
+      '@types/babel__core': 7.20.5
+      react-refresh: 0.14.2
+      vite: 6.2.2(@types/[email protected])([email protected])([email protected])([email protected])([email protected])
+    transitivePeerDependencies:
+      - supports-color
+
+  [email protected]:
+    dependencies:
+      jsonparse: 1.3.1
+      through: 2.3.8
+
+  [email protected]([email protected]):
+    dependencies:
+      acorn: 8.14.1
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      fast-deep-equal: 3.1.3
+      fast-json-stable-stringify: 2.1.0
+      json-schema-traverse: 0.4.1
+      uri-js: 4.4.1
+
+  [email protected]:
+    dependencies:
+      fast-deep-equal: 3.1.3
+      fast-uri: 3.0.6
+      json-schema-traverse: 1.0.0
+      require-from-string: 2.0.2
+
+  [email protected]:
+    dependencies:
+      string-width: 4.2.3
+
+  [email protected]:
+    dependencies:
+      environment: 1.1.0
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      color-convert: 2.0.1
+
+  [email protected]: {}
+
+  [email protected]([email protected])([email protected])([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@ant-design/colors': 7.2.0
+      '@ant-design/cssinjs': 1.23.0([email protected]([email protected]))([email protected])
+      '@ant-design/cssinjs-utils': 1.1.3([email protected]([email protected]))([email protected])
+      '@ant-design/fast-color': 2.0.6
+      '@ant-design/icons': 5.6.1([email protected]([email protected]))([email protected])
+      '@ant-design/react-slick': 1.1.2([email protected])
+      '@babel/runtime': 7.26.10
+      '@rc-component/color-picker': 2.0.1([email protected]([email protected]))([email protected])
+      '@rc-component/mutate-observer': 1.1.0([email protected]([email protected]))([email protected])
+      '@rc-component/qrcode': 1.0.0([email protected]([email protected]))([email protected])
+      '@rc-component/tour': 1.15.1([email protected]([email protected]))([email protected])
+      '@rc-component/trigger': 2.2.6([email protected]([email protected]))([email protected])
+      classnames: 2.5.1
+      copy-to-clipboard: 3.3.3
+      dayjs: 1.11.13
+      rc-cascader: 3.33.1([email protected]([email protected]))([email protected])
+      rc-checkbox: 3.5.0([email protected]([email protected]))([email protected])
+      rc-collapse: 3.9.0([email protected]([email protected]))([email protected])
+      rc-dialog: 9.6.0([email protected]([email protected]))([email protected])
+      rc-drawer: 7.2.0([email protected]([email protected]))([email protected])
+      rc-dropdown: 4.2.1([email protected]([email protected]))([email protected])
+      rc-field-form: 2.7.0([email protected]([email protected]))([email protected])
+      rc-image: 7.11.1([email protected]([email protected]))([email protected])
+      rc-input: 1.7.3([email protected]([email protected]))([email protected])
+      rc-input-number: 9.4.0([email protected]([email protected]))([email protected])
+      rc-mentions: 2.19.1([email protected]([email protected]))([email protected])
+      rc-menu: 9.16.1([email protected]([email protected]))([email protected])
+      rc-motion: 2.9.5([email protected]([email protected]))([email protected])
+      rc-notification: 5.6.3([email protected]([email protected]))([email protected])
+      rc-pagination: 5.1.0([email protected]([email protected]))([email protected])
+      rc-picker: 4.11.3([email protected])([email protected])([email protected])([email protected]([email protected]))([email protected])
+      rc-progress: 4.0.0([email protected]([email protected]))([email protected])
+      rc-rate: 2.13.1([email protected]([email protected]))([email protected])
+      rc-resize-observer: 1.4.3([email protected]([email protected]))([email protected])
+      rc-segmented: 2.7.0([email protected]([email protected]))([email protected])
+      rc-select: 14.16.6([email protected]([email protected]))([email protected])
+      rc-slider: 11.1.8([email protected]([email protected]))([email protected])
+      rc-steps: 6.0.1([email protected]([email protected]))([email protected])
+      rc-switch: 4.1.0([email protected]([email protected]))([email protected])
+      rc-table: 7.50.4([email protected]([email protected]))([email protected])
+      rc-tabs: 15.5.1([email protected]([email protected]))([email protected])
+      rc-textarea: 1.9.0([email protected]([email protected]))([email protected])
+      rc-tooltip: 6.4.0([email protected]([email protected]))([email protected])
+      rc-tree: 5.13.1([email protected]([email protected]))([email protected])
+      rc-tree-select: 5.27.0([email protected]([email protected]))([email protected])
+      rc-upload: 4.8.1([email protected]([email protected]))([email protected])
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+      scroll-into-view-if-needed: 3.1.0
+      throttle-debounce: 5.0.2
+    transitivePeerDependencies:
+      - date-fns
+      - luxon
+      - moment
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      normalize-path: 3.0.0
+      picomatch: 2.3.1
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      call-bound: 1.0.4
+      is-array-buffer: 3.0.5
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+      es-object-atoms: 1.1.1
+      get-intrinsic: 1.3.0
+      is-string: 1.1.1
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+      es-errors: 1.3.0
+      es-object-atoms: 1.1.1
+      es-shim-unscopables: 1.1.0
+
+  [email protected]:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+      es-errors: 1.3.0
+      es-object-atoms: 1.1.1
+      es-shim-unscopables: 1.1.0
+
+  [email protected]:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+      es-shim-unscopables: 1.1.0
+
+  [email protected]:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+      es-shim-unscopables: 1.1.0
+
+  [email protected]:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+      es-errors: 1.3.0
+      es-shim-unscopables: 1.1.0
+
+  [email protected]:
+    dependencies:
+      array-buffer-byte-length: 1.0.2
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+      es-errors: 1.3.0
+      get-intrinsic: 1.3.0
+      is-array-buffer: 3.0.5
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]([email protected]):
+    dependencies:
+      browserslist: 4.24.4
+      caniuse-lite: 1.0.30001706
+      fraction.js: 4.3.7
+      normalize-range: 0.1.2
+      picocolors: 1.1.1
+      postcss: 8.4.35
+      postcss-value-parser: 4.2.0
+
+  [email protected]:
+    dependencies:
+      possible-typed-array-names: 1.1.0
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      follow-redirects: 1.15.9
+      form-data: 4.0.2
+      proxy-from-env: 1.1.0
+    transitivePeerDependencies:
+      - debug
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      ansi-align: 3.0.1
+      camelcase: 8.0.0
+      chalk: 5.4.1
+      cli-boxes: 3.0.0
+      string-width: 7.2.0
+      type-fest: 4.37.0
+      widest-line: 5.0.0
+      wrap-ansi: 9.0.0
+
+  [email protected]:
+    dependencies:
+      balanced-match: 1.0.2
+      concat-map: 0.0.1
+
+  [email protected]:
+    dependencies:
+      balanced-match: 1.0.2
+
+  [email protected]:
+    dependencies:
+      fill-range: 7.1.1
+
+  [email protected]:
+    dependencies:
+      caniuse-lite: 1.0.30001706
+      electron-to-chromium: 1.5.120
+      node-releases: 2.0.19
+      update-browserslist-db: 1.1.3([email protected])
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      es-errors: 1.3.0
+      function-bind: 1.1.2
+
+  [email protected]:
+    dependencies:
+      call-bind-apply-helpers: 1.0.2
+      es-define-property: 1.0.1
+      get-intrinsic: 1.3.0
+      set-function-length: 1.2.2
+
+  [email protected]:
+    dependencies:
+      call-bind-apply-helpers: 1.0.2
+      get-intrinsic: 1.3.0
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      pascal-case: 3.1.2
+      tslib: 2.8.1
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      camelcase: 6.3.0
+      map-obj: 4.3.0
+      quick-lru: 5.1.1
+      type-fest: 1.4.0
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      no-case: 3.0.4
+      tslib: 2.8.1
+      upper-case-first: 2.0.2
+
+  [email protected]:
+    dependencies:
+      ansi-styles: 4.3.0
+      supports-color: 7.2.0
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      camel-case: 4.1.2
+      capital-case: 1.0.4
+      constant-case: 3.0.4
+      dot-case: 3.0.4
+      header-case: 2.0.4
+      no-case: 3.0.4
+      param-case: 3.0.4
+      pascal-case: 3.1.2
+      path-case: 3.0.4
+      sentence-case: 3.0.4
+      snake-case: 3.0.4
+      tslib: 2.8.1
+
+  [email protected]:
+    dependencies:
+      boolbase: 1.0.0
+      css-select: 5.1.0
+      css-what: 6.1.0
+      domelementtype: 2.3.0
+      domhandler: 5.0.3
+      domutils: 3.2.2
+
+  [email protected]:
+    dependencies:
+      cheerio-select: 2.1.0
+      dom-serializer: 2.0.0
+      domhandler: 5.0.3
+      domutils: 3.2.2
+      encoding-sniffer: 0.2.0
+      htmlparser2: 9.1.0
+      parse5: 7.2.1
+      parse5-htmlparser2-tree-adapter: 7.1.0
+      parse5-parser-stream: 7.1.2
+      undici: 6.21.2
+      whatwg-mimetype: 4.0.0
+
+  [email protected]:
+    dependencies:
+      anymatch: 3.1.3
+      braces: 3.0.3
+      glob-parent: 5.1.2
+      is-binary-path: 2.1.0
+      is-glob: 4.0.3
+      normalize-path: 3.0.0
+      readdirp: 3.6.0
+    optionalDependencies:
+      fsevents: 2.3.3
+
+  [email protected]:
+    dependencies:
+      readdirp: 4.1.2
+    optional: true
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      restore-cursor: 5.1.0
+
+  [email protected]:
+    dependencies:
+      slice-ansi: 5.0.0
+      string-width: 7.2.0
+
+  [email protected]:
+    dependencies:
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+      wrap-ansi: 7.0.0
+
+  [email protected]:
+    dependencies:
+      color-name: 1.1.4
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      delayed-stream: 1.0.0
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      array-ify: 1.0.0
+      dot-prop: 5.3.0
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      no-case: 3.0.4
+      tslib: 2.8.1
+      upper-case: 2.0.2
+
+  [email protected]:
+    dependencies:
+      compare-func: 2.0.0
+
+  [email protected]:
+    dependencies:
+      compare-func: 2.0.0
+
+  [email protected]:
+    dependencies:
+      JSONStream: 1.3.5
+      is-text-path: 2.0.0
+      meow: 12.1.1
+      split2: 4.2.0
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      is-what: 3.14.1
+
+  [email protected]:
+    dependencies:
+      toggle-selection: 1.0.6
+
+  [email protected](@types/[email protected])([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@types/node': 22.13.10
+      cosmiconfig: 9.0.0([email protected])
+      jiti: 2.4.2
+      typescript: 5.7.3
+
+  [email protected]([email protected]):
+    dependencies:
+      import-fresh: 3.3.1
+      js-yaml: 4.1.0
+      parse-json: 5.2.0
+      path-type: 4.0.0
+    optionalDependencies:
+      typescript: 5.7.3
+
+  [email protected]([email protected]):
+    dependencies:
+      env-paths: 2.2.1
+      import-fresh: 3.3.1
+      js-yaml: 4.1.0
+      parse-json: 5.2.0
+    optionalDependencies:
+      typescript: 5.7.3
+
+  [email protected]:
+    dependencies:
+      cross-spawn: 7.0.6
+
+  [email protected]:
+    dependencies:
+      path-key: 3.1.1
+      shebang-command: 2.0.0
+      which: 2.0.2
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      boolbase: 1.0.0
+      css-what: 6.1.0
+      domhandler: 5.0.3
+      domutils: 3.2.2
+      nth-check: 2.1.1
+
+  [email protected]:
+    dependencies:
+      mdn-data: 2.0.28
+      source-map-js: 1.2.1
+
+  [email protected]:
+    dependencies:
+      mdn-data: 2.0.30
+      source-map-js: 1.2.1
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      css-tree: 2.2.1
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      is-data-view: 1.0.2
+
+  [email protected]:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      is-data-view: 1.0.2
+
+  [email protected]:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      is-data-view: 1.0.2
+
+  [email protected]:
+    dependencies:
+      '@babel/runtime': 7.26.10
+    optional: true
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      ms: 2.1.3
+
+  [email protected]:
+    dependencies:
+      ms: 2.1.3
+
+  [email protected]:
+    dependencies:
+      decamelize: 1.2.0
+      map-obj: 1.0.1
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      es-define-property: 1.0.1
+      es-errors: 1.3.0
+      gopd: 1.2.0
+
+  [email protected]:
+    dependencies:
+      define-data-property: 1.1.4
+      has-property-descriptors: 1.0.2
+      object-keys: 1.1.1
+
+  [email protected]: {}
+
+  [email protected]:
+    optional: true
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      path-type: 4.0.0
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      esutils: 2.0.3
+
+  [email protected]:
+    dependencies:
+      domelementtype: 2.3.0
+      domhandler: 5.0.3
+      entities: 4.5.0
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      domelementtype: 2.3.0
+
+  [email protected]:
+    dependencies:
+      dom-serializer: 2.0.0
+      domelementtype: 2.3.0
+      domhandler: 5.0.3
+
+  [email protected]:
+    dependencies:
+      no-case: 3.0.4
+      tslib: 2.8.1
+
+  [email protected]:
+    dependencies:
+      is-obj: 2.0.0
+
+  [email protected]:
+    dependencies:
+      call-bind-apply-helpers: 1.0.2
+      es-errors: 1.3.0
+      gopd: 1.2.0
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      iconv-lite: 0.6.3
+      whatwg-encoding: 3.1.1
+
+  [email protected]:
+    dependencies:
+      once: 1.4.0
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      prr: 1.0.1
+    optional: true
+
+  [email protected]:
+    dependencies:
+      is-arrayish: 0.2.1
+
+  [email protected]:
+    dependencies:
+      array-buffer-byte-length: 1.0.2
+      arraybuffer.prototype.slice: 1.0.4
+      available-typed-arrays: 1.0.7
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      data-view-buffer: 1.0.2
+      data-view-byte-length: 1.0.2
+      data-view-byte-offset: 1.0.1
+      es-define-property: 1.0.1
+      es-errors: 1.3.0
+      es-object-atoms: 1.1.1
+      es-set-tostringtag: 2.1.0
+      es-to-primitive: 1.3.0
+      function.prototype.name: 1.1.8
+      get-intrinsic: 1.3.0
+      get-proto: 1.0.1
+      get-symbol-description: 1.1.0
+      globalthis: 1.0.4
+      gopd: 1.2.0
+      has-property-descriptors: 1.0.2
+      has-proto: 1.2.0
+      has-symbols: 1.1.0
+      hasown: 2.0.2
+      internal-slot: 1.1.0
+      is-array-buffer: 3.0.5
+      is-callable: 1.2.7
+      is-data-view: 1.0.2
+      is-regex: 1.2.1
+      is-shared-array-buffer: 1.0.4
+      is-string: 1.1.1
+      is-typed-array: 1.1.15
+      is-weakref: 1.1.1
+      math-intrinsics: 1.1.0
+      object-inspect: 1.13.4
+      object-keys: 1.1.1
+      object.assign: 4.1.7
+      own-keys: 1.0.1
+      regexp.prototype.flags: 1.5.4
+      safe-array-concat: 1.1.3
+      safe-push-apply: 1.0.0
+      safe-regex-test: 1.1.0
+      set-proto: 1.0.0
+      string.prototype.trim: 1.2.10
+      string.prototype.trimend: 1.0.9
+      string.prototype.trimstart: 1.0.8
+      typed-array-buffer: 1.0.3
+      typed-array-byte-length: 1.0.3
+      typed-array-byte-offset: 1.0.4
+      typed-array-length: 1.0.7
+      unbox-primitive: 1.1.0
+      which-typed-array: 1.1.19
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+      es-errors: 1.3.0
+      es-set-tostringtag: 2.1.0
+      function-bind: 1.1.2
+      get-intrinsic: 1.3.0
+      globalthis: 1.0.4
+      gopd: 1.2.0
+      has-property-descriptors: 1.0.2
+      has-proto: 1.2.0
+      has-symbols: 1.1.0
+      internal-slot: 1.1.0
+      iterator.prototype: 1.1.5
+      safe-array-concat: 1.1.3
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      es-errors: 1.3.0
+
+  [email protected]:
+    dependencies:
+      es-errors: 1.3.0
+      get-intrinsic: 1.3.0
+      has-tostringtag: 1.0.2
+      hasown: 2.0.2
+
+  [email protected]:
+    dependencies:
+      hasown: 2.0.2
+
+  [email protected]:
+    dependencies:
+      is-callable: 1.2.7
+      is-date-object: 1.1.0
+      is-symbol: 1.1.1
+
+  [email protected]:
+    optionalDependencies:
+      '@esbuild/aix-ppc64': 0.25.1
+      '@esbuild/android-arm': 0.25.1
+      '@esbuild/android-arm64': 0.25.1
+      '@esbuild/android-x64': 0.25.1
+      '@esbuild/darwin-arm64': 0.25.1
+      '@esbuild/darwin-x64': 0.25.1
+      '@esbuild/freebsd-arm64': 0.25.1
+      '@esbuild/freebsd-x64': 0.25.1
+      '@esbuild/linux-arm': 0.25.1
+      '@esbuild/linux-arm64': 0.25.1
+      '@esbuild/linux-ia32': 0.25.1
+      '@esbuild/linux-loong64': 0.25.1
+      '@esbuild/linux-mips64el': 0.25.1
+      '@esbuild/linux-ppc64': 0.25.1
+      '@esbuild/linux-riscv64': 0.25.1
+      '@esbuild/linux-s390x': 0.25.1
+      '@esbuild/linux-x64': 0.25.1
+      '@esbuild/netbsd-arm64': 0.25.1
+      '@esbuild/netbsd-x64': 0.25.1
+      '@esbuild/openbsd-arm64': 0.25.1
+      '@esbuild/openbsd-x64': 0.25.1
+      '@esbuild/sunos-x64': 0.25.1
+      '@esbuild/win32-arm64': 0.25.1
+      '@esbuild/win32-ia32': 0.25.1
+      '@esbuild/win32-x64': 0.25.1
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      debug: 3.2.7
+      is-core-module: 2.16.1
+      resolve: 1.22.10
+    transitivePeerDependencies:
+      - supports-color
+
+  [email protected]([email protected])([email protected]([email protected])):
+    dependencies:
+      debug: 4.4.0
+      eslint: 9.22.0([email protected])
+      get-tsconfig: 4.10.0
+      rspack-resolver: 1.2.2
+      stable-hash: 0.0.5
+      tinyglobby: 0.2.12
+    optionalDependencies:
+      eslint-plugin-import: 2.31.0(@typescript-eslint/[email protected]([email protected]([email protected]))([email protected]))([email protected])([email protected]([email protected]))
+    transitivePeerDependencies:
+      - supports-color
+
+  [email protected](@typescript-eslint/[email protected]([email protected]([email protected]))([email protected]))([email protected])([email protected])([email protected]([email protected])):
+    dependencies:
+      debug: 3.2.7
+    optionalDependencies:
+      '@typescript-eslint/parser': 8.27.0([email protected]([email protected]))([email protected])
+      eslint: 9.22.0([email protected])
+      eslint-import-resolver-node: 0.3.9
+      eslint-import-resolver-typescript: 4.2.2([email protected])([email protected]([email protected]))
+    transitivePeerDependencies:
+      - supports-color
+
+  [email protected](@typescript-eslint/[email protected]([email protected]([email protected]))([email protected]))([email protected])([email protected]([email protected])):
+    dependencies:
+      '@rtsao/scc': 1.1.0
+      array-includes: 3.1.8
+      array.prototype.findlastindex: 1.2.6
+      array.prototype.flat: 1.3.3
+      array.prototype.flatmap: 1.3.3
+      debug: 3.2.7
+      doctrine: 2.1.0
+      eslint: 9.22.0([email protected])
+      eslint-import-resolver-node: 0.3.9
+      eslint-module-utils: 2.12.0(@typescript-eslint/[email protected]([email protected]([email protected]))([email protected]))([email protected])([email protected])([email protected]([email protected]))
+      hasown: 2.0.2
+      is-core-module: 2.16.1
+      is-glob: 4.0.3
+      minimatch: 3.1.2
+      object.fromentries: 2.0.8
+      object.groupby: 1.0.3
+      object.values: 1.2.1
+      semver: 6.3.1
+      string.prototype.trimend: 1.0.9
+      tsconfig-paths: 3.15.0
+    optionalDependencies:
+      '@typescript-eslint/parser': 8.27.0([email protected]([email protected]))([email protected])
+    transitivePeerDependencies:
+      - eslint-import-resolver-typescript
+      - eslint-import-resolver-webpack
+      - supports-color
+
+  [email protected]([email protected]([email protected])):
+    dependencies:
+      aria-query: 5.3.2
+      array-includes: 3.1.8
+      array.prototype.flatmap: 1.3.3
+      ast-types-flow: 0.0.8
+      axe-core: 4.10.3
+      axobject-query: 4.1.0
+      damerau-levenshtein: 1.0.8
+      emoji-regex: 9.2.2
+      eslint: 9.22.0([email protected])
+      hasown: 2.0.2
+      jsx-ast-utils: 3.3.5
+      language-tags: 1.0.9
+      minimatch: 3.1.2
+      object.fromentries: 2.0.8
+      safe-regex-test: 1.1.0
+      string.prototype.includes: 2.0.1
+
+  [email protected]([email protected]([email protected])):
+    dependencies:
+      eslint: 9.22.0([email protected])
+
+  [email protected]([email protected]([email protected])):
+    dependencies:
+      eslint: 9.22.0([email protected])
+
+  [email protected]([email protected]([email protected])):
+    dependencies:
+      array-includes: 3.1.8
+      array.prototype.findlast: 1.2.5
+      array.prototype.flatmap: 1.3.3
+      array.prototype.tosorted: 1.1.4
+      doctrine: 2.1.0
+      es-iterator-helpers: 1.2.1
+      eslint: 9.22.0([email protected])
+      estraverse: 5.3.0
+      hasown: 2.0.2
+      jsx-ast-utils: 3.3.5
+      minimatch: 3.1.2
+      object.entries: 1.1.9
+      object.fromentries: 2.0.8
+      object.values: 1.2.1
+      prop-types: 15.8.1
+      resolve: 2.0.0-next.5
+      semver: 6.3.1
+      string.prototype.matchall: 4.0.12
+      string.prototype.repeat: 1.0.0
+
+  [email protected]:
+    dependencies:
+      esrecurse: 4.3.0
+      estraverse: 5.3.0
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]([email protected]):
+    dependencies:
+      '@eslint-community/eslint-utils': 4.5.1([email protected]([email protected]))
+      '@eslint-community/regexpp': 4.12.1
+      '@eslint/config-array': 0.19.2
+      '@eslint/config-helpers': 0.1.0
+      '@eslint/core': 0.12.0
+      '@eslint/eslintrc': 3.3.0
+      '@eslint/js': 9.22.0
+      '@eslint/plugin-kit': 0.2.7
+      '@humanfs/node': 0.16.6
+      '@humanwhocodes/module-importer': 1.0.1
+      '@humanwhocodes/retry': 0.4.2
+      '@types/estree': 1.0.6
+      '@types/json-schema': 7.0.15
+      ajv: 6.12.6
+      chalk: 4.1.2
+      cross-spawn: 7.0.6
+      debug: 4.4.0
+      escape-string-regexp: 4.0.0
+      eslint-scope: 8.3.0
+      eslint-visitor-keys: 4.2.0
+      espree: 10.3.0
+      esquery: 1.6.0
+      esutils: 2.0.3
+      fast-deep-equal: 3.1.3
+      file-entry-cache: 8.0.0
+      find-up: 5.0.0
+      glob-parent: 6.0.2
+      ignore: 5.3.2
+      imurmurhash: 0.1.4
+      is-glob: 4.0.3
+      json-stable-stringify-without-jsonify: 1.0.1
+      lodash.merge: 4.6.2
+      minimatch: 3.1.2
+      natural-compare: 1.4.0
+      optionator: 0.9.4
+    optionalDependencies:
+      jiti: 2.4.2
+    transitivePeerDependencies:
+      - supports-color
+
+  [email protected]:
+    dependencies:
+      acorn: 8.14.1
+      acorn-jsx: 5.3.2([email protected])
+      eslint-visitor-keys: 4.2.0
+
+  [email protected]:
+    dependencies:
+      estraverse: 5.3.0
+
+  [email protected]:
+    dependencies:
+      estraverse: 5.3.0
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      cross-spawn: 7.0.6
+      get-stream: 8.0.1
+      human-signals: 5.0.0
+      is-stream: 3.0.0
+      merge-stream: 2.0.0
+      npm-run-path: 5.3.0
+      onetime: 6.0.0
+      signal-exit: 4.1.0
+      strip-final-newline: 3.0.0
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      debug: 4.4.0
+      get-stream: 5.2.0
+      yauzl: 2.10.0
+    optionalDependencies:
+      '@types/yauzl': 2.10.3
+    transitivePeerDependencies:
+      - supports-color
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      '@nodelib/fs.stat': 2.0.5
+      '@nodelib/fs.walk': 1.2.8
+      glob-parent: 5.1.2
+      merge2: 1.4.1
+      micromatch: 4.0.8
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      reusify: 1.1.0
+
+  [email protected]:
+    dependencies:
+      websocket-driver: 0.7.4
+
+  [email protected]:
+    dependencies:
+      pend: 1.2.0
+
+  [email protected]([email protected]):
+    optionalDependencies:
+      picomatch: 4.0.2
+
+  [email protected]:
+    dependencies:
+      flat-cache: 3.2.0
+
+  [email protected]:
+    dependencies:
+      flat-cache: 4.0.1
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      to-regex-range: 5.0.1
+
+  [email protected]:
+    dependencies:
+      locate-path: 6.0.0
+      path-exists: 4.0.0
+
+  [email protected]:
+    dependencies:
+      locate-path: 7.2.0
+      path-exists: 5.0.0
+      unicorn-magic: 0.1.0
+
+  [email protected]:
+    dependencies:
+      '@firebase/analytics': 0.10.12(@firebase/[email protected])
+      '@firebase/analytics-compat': 0.2.18(@firebase/[email protected])(@firebase/[email protected])
+      '@firebase/app': 0.11.3
+      '@firebase/app-check': 0.8.13(@firebase/[email protected])
+      '@firebase/app-check-compat': 0.3.20(@firebase/[email protected])(@firebase/[email protected])
+      '@firebase/app-compat': 0.2.52
+      '@firebase/app-types': 0.9.3
+      '@firebase/auth': 1.9.1(@firebase/[email protected])
+      '@firebase/auth-compat': 0.5.19(@firebase/[email protected])(@firebase/[email protected])(@firebase/[email protected])
+      '@firebase/data-connect': 0.3.2(@firebase/[email protected])
+      '@firebase/database': 1.0.14
+      '@firebase/database-compat': 2.0.5
+      '@firebase/firestore': 4.7.10(@firebase/[email protected])
+      '@firebase/firestore-compat': 0.3.45(@firebase/[email protected])(@firebase/[email protected])(@firebase/[email protected])
+      '@firebase/functions': 0.12.3(@firebase/[email protected])
+      '@firebase/functions-compat': 0.3.20(@firebase/[email protected])(@firebase/[email protected])
+      '@firebase/installations': 0.6.13(@firebase/[email protected])
+      '@firebase/installations-compat': 0.2.13(@firebase/[email protected])(@firebase/[email protected])(@firebase/[email protected])
+      '@firebase/messaging': 0.12.17(@firebase/[email protected])
+      '@firebase/messaging-compat': 0.2.17(@firebase/[email protected])(@firebase/[email protected])
+      '@firebase/performance': 0.7.2(@firebase/[email protected])
+      '@firebase/performance-compat': 0.2.15(@firebase/[email protected])(@firebase/[email protected])
+      '@firebase/remote-config': 0.6.0(@firebase/[email protected])
+      '@firebase/remote-config-compat': 0.2.13(@firebase/[email protected])(@firebase/[email protected])
+      '@firebase/storage': 0.13.7(@firebase/[email protected])
+      '@firebase/storage-compat': 0.3.17(@firebase/[email protected])(@firebase/[email protected])(@firebase/[email protected])
+      '@firebase/util': 1.11.0
+      '@firebase/vertexai': 1.2.0(@firebase/[email protected])(@firebase/[email protected])
+    transitivePeerDependencies:
+      - '@react-native-async-storage/async-storage'
+
+  [email protected]:
+    dependencies:
+      flatted: 3.3.3
+      keyv: 4.5.4
+      rimraf: 3.0.2
+
+  [email protected]:
+    dependencies:
+      flatted: 3.3.3
+      keyv: 4.5.4
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      is-callable: 1.2.7
+
+  [email protected]:
+    dependencies:
+      cross-spawn: 7.0.6
+      signal-exit: 4.1.0
+
+  [email protected]:
+    dependencies:
+      asynckit: 0.4.0
+      combined-stream: 1.0.8
+      es-set-tostringtag: 2.1.0
+      mime-types: 2.1.35
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      graceful-fs: 4.2.11
+      jsonfile: 6.1.0
+      universalify: 2.0.1
+
+  [email protected]:
+    dependencies:
+      minipass: 3.3.6
+
+  [email protected]: {}
+
+  [email protected]:
+    optional: true
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      define-properties: 1.2.1
+      functions-have-names: 1.2.3
+      hasown: 2.0.2
+      is-callable: 1.2.7
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    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
+
+  [email protected]:
+    dependencies:
+      dunder-proto: 1.0.1
+      es-object-atoms: 1.1.1
+
+  [email protected]:
+    dependencies:
+      pump: 3.0.2
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      get-intrinsic: 1.3.0
+
+  [email protected]:
+    dependencies:
+      resolve-pkg-maps: 1.0.0
+
+  [email protected]:
+    dependencies:
+      dargs: 8.1.0
+      meow: 12.1.1
+      split2: 4.2.0
+
+  [email protected]:
+    dependencies:
+      is-glob: 4.0.3
+
+  [email protected]:
+    dependencies:
+      is-glob: 4.0.3
+
+  [email protected]:
+    dependencies:
+      foreground-child: 3.3.1
+      jackspeak: 3.4.3
+      minimatch: 9.0.5
+      minipass: 7.1.2
+      package-json-from-dist: 1.0.1
+      path-scurry: 1.11.1
+
+  [email protected]:
+    dependencies:
+      fs.realpath: 1.0.0
+      inflight: 1.0.6
+      inherits: 2.0.4
+      minimatch: 3.1.2
+      once: 1.4.0
+      path-is-absolute: 1.0.1
+
+  [email protected]:
+    dependencies:
+      ini: 4.1.1
+
+  [email protected]:
+    dependencies:
+      global-prefix: 3.0.0
+
+  [email protected]:
+    dependencies:
+      ini: 1.3.8
+      kind-of: 6.0.3
+      which: 1.3.1
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      define-properties: 1.2.1
+      gopd: 1.2.0
+
+  [email protected]:
+    dependencies:
+      array-union: 2.1.0
+      dir-glob: 3.0.1
+      fast-glob: 3.3.3
+      ignore: 5.3.2
+      merge2: 1.4.1
+      slash: 3.0.0
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      chalk: 5.4.1
+      tinygradient: 1.1.5
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      es-define-property: 1.0.1
+
+  [email protected]:
+    dependencies:
+      dunder-proto: 1.0.1
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      has-symbols: 1.1.0
+
+  [email protected]:
+    dependencies:
+      function-bind: 1.1.2
+
+  [email protected]:
+    dependencies:
+      capital-case: 1.0.4
+      tslib: 2.8.1
+
+  [email protected]:
+    dependencies:
+      lru-cache: 6.0.0
+
+  [email protected]:
+    dependencies:
+      void-elements: 3.1.0
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      domelementtype: 2.3.0
+      domhandler: 5.0.3
+      domutils: 3.2.2
+      entities: 4.5.0
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      '@babel/runtime': 7.26.10
+
+  [email protected]:
+    dependencies:
+      '@babel/runtime': 7.26.10
+
+  [email protected]:
+    dependencies:
+      safer-buffer: 2.1.2
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    optional: true
+
+  [email protected]:
+    optional: true
+
+  [email protected]:
+    dependencies:
+      parent-module: 1.0.1
+      resolve-from: 4.0.0
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      once: 1.4.0
+      wrappy: 1.0.2
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      es-errors: 1.3.0
+      hasown: 2.0.2
+      side-channel: 1.1.0
+
+  [email protected]:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      get-intrinsic: 1.3.0
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      async-function: 1.0.0
+      call-bound: 1.0.4
+      get-proto: 1.0.1
+      has-tostringtag: 1.0.2
+      safe-regex-test: 1.1.0
+
+  [email protected]:
+    dependencies:
+      has-bigints: 1.1.0
+
+  [email protected]:
+    dependencies:
+      binary-extensions: 2.3.0
+
+  [email protected]:
+    dependencies:
+      call-bound: 1.0.4
+      has-tostringtag: 1.0.2
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      hasown: 2.0.2
+
+  [email protected]:
+    dependencies:
+      call-bound: 1.0.4
+      get-intrinsic: 1.3.0
+      is-typed-array: 1.1.15
+
+  [email protected]:
+    dependencies:
+      call-bound: 1.0.4
+      has-tostringtag: 1.0.2
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      call-bound: 1.0.4
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      get-east-asian-width: 1.3.0
+
+  [email protected]:
+    dependencies:
+      call-bound: 1.0.4
+      get-proto: 1.0.1
+      has-tostringtag: 1.0.2
+      safe-regex-test: 1.1.0
+
+  [email protected]:
+    dependencies:
+      is-extglob: 2.1.1
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      call-bound: 1.0.4
+      has-tostringtag: 1.0.2
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      call-bound: 1.0.4
+      gopd: 1.2.0
+      has-tostringtag: 1.0.2
+      hasown: 2.0.2
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      call-bound: 1.0.4
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      call-bound: 1.0.4
+      has-tostringtag: 1.0.2
+
+  [email protected]:
+    dependencies:
+      call-bound: 1.0.4
+      has-symbols: 1.1.0
+      safe-regex-test: 1.1.0
+
+  [email protected]:
+    dependencies:
+      text-extensions: 2.4.0
+
+  [email protected]:
+    dependencies:
+      which-typed-array: 1.1.19
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      call-bound: 1.0.4
+
+  [email protected]:
+    dependencies:
+      call-bound: 1.0.4
+      get-intrinsic: 1.3.0
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      define-data-property: 1.1.4
+      es-object-atoms: 1.1.1
+      get-intrinsic: 1.3.0
+      get-proto: 1.0.1
+      has-symbols: 1.1.0
+      set-function-name: 2.0.2
+
+  [email protected]:
+    dependencies:
+      '@isaacs/cliui': 8.0.2
+    optionalDependencies:
+      '@pkgjs/parseargs': 0.11.0
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      argparse: 2.0.1
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      string-convert: 0.2.1
+
+  [email protected]:
+    dependencies:
+      minimist: 1.2.8
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      universalify: 2.0.1
+    optionalDependencies:
+      graceful-fs: 4.2.11
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      array-includes: 3.1.8
+      array.prototype.flat: 1.3.3
+      object.assign: 4.1.7
+      object.values: 1.2.1
+
+  [email protected]:
+    dependencies:
+      json-buffer: 3.0.1
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      language-subtag-registry: 0.3.23
+
+  [email protected]:
+    dependencies:
+      copy-anything: 2.0.6
+      parse-node-version: 1.0.1
+      tslib: 2.8.1
+    optionalDependencies:
+      errno: 0.1.8
+      graceful-fs: 4.2.11
+      image-size: 0.5.5
+      make-dir: 2.1.0
+      mime: 1.6.0
+      needle: 3.3.1
+      source-map: 0.6.1
+
+  [email protected]:
+    dependencies:
+      prelude-ls: 1.2.1
+      type-check: 0.4.0
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      chalk: 5.4.1
+      commander: 13.1.0
+      debug: 4.4.0
+      execa: 8.0.1
+      lilconfig: 3.1.3
+      listr2: 8.2.5
+      micromatch: 4.0.8
+      pidtree: 0.6.0
+      string-argv: 0.3.2
+      yaml: 2.7.0
+    transitivePeerDependencies:
+      - supports-color
+
+  [email protected]:
+    dependencies:
+      cli-truncate: 4.0.0
+      colorette: 2.0.20
+      eventemitter3: 5.0.1
+      log-update: 6.1.0
+      rfdc: 1.4.1
+      wrap-ansi: 9.0.0
+
+  [email protected]:
+    dependencies:
+      mlly: 1.7.4
+      pkg-types: 1.3.1
+
+  [email protected]:
+    dependencies:
+      mlly: 1.7.4
+      pkg-types: 2.1.0
+      quansync: 0.2.10
+
+  [email protected]:
+    dependencies:
+      p-locate: 5.0.0
+
+  [email protected]:
+    dependencies:
+      p-locate: 6.0.0
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      ansi-escapes: 7.0.0
+      cli-cursor: 5.0.0
+      slice-ansi: 7.1.0
+      strip-ansi: 7.1.0
+      wrap-ansi: 9.0.0
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      js-tokens: 4.0.0
+
+  [email protected]:
+    dependencies:
+      tslib: 2.8.1
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      yallist: 3.1.1
+
+  [email protected]:
+    dependencies:
+      yallist: 4.0.0
+
+  [email protected]:
+    dependencies:
+      sourcemap-codec: 1.4.8
+
+  [email protected]:
+    dependencies:
+      pify: 4.0.1
+      semver: 5.7.2
+    optional: true
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      '@types/minimist': 1.2.5
+      camelcase-keys: 7.0.2
+      decamelize: 5.0.1
+      decamelize-keys: 1.1.1
+      hard-rejection: 2.1.0
+      minimist-options: 4.1.0
+      normalize-package-data: 3.0.3
+      read-pkg-up: 8.0.0
+      redent: 4.0.0
+      trim-newlines: 4.1.1
+      type-fest: 1.4.0
+      yargs-parser: 20.2.9
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      braces: 3.0.3
+      picomatch: 2.3.1
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      mime-db: 1.52.0
+
+  [email protected]:
+    optional: true
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      brace-expansion: 1.1.11
+
+  [email protected]:
+    dependencies:
+      brace-expansion: 2.0.1
+
+  [email protected]:
+    dependencies:
+      arrify: 1.0.1
+      is-plain-obj: 1.1.0
+      kind-of: 6.0.3
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      yallist: 4.0.0
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      minipass: 3.3.6
+      yallist: 4.0.0
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      acorn: 8.14.1
+      pathe: 2.0.3
+      pkg-types: 1.3.1
+      ufo: 1.5.4
+
+  [email protected]:
+    optional: true
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      any-promise: 1.3.0
+      object-assign: 4.1.1
+      thenify-all: 1.6.0
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      iconv-lite: 0.6.3
+      sax: 1.4.1
+    optional: true
+
+  [email protected]:
+    dependencies:
+      lower-case: 2.0.2
+      tslib: 2.8.1
+
+  [email protected]:
+    optional: true
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      hosted-git-info: 4.1.0
+      is-core-module: 2.16.1
+      semver: 7.7.1
+      validate-npm-package-license: 3.0.4
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      path-key: 4.0.0
+
+  [email protected]:
+    dependencies:
+      boolbase: 1.0.0
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      define-properties: 1.2.1
+      es-object-atoms: 1.1.1
+      has-symbols: 1.1.0
+      object-keys: 1.1.1
+
+  [email protected]:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      define-properties: 1.2.1
+      es-object-atoms: 1.1.1
+
+  [email protected]:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+      es-object-atoms: 1.1.1
+
+  [email protected]:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+
+  [email protected]:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      define-properties: 1.2.1
+      es-object-atoms: 1.1.1
+
+  [email protected]:
+    dependencies:
+      wrappy: 1.0.2
+
+  [email protected]:
+    dependencies:
+      mimic-fn: 4.0.0
+
+  [email protected]:
+    dependencies:
+      mimic-function: 5.0.1
+
+  [email protected]:
+    dependencies:
+      deep-is: 0.1.4
+      fast-levenshtein: 2.0.6
+      levn: 0.4.1
+      prelude-ls: 1.2.1
+      type-check: 0.4.0
+      word-wrap: 1.2.5
+
+  [email protected]:
+    dependencies:
+      get-intrinsic: 1.3.0
+      object-keys: 1.1.1
+      safe-push-apply: 1.0.0
+
+  [email protected]:
+    dependencies:
+      yocto-queue: 0.1.0
+
+  [email protected]:
+    dependencies:
+      yocto-queue: 1.2.0
+
+  [email protected]:
+    dependencies:
+      p-limit: 3.1.0
+
+  [email protected]:
+    dependencies:
+      p-limit: 4.0.0
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      quansync: 0.2.10
+
+  [email protected]:
+    dependencies:
+      dot-case: 3.0.4
+      tslib: 2.8.1
+
+  [email protected]:
+    dependencies:
+      callsites: 3.1.0
+
+  [email protected]:
+    dependencies:
+      '@babel/code-frame': 7.26.2
+      error-ex: 1.3.2
+      json-parse-even-better-errors: 2.3.1
+      lines-and-columns: 1.2.4
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      domhandler: 5.0.3
+      parse5: 7.2.1
+
+  [email protected]:
+    dependencies:
+      parse5: 7.2.1
+
+  [email protected]:
+    dependencies:
+      entities: 4.5.0
+
+  [email protected]:
+    dependencies:
+      no-case: 3.0.4
+      tslib: 2.8.1
+
+  [email protected]:
+    dependencies:
+      dot-case: 3.0.4
+      tslib: 2.8.1
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      lru-cache: 10.4.3
+      minipass: 7.1.2
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    optional: true
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      confbox: 0.1.8
+      mlly: 1.7.4
+      pathe: 2.0.3
+
+  [email protected]:
+    dependencies:
+      confbox: 0.2.1
+      exsolve: 1.0.4
+      pathe: 2.0.3
+
+  [email protected]: {}
+
+  [email protected]([email protected]):
+    dependencies:
+      postcss: 8.4.35
+      postcss-value-parser: 4.2.0
+      read-cache: 1.0.0
+      resolve: 1.22.10
+
+  [email protected]([email protected]):
+    dependencies:
+      camelcase-css: 2.0.1
+      postcss: 8.4.35
+
+  [email protected]([email protected]):
+    dependencies:
+      postcss: 8.4.35
+
+  [email protected]([email protected]):
+    dependencies:
+      lilconfig: 3.1.3
+      yaml: 2.7.0
+    optionalDependencies:
+      postcss: 8.4.35
+
+  [email protected]: {}
+
+  [email protected]([email protected]):
+    dependencies:
+      postcss: 8.4.35
+      postcss-selector-parser: 6.1.2
+
+  [email protected]([email protected]):
+    dependencies:
+      '@csstools/selector-resolve-nested': 3.0.0([email protected])
+      '@csstools/selector-specificity': 5.0.0([email protected])
+      postcss: 8.4.35
+      postcss-selector-parser: 7.1.0
+
+  [email protected]: {}
+
+  [email protected]([email protected]):
+    dependencies:
+      postcss: 8.4.35
+
+  [email protected]([email protected]):
+    dependencies:
+      postcss: 8.4.35
+
+  [email protected]:
+    dependencies:
+      cssesc: 3.0.0
+      util-deprecate: 1.0.2
+
+  [email protected]:
+    dependencies:
+      cssesc: 3.0.0
+      util-deprecate: 1.0.2
+
+  [email protected]([email protected]):
+    dependencies:
+      postcss: 8.4.35
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      nanoid: 3.3.11
+      picocolors: 1.1.1
+      source-map-js: 1.2.1
+
+  [email protected]:
+    dependencies:
+      nanoid: 3.3.11
+      picocolors: 1.1.1
+      source-map-js: 1.2.1
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      fast-diff: 1.3.0
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      loose-envify: 1.4.0
+      object-assign: 4.1.1
+      react-is: 16.13.1
+
+  [email protected]:
+    dependencies:
+      '@protobufjs/aspromise': 1.1.2
+      '@protobufjs/base64': 1.1.2
+      '@protobufjs/codegen': 2.0.4
+      '@protobufjs/eventemitter': 1.1.0
+      '@protobufjs/fetch': 1.1.0
+      '@protobufjs/float': 1.0.2
+      '@protobufjs/inquire': 1.1.0
+      '@protobufjs/path': 1.1.2
+      '@protobufjs/pool': 1.1.0
+      '@protobufjs/utf8': 1.1.0
+      '@types/node': 22.13.10
+      long: 5.3.1
+
+  [email protected]: {}
+
+  [email protected]:
+    optional: true
+
+  [email protected]:
+    dependencies:
+      end-of-stream: 1.4.4
+      once: 1.4.0
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      side-channel: 1.1.0
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      classnames: 2.5.1
+      rc-select: 14.16.6([email protected]([email protected]))([email protected])
+      rc-tree: 5.13.1([email protected]([email protected]))([email protected])
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      classnames: 2.5.1
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      classnames: 2.5.1
+      rc-motion: 2.9.5([email protected]([email protected]))([email protected])
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      '@rc-component/portal': 1.1.2([email protected]([email protected]))([email protected])
+      classnames: 2.5.1
+      rc-motion: 2.9.5([email protected]([email protected]))([email protected])
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      '@rc-component/portal': 1.1.2([email protected]([email protected]))([email protected])
+      classnames: 2.5.1
+      rc-motion: 2.9.5([email protected]([email protected]))([email protected])
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      '@rc-component/trigger': 2.2.6([email protected]([email protected]))([email protected])
+      classnames: 2.5.1
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      '@rc-component/async-validator': 5.0.4
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      '@rc-component/portal': 1.1.2([email protected]([email protected]))([email protected])
+      classnames: 2.5.1
+      rc-dialog: 9.6.0([email protected]([email protected]))([email protected])
+      rc-motion: 2.9.5([email protected]([email protected]))([email protected])
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      '@rc-component/mini-decimal': 1.1.0
+      classnames: 2.5.1
+      rc-input: 1.7.3([email protected]([email protected]))([email protected])
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      classnames: 2.5.1
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      '@rc-component/trigger': 2.2.6([email protected]([email protected]))([email protected])
+      classnames: 2.5.1
+      rc-input: 1.7.3([email protected]([email protected]))([email protected])
+      rc-menu: 9.16.1([email protected]([email protected]))([email protected])
+      rc-textarea: 1.9.0([email protected]([email protected]))([email protected])
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      '@rc-component/trigger': 2.2.6([email protected]([email protected]))([email protected])
+      classnames: 2.5.1
+      rc-motion: 2.9.5([email protected]([email protected]))([email protected])
+      rc-overflow: 1.4.1([email protected]([email protected]))([email protected])
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      classnames: 2.5.1
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      classnames: 2.5.1
+      rc-motion: 2.9.5([email protected]([email protected]))([email protected])
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      classnames: 2.5.1
+      rc-resize-observer: 1.4.3([email protected]([email protected]))([email protected])
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      classnames: 2.5.1
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  [email protected]([email protected])([email protected])([email protected])([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      '@rc-component/trigger': 2.2.6([email protected]([email protected]))([email protected])
+      classnames: 2.5.1
+      rc-overflow: 1.4.1([email protected]([email protected]))([email protected])
+      rc-resize-observer: 1.4.3([email protected]([email protected]))([email protected])
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+    optionalDependencies:
+      date-fns: 2.30.0
+      dayjs: 1.11.13
+      moment: 2.30.1
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      classnames: 2.5.1
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      classnames: 2.5.1
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      classnames: 2.5.1
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+      resize-observer-polyfill: 1.5.1
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      classnames: 2.5.1
+      rc-motion: 2.9.5([email protected]([email protected]))([email protected])
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      '@rc-component/trigger': 2.2.6([email protected]([email protected]))([email protected])
+      classnames: 2.5.1
+      rc-motion: 2.9.5([email protected]([email protected]))([email protected])
+      rc-overflow: 1.4.1([email protected]([email protected]))([email protected])
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      rc-virtual-list: 3.18.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      classnames: 2.5.1
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      classnames: 2.5.1
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      classnames: 2.5.1
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      '@rc-component/context': 1.4.0([email protected]([email protected]))([email protected])
+      classnames: 2.5.1
+      rc-resize-observer: 1.4.3([email protected]([email protected]))([email protected])
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      rc-virtual-list: 3.18.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      classnames: 2.5.1
+      rc-dropdown: 4.2.1([email protected]([email protected]))([email protected])
+      rc-menu: 9.16.1([email protected]([email protected]))([email protected])
+      rc-motion: 2.9.5([email protected]([email protected]))([email protected])
+      rc-resize-observer: 1.4.3([email protected]([email protected]))([email protected])
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      classnames: 2.5.1
+      rc-input: 1.7.3([email protected]([email protected]))([email protected])
+      rc-resize-observer: 1.4.3([email protected]([email protected]))([email protected])
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      '@rc-component/trigger': 2.2.6([email protected]([email protected]))([email protected])
+      classnames: 2.5.1
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      classnames: 2.5.1
+      rc-select: 14.16.6([email protected]([email protected]))([email protected])
+      rc-tree: 5.13.1([email protected]([email protected]))([email protected])
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      classnames: 2.5.1
+      rc-motion: 2.9.5([email protected]([email protected]))([email protected])
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      rc-virtual-list: 3.18.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      classnames: 2.5.1
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+      react-is: 18.3.1
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      classnames: 2.5.1
+      rc-resize-observer: 1.4.3([email protected]([email protected]))([email protected])
+      rc-util: 5.44.4([email protected]([email protected]))([email protected])
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+
+  [email protected]([email protected]):
+    dependencies:
+      loose-envify: 1.4.0
+      react: 18.3.1
+      scheduler: 0.23.2
+
+  [email protected]([email protected])([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@babel/runtime': 7.26.10
+      html-parse-stringify: 3.0.1
+      i18next: 23.16.8
+      react: 18.3.1
+    optionalDependencies:
+      react-dom: 18.3.1([email protected])
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      react: 18.3.1
+      react-dom: 18.3.1([email protected])
+      react-router: 7.4.0([email protected]([email protected]))([email protected])
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@types/cookie': 0.6.0
+      cookie: 1.0.2
+      react: 18.3.1
+      set-cookie-parser: 2.7.1
+      turbo-stream: 2.4.0
+    optionalDependencies:
+      react-dom: 18.3.1([email protected])
+
+  [email protected]:
+    dependencies:
+      loose-envify: 1.4.0
+
+  [email protected]:
+    dependencies:
+      pify: 2.3.0
+
+  [email protected]:
+    dependencies:
+      find-up: 5.0.0
+      read-pkg: 6.0.0
+      type-fest: 1.4.0
+
+  [email protected]:
+    dependencies:
+      '@types/normalize-package-data': 2.4.4
+      normalize-package-data: 3.0.3
+      parse-json: 5.2.0
+      type-fest: 1.4.0
+
+  [email protected]:
+    dependencies:
+      picomatch: 2.3.1
+
+  [email protected]:
+    optional: true
+
+  [email protected]:
+    dependencies:
+      indent-string: 5.0.0
+      strip-indent: 4.0.0
+
+  [email protected]:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+      es-errors: 1.3.0
+      es-object-atoms: 1.1.1
+      get-intrinsic: 1.3.0
+      get-proto: 1.0.1
+      which-builtin-type: 1.2.1
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-errors: 1.3.0
+      get-proto: 1.0.1
+      gopd: 1.2.0
+      set-function-name: 2.0.2
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      is-core-module: 2.16.1
+      path-parse: 1.0.7
+      supports-preserve-symlinks-flag: 1.0.0
+
+  [email protected]:
+    dependencies:
+      is-core-module: 2.16.1
+      path-parse: 1.0.7
+      supports-preserve-symlinks-flag: 1.0.0
+
+  [email protected]:
+    dependencies:
+      onetime: 7.0.0
+      signal-exit: 4.1.0
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      glob: 7.2.3
+
+  [email protected]:
+    dependencies:
+      '@types/estree': 1.0.6
+    optionalDependencies:
+      '@rollup/rollup-android-arm-eabi': 4.36.0
+      '@rollup/rollup-android-arm64': 4.36.0
+      '@rollup/rollup-darwin-arm64': 4.36.0
+      '@rollup/rollup-darwin-x64': 4.36.0
+      '@rollup/rollup-freebsd-arm64': 4.36.0
+      '@rollup/rollup-freebsd-x64': 4.36.0
+      '@rollup/rollup-linux-arm-gnueabihf': 4.36.0
+      '@rollup/rollup-linux-arm-musleabihf': 4.36.0
+      '@rollup/rollup-linux-arm64-gnu': 4.36.0
+      '@rollup/rollup-linux-arm64-musl': 4.36.0
+      '@rollup/rollup-linux-loongarch64-gnu': 4.36.0
+      '@rollup/rollup-linux-powerpc64le-gnu': 4.36.0
+      '@rollup/rollup-linux-riscv64-gnu': 4.36.0
+      '@rollup/rollup-linux-s390x-gnu': 4.36.0
+      '@rollup/rollup-linux-x64-gnu': 4.36.0
+      '@rollup/rollup-linux-x64-musl': 4.36.0
+      '@rollup/rollup-win32-arm64-msvc': 4.36.0
+      '@rollup/rollup-win32-ia32-msvc': 4.36.0
+      '@rollup/rollup-win32-x64-msvc': 4.36.0
+      fsevents: 2.3.3
+
+  [email protected]:
+    optionalDependencies:
+      '@unrs/rspack-resolver-binding-darwin-arm64': 1.2.2
+      '@unrs/rspack-resolver-binding-darwin-x64': 1.2.2
+      '@unrs/rspack-resolver-binding-freebsd-x64': 1.2.2
+      '@unrs/rspack-resolver-binding-linux-arm-gnueabihf': 1.2.2
+      '@unrs/rspack-resolver-binding-linux-arm64-gnu': 1.2.2
+      '@unrs/rspack-resolver-binding-linux-arm64-musl': 1.2.2
+      '@unrs/rspack-resolver-binding-linux-x64-gnu': 1.2.2
+      '@unrs/rspack-resolver-binding-linux-x64-musl': 1.2.2
+      '@unrs/rspack-resolver-binding-wasm32-wasi': 1.2.2
+      '@unrs/rspack-resolver-binding-win32-arm64-msvc': 1.2.2
+      '@unrs/rspack-resolver-binding-win32-x64-msvc': 1.2.2
+
+  [email protected]:
+    dependencies:
+      queue-microtask: 1.2.3
+
+  [email protected]:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      get-intrinsic: 1.3.0
+      has-symbols: 1.1.0
+      isarray: 2.0.5
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      es-errors: 1.3.0
+      isarray: 2.0.5
+
+  [email protected]:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      is-regex: 1.2.1
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      chokidar: 4.0.3
+      immutable: 5.0.3
+      source-map-js: 1.2.1
+    optionalDependencies:
+      '@parcel/watcher': 2.5.1
+    optional: true
+
+  [email protected]:
+    optional: true
+
+  [email protected]:
+    dependencies:
+      loose-envify: 1.4.0
+
+  [email protected]:
+    dependencies:
+      compute-scroll-into-view: 3.1.1
+
+  [email protected]:
+    optional: true
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      no-case: 3.0.4
+      tslib: 2.8.1
+      upper-case-first: 2.0.2
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      define-data-property: 1.1.4
+      es-errors: 1.3.0
+      function-bind: 1.1.2
+      get-intrinsic: 1.3.0
+      gopd: 1.2.0
+      has-property-descriptors: 1.0.2
+
+  [email protected]:
+    dependencies:
+      define-data-property: 1.1.4
+      es-errors: 1.3.0
+      functions-have-names: 1.2.3
+      has-property-descriptors: 1.0.2
+
+  [email protected]:
+    dependencies:
+      dunder-proto: 1.0.1
+      es-errors: 1.3.0
+      es-object-atoms: 1.1.1
+
+  [email protected]:
+    dependencies:
+      shebang-regex: 3.0.0
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      es-errors: 1.3.0
+      object-inspect: 1.13.4
+
+  [email protected]:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      get-intrinsic: 1.3.0
+      object-inspect: 1.13.4
+
+  [email protected]:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      get-intrinsic: 1.3.0
+      object-inspect: 1.13.4
+      side-channel-map: 1.0.1
+
+  [email protected]:
+    dependencies:
+      es-errors: 1.3.0
+      object-inspect: 1.13.4
+      side-channel-list: 1.0.0
+      side-channel-map: 1.0.1
+      side-channel-weakmap: 1.0.2
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      ansi-styles: 4.3.0
+      astral-regex: 2.0.0
+      is-fullwidth-code-point: 3.0.0
+
+  [email protected]:
+    dependencies:
+      ansi-styles: 6.2.1
+      is-fullwidth-code-point: 4.0.0
+
+  [email protected]:
+    dependencies:
+      ansi-styles: 6.2.1
+      is-fullwidth-code-point: 5.0.0
+
+  [email protected]:
+    dependencies:
+      dot-case: 3.0.4
+      tslib: 2.8.1
+
+  [email protected]: {}
+
+  [email protected]:
+    optional: true
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      spdx-expression-parse: 3.0.1
+      spdx-license-ids: 3.0.21
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      spdx-exceptions: 2.5.0
+      spdx-license-ids: 3.0.21
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      emoji-regex: 8.0.0
+      is-fullwidth-code-point: 3.0.0
+      strip-ansi: 6.0.1
+
+  [email protected]:
+    dependencies:
+      eastasianwidth: 0.2.0
+      emoji-regex: 9.2.2
+      strip-ansi: 7.1.0
+
+  [email protected]:
+    dependencies:
+      emoji-regex: 10.4.0
+      get-east-asian-width: 1.3.0
+      strip-ansi: 7.1.0
+
+  [email protected]:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+
+  [email protected]:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+      es-errors: 1.3.0
+      es-object-atoms: 1.1.1
+      get-intrinsic: 1.3.0
+      gopd: 1.2.0
+      has-symbols: 1.1.0
+      internal-slot: 1.1.0
+      regexp.prototype.flags: 1.5.4
+      set-function-name: 2.0.2
+      side-channel: 1.1.0
+
+  [email protected]:
+    dependencies:
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+
+  [email protected]:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      define-data-property: 1.1.4
+      define-properties: 1.2.1
+      es-abstract: 1.23.9
+      es-object-atoms: 1.1.1
+      has-property-descriptors: 1.0.2
+
+  [email protected]:
+    dependencies:
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      define-properties: 1.2.1
+      es-object-atoms: 1.1.1
+
+  [email protected]:
+    dependencies:
+      call-bind: 1.0.8
+      define-properties: 1.2.1
+      es-object-atoms: 1.1.1
+
+  [email protected]:
+    dependencies:
+      ansi-regex: 5.0.1
+
+  [email protected]:
+    dependencies:
+      ansi-regex: 6.1.0
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      min-indent: 1.0.1
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]([email protected])([email protected]([email protected])):
+    dependencies:
+      postcss-less: 6.0.0([email protected])
+      stylelint: 15.11.0([email protected])
+      stylelint-config-recommended: 13.0.0([email protected]([email protected]))
+      stylelint-less: 2.0.0([email protected])([email protected]([email protected]))
+    optionalDependencies:
+      postcss: 8.4.35
+
+  [email protected]([email protected])([email protected]([email protected])):
+    dependencies:
+      postcss-scss: 4.0.9([email protected])
+      stylelint: 15.11.0([email protected])
+      stylelint-config-recommended: 10.0.1([email protected]([email protected]))
+      stylelint-scss: 4.7.0([email protected]([email protected]))
+    optionalDependencies:
+      postcss: 8.4.35
+
+  [email protected]([email protected]([email protected])):
+    dependencies:
+      stylelint: 15.11.0([email protected])
+
+  [email protected]([email protected]([email protected])):
+    dependencies:
+      stylelint: 15.11.0([email protected])
+
+  [email protected]([email protected])([email protected]([email protected])):
+    dependencies:
+      stylelint: 15.11.0([email protected])
+      stylelint-config-recommended-scss: 9.0.1([email protected])([email protected]([email protected]))
+      stylelint-config-standard: 30.0.1([email protected]([email protected]))
+    optionalDependencies:
+      postcss: 8.4.35
+
+  [email protected]([email protected]([email protected])):
+    dependencies:
+      stylelint: 15.11.0([email protected])
+      stylelint-config-recommended: 10.0.1([email protected]([email protected]))
+
+  [email protected]([email protected])([email protected]([email protected])):
+    dependencies:
+      postcss: 8.4.35
+      postcss-resolve-nested-selector: 0.1.6
+      postcss-value-parser: 4.2.0
+      stylelint: 15.11.0([email protected])
+
+  [email protected]([email protected]([email protected])):
+    dependencies:
+      postcss: 8.4.35
+      postcss-sorting: 8.0.2([email protected])
+      stylelint: 15.11.0([email protected])
+
+  [email protected]([email protected])([email protected]([email protected])):
+    dependencies:
+      prettier: 3.5.3
+      prettier-linter-helpers: 1.0.0
+      stylelint: 15.11.0([email protected])
+
+  [email protected]([email protected]([email protected])):
+    dependencies:
+      postcss-media-query-parser: 0.2.3
+      postcss-resolve-nested-selector: 0.1.6
+      postcss-selector-parser: 6.1.2
+      postcss-value-parser: 4.2.0
+      stylelint: 15.11.0([email protected])
+
+  [email protected]([email protected]):
+    dependencies:
+      '@csstools/css-parser-algorithms': 2.7.1(@csstools/[email protected])
+      '@csstools/css-tokenizer': 2.4.1
+      '@csstools/media-query-list-parser': 2.1.13(@csstools/[email protected](@csstools/[email protected]))(@csstools/[email protected])
+      '@csstools/selector-specificity': 3.1.1([email protected])
+      balanced-match: 2.0.0
+      colord: 2.9.3
+      cosmiconfig: 8.3.6([email protected])
+      css-functions-list: 3.2.3
+      css-tree: 2.3.1
+      debug: 4.4.0
+      fast-glob: 3.3.3
+      fastest-levenshtein: 1.0.16
+      file-entry-cache: 7.0.2
+      global-modules: 2.0.0
+      globby: 11.1.0
+      globjoin: 0.1.4
+      html-tags: 3.3.1
+      ignore: 5.3.2
+      import-lazy: 4.0.0
+      imurmurhash: 0.1.4
+      is-plain-object: 5.0.0
+      known-css-properties: 0.29.0
+      mathml-tag-names: 2.1.3
+      meow: 10.1.5
+      micromatch: 4.0.8
+      normalize-path: 3.0.0
+      picocolors: 1.1.1
+      postcss: 8.4.35
+      postcss-resolve-nested-selector: 0.1.6
+      postcss-safe-parser: 6.0.0([email protected])
+      postcss-selector-parser: 6.1.2
+      postcss-value-parser: 4.2.0
+      resolve-from: 5.0.0
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+      style-search: 0.1.0
+      supports-hyperlinks: 3.2.0
+      svg-tags: 1.0.0
+      table: 6.9.0
+      write-file-atomic: 5.0.1
+    transitivePeerDependencies:
+      - supports-color
+      - typescript
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      '@jridgewell/gen-mapping': 0.3.8
+      commander: 4.1.1
+      glob: 10.4.5
+      lines-and-columns: 1.2.4
+      mz: 2.7.0
+      pirates: 4.0.6
+      ts-interface-checker: 0.1.13
+
+  [email protected]:
+    dependencies:
+      has-flag: 4.0.0
+
+  [email protected]:
+    dependencies:
+      has-flag: 4.0.0
+      supports-color: 7.2.0
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      '@trysound/sax': 0.2.0
+      commander: 7.2.0
+      css-select: 5.1.0
+      css-tree: 2.3.1
+      css-what: 6.1.0
+      csso: 5.0.5
+      picocolors: 1.1.1
+
+  [email protected]:
+    dependencies:
+      ajv: 8.17.1
+      lodash.truncate: 4.4.2
+      slice-ansi: 4.0.0
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+
+  [email protected]:
+    dependencies:
+      '@alloc/quick-lru': 5.2.0
+      arg: 5.0.2
+      chokidar: 3.6.0
+      didyoumean: 1.2.2
+      dlv: 1.1.3
+      fast-glob: 3.3.3
+      glob-parent: 6.0.2
+      is-glob: 4.0.3
+      jiti: 1.21.7
+      lilconfig: 2.1.0
+      micromatch: 4.0.8
+      normalize-path: 3.0.0
+      object-hash: 3.0.0
+      picocolors: 1.1.1
+      postcss: 8.4.35
+      postcss-import: 15.1.0([email protected])
+      postcss-js: 4.0.1([email protected])
+      postcss-load-config: 4.0.2([email protected])
+      postcss-nested: 6.2.0([email protected])
+      postcss-selector-parser: 6.1.2
+      resolve: 1.22.10
+      sucrase: 3.35.0
+    transitivePeerDependencies:
+      - ts-node
+
+  [email protected]:
+    dependencies:
+      chownr: 2.0.0
+      fs-minipass: 2.1.0
+      minipass: 5.0.0
+      minizlib: 2.1.2
+      mkdirp: 1.0.4
+      yallist: 4.0.0
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      thenify: 3.3.1
+
+  [email protected]:
+    dependencies:
+      any-promise: 1.3.0
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      fdir: 6.4.3([email protected])
+      picomatch: 4.0.2
+
+  [email protected]:
+    dependencies:
+      '@types/tinycolor2': 1.4.6
+      tinycolor2: 1.6.0
+
+  [email protected]:
+    dependencies:
+      is-number: 7.0.0
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]([email protected]):
+    dependencies:
+      typescript: 5.7.3
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      '@types/json5': 0.0.29
+      json5: 1.0.2
+      minimist: 1.2.8
+      strip-bom: 3.0.0
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      prelude-ls: 1.2.1
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      call-bound: 1.0.4
+      es-errors: 1.3.0
+      is-typed-array: 1.1.15
+
+  [email protected]:
+    dependencies:
+      call-bind: 1.0.8
+      for-each: 0.3.5
+      gopd: 1.2.0
+      has-proto: 1.2.0
+      is-typed-array: 1.1.15
+
+  [email protected]:
+    dependencies:
+      available-typed-arrays: 1.0.7
+      call-bind: 1.0.8
+      for-each: 0.3.5
+      gopd: 1.2.0
+      has-proto: 1.2.0
+      is-typed-array: 1.1.15
+      reflect.getprototypeof: 1.0.10
+
+  [email protected]:
+    dependencies:
+      call-bind: 1.0.8
+      for-each: 0.3.5
+      gopd: 1.2.0
+      is-typed-array: 1.1.15
+      possible-typed-array-names: 1.1.0
+      reflect.getprototypeof: 1.0.10
+
+  [email protected]:
+    dependencies:
+      ts-toolbelt: 9.6.0
+
+  [email protected]([email protected]([email protected]))([email protected]):
+    dependencies:
+      '@typescript-eslint/eslint-plugin': 8.27.0(@typescript-eslint/[email protected]([email protected]([email protected]))([email protected]))([email protected]([email protected]))([email protected])
+      '@typescript-eslint/parser': 8.27.0([email protected]([email protected]))([email protected])
+      '@typescript-eslint/utils': 8.27.0([email protected]([email protected]))([email protected])
+      eslint: 9.22.0([email protected])
+      typescript: 5.7.3
+    transitivePeerDependencies:
+      - supports-color
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      call-bound: 1.0.4
+      has-bigints: 1.1.0
+      has-symbols: 1.1.0
+      which-boxed-primitive: 1.1.1
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]([email protected]):
+    dependencies:
+      browserslist: 4.24.4
+      escalade: 3.2.0
+      picocolors: 1.1.1
+
+  [email protected]:
+    dependencies:
+      tslib: 2.8.1
+
+  [email protected]:
+    dependencies:
+      tslib: 2.8.1
+
+  [email protected]:
+    dependencies:
+      punycode: 2.3.1
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      spdx-correct: 3.2.0
+      spdx-expression-parse: 3.0.1
+
+  [email protected]([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])):
+    dependencies:
+      chalk: 4.1.2
+      debug: 4.4.0
+      fs-extra: 10.1.0
+      vite: 6.2.2(@types/[email protected])([email protected])([email protected])([email protected])([email protected])
+    transitivePeerDependencies:
+      - supports-color
+
+  [email protected]: {}
+
+  [email protected]([email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected])):
+    dependencies:
+      '@rollup/pluginutils': 4.2.1
+      change-case: 4.1.2
+      console: 0.7.2
+      es-module-lexer: 0.9.3
+      fs-extra: 10.1.0
+      magic-string: 0.25.9
+      pathe: 0.2.0
+      vite: 6.2.2(@types/[email protected])([email protected])([email protected])([email protected])([email protected])
+
+  [email protected](@types/[email protected])([email protected])([email protected])([email protected])([email protected]):
+    dependencies:
+      esbuild: 0.25.1
+      postcss: 8.5.3
+      rollup: 4.36.0
+    optionalDependencies:
+      '@types/node': 22.13.10
+      fsevents: 2.3.3
+      jiti: 2.4.2
+      less: 4.2.2
+      sass: 1.86.0
+      yaml: 2.7.0
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      http-parser-js: 0.5.9
+      safe-buffer: 5.2.1
+      websocket-extensions: 0.1.4
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      iconv-lite: 0.6.3
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      is-bigint: 1.1.0
+      is-boolean-object: 1.2.2
+      is-number-object: 1.1.1
+      is-string: 1.1.1
+      is-symbol: 1.1.1
+
+  [email protected]:
+    dependencies:
+      call-bound: 1.0.4
+      function.prototype.name: 1.1.8
+      has-tostringtag: 1.0.2
+      is-async-function: 2.1.1
+      is-date-object: 1.1.0
+      is-finalizationregistry: 1.1.1
+      is-generator-function: 1.1.0
+      is-regex: 1.2.1
+      is-weakref: 1.1.1
+      isarray: 2.0.5
+      which-boxed-primitive: 1.1.1
+      which-collection: 1.0.2
+      which-typed-array: 1.1.19
+
+  [email protected]:
+    dependencies:
+      is-map: 2.0.3
+      is-set: 2.0.3
+      is-weakmap: 2.0.2
+      is-weakset: 2.0.4
+
+  [email protected]:
+    dependencies:
+      available-typed-arrays: 1.0.7
+      call-bind: 1.0.8
+      call-bound: 1.0.4
+      for-each: 0.3.5
+      get-proto: 1.0.1
+      gopd: 1.2.0
+      has-tostringtag: 1.0.2
+
+  [email protected]:
+    dependencies:
+      isexe: 2.0.0
+
+  [email protected]:
+    dependencies:
+      isexe: 2.0.0
+
+  [email protected]:
+    dependencies:
+      string-width: 7.2.0
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      ansi-styles: 4.3.0
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+
+  [email protected]:
+    dependencies:
+      ansi-styles: 6.2.1
+      string-width: 5.1.2
+      strip-ansi: 7.1.0
+
+  [email protected]:
+    dependencies:
+      ansi-styles: 6.2.1
+      string-width: 7.2.0
+      strip-ansi: 7.1.0
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      imurmurhash: 0.1.4
+      signal-exit: 4.1.0
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]: {}
+
+  [email protected]:
+    dependencies:
+      cliui: 8.0.1
+      escalade: 3.2.0
+      get-caller-file: 2.0.5
+      require-directory: 2.1.1
+      string-width: 4.2.3
+      y18n: 5.0.8
+      yargs-parser: 21.1.1
+
+  [email protected]:
+    dependencies:
+      buffer-crc32: 0.2.13
+      fd-slicer: 1.1.0
+
+  [email protected]: {}
+
+  [email protected]: {}

+ 7 - 0
postcss.config.js

@@ -0,0 +1,7 @@
+export default {
+    plugins: {
+        tailwindcss: {},
+        autoprefixer: {},
+        'postcss-nesting': {},
+    },
+};

+ 1 - 0
public/vite.svg

@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>

+ 37 - 0
src/App.tsx

@@ -0,0 +1,37 @@
+import React from 'react';
+
+import { ConfigProvider } from 'antd';
+import enUS from 'antd/locale/en_US';
+import faIR from 'antd/locale/fa_IR';
+import { useTranslation } from 'react-i18next';
+import { RouterProvider } from 'react-router-dom';
+
+import router from './router';
+import models from './utils/model/autoImportModels';
+
+const localeMap = {
+    'en-US': enUS,
+    'fa-IR': faIR,
+};
+
+const App: React.FC = () => {
+    const { i18n } = useTranslation();
+    const locale = localeMap[i18n.language as keyof typeof localeMap] || enUS;
+
+    // 创建所有 model 的 Provider 组件
+    const ModelProviders = ({ children }: { children: React.ReactNode }) => {
+        return models.reduce((acc, model) => {
+            return <model.Provider>{acc}</model.Provider>;
+        }, children);
+    };
+
+    return (
+        <ConfigProvider locale={locale}>
+            <ModelProviders>
+                <RouterProvider router={router} />
+            </ModelProviders>
+        </ConfigProvider>
+    );
+};
+
+export default App;

+ 5 - 0
src/assets/iconify/multi-color/logo.svg

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5" fill="none" stroke="#4F26E5" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+    <path d="M12 2L2 7l10 5 10-5-10-5z" fill="#2F26E5" fill-opacity="0.1"/>
+</svg> 

+ 4 - 0
src/assets/iconify/single-color/home.svg

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z" fill="currentColor"/>
+</svg> 

+ 4 - 0
src/assets/iconify/single-color/user.svg

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+    <path d="M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z" fill="currentColor"/>
+</svg> 

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


+ 21 - 0
src/components/LanguageSwitch.tsx

@@ -0,0 +1,21 @@
+import { Select } from 'antd';
+import { useTranslation } from 'react-i18next';
+
+const { Option } = Select;
+
+const LanguageSwitch = () => {
+    const { i18n } = useTranslation();
+
+    const handleChange = (value: string) => {
+        i18n.changeLanguage(value);
+    };
+
+    return (
+        <Select value={i18n.language} onChange={handleChange} style={{ width: 120 }}>
+            <Option value="fa-IR">فارسی</Option>
+            <Option value="en-US">English</Option>
+        </Select>
+    );
+};
+
+export default LanguageSwitch;

+ 33 - 0
src/config/index.ts

@@ -0,0 +1,33 @@
+import type { Config } from './types';
+
+const env = import.meta.env.VITE_APP_ENV || 'production';
+const isDev = env === 'development';
+const isTest = env === 'test';
+
+const configTitle = import.meta.env.VITE_APP_TITLE!;
+let title = configTitle;
+if (isDev) {
+    title = `${configTitle} - 开发环境`;
+} else if (isTest) {
+    title = `${configTitle} - 测试环境`;
+}
+
+const config: Config = {
+    app: {
+        title,
+        version: import.meta.env.VITE_APP_VERSION!,
+        routerMode: import.meta.env.VITE_ROUTER_MODE!,
+        storageNameSpace: import.meta.env.VITE_STORAGE_NAME_SPACE!,
+    },
+    security: {
+        enableRequestEncryption: import.meta.env.VITE_ENABLE_REQUEST_ENCRYPTION === 'true',
+        requestEncryptionKey: import.meta.env.VITE_REQUEST_ENCRYPTION_KEY ?? 'unknown',
+        enableStorageEncryption: import.meta.env.VITE_ENABLE_STORAGE_ENCRYPTION === 'true',
+        storageEncryptionKey: import.meta.env.VITE_STORAGE_ENCRYPTION_KEY ?? 'unknown',
+    },
+    api: {
+        baseURL: import.meta.env.VITE_API_BASE_URL!,
+    },
+};
+
+export default config;

+ 68 - 0
src/config/request/authHeaderInterceptor.ts

@@ -0,0 +1,68 @@
+import { fetchRefreshToken } from '@/services/login';
+import { formatToken, getToken, setToken } from '@/utils/authUtils';
+import { md5, sha1 } from '@/utils/crypto';
+import { IRequestInterceptorAxios, RequestConfig } from '@/utils/request/types';
+import { currentUnixTimestamp } from '@/utils/timeUtils';
+
+class TokenRefresh {
+    private static isRefreshing: boolean = false;
+    private static requests: { (token: string): void }[] = [];
+
+    private static retryOriginalRequest(config: RequestConfig) {
+        return new Promise((resolve) => {
+            TokenRefresh.requests.push((accessToken: string) => {
+                config.headers = config.headers ?? {};
+                config.headers['Authorization'] = formatToken(accessToken);
+                resolve(config);
+            });
+        });
+    }
+
+    public static beforeRequestRefreshTokenFirst(config: RequestConfig, refreshToken: string) {
+        return new Promise((resolve, reject) => {
+            if (!TokenRefresh.isRefreshing) {
+                TokenRefresh.isRefreshing = true;
+                fetchRefreshToken({ headers: { Authorization: formatToken(refreshToken) } })
+                    .then(
+                        (res: API.RefreshTokenResult) => {
+                            const info = res.data as API.UserInfo;
+                            const accessToken = info.accessToken!;
+                            setToken({
+                                accessToken: accessToken,
+                                expires: info.expires,
+                                refreshToken: info.refreshToken,
+                            });
+                            config.headers = config.headers ?? {};
+                            config.headers['Authorization'] = formatToken(accessToken);
+                            TokenRefresh.requests.forEach((cb) => cb(accessToken));
+                            TokenRefresh.requests = [];
+                        },
+                        (err: Error) => {
+                            reject(err);
+                        }
+                    )
+                    .finally(() => {
+                        TokenRefresh.isRefreshing = false;
+                    });
+            }
+            resolve(TokenRefresh.retryOriginalRequest(config));
+        });
+    }
+}
+
+export const authHeaderInterceptor: IRequestInterceptorAxios = (config: RequestConfig) => {
+    const ts = currentUnixTimestamp();
+    config.headers = config.headers ?? {};
+    config.headers['X-Request-Sign'] = sha1(ts + md5(navigator.userAgent ?? ''));
+    config.headers['X-Request-Timestamp'] = ts;
+    if (config.requireToken !== true) return config;
+
+    const data = getToken();
+    const expires = (data.expires ?? 0) - currentUnixTimestamp() > 0;
+    if (data.accessToken && expires) {
+        config.headers['Authorization'] = formatToken(data.accessToken);
+        return config;
+    } else {
+        return TokenRefresh.beforeRequestRefreshTokenFirst(config, data.refreshToken!);
+    }
+};

+ 63 - 0
src/config/request/encryptionInterceptors.ts

@@ -0,0 +1,63 @@
+import globalConfig from '@/config';
+import { aesEncrypt, aesDecrypt } from '@/utils/crypto';
+import {
+    IRequestInterceptorAxios,
+    IResponseInterceptor,
+    RequestConfig,
+} from '@/utils/request/types';
+
+/**
+ * 请求数据加密拦截器
+ * 对请求数据进行加密
+ */
+export const requestEncryptionInterceptor: IRequestInterceptorAxios = (config) => {
+    const { enabled: optEnableEncryption, key: optEncryptionKey } =
+        (config as RequestConfig)?.encryption ?? {};
+
+    const enableEncryption = optEnableEncryption ?? globalConfig.security.enableRequestEncryption;
+    const encryptionKey = optEncryptionKey ?? globalConfig.security.requestEncryptionKey;
+
+    if (!enableEncryption) {
+        return config;
+    }
+
+    if (['post', 'put'].includes(config.method?.toLowerCase() || '') && config.data) {
+        config.headers = {
+            ...(config.headers ?? {}),
+            'X-Request-Encrypted': 'true',
+            'Content-Type': 'text/plain',
+        };
+        config.data = aesEncrypt(JSON.stringify(config.data), encryptionKey);
+    }
+
+    return config;
+};
+
+/**
+ * 响应数据解密拦截器
+ * 对响应数据进行解密
+ */
+export const responseDecryptionInterceptor: IResponseInterceptor = (response) => {
+    const { enabled: optEnableEncryption, key: optEncryptionKey } =
+        (response.config as RequestConfig)?.encryption ?? {};
+
+    const enableEncryption = optEnableEncryption ?? globalConfig.security.enableRequestEncryption;
+    const encryptionKey = optEncryptionKey ?? globalConfig.security.requestEncryptionKey;
+
+    if (!enableEncryption) {
+        return response;
+    }
+
+    const isEncrypted = response.headers?.['X-Response-Encrypted'] === 'true';
+    if (isEncrypted && response.data) {
+        const decryptedData = aesDecrypt(response.data as string, encryptionKey);
+        if (decryptedData) {
+            try {
+                response.data = JSON.parse(decryptedData);
+            } catch (error) {
+                console.error('Failed to parse decrypted response data:', error);
+            }
+        }
+    }
+    return response;
+};

+ 27 - 0
src/config/request/index.ts

@@ -0,0 +1,27 @@
+import { stringify } from 'qs';
+
+import { RequestConfig } from '@/utils/request/types';
+
+import { authHeaderInterceptor } from './authHeaderInterceptor';
+import {
+    requestEncryptionInterceptor,
+    responseDecryptionInterceptor,
+} from './encryptionInterceptors';
+import { errorConfig } from './requestErrorConfig';
+
+const config: RequestConfig = {
+    baseURL: import.meta.env.VITE_API_BASE_URL!,
+    // 请求超时时间
+    timeout: 15000,
+    headers: {
+        Accept: 'application/json, text/plain, */*',
+        'Content-Type': 'application/json',
+        'X-Requested-With': 'XMLHttpRequest',
+    },
+    paramsSerializer: (params) => stringify(params),
+    ...errorConfig,
+    requestInterceptors: [authHeaderInterceptor, requestEncryptionInterceptor],
+    responseInterceptors: [responseDecryptionInterceptor],
+};
+
+export default config;

+ 132 - 0
src/config/request/requestErrorConfig.ts

@@ -0,0 +1,132 @@
+import { message, notification } from 'antd';
+import axios from 'axios';
+
+import { ErrorShowType } from '@/defines';
+import { reportError } from '@/firebase';
+import { RequestConfig } from '@/utils/request/types';
+import { toLoginPage } from '@/utils/routerUtils';
+
+/**
+ * @name 错误处理
+ */
+export const errorConfig: RequestConfig = {
+    // 错误处理: umi@3 的错误处理方案。
+    errorConfig: {
+        // 错误抛出
+        errorThrower: (res: any) => {
+            const { success, data, errorCode, errorMessage, showType } =
+                res as unknown as API.Result;
+            if (!success) {
+                const error: any = new Error(errorMessage);
+                error.name = 'BizError';
+                error.info = { errorCode, errorMessage, showType, data };
+                throw error; // 抛出自制的错误
+            }
+        },
+        // 错误接收及处理
+        errorHandler: (error: any, opts: any) => {
+            if (axios.isCancel(error)) {
+                console.warn('请求已被取消', error, opts);
+                Object.assign(error, { isCanceled: true });
+                return;
+            }
+
+            // 错误上报逻辑
+            if (error.name === 'BizError') {
+                // 接口业务错误
+                const errorInfo: API.Result | undefined = error.info;
+                if (errorInfo) {
+                    const { errorMessage, errorCode, data } = errorInfo;
+                    reportError(error, {
+                        errorName: 'apiBiz',
+                        errorCode: errorCode,
+                        errorMessage: errorMessage,
+                        errorData: data,
+                        requestUrl: opts?.url,
+                        requestMethod: opts?.method,
+                    });
+                }
+            } else if (error.response) {
+                // 接口响应错误
+                reportError(error, {
+                    errorName: 'apiResponse',
+                    errorCode: error.response.status,
+                    errorMessage: error.message,
+                    responseData: error.response.data,
+                    requestUrl: error.config?.url,
+                    requestMethod: error.config?.method,
+                });
+            } else if (error.request) {
+                // 请求已经成功发起,但没有收到响应
+                reportError(error, {
+                    errorName: 'apiNetwork',
+                    errorMessage: 'None response',
+                    requestUrl: error.config?.url,
+                    requestMethod: error.config?.method,
+                });
+            } else {
+                // 发送请求时出了点问题
+                reportError(error, {
+                    errorName: 'apiRequest',
+                    errorMessage: 'Invalid request configuration or parameters',
+                    requestUrl: error.config?.url,
+                    requestMethod: error.config?.method,
+                });
+            }
+
+            if (opts?.skipErrorHandler) throw error;
+
+            // errorThrower 抛出的错误。
+            if (error.name === 'BizError') {
+                const errorInfo: API.Result | undefined = error.info;
+                if (errorInfo) {
+                    const { errorMessage, errorCode } = errorInfo;
+
+                    if (errorCode === 401) {
+                        toLoginPage();
+                        return;
+                    }
+                    switch (errorInfo.showType) {
+                        case ErrorShowType.SILENT:
+                            // do nothing
+                            break;
+                        case ErrorShowType.WARN_MESSAGE:
+                            message.warning(errorMessage);
+                            break;
+                        case ErrorShowType.ERROR_MESSAGE:
+                            message.error(errorMessage);
+                            break;
+                        case ErrorShowType.NOTIFICATION:
+                            notification.error({
+                                description: errorMessage,
+                                message: errorCode,
+                            });
+                            break;
+                        case ErrorShowType.REDIRECT:
+                            // TODO: redirect
+                            break;
+                        default:
+                            message.error(errorMessage);
+                    }
+                }
+            } else if (error.response) {
+                // Axios 的错误
+                if (error.response.status === 401) {
+                    toLoginPage();
+                    return;
+                }
+
+                notification.error({
+                    message: error.response.status,
+                    description: error.message,
+                });
+            } else if (error.request) {
+                // 请求已经成功发起,但没有收到响应
+                message.error('None response! Please retry.');
+            } else {
+                // 发送请求时出了点问题
+                message.error('Request error, please retry.');
+            }
+        },
+    },
+};

+ 26 - 0
src/config/types.ts

@@ -0,0 +1,26 @@
+export interface Config {
+    app: {
+        /**应用标题 */
+        title: string;
+        /**应用版本 */
+        version: string;
+        /**路由模式 */
+        routerMode: 'hash' | 'history';
+        /**存储命名空间 */
+        storageNameSpace: string;
+    };
+    security: {
+        /**是否启用请求加密 */
+        enableRequestEncryption: boolean;
+        /**请求加密密钥 */
+        requestEncryptionKey: string;
+        /**存储加密总开关,如果设置为 false,则会忽略 StorageOptions 中的加密配置,不对存储进行加密 */
+        enableStorageEncryption: boolean;
+        /**存储加密密钥 */
+        storageEncryptionKey: string;
+    };
+    api: {
+        /**API基础URL */
+        baseURL: string;
+    };
+}

+ 7 - 0
src/defines/errorShowType.ts

@@ -0,0 +1,7 @@
+export enum ErrorShowType {
+    SILENT = 0,
+    WARN_MESSAGE = 1,
+    ERROR_MESSAGE = 2,
+    NOTIFICATION = 4,
+    REDIRECT = 9,
+}

+ 1 - 0
src/defines/index.ts

@@ -0,0 +1 @@
+export * from './errorShowType';

+ 64 - 0
src/firebase.tsx

@@ -0,0 +1,64 @@
+import { getAnalytics, logEvent, setUserProperties } from 'firebase/analytics';
+import { initializeApp } from 'firebase/app';
+
+const firebaseConfig = {
+    apiKey: 'AIzaSyCxwmQ0oUKyUi-FVdqtNZx7SE_a0Mg7xHM',
+    authDomain: 'jump-visacard.firebaseapp.com',
+    projectId: 'jump-visacard',
+    storageBucket: 'jump-visacard.firebasestorage.app',
+    messagingSenderId: '508907990485',
+    appId: '1:508907990485:web:2f3bddddfc1d431224a15c',
+    measurementId: 'G-G87QHZ6J4L',
+};
+
+// Initialize Firebase
+console.log('Firebase 初始化开始');
+const app = initializeApp(firebaseConfig);
+console.log('Firebase app 已创建');
+const analytics = getAnalytics(app);
+console.log('Firebase analytics 已创建');
+
+/**
+ * 上报自定义事件
+ * @param eventName 事件名称
+ * @param eventParams 事件参数
+ */
+export const reportEvent = (eventName: string, eventParams?: Record<string, any>) => {
+    try {
+        logEvent(analytics, eventName, eventParams);
+    } catch (error) {
+        console.error('Failed to report event:', error);
+    }
+};
+
+/**
+ * 上报错误事件
+ * @param error 错误对象
+ * @param errorContext 错误上下文
+ */
+export const reportError = (error: Error, errorContext?: Record<string, any>) => {
+    try {
+        logEvent(analytics, 'error', {
+            error_message: error.message,
+            error_stack: error.stack,
+            error_name: error.name,
+            ...errorContext,
+        });
+    } catch (e) {
+        console.error('Failed to report error:', e);
+    }
+};
+
+/**
+ * 设置用户属性
+ * @param properties 用户属性对象
+ */
+export const setUserPropertyValue = (properties: Record<string, string>) => {
+    try {
+        setUserProperties(analytics, properties);
+    } catch (error) {
+        console.error('Failed to set user properties:', error);
+    }
+};
+
+export { app, analytics };

+ 192 - 0
src/i18n/index.ts

@@ -0,0 +1,192 @@
+import i18n from 'i18next';
+import LanguageDetector from 'i18next-browser-languagedetector';
+import { initReactI18next } from 'react-i18next';
+
+import { getLangTarget } from './langMap';
+
+/**
+// ****************** 不使用 LanguageDetector、不支持按需加载翻译文件 时 i18n 的配置方法 ******************
+// 自动导入所有翻译文件
+const modules = import.meta.glob('@/locales/*.ts', { eager: true });
+const resources: Record<string, { translation: Record<string, any> }> = {};
+const languageCodes = new Set<string>();
+Object.entries(modules).forEach(([path, module]) => {
+    const lang = path.split('/').pop()?.replace('.ts', '') || '';
+    resources[lang] = {
+        translation: (module as { default: Record<string, string> }).default,
+    };
+    languageCodes.add(lang);
+    const baseCode = lang.split('-')[0];
+    languageCodes.add(baseCode);
+});
+const supportedLanguages = Array.from(languageCodes).sort();
+
+// 检查语言是否有对应的翻译文件
+const hasTranslation = (lang: string) => {
+    return lang in resources;
+};
+
+// 获取URL中的语言参数
+const getLangFromUrl = () => {
+    if (typeof window === 'undefined') return null;
+
+    const searchParams = new URLSearchParams(window.location.search);
+    const searchLang = searchParams.get('lang');
+    if (searchLang) return searchLang;
+
+    const hash = window.location.hash;
+    const hashParams = new URLSearchParams(hash.split('?')[1] || '');
+    return hashParams.get('lang');
+};
+
+// 获取浏览器语言
+const getBrowserLang = () => {
+    if (typeof window === 'undefined') return 'en-US';
+    return getLangTarget(navigator.language);
+};
+
+// 初始化语言
+const initLang = () => {
+    const urlLang = getLangFromUrl();
+    if (urlLang) {
+        const targetLang = getLangTarget(urlLang);
+        return hasTranslation(targetLang) ? targetLang : 'en-US';
+    }
+    const browserLang = getBrowserLang();
+    return hasTranslation(browserLang) ? browserLang : 'en-US';
+};
+
+i18n.use(initReactI18next).init({
+    supportedLngs: supportedLanguages,
+    lng: initLang(), // 默认语言为英文
+    fallbackLng: 'en-US', // 后备语言为英文
+    debug:
+        import.meta.env.VITE_APP_ENV === 'development' || import.meta.env.VITE_APP_ENV === 'test',
+    interpolation: {
+        escapeValue: false,
+        prefix: '{',
+        suffix: '}',
+    },
+    resources,
+});
+// ****************** 不使用 LanguageDetector、不支持按需加载翻译文件 时 i18n 的配置方法 end ******************
+*/
+
+/**
+// ****************** 使用 LanguageDetector、不支持按需加载翻译文件 时 i18n 的配置方法 ******************
+// 自动导入所有翻译文件
+const modules = import.meta.glob('@/locales/*.ts', { eager: true });
+const resources: Record<string, { translation: Record<string, any> }> = {};
+const languageCodes = new Set<string>();
+Object.entries(modules).forEach(([path, module]) => {
+    const lang = path.split('/').pop()?.replace('.ts', '') || '';
+    resources[lang] = {
+        translation: (module as { default: Record<string, string> }).default,
+    };
+    languageCodes.add(lang);
+    const baseCode = lang.split('-')[0];
+    languageCodes.add(baseCode);
+});
+const supportedLanguages = Array.from(languageCodes).sort();
+
+// 初始化i18n
+i18n.use(LanguageDetector)
+    .use(initReactI18next)
+    .init({
+        supportedLngs: supportedLanguages,
+        fallbackLng: 'en-US',
+        detection: {
+            order: ['querystring', 'navigator'],
+            lookupQuerystring: 'lang',
+            caches: [],
+            convertDetectedLanguage: (lang) => {
+                const result = getLangTarget(lang);
+                console.warn(`convert detected language ~ lang: ${lang} ->  ${result}`);
+                return result;
+            },
+        },
+        debug:
+            import.meta.env.VITE_APP_ENV === 'development' ||
+            import.meta.env.VITE_APP_ENV === 'test',
+        interpolation: {
+            escapeValue: false,
+            prefix: '{',
+            suffix: '}',
+        },
+        resources,
+    });
+// ****************** 使用 LanguageDetector、不支持按需加载翻译文件 时 i18n 的配置方法 ******************
+*/
+
+// ****************** 使用 LanguageDetector、支持按需加载翻译文件 时 i18n 的配置方法 ******************
+const modules = import.meta.glob('@/locales/*.ts');
+const languageFiles: Record<string, () => Promise<any>> = {};
+const languageCodes = new Set<string>();
+Object.entries(modules).forEach(([path]) => {
+    const lang = path.split('/').pop()?.replace('.ts', '') || '';
+    languageFiles[lang] = modules[path];
+    languageCodes.add(lang);
+    const baseCode = lang.split('-')[0];
+    languageCodes.add(baseCode);
+});
+const supportedLanguages = Array.from(languageCodes).sort();
+
+const loadLanguage = async (lang: string) => {
+    console.log('i18next: before loadLanguage:', lang);
+    if (i18n.hasResourceBundle(lang, 'translation')) {
+        return;
+    }
+
+    if (!languageFiles[lang]) {
+        console.error(`i18next: language file not found for: ${lang}`);
+        return;
+    }
+
+    try {
+        const module = await languageFiles[lang]();
+        const translations = (module as { default: Record<string, string> }).default;
+        i18n.addResourceBundle(lang, 'translation', translations, true, true);
+        console.log('i18next: successfully loaded language:', lang);
+    } catch (error) {
+        console.error(`i18next: failed to load language: ${lang}`, error);
+    }
+};
+
+// 先监听语言变化,否则等初始化完成之后再监听,会导致接收不到初始化时的 languageChanged 事件,不加载初始语言的翻译文件
+i18n.on('languageChanged', async (lang) => {
+    console.log('i18next: onLanguageChanged--------', lang);
+    if (!i18n.hasResourceBundle(lang, 'translation')) {
+        await loadLanguage(lang);
+        i18n.changeLanguage(lang);
+    }
+});
+
+// 初始化i18n
+i18n.use(LanguageDetector)
+    .use(initReactI18next)
+    .init({
+        supportedLngs: supportedLanguages,
+        fallbackLng: 'en-US',
+        detection: {
+            order: ['querystring', 'navigator'],
+            lookupQuerystring: 'lang',
+            caches: [],
+            convertDetectedLanguage: (lang) => {
+                const result = getLangTarget(lang);
+                console.warn(`convert detected language ~ lang: ${lang} ->  ${result}`);
+                return result;
+            },
+        },
+        debug:
+            import.meta.env.VITE_APP_ENV === 'development' ||
+            import.meta.env.VITE_APP_ENV === 'test',
+        interpolation: {
+            escapeValue: false,
+            prefix: '{',
+            suffix: '}',
+        },
+        resources: {},
+    });
+// ****************** 使用 LanguageDetector、支持按需加载翻译文件 时 i18n 的配置方法 end ******************
+
+export default i18n;

+ 344 - 0
src/i18n/langMap.ts

@@ -0,0 +1,344 @@
+const langMap: { [key: string]: string } = {
+    // 简单语言标识映射
+    fa: 'fa-IR', // 波斯语
+    zh: 'zh-CN', // 中文
+    en: 'en-US', // 英语(改为美国英语作为默认)
+    ar: 'ar-SA', // 阿拉伯语
+    de: 'de-DE', // 德语
+    es: 'es-ES', // 西班牙语
+    fr: 'fr-FR', // 法语
+    hi: 'hi-IN', // 印地语(修正为印地语)
+    id: 'id-ID', // 印度尼西亚语
+    it: 'it-IT', // 意大利语
+    ja: 'ja-JP', // 日语
+    ko: 'ko-KR', // 朝鲜语
+    nl: 'nl-NL', // 荷兰语
+    pl: 'pl-PL', // 波兰语
+    pt: 'pt-PT', // 葡萄牙语
+    ru: 'ru-RU', // 俄语
+    sv: 'sv-SE', // 瑞典语
+    th: 'th-TH', // 泰语
+    tr: 'tr-TR', // 土耳其语
+    vi: 'vi-VN', // 越南语
+    // 新增简单语言标识
+    af: 'af-ZA', // 南非荷兰语(修正为南非荷兰语)
+    am: 'am-ET', // 阿姆哈拉语
+    as: 'as-IN', // 阿萨姆语(修正为阿萨姆语)
+    az: 'az-AZ', // 阿塞拜疆语
+    be: 'be-BY', // 白俄罗斯语
+    bg: 'bg-BG', // 保加利亚语
+    bn: 'bn-BD', // 孟加拉语
+    bo: 'bo-CN', // 藏语(修正为藏语)
+    bs: 'bs-BA', // 波斯尼亚语
+    ca: 'ca-ES', // 加泰罗尼亚语(修正为加泰罗尼亚语)
+    cs: 'cs-CZ', // 捷克语
+    cy: 'cy-GB', // 威尔士语(修正为威尔士语)
+    da: 'da-DK', // 丹麦语
+    el: 'el-GR', // 希腊语
+    et: 'et-EE', // 爱沙尼亚语
+    eu: 'eu-ES', // 巴斯克语(修正为巴斯克语)
+    fi: 'fi-FI', // 芬兰语
+    ga: 'ga-IE', // 爱尔兰语(修正为爱尔兰语)
+    gd: 'gd-GB', // 苏格兰盖立语(修正为苏格兰盖立语)
+    gl: 'gl-ES', // 加利西亚语(修正为加利西亚语)
+    gu: 'gu-IN', // 古吉拉特语(修正为古吉拉特语)
+    he: 'he-IL', // 希伯来语
+    hr: 'hr-HR', // 克罗地亚语
+    hu: 'hu-HU', // 匈牙利语
+    hy: 'hy-AM', // 亚美尼亚语
+    is: 'is-IS', // 冰岛语
+    ka: 'ka-GE', // 格鲁吉亚语
+    kk: 'kk-KZ', // 哈萨克语
+    km: 'km-KH', // 高棉语
+    kn: 'kn-IN', // 埃纳德语(修正为埃纳德语)
+    ky: 'ky-KG', // 吉尔吉斯语
+    lo: 'lo-LA', // 老挝语
+    lt: 'lt-LT', // 立陶宛语
+    lv: 'lv-LV', // 拉脱维亚语
+    mk: 'mk-MK', // 马其顿语
+    ml: 'ml-IN', // 马拉雅拉姆语(修正为马拉雅拉姆语)
+    mn: 'mn-MN', // 蒙古语
+    mr: 'mr-IN', // 马拉地语(修正为马拉地语)
+    ms: 'ms-MY', // 马来语
+    mt: 'mt-MT', // 马其他语
+    my: 'my-MM', // 缅甸语
+    ne: 'ne-NP', // 尼泊尔语
+    no: 'nb-NO', // 挪威语
+    or: 'or-IN', // 奥里雅语(修正为奥里雅语)
+    pa: 'pa-IN', // 旁遮普语(修正为旁遮普语)
+    ps: 'ps-AF', // 普什图语
+    ro: 'ro-RO', // 罗马尼亚语
+    sa: 'sa-IN', // 梵语(修正为梵语)
+    sd: 'sd-PK', // 信德语(修正为信德语)
+    si: 'si-LK', // 僧伽罗语
+    sk: 'sk-SK', // 斯洛伐克语
+    sl: 'sl-SI', // 斯洛文尼亚语
+    sq: 'sq-AL', // 阿尔巴尼亚语
+    sr: 'sr-RS', // 塞尔维亚语
+    sw: 'sw-KE', // 斯瓦西里语
+    ta: 'ta-IN', // 泰米尔语(修正为泰米尔语)
+    te: 'te-IN', // 泰卢固语(修正为泰卢固语)
+    tg: 'tg-TJ', // 塔吉克语
+    ti: 'ti-ET', // 提格里尼亚语
+    tk: 'tk-TM', // 土库曼语
+    tt: 'tt-RU', // 鞑靼语(修正为鞑靼语)
+    ug: 'ug-CN', // 维吾尔语(修正为维吾尔语)
+    uk: 'uk-UA', // 乌克兰语
+    ur: 'ur-PK', // 乌尔都语
+    uz: 'uz-UZ', // 乌兹别克语
+    wo: 'wo-SN', // 沃洛夫语(修正为沃洛夫语)
+    xh: 'xh-ZA', // 索萨语(修正为索萨语)
+    yo: 'yo-NG', // 约鲁巴语(修正为约鲁巴语)
+    zu: 'zu-ZA', // 祖鲁语(修正为祖鲁语)
+
+    // 原有的详细语言映射
+    'sq-al': 'sq-AL', //阿尔巴尼亚语(阿尔巴尼亚)
+    'gsw-fr': 'gsw-FR', //阿尔萨斯语(法国)
+    'ar-dz': 'ar-DZ', //阿拉伯语(阿尔及利亚)
+    'ar-ae': 'ar-AE', //阿拉伯语(阿联酋)
+    'ar-om': 'ar-OM', //阿拉伯语(阿曼)
+    'ar-eg': 'ar-EG', //阿拉伯语(埃及)
+    'ar-bh': 'ar-BH', //阿拉伯语(巴林)
+    'ar-qa': 'ar-QA', //阿拉伯语(卡塔尔)
+    'ar-kw': 'ar-KW', //阿拉伯语(科威特)
+    'ar-lb': 'ar-LB', //阿拉伯语(黎巴嫩)
+    'ar-ly': 'ar-LY', //阿拉伯语(利⽐亚)
+    'ar-ma': 'ar-MA', //阿拉伯语(摩洛哥)
+    'ar-sa': 'ar-SA', //阿拉伯语(沙特阿拉伯)
+    'ar-tn': 'ar-TN', //阿拉伯语(突尼斯)
+    'ar-sy': 'ar-SY', //阿拉伯语(叙利亚)
+    'ar-ye': 'ar-YE', //阿拉伯语(也门)
+    'ar-iq': 'ar-IQ', //阿拉伯语(伊拉克)
+    'ar-jo': 'ar-JO', //阿拉伯语(约旦)
+    'am-et': 'am-ET', //阿姆哈拉语(埃塞俄⽐亚)
+    'as-in': 'as-IN', //阿萨姆语(印度)
+    'az-latn': 'az-AZ', //阿塞拜疆语(拉丁语)
+    'az-latn-az': 'az-AZ', //阿塞拜疆语(拉丁语,阿塞拜疆)
+    'az-cyrl': 'az-AZ', //阿塞拜疆语(西⾥尔⽂)
+    'az-cyrl-az': 'az-AZ', //阿塞拜疆语(西⾥尔⽂,阿塞拜疆)
+    'kn-in': 'kn-IN', //埃纳德语(印度)
+    'ga-ie': 'ga-IE', //爱尔兰语(爱尔兰)
+    'et-ee': 'et-EE', //爱沙尼亚语(爱沙尼亚)
+    'oc-fr': 'oc-FR', //奥克西唐语(法国)
+    'or-in': 'or-IN', //奥里雅语(印度)
+    'ba-ru': 'ba-RU', //巴什基尔语(俄罗斯)
+    'eu-es': 'eu-ES', //巴斯克语(巴斯克)
+    'nso-za': 'nso-ZA', //巴索托语(南⾮)
+    'be-by': 'be-BY', //白俄罗斯语(白俄罗斯)
+    'bg-bg': 'bg-BG', //保加利亚语(保加利亚)
+    'se-fi': 'se-FI', //北萨米语(芬兰)
+    'se-no': 'se-NO', //北萨米语(挪威)
+    'se-se': 'se-SE', //北萨米语(瑞典)
+    'is-is': 'is-IS', //冰岛语(冰岛)
+    'pl-pl': 'pl-PL', //波兰语(波兰)
+    'bs-latn': 'bs-BA', //波斯尼亚语(拉丁语)
+    'bs-latn-ba': 'bs-BA', //波斯尼亚语(拉丁语,波斯尼亚和⿊塞哥维那)
+    'bs-cyrl': 'bs-BA', //波斯尼亚语(西⾥尔⽂)
+    'bs-cyrl-ba': 'bs-BA', //波斯尼亚语(西⾥尔⽂,波斯尼亚和⿊塞哥维那)
+    'fa-ir': 'fa-IR', //波斯语
+    'br-fr': 'br-FR', //布里多尼语(法国)
+    'bo-cn': 'bo-CN', //藏语(中国)
+    'ko-kr': 'ko-KR', //朝鲜语(韩国)
+    'tn-za': 'tn-ZA', //茨瓦纳语(南非)
+    'prs-af': 'ps-AF', //达里语(阿富汗)
+    'tt-ru': 'tt-RU', //鞑靼语(俄罗斯)
+    'da-dk': 'da-DK', //丹麦语(丹麦)
+    'de-at': 'de-AT', //德语(奥地利)
+    'de-de': 'de-DE', //德语(德国)
+    'de-li': 'de-LI', //德语(列⽀敦⼠登)
+    'de-lu': 'de-LU', //德语(卢森堡)
+    'de-ch': 'de-CH', //德语(瑞⼠)
+    'dv-mv': 'dv-MV', //迪维希语(马尔代夫)
+    'ru-ru': 'ru-RU', //俄语(俄罗斯)
+    'fo-fo': 'fo-FO', //法罗语(法罗群岛)
+    'fr-be': 'fr-BE', //法语(⽐利时)
+    'fr-fr': 'fr-FR', //法语(法国)
+    'fr-ca': 'fr-CA', //法语(加拿⼤)
+    'fr-lu': 'fr-LU', //法语(卢森堡)
+    'fr-mc': 'fr-MC', //法语(摩纳哥)
+    'fr-ch': 'fr-CH', //法语(瑞⼠)
+    'sa-in': 'sa-IN', //梵语(印度)
+    'fil-ph': 'fil-PH', //菲律宾语(菲律宾)
+    'fi-fi': 'fi-FI', //芬兰语(芬兰)
+    'fy-nl': 'fy-NL', //弗⾥西亚语(荷兰)
+    'km-kh': 'km-KH', //高棉语(柬埔寨)
+    'kl-gl': 'kl-GL', //格陵兰语(格陵兰)
+    'ka-ge': 'ka-GE', //格鲁吉亚语(格鲁吉亚)
+    'gu-in': 'gu-IN', //古吉拉特语(印度)
+    'kk-kz': 'kk-KZ', //哈萨克语(哈萨克斯坦)
+    'ha-latn': 'ha-NG', //豪撒语(拉丁语)
+    'ha-latn-ng': 'ha-NG', //豪撒语(拉丁语,尼⽇利亚)
+    'nl-be': 'nl-BE', //荷兰语(⽐利时)
+    'nl-nl': 'nl-NL', //荷兰语(荷兰)
+    'qut-gt': 'qut-GT', //基切语(危地马拉)
+    'ky-kg': 'ky-KG', //吉尔吉斯语(吉尔吉斯斯坦)
+    'gl-es': 'gl-ES', //加利西亚语(加利西亚语)
+    'ca-es': 'ca-ES', //加泰罗尼亚语(加泰罗尼亚)
+    'ca-es-valencia': 'ca-ES', //加泰罗尼亚语(加泰罗尼亚)
+    'cs-cz': 'cs-CZ', //捷克语(捷克共和国)
+    'co-fr': 'co-FR', //科西嘉语(法国)
+    'hr-hr': 'hr-HR', //克罗地亚语(克罗地亚)
+    'hr-ba': 'hr-BA', //克罗地亚语(拉丁语,波斯尼亚和⿊塞哥维那)
+    'quz-bo': 'quz-BO', //克丘亚语(玻利维亚)
+    'quz-ec': 'quz-EC', //克丘亚语(厄⽠多尔)
+    'quz-pe': 'quz-PE', //克丘亚语(秘鲁)
+    'kok-in': 'kok-IN', //孔卡尼语(印度)
+    'lv-lv': 'lv-LV', //拉脱维亚语(拉脱维亚)
+    'lo-la': 'lo-LA', //老挝语(老挝人民民主共和国)
+    'lt-lt': 'lt-LT', //立陶宛语(立陶宛)
+    'lb-lu': 'lb-LU', //卢森堡语(卢森堡)
+    'rw-rw': 'rw-RW', //卢旺达语(卢旺达)
+    'ro-ro': 'ro-RO', //罗马尼亚语(罗马尼亚)
+    'rm-ch': 'rm-CH', //罗曼什语(瑞⼠)
+    'smj-no': 'smj-NO', //律勒萨米语(挪威)
+    'smj-se': 'smj-SE', //律勒萨米语(瑞典)
+    'mt-mt': 'mt-MT', //马其他语(马其他)
+    'mr-in': 'mr-IN', //马拉地语(印度)
+    'ml-in': 'ml-IN', //马拉雅拉姆语(印度)
+    'ms-my': 'ms-MY', //马来语(马来西亚)
+    'ms-bn': 'ms-BN', //马来语(⽂莱达鲁萨兰国)
+    'my-mm': 'my-MM', //缅甸语(缅甸)
+    'arn-cl': 'arn-CL', //马普丹冈语(智利)
+    'mk-mk': 'mk-MK', //马其顿语(前南斯拉夫马其顿共和国)
+    'mi-nz': 'mi-NZ', //毛利语(新西兰)
+    'mn-mong': 'mn-MN', //蒙古语(传统蒙古语)
+    'mn-mong-cn': 'mn-MN', //蒙古语(传统蒙古语,中国)
+    'mn-cyrl': 'mn-MN', //蒙古语(西⾥尔⽂)
+    'mn-mn': 'mn-MN', //蒙古语(西⾥尔⽂,蒙古)
+    'bn-bd': 'bn-BD', //孟加拉语(孟加拉国)
+    'bn-in': 'bn-IN', //孟加拉语(印度)
+    'moh-ca': 'moh-CA', //莫霍克语(莫霍克)
+    'af-za': 'af-ZA', //南非荷兰语(南非)
+    'sma-no': 'sma-NO', //南萨米语(挪威)
+    'sma-se': 'sma-SE', //南萨米语(瑞典)
+    'ne-np': 'ne-NP', //尼泊尔语(尼泊尔)
+    'pa-in': 'pa-IN', //旁遮普语(印度)
+    'pa-arab-pk': 'pa-PK', //旁遮普语(阿拉伯语)
+    'pt-br': 'pt-BR', //葡萄牙语(巴西)
+    'pt-pt': 'pt-PT', //葡萄牙语(葡萄牙)
+    'chr-cher-us': 'chr-US', //切罗基语
+    'ja-jp': 'ja-JP', //日语(日本)
+    'sv-fi': 'sv-FI', //瑞典语(芬兰)
+    'sv-se': 'sv-SE', //瑞典语(瑞典)
+    'sr-latn': 'sr-RS', //塞尔维亚语(拉丁语)
+    'sr-latn-ba': 'sr-BA', //塞尔维亚语(拉丁语,波斯尼亚和⿊塞哥维那)
+    'sr-latn-me': 'sr-ME', //塞尔维亚语(拉丁语,⿊⼭共和国)
+    'sr-latn-rs': 'sr-RS', //塞尔维亚语(拉丁语,塞尔维亚共和国)
+    'sr-latn-cs': 'sr-RS', //塞尔维亚语(拉丁语,塞尔维亚和⿊⼭(前
+    'sr-cyrl': 'sr-RS', //塞尔维亚语(西⾥尔⽂)
+    'sr-cyrl-ba': 'sr-BA', //塞尔维亚语(西⾥尔⽂,波斯尼亚和⿊塞哥维那)
+    'sr-cyrl-me': 'sr-ME', //塞尔维亚语(西⾥尔⽂,⿊⼭共和国)
+    'sr-cyrl-rs': 'sr-RS', //塞尔维亚语(西⾥尔⽂,塞尔维亚共和国)
+    'sr-cyrl-cs': 'sr-RS', //塞尔维亚语(西⾥尔⽂,塞尔维亚和⿊⼭(前
+    'si-lk': 'si-LK', //僧伽罗语(斯⾥兰卡)
+    'hsb-de': 'hsb-DE', //上索布语(德国)
+    'nb-no': 'nb-NO', //书面挪威语(挪威)
+    'nn-no': 'nn-NO', //尼诺斯克挪威语(挪威)
+    'sms-fi': 'sms-FI', //斯科特萨⽶语(芬兰)
+    'sk-sk': 'sk-SK', //斯洛伐克语(斯洛伐克)
+    'sl-si': 'sl-SI', //斯洛文尼亚语(斯洛文尼亚)
+    'sw-ke': 'sw-KE', //斯瓦西里语(肯尼亚)
+    'gd-gb': 'gd-GB', //苏格兰盖立语(英国)
+    'tg-cyrl': 'tg-TJ', //塔吉克语(西⾥尔⽂)
+    'tg-cyrl-tj': 'tg-TJ', //塔吉克语(西⾥尔⽂,塔吉克斯坦)
+    'tzm-latn': 'tzm-DZ', //塔马塞特语(拉丁语)
+    'tzm-latn-dz': 'tzm-DZ', //塔马塞特语(拉丁语,阿尔及利亚)
+    'th-th': 'th-TH', //泰语(泰国)
+    'te-in': 'te-IN', //泰卢固语(印度)
+    'ta-in': 'ta-IN', //泰米尔语(印度)
+    'tr-tr': 'tr-TR', //土耳其语(土耳其)
+    'tk-tm': 'tk-TM', //土库曼语(土库曼斯坦)
+    'cy-gb': 'cy-GB', //威尔士语(英国)
+    'ug-cn': 'ug-CN', //维吾尔语(中国)
+    'wo-sn': 'wo-SN', //沃洛夫语(塞内加尔)
+    'ur-pk': 'ur-PK', //乌尔都语(巴基斯坦伊斯兰共和国)
+    'uk-ua': 'uk-UA', //乌克兰语(乌克兰)
+    'uz-latn': 'uz-UZ', //乌兹别克语(拉丁语)
+    'uz-latn-uz': 'uz-UZ', //乌兹别克语(拉丁语,乌兹别克斯坦)
+    'uz-cyrl': 'uz-UZ', //乌兹别克语(西⾥尔⽂)
+    'uz-cyrl-uz': 'uz-UZ', //乌兹别克语(西⾥尔⽂,乌兹别克斯坦)
+    'es-ar': 'es-AR', //西班牙语(阿根廷)
+    'es-py': 'es-PY', //西班牙语(巴拉圭)
+    'es-pa': 'es-PA', //西班牙语(巴拿马)
+    'es-pr': 'es-PR', //西班牙语(波多黎各)
+    'es-bo': 'es-BO', //西班牙语(玻利维亚)
+    'es-do': 'es-DO', //西班牙语(多⽶尼加共和国)
+    'es-ec': 'es-EC', //西班牙语(厄⽠多尔)
+    'es-co': 'es-CO', //西班牙语(哥伦⽐亚)
+    'es-cr': 'es-CR', //西班牙语(哥斯达黎加)
+    'es-hn': 'es-HN', //西班牙语(洪都拉斯)
+    'es-us': 'es-US', //西班牙语(美国)
+    'es-pe': 'es-PE', //西班牙语(秘鲁)
+    'es-mx': 'es-MX', //西班牙语(墨西哥)
+    'es-ni': 'es-NI', //西班牙语(尼加拉⽠)
+    'es-sv': 'es-SV', //西班牙语(萨尔⽡多)
+    'es-gt': 'es-GT', //西班牙语(危地马拉)
+    'es-ve': 'es-VE', //西班牙语(委内瑞拉玻利⽡尔共和国)
+    'es-uy': 'es-UY', //西班牙语(乌拉圭)
+    'es-es': 'es-ES', //西班牙语(西班⽛,国际排序)
+    'es-cl': 'es-CL', //西班牙语(智利)
+    'he-il': 'he-IL', //希伯来语(以⾊列)
+    'el-gr': 'el-GR', //希腊语(希腊)
+    'dsb-de': 'dsb-DE', //下索布语(德国)
+    'hu-hu': 'hu-HU', //匈牙利语(匈牙利)
+    'ad-arab-pk': 'sd-PK', //信德语(阿拉伯语)
+    'syr-sy': 'syr-SY', //叙利亚语(叙利亚)
+    'sah-ru': 'sah-RU', //雅库特语(俄罗斯)
+    'hy-am': 'hy-AM', //亚美尼亚语(亚美尼亚)
+    'ig-ng': 'ig-NG', //伊博语(尼⽇利亚)
+    'smn-fi': 'smn-FI', //伊纳里萨米语(芬兰)
+    'ii-cn': 'ii-CN', //彝语(中国)
+    'it-ch': 'it-CH', //意大利语(瑞⼠)
+    'it-it': 'it-IT', //意大利语(意⼤利)
+    'iu-latn': 'iu-CA', //因纽特语(拉丁语)
+    'iu-latn-ca': 'iu-CA', //因纽特语(拉丁语,加拿⼤)
+    'iu-cans': 'iu-CA', //因纽特语(⾳节)
+    'iu-cans-ca': 'iu-CA', //因纽特语(⾳节,加拿⼤)
+    'hi-in': 'hi-IN', //印地语(印度)
+    'id-id': 'id-ID', //印度尼西亚语(印度尼西亚)
+    'en-ie': 'en-IE', //英语(爱尔兰)
+    'en-au': 'en-AU', //英语(澳⼤利亚)
+    'en-bz': 'en-BZ', //英语(伯利兹)
+    'en-ph': 'en-PH', //英语(菲律宾共和国)
+    'en-029': 'en-029', //英语(加勒⽐海)
+    'en-ca': 'en-CA', //英语(加拿⼤)
+    'en-zw': 'en-ZW', //英语(津巴布韦)
+    'en-my': 'en-MY', //英语(马来西亚)
+    'en-us': 'en-US', //英语(美国)
+    'en-za': 'en-ZA', //英语(南⾮)
+    'en-tt': 'en-TT', //英语(特⽴尼达和多巴哥)
+    'en-sg': 'en-SG', //英语(新加坡)
+    'en-nz': 'en-NZ', //英语(新西兰)
+    'en-jm': 'en-JM', //英语(⽛买加)
+    'en-in': 'en-IN', //英语(印度)
+    'en-gb': 'en-GB', //英语(英国)
+    'yo-ng': 'yo-NG', //约鲁巴语(尼⽇利亚)
+    'vi-vn': 'vi-VN', //越南语(越南)
+    'zh-hant': 'zh-TW', //中文(繁体)
+    'zh-mo': 'zh-MO', //中文(繁体,澳门特别行政区)
+    'zh-tw': 'zh-TW', //中文(繁体,台湾)
+    'zh-hk': 'zh-HK', //中文(繁体,香港特别行政区)
+    'zh-cn': 'zh-CN', //中文(简体)
+    'zh-sg': 'zh-SG', //中文(简体,新加坡)
+    'ku-arab-iq': 'ku-IQ', //中部库尔德语
+
+    // 新增标准语言变体映射
+    'zh-hans': 'zh-CN', // 简体中文
+    'en-001': 'en-GB', // 国际英语
+    'en-150': 'en-GB', // 欧洲英语
+    'ar-001': 'ar-SA', // 现代标准阿拉伯语
+    'es-419': 'es-ES', // 拉丁美洲西班牙语
+    'fr-001': 'fr-FR', // 国际法语
+    'pt-001': 'pt-PT', // 国际葡萄牙语
+
+    // 新增特殊用途语言代码
+    und: 'en-US', // 未定义语言
+    mul: 'en-US', // 多语言
+    zxx: 'en-US', // 无语言内容
+};
+
+import replace from 'ramda/es/replace';
+
+export function getLangTarget(language: string): string {
+    return langMap[replace(/_/g, '-', language.toLowerCase())] || 'en-US';
+}

+ 21 - 0
src/layouts/BasicLayout.tsx

@@ -0,0 +1,21 @@
+import { Outlet } from 'react-router-dom';
+
+import LanguageSwitch from '@/components/LanguageSwitch';
+
+const BasicLayout = () => {
+    return (
+        <div className="min-h-screen bg-gray-50">
+            <header className="bg-white shadow-sm">
+                <div className="max-w-7xl mx-auto px-4 py-4 flex justify-between items-center">
+                    <h1 className="text-xl font-bold text-gray-900">Visa Card H5</h1>
+                    <LanguageSwitch />
+                </div>
+            </header>
+            <main className="max-w-7xl mx-auto px-4 py-6">
+                <Outlet />
+            </main>
+        </div>
+    );
+};
+
+export default BasicLayout;

+ 12 - 0
src/locales/en-US.ts

@@ -0,0 +1,12 @@
+import common from './en-US/common';
+import components from './en-US/components';
+import menus from './en-US/menus';
+import pages from './en-US/pages';
+
+export default {
+    DIR: 'ltr',
+    common,
+    menus,
+    components,
+    pages,
+};

+ 1 - 0
src/locales/en-US/common.ts

@@ -0,0 +1 @@
+export default {};

+ 1 - 0
src/locales/en-US/components.ts

@@ -0,0 +1 @@
+export default {};

+ 7 - 0
src/locales/en-US/menus.ts

@@ -0,0 +1,7 @@
+export default {
+    ['403']: '403',
+    ['500']: '500',
+    ['404']: '404',
+    ['home']: 'Home',
+    ['routeDemo']: 'Route Demo',
+};

+ 31 - 0
src/locales/en-US/pages.ts

@@ -0,0 +1,31 @@
+export default {
+    error: {
+        ['404']: {
+            title: '404',
+            subtitle: 'Sorry, the page you visited does not exist',
+            backHome: 'Back to Home',
+        },
+        ['403']: {
+            title: '403',
+            subtitle: 'Sorry, you are not authorized to access this page',
+            backHome: 'Back to Home',
+        },
+        ['500']: {
+            title: '500',
+            subtitle: 'Sorry, the server is reporting an error',
+            backHome: 'Back to Home',
+        },
+    },
+
+    home: {
+        title: 'Home',
+        description: 'This is an example page using Ant Design and Tailwind CSS',
+        features: {
+            title: 'Key Features',
+            antd: 'Using Ant Design Component Library',
+            tailwind: 'Using Tailwind CSS Framework',
+            i18n: 'Support for Internationalization',
+        },
+        getStarted: 'Get Started',
+    },
+};

+ 12 - 0
src/locales/fa-IR.ts

@@ -0,0 +1,12 @@
+import common from './fa-IR/common';
+import components from './fa-IR/components';
+import menus from './fa-IR/menus';
+import pages from './fa-IR/pages';
+
+export default {
+    DIR: 'rtl',
+    common,
+    menus,
+    components,
+    pages,
+};

+ 1 - 0
src/locales/fa-IR/common.ts

@@ -0,0 +1 @@
+export default {};

+ 1 - 0
src/locales/fa-IR/components.ts

@@ -0,0 +1 @@
+export default {};

+ 7 - 0
src/locales/fa-IR/menus.ts

@@ -0,0 +1,7 @@
+export default {
+    ['403']: '403',
+    ['500']: '500',
+    ['404']: '404',
+    ['home']: 'صفحه اصلی',
+    ['routeDemo']: 'نمایش مسیر',
+};

+ 31 - 0
src/locales/fa-IR/pages.ts

@@ -0,0 +1,31 @@
+export default {
+    error: {
+        ['404']: {
+            title: '۴۰۴',
+            subtitle: 'متأسفانه صفحه مورد نظر شما وجود ندارد',
+            backHome: 'بازگشت به صفحه اصلی',
+        },
+        ['403']: {
+            title: '۴۰۳',
+            subtitle: 'متأسفانه شما مجاز به دسترسی به این صفحه نیستید',
+            backHome: 'بازگشت به صفحه اصلی',
+        },
+        ['500']: {
+            title: '۵۰۰',
+            subtitle: 'متأسفانه سرور با خطا مواجه شده است',
+            backHome: 'بازگشت به صفحه اصلی',
+        },
+    },
+
+    home: {
+        title: 'صفحه اصلی',
+        description: 'این یک صفحه نمونه با استفاده از Ant Design و Tailwind CSS است',
+        features: {
+            title: 'ویژگی‌های کلیدی',
+            antd: 'استفاده از کتابخانه کامپوننت Ant Design',
+            tailwind: 'استفاده از فریم‌ورک Tailwind CSS',
+            i18n: 'پشتیبانی از چند زبانه',
+        },
+        getStarted: 'شروع کنید',
+    },
+};

+ 69 - 0
src/main.tsx

@@ -0,0 +1,69 @@
+import React from 'react';
+
+import dayjs from 'dayjs';
+import utc from 'dayjs/plugin/utc';
+import ReactDOM from 'react-dom/client';
+import { I18nextProvider } from 'react-i18next';
+
+import './i18n';
+import './styles/antd.scss';
+import './styles/global.scss';
+import './styles/tailwind.css';
+
+import App from './App';
+import i18n from './i18n';
+
+// 配置 dayjs
+dayjs.extend(utc);
+
+// 更新 URL 中的语言参数
+const updateUrlLang = (language: string) => {
+    const url = new URL(window.location.href);
+    const hash = url.hash;
+
+    // 移除 URL 中的 lang 参数
+    url.searchParams.delete('lang');
+
+    if (hash) {
+        // Hash 路由模式
+        const [path, search] = hash.split('?');
+        const params = new URLSearchParams(search || '');
+        params.set('lang', language);
+        url.hash = `${path}?${params.toString()}`;
+    } else {
+        // 普通路由模式
+        url.searchParams.set('lang', language);
+    }
+
+    window.history.replaceState({}, '', url.toString());
+};
+
+// 设置文档方向
+const setDocumentDirection = (language: string) => {
+    const direction = i18n.t('DIR') === 'rtl' ? 'rtl' : 'ltr';
+    document.documentElement.dir = direction;
+    document.documentElement.lang = language;
+    // 更新 URL 中的语言参数
+    updateUrlLang(language);
+};
+
+// 监听语言变化
+i18n.on('languageChanged', setDocumentDirection);
+
+// 初始化时只设置文档方向,不更新 URL
+const initDocumentDirection = (language: string) => {
+    const direction = i18n.t('DIR') === 'rtl' ? 'rtl' : 'ltr';
+    document.documentElement.dir = direction;
+    document.documentElement.lang = language;
+};
+
+// 初始化时设置方向
+initDocumentDirection(i18n.language);
+
+ReactDOM.createRoot(document.getElementById('root')!).render(
+    <React.StrictMode>
+        <I18nextProvider i18n={i18n}>
+            <App />
+        </I18nextProvider>
+    </React.StrictMode>
+);

+ 42 - 0
src/models/userModel.ts

@@ -0,0 +1,42 @@
+import { useState } from 'react';
+
+import { createModel } from '../utils/model/createModel';
+
+interface UserState {
+    name: string;
+    age: number;
+}
+
+interface UserModel extends UserState {
+    updateName: (name: string) => void;
+    updateAge: (age: number) => void;
+    incrementAge: () => void;
+}
+
+const useUserModel = (): UserModel => {
+    const [state, setState] = useState<UserState>({
+        name: 'John Doe',
+        age: 30,
+    });
+
+    const updateName = (name: string) => {
+        setState((prev) => ({ ...prev, name }));
+    };
+
+    const updateAge = (age: number) => {
+        setState((prev) => ({ ...prev, age }));
+    };
+
+    const incrementAge = () => {
+        setState((prev) => ({ ...prev, age: prev.age + 1 }));
+    };
+
+    return {
+        ...state,
+        updateName,
+        updateAge,
+        incrementAge,
+    };
+};
+
+export const userModel = createModel(useUserModel, 'user');

+ 23 - 0
src/pages/error/403.tsx

@@ -0,0 +1,23 @@
+import { Button, Result } from 'antd';
+import { useTranslation } from 'react-i18next';
+import { useNavigate } from 'react-router-dom';
+
+const Forbidden = () => {
+    const navigate = useNavigate();
+    const { t } = useTranslation();
+
+    return (
+        <Result
+            status="403"
+            title={t('pages.error.403.title')}
+            subTitle={t('pages.error.403.subtitle')}
+            extra={
+                <Button type="primary" onClick={() => navigate('/')}>
+                    {t('pages.error.403.backHome')}
+                </Button>
+            }
+        />
+    );
+};
+
+export default Forbidden;

+ 23 - 0
src/pages/error/404.tsx

@@ -0,0 +1,23 @@
+import { Button, Result } from 'antd';
+import { useTranslation } from 'react-i18next';
+import { useNavigate } from 'react-router-dom';
+
+const NotFound = () => {
+    const navigate = useNavigate();
+    const { t } = useTranslation();
+
+    return (
+        <Result
+            status="404"
+            title={t('pages.error.404.title')}
+            subTitle={t('pages.error.404.subtitle')}
+            extra={
+                <Button type="primary" onClick={() => navigate('/')}>
+                    {t('pages.error.404.backHome')}
+                </Button>
+            }
+        />
+    );
+};
+
+export default NotFound;

+ 23 - 0
src/pages/error/500.tsx

@@ -0,0 +1,23 @@
+import { Button, Result } from 'antd';
+import { useTranslation } from 'react-i18next';
+import { useNavigate } from 'react-router-dom';
+
+const ServerError = () => {
+    const navigate = useNavigate();
+    const { t } = useTranslation();
+
+    return (
+        <Result
+            status="500"
+            title={t('pages.error.500.title')}
+            subTitle={t('pages.error.500.subtitle')}
+            extra={
+                <Button type="primary" onClick={() => navigate('/')}>
+                    {t('pages.error.500.backHome')}
+                </Button>
+            }
+        />
+    );
+};
+
+export default ServerError;

+ 311 - 0
src/pages/home/index.tsx

@@ -0,0 +1,311 @@
+import React, { useEffect, useState } from 'react';
+
+import { Icon } from '@iconify/react';
+import mdiAccount from '@iconify-icons/mdi/account';
+import mdiBell from '@iconify-icons/mdi/bell';
+import mdiHeart from '@iconify-icons/mdi/heart';
+import mdiHome from '@iconify-icons/mdi/home';
+import mdiLoading from '@iconify-icons/mdi/loading';
+import mdiSettings from '@iconify-icons/mdi/settings';
+import Button from 'antd/es/button';
+import Card from 'antd/es/card';
+import Space from 'antd/es/space';
+import Typography from 'antd/es/typography';
+import { useTranslation } from 'react-i18next';
+import { useNavigate } from 'react-router-dom';
+
+import multiColorIcon from '@/assets/iconify/multi-color/logo.svg';
+import singleColorIcon from '@/assets/iconify/single-color/home.svg';
+import LanguageSwitch from '@/components/LanguageSwitch';
+import { reportEvent } from '@/firebase';
+import { userModel } from '@/models/userModel';
+import { fetchLogin } from '@/services/login';
+import { createLocalTools } from '@/utils/localUtils';
+
+const { Title } = Typography;
+
+const Home: React.FC = () => {
+    const { t, i18n } = useTranslation();
+    const navigate = useNavigate();
+    const user = userModel.useModel();
+    const [loading, setLoading] = useState(false);
+    const [loginStatus, setLoginStatus] = useState<string>('');
+    const [storageStatus, setStorageStatus] = useState<string>('');
+
+    useEffect(() => {
+        console.log('✅ home组件挂载:componentDidMount');
+        reportEvent('homePage_show');
+        return () => {
+            console.log('❌ home组件卸载:componentWillUnmount');
+            reportEvent('homePage_hide');
+        };
+    }, []);
+
+    // 创建加密存储工具实例
+    const encryptedLs = createLocalTools({
+        encryptKey: true,
+        encryptData: true,
+    });
+
+    // 创建明文存储工具实例
+    const plainLs = createLocalTools({
+        encryptKey: false,
+        encryptData: false,
+    });
+
+    // 演示加密存储 - 添加数据
+    const handleEncryptedStorageAdd = () => {
+        encryptedLs.setLocal('encryptedData', { name: '加密数据', timestamp: Date.now() });
+        setStorageStatus('加密数据添加成功');
+    };
+
+    // 演示加密存储 - 获取数据
+    const handleEncryptedStorageGet = () => {
+        const data = encryptedLs.getLocal<{ name: string; timestamp: number }>('encryptedData');
+        setStorageStatus(`获取加密数据: ${JSON.stringify(data)}`);
+    };
+
+    // 演示加密存储 - 删除数据
+    const handleEncryptedStorageRemove = () => {
+        encryptedLs.removeLocal('encryptedData');
+        setStorageStatus('加密数据删除成功');
+    };
+
+    // 演示明文存储 - 添加数据
+    const handlePlainStorageAdd = () => {
+        plainLs.setLocal('plainData', { name: '明文数据', timestamp: Date.now() });
+        setStorageStatus('明文数据添加成功');
+    };
+
+    // 演示明文存储 - 获取数据
+    const handlePlainStorageGet = () => {
+        const data = plainLs.getLocal<{ name: string; timestamp: number }>('plainData');
+        setStorageStatus(`获取明文数据: ${JSON.stringify(data)}`);
+    };
+
+    // 演示明文存储 - 删除数据
+    const handlePlainStorageRemove = () => {
+        plainLs.removeLocal('plainData');
+        setStorageStatus('明文数据删除成功');
+    };
+
+    // 演示清除所有数据
+    const handleStorageClear = () => {
+        encryptedLs.clearLocal();
+        plainLs.clearLocal();
+        setStorageStatus('所有数据清除成功');
+    };
+
+    // 演示网络请求
+    const handleLoginDemo = async () => {
+        setLoading(true);
+        try {
+            const result = await fetchLogin({
+                username: 'test',
+                password: '123456',
+                captchaId: 'test-captcha',
+                captchaCode: '1234',
+            });
+            setLoginStatus('登录成功');
+            console.log('登录结果:', result);
+        } catch (error) {
+            setLoginStatus('登录失败');
+            console.error('登录错误:', error);
+        } finally {
+            setLoading(false);
+        }
+    };
+
+    // 演示路由跳转
+    const handleNavigation = (path: string) => {
+        navigate(path);
+    };
+
+    // 切换语言
+    const handleLanguageChange = (lang: string) => {
+        i18n.changeLanguage(lang);
+    };
+
+    return (
+        <div className="max-w-4xl mx-auto p-4">
+            <div className="flex justify-between items-center mb-6">
+                <h1 className="text-3xl font-bold text-gray-900">{t('pages.home.title')}</h1>
+                <LanguageSwitch />
+            </div>
+
+            {/* 多语言演示卡片 */}
+            <Card className="mb-6">
+                <Title level={3}>多语言演示</Title>
+                <div className="space-y-4">
+                    <p className="text-gray-600">{t('pages.home.description')}</p>
+                    <Space>
+                        <Button onClick={() => handleLanguageChange('en-US')}>English</Button>
+                        <Button onClick={() => handleLanguageChange('fa-IR')}>فارسی</Button>
+                    </Space>
+                    <div className="space-y-2">
+                        <p className="text-gray-600">{t('pages.home.features.title')}</p>
+                        <ul className="list-disc list-inside space-y-1 text-gray-600">
+                            <li>{t('pages.home.features.antd')}</li>
+                            <li>{t('pages.home.features.tailwind')}</li>
+                            <li>{t('pages.home.features.i18n')}</li>
+                        </ul>
+                    </div>
+                </div>
+            </Card>
+
+            {/* 用户信息卡片 */}
+            <Card className="mb-6">
+                <Title level={3}>用户信息</Title>
+                <div className="space-y-4">
+                    <p className="text-gray-600">姓名:{user.name}</p>
+                    <p className="text-gray-600">年龄:{user.age}</p>
+                    <Space wrap>
+                        <Button onClick={() => user.updateName('张三')}>修改名字</Button>
+                        <Button onClick={() => user.updateAge(25)}>修改年龄</Button>
+                        <Button onClick={user.incrementAge}>年龄+1</Button>
+                    </Space>
+                </div>
+            </Card>
+
+            {/* 功能演示卡片 */}
+            <Card className="mb-6">
+                <Title level={3}>功能演示</Title>
+                <div className="space-y-4">
+                    <div>
+                        <Title level={4}>本地存储演示</Title>
+                        <div className="space-y-4">
+                            <div>
+                                <Title level={5}>加密存储</Title>
+                                <Space wrap>
+                                    <Button onClick={handleEncryptedStorageAdd}>
+                                        添加加密数据
+                                    </Button>
+                                    <Button onClick={handleEncryptedStorageGet}>
+                                        获取加密数据
+                                    </Button>
+                                    <Button onClick={handleEncryptedStorageRemove}>
+                                        删除加密数据
+                                    </Button>
+                                </Space>
+                            </div>
+                            <div>
+                                <Title level={5}>明文存储</Title>
+                                <Space wrap>
+                                    <Button onClick={handlePlainStorageAdd}>添加明文数据</Button>
+                                    <Button onClick={handlePlainStorageGet}>获取明文数据</Button>
+                                    <Button onClick={handlePlainStorageRemove}>删除明文数据</Button>
+                                </Space>
+                            </div>
+                            <div>
+                                <Button danger onClick={handleStorageClear}>
+                                    清除所有数据
+                                </Button>
+                            </div>
+                        </div>
+                        {storageStatus && <p className="mt-2 text-gray-600">{storageStatus}</p>}
+                    </div>
+
+                    <div>
+                        <Title level={4}>网络请求演示</Title>
+                        <Space>
+                            <Button type="primary" onClick={handleLoginDemo} loading={loading}>
+                                测试登录
+                            </Button>
+                            {loginStatus && <span className="text-gray-600">{loginStatus}</span>}
+                        </Space>
+                    </div>
+
+                    <div>
+                        <Title level={4}>路由跳转演示</Title>
+                        <Space>
+                            <Button onClick={() => handleNavigation('/route-demo')}>
+                                路由示例
+                            </Button>
+                        </Space>
+                    </div>
+                </div>
+            </Card>
+
+            {/* 图标演示卡片 */}
+            <Card className="mb-6">
+                <Title level={3}>图标演示</Title>
+                <div className="space-y-6">
+                    <div>
+                        <Title level={4}>离线图标</Title>
+                        <Space wrap>
+                            <Button icon={<Icon icon={mdiHome} />}>首页</Button>
+                            <Button icon={<Icon icon={mdiAccount} />}>用户</Button>
+                            <Button icon={<Icon icon={mdiSettings} />}>设置</Button>
+                            <Button icon={<Icon icon={mdiBell} />}>通知</Button>
+                            <Button icon={<Icon icon={mdiHeart} />}>收藏</Button>
+                        </Space>
+                    </div>
+
+                    <div>
+                        <Title level={4}>在线图标</Title>
+                        <Space wrap>
+                            <Button icon={<Icon icon="ri:home-line" />}>首页</Button>
+                            <Button icon={<Icon icon="ri:user-line" />}>用户</Button>
+                            <Button icon={<Icon icon="ri:settings-line" />}>设置</Button>
+                            <Button icon={<Icon icon="ri:notification-line" />}>通知</Button>
+                            <Button icon={<Icon icon="ri:heart-line" />}>收藏</Button>
+                        </Space>
+                    </div>
+
+                    <div>
+                        <Title level={4}>自定义图标</Title>
+                        <Space>
+                            <Icon
+                                icon={singleColorIcon}
+                                className="w-[40px] h-[40px] text-red-500"
+                            />
+                            <Icon icon={multiColorIcon} className="w-[40px] h-[40px]" />
+                        </Space>
+                    </div>
+
+                    <div>
+                        <Title level={4}>动画图标</Title>
+                        <Space>
+                            <Icon icon={mdiLoading} className="animate-spin" />
+                            <Icon icon={mdiHeart} className="animate-bounce" />
+                            <Icon icon={mdiBell} className="animate-pulse" />
+                        </Space>
+                    </div>
+                </div>
+            </Card>
+
+            {/* 样式演示卡片 */}
+            <Card>
+                <Title level={3}>样式演示</Title>
+                <div className="space-y-4">
+                    <div>
+                        <Title level={4}>Tailwind CSS 样式</Title>
+                        <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
+                            <div className="bg-blue-500 text-white p-4 rounded-lg shadow-md">
+                                响应式卡片 1
+                            </div>
+                            <div className="bg-green-500 text-white p-4 rounded-lg shadow-md">
+                                响应式卡片 2
+                            </div>
+                            <div className="bg-purple-500 text-white p-4 rounded-lg shadow-md">
+                                响应式卡片 3
+                            </div>
+                        </div>
+                    </div>
+
+                    <div>
+                        <Title level={4}>Ant Design 组件</Title>
+                        <Space wrap>
+                            <Button type="primary">主要按钮</Button>
+                            <Button>默认按钮</Button>
+                            <Button type="dashed">虚线按钮</Button>
+                            <Button type="link">链接按钮</Button>
+                        </Space>
+                    </div>
+                </div>
+            </Card>
+        </div>
+    );
+};
+
+export default Home;

+ 92 - 0
src/pages/routeDemo/index.tsx

@@ -0,0 +1,92 @@
+import React, { useEffect } from 'react';
+
+import { Button, Card, Space, Typography } from 'antd';
+import { useNavigate, useParams, useSearchParams } from 'react-router-dom';
+
+import { reportEvent } from '@/firebase';
+import { userModel } from '@/models/userModel';
+
+const { Title, Paragraph } = Typography;
+
+const RouteDemo: React.FC = () => {
+    const navigate = useNavigate();
+    const params = useParams();
+    const [searchParams] = useSearchParams();
+    const user = userModel.useModel();
+
+    useEffect(() => {
+        console.log('✅ routeDemo组件挂载:componentDidMount');
+        reportEvent('routeDemoPage_show');
+        return () => {
+            console.log('❌ routeDemo组件卸载:componentWillUnmount');
+            reportEvent('routeDemoPage_hide');
+        };
+    }, []);
+
+    return (
+        <div className="max-w-4xl mx-auto">
+            <Card className="bg-white rounded-lg shadow-sm">
+                <Title level={2}>路由示例</Title>
+
+                <Space direction="vertical" size="large" className="w-full">
+                    <div>
+                        <Title level={4}>1. 路由参数</Title>
+                        <Paragraph className="text-gray-600">
+                            当前路由参数:{JSON.stringify(params)}
+                        </Paragraph>
+                        <Paragraph className="text-gray-600">
+                            当前查询参数:{JSON.stringify(Object.fromEntries(searchParams))}
+                        </Paragraph>
+                    </div>
+
+                    <div>
+                        <Title level={4}>2. 路由跳转</Title>
+                        <Space wrap>
+                            <Button onClick={() => navigate('/')}>返回首页</Button>
+                            <Button onClick={() => navigate('/403')}>访问 403 页面</Button>
+                            <Button onClick={() => navigate('/404')}>访问 404 页面</Button>
+                            <Button onClick={() => navigate('/500')}>访问 500 页面</Button>
+                            <Button onClick={() => navigate('/test/test1')}>
+                                访问 /test/test1 页面
+                            </Button>
+                            <Button onClick={() => navigate('/test/test2')}>
+                                访问 /test/test2 页面
+                            </Button>
+                            <Button onClick={() => navigate('/hey/baby')}>
+                                访问 不存在的 页面
+                            </Button>
+                        </Space>
+                    </div>
+
+                    <div>
+                        <Title level={4}>3. 带参数的路由跳转</Title>
+                        <Space wrap>
+                            <Button onClick={() => navigate('/route-demo/123?name=test')}>
+                                跳转到 /routeDemo/123?name=test
+                            </Button>
+                            <Button onClick={() => navigate('/route-demo/456?type=user')}>
+                                跳转到 /routeDemo/456?type=user
+                            </Button>
+                        </Space>
+                    </div>
+
+                    <div>
+                        <Title level={4}>4. Model 状态示例</Title>
+                        <Paragraph className="text-gray-600">
+                            这个页面也能访问到用户信息:
+                        </Paragraph>
+                        <Paragraph className="text-gray-600">姓名:{user.name}</Paragraph>
+                        <Paragraph className="text-gray-600">年龄:{user.age}</Paragraph>
+                        <Space wrap className="mt-4">
+                            <Button onClick={() => user.updateName('李四')}>修改名字</Button>
+                            <Button onClick={() => user.updateAge(35)}>修改年龄</Button>
+                            <Button onClick={user.incrementAge}>年龄+1</Button>
+                        </Space>
+                    </div>
+                </Space>
+            </Card>
+        </div>
+    );
+};
+
+export default RouteDemo;

+ 43 - 0
src/router/index.tsx

@@ -0,0 +1,43 @@
+import { createHashRouter, createBrowserRouter } from 'react-router-dom';
+
+import config from '@/config';
+
+import routerConfig from './routes';
+import { getTitleByPath } from './titles';
+
+const router =
+    config.app.routerMode === 'hash'
+        ? createHashRouter(routerConfig)
+        : createBrowserRouter(routerConfig);
+
+const setPageTitle = (pathname: string) => {
+    const routeTitle = getTitleByPath(pathname);
+    if (routeTitle) {
+        document.title = `${config.app.title} - ${routeTitle}`;
+    } else {
+        document.title = config.app.title;
+    }
+};
+
+const getInitialPathname = () => {
+    if (config.app.routerMode === 'hash') {
+        const hash = window.location.hash.replace(/^#/, ''); // 去掉 '#'
+        const [path] = hash.split('?'); // 提取路径和查询部分
+        return path;
+    } else {
+        return window.location.pathname; // 获取 history 模式的路径和查询
+    }
+};
+
+// 设置初始标题
+const initialPathname = getInitialPathname();
+
+setPageTitle(initialPathname);
+
+router.subscribe((state) => {
+    console.log(' router.subscribe ~ state:', state);
+    setPageTitle(state.location.pathname);
+});
+
+export { routerConfig };
+export default router;

+ 66 - 0
src/router/routes.tsx

@@ -0,0 +1,66 @@
+import { Navigate } from 'react-router-dom';
+
+import Layout from '@/layouts/BasicLayout';
+import Forbidden from '@/pages/error/403';
+import NotFound from '@/pages/error/404';
+import ServerError from '@/pages/error/500';
+import Home from '@/pages/home';
+import RouteDemo from '@/pages/routeDemo';
+
+import { AppRouteObject } from './types';
+
+const routes: AppRouteObject[] = [
+    {
+        path: '/',
+        element: <Layout />,
+        children: [
+            {
+                index: true,
+                element: <Navigate to="/home" replace />,
+            },
+            {
+                name: 'home',
+                path: '/home',
+                element: <Home />,
+            },
+            {
+                name: 'routeDemo',
+                path: '/route-demo/:id?',
+                element: <RouteDemo />,
+            },
+            {
+                name: 'test',
+                path: '/test',
+                children: [
+                    {
+                        name: 'test1',
+                        path: '/test/test1',
+                        element: <div>test1</div>,
+                    },
+                    {
+                        name: 'test2',
+                        path: '/test/test2',
+                        element: <div>test2</div>,
+                    },
+                ],
+            },
+        ],
+    },
+    {
+        name: '403',
+        path: '/403',
+        element: <Forbidden />,
+    },
+    {
+        name: '500',
+        path: '/500',
+        element: <ServerError />,
+    },
+    {
+        name: '404',
+        path: '*',
+        element: <NotFound />,
+    },
+] as AppRouteObject[];
+
+export default routes;

+ 78 - 0
src/router/titles.ts

@@ -0,0 +1,78 @@
+import i18next from 'i18next';
+
+import routerConfig from './routes';
+
+import type { AppRouteObject } from './types';
+
+// 扁平化路由配置
+const flattenRoutes = (routes: AppRouteObject[], parentNames: string[] = []): AppRouteObject[] => {
+    return routes.reduce((acc: AppRouteObject[], route: AppRouteObject) => {
+        // 添加当前路由,并添加 locale 字段
+        if (route.name && !route.index) {
+            const currentNames = [...parentNames, route.name];
+            acc.push({
+                ...route,
+                locale: `menus.${currentNames.join('.')}`,
+            });
+        } else {
+            acc.push(route);
+        }
+
+        // 如果有子路由,递归处理
+        if (route.children) {
+            acc.push(
+                ...flattenRoutes(
+                    route.children,
+                    route.name ? [...parentNames, route.name] : parentNames
+                )
+            );
+        }
+
+        return acc;
+    }, []);
+};
+
+const flatRoutes = flattenRoutes(routerConfig);
+console.log('flatRoutes:', flatRoutes);
+
+/**
+ * 获取路由路径对应的标题
+ * @param pathname 路由路径
+ * @returns 路由标题
+ */
+export const getTitleByPath = (pathname: string): string => {
+    console.log('getTitleByPath ~ pathname:', pathname);
+
+    // 先尝试精确匹配
+    let route = flatRoutes.find((route) => route.path === pathname);
+
+    // 处理带参路由
+    if (!route) {
+        route = flatRoutes.find((route) => {
+            if (!route.path) return false;
+            if (route.path === '*') return true;
+            // 将路由路径转换为正则表达式
+            const routePattern = route.path
+                .replace(/\/:([^/?]+)\?/g, '(?:/[^/]+)?') // 处理可选参数
+                .replace(/\/:([^/?]+)/g, '(?:/[^/]+)'); // 处理必选参数
+
+            try {
+                return new RegExp(`^${routePattern}$`).test(pathname);
+            } catch {
+                return false;
+            }
+        });
+    }
+
+    if (route) {
+        if (route.locale) {
+            return i18next.t(route.locale, { defaultValue: '' });
+        }
+        return '';
+    }
+
+    // 如果找不到对应的路由,将路径转换为 i18n key
+    const i18nKey = `menus.${pathname.slice(1).replace(/\//g, '.')}`;
+    console.log(' getTitleByPath ~ i18nKey:', i18nKey);
+    return i18next.t(i18nKey, { defaultValue: '' });
+};

+ 10 - 0
src/router/types.ts

@@ -0,0 +1,10 @@
+import type { RouteObject } from 'react-router-dom';
+
+/**
+ * 扩展的路由配置类型
+ */
+export type AppRouteObject = RouteObject & {
+    name: string;
+    locale?: string;
+    children?: AppRouteObject[];
+};

+ 39 - 0
src/services/login/index.ts

@@ -0,0 +1,39 @@
+import { request } from '@/utils/request';
+
+export async function fetchLogin(body: API.LoginParams, options?: { [key: string]: any }) {
+    return request<API.LoginResult>('/user/login', {
+        method: 'POST',
+        data: body,
+        ...(options || {}),
+        requireToken: false,
+    });
+}
+
+export async function fetchLogout(options?: { [key: string]: any }) {
+    console.log('file: index.ts:13 ~ fetchLogout ~ options:', options);
+    // return request<API.Result>('/user/logout', {
+    //   method: 'POST',
+    //   ...(options || {}),
+    // });
+    return Promise.resolve<API.Result>({
+        success: true,
+        errorCode: 0,
+        errorMessage: '成功',
+    });
+}
+
+export async function fetchRefreshToken(options?: { [key: string]: any }) {
+    return request<API.RefreshTokenResult>('/user/refreshToken', {
+        method: 'POST',
+        ...(options || {}),
+        requireToken: false,
+    });
+}
+
+export async function fetchCaptcha(options?: { [key: string]: any }) {
+    return request<API.CaptchaResult>('/captcha/get', {
+        method: 'POST',
+        ...(options || {}),
+        requireToken: false,
+    });
+}

+ 45 - 0
src/services/login/typings.d.ts

@@ -0,0 +1,45 @@
+declare namespace API {
+    type UserInfo = {
+        /** token */
+        accessToken?: string;
+        /** 用于调用刷新accessToken的接口时所需的token */
+        refreshToken?: string;
+        /** `accessToken`的过期时间(unix时间戳) */
+        expires?: number;
+        /** 用户名 */
+        username?: string;
+        /** 昵称 */
+        nickname?: string;
+        /** 头像 */
+        avatar?: string;
+        /** 当前登录用户的角色 */
+        roles?: Array<string>;
+        /** 当前登录用户的按钮级别权限 */
+        permissions?: Array<string>;
+    };
+
+    type LoginParams = {
+        username: string;
+        password: string;
+        captchaId: string;
+        captchaCode: string;
+    };
+
+    type LoginResult = Result<UserInfo>;
+
+    type RefreshTokenInfo = {
+        /** token */
+        accessToken: string;
+        /** 用于调用刷新accessToken的接口时所需的token */
+        refreshToken: string;
+        /** `accessToken`的过期时间(unix时间戳) */
+        expires: number;
+    };
+    type RefreshTokenResult = Result<RefreshTokenInfo>;
+
+    type CaptchaInfo = {
+        base64image: string;
+        id: string;
+    };
+    type CaptchaResult = Result<CaptchaInfo>;
+}

+ 4 - 0
src/styles/antd.scss

@@ -0,0 +1,4 @@
+.ant-message-notice-content {
+    max-width: calc(100% - 50px) !important;
+    text-align: start !important;
+}

+ 379 - 0
src/styles/global.scss

@@ -0,0 +1,379 @@
+*,
+::before,
+::after {
+    box-sizing: border-box;
+    border-color: currentcolor;
+    border-style: solid;
+    border-width: 0;
+}
+
+html {
+    box-sizing: border-box;
+    width: 100%;
+    height: 100%;
+    line-height: 1.5;
+    tab-size: 4;
+    text-size-adjust: 100%;
+}
+
+body {
+    width: 100%;
+    height: 100%;
+    margin: 0;
+    font-family:
+        'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei',
+        '微软雅黑', Arial, sans-serif;
+    line-height: inherit;
+    -moz-osx-font-smoothing: grayscale;
+    -webkit-font-smoothing: antialiased;
+    text-rendering: optimizelegibility;
+}
+
+#root {
+    width: 100%;
+    height: 100%;
+    overflow: hidden auto;
+}
+
+hr {
+    height: 0;
+    color: inherit;
+    border-top-width: 1px;
+}
+
+abbr:where([title]) {
+    text-decoration: underline dotted;
+}
+
+a {
+    color: inherit;
+    text-decoration: inherit;
+}
+
+b,
+strong {
+    font-weight: bolder;
+}
+
+code,
+kbd,
+samp,
+pre {
+    font-family:
+        ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New',
+        monospace;
+    font-size: 1em;
+}
+
+small {
+    font-size: 80%;
+}
+
+sub,
+sup {
+    position: relative;
+    font-size: 75%;
+    line-height: 0;
+    vertical-align: baseline;
+}
+
+sub {
+    bottom: -0.25em;
+}
+
+sup {
+    top: -0.5em;
+}
+
+table {
+    text-indent: 0;
+    border-collapse: collapse;
+    border-color: inherit;
+}
+
+button,
+input,
+optgroup,
+select,
+textarea {
+    padding: 0;
+    margin: 0;
+    font-family: inherit;
+    font-size: 100%;
+    line-height: inherit;
+    color: inherit;
+}
+
+button,
+select {
+    text-transform: none;
+}
+
+button,
+[type='button'],
+[type='reset'],
+[type='submit'] {
+    background-image: none;
+}
+
+:-moz-focusring {
+    outline: auto;
+}
+
+:-moz-ui-invalid {
+    box-shadow: none;
+}
+
+progress {
+    vertical-align: baseline;
+}
+
+::-webkit-inner-spin-button,
+::-webkit-outer-spin-button {
+    height: auto;
+}
+
+[type='search'] {
+    outline-offset: -2px;
+}
+
+::-webkit-file-upload-button {
+    font: inherit;
+}
+
+summary {
+    display: list-item;
+}
+
+blockquote,
+dl,
+dd,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+hr,
+figure,
+p,
+pre {
+    margin: 0;
+}
+
+fieldset {
+    padding: 0;
+    margin: 0;
+}
+
+legend {
+    padding: 0;
+}
+
+ol,
+ul,
+menu {
+    padding: 0;
+    margin: 0;
+    list-style: none;
+}
+
+textarea {
+    resize: vertical;
+}
+
+input::placeholder,
+textarea::placeholder {
+    color: #9ca3af;
+    opacity: 1;
+}
+
+button,
+[role='button'] {
+    cursor: pointer;
+}
+
+:disabled {
+    cursor: default;
+}
+
+svg,
+video,
+canvas,
+audio,
+iframe,
+embed,
+object {
+    display: block;
+}
+
+img,
+video {
+    max-width: 100%;
+    height: auto;
+}
+
+[hidden] {
+    display: none;
+}
+
+.dark {
+    color-scheme: dark;
+}
+
+label {
+    font-weight: 700;
+}
+
+*,
+*::before,
+*::after {
+    box-sizing: inherit;
+}
+
+a:focus,
+a:active {
+    outline: none;
+}
+
+a,
+a:focus,
+a:hover {
+    color: inherit;
+    text-decoration: none;
+    cursor: pointer;
+}
+
+div:focus {
+    outline: none;
+}
+
+.clearfix {
+    &::after {
+        display: block;
+        height: 0;
+        clear: both;
+        font-size: 0;
+        visibility: hidden;
+        content: ' ';
+    }
+}
+
+// RTL 支持
+[dir='rtl'] {
+    // 文本对齐
+    text-align: right;
+
+    // left-[xpx] 转换为 right-[xpx]
+    [class*='left-['] {
+        @for $i from 0 through 100 {
+            &.left-\[#{$i}px\] {
+                left: unset;
+                right: #{$i}px;
+            }
+        }
+    }
+
+    // right-[xpx] 转换为 left-[xpx]
+    [class*='right-['] {
+        @for $i from 0 through 100 {
+            &.right-\[#{$i}px\] {
+                right: unset;
+                left: #{$i}px;
+            }
+        }
+    }
+
+    // 边距和填充
+    .ml-auto {
+        margin-left: unset;
+        margin-right: auto;
+    }
+
+    .mr-auto {
+        margin-right: unset;
+        margin-left: auto;
+    }
+
+    // 浮动
+    .float-right {
+        float: left;
+    }
+
+    .float-left {
+        float: right;
+    }
+
+    // 边框
+    .border-l {
+        border-left: none;
+        border-right: 1px solid;
+    }
+
+    .border-r {
+        border-right: none;
+        border-left: 1px solid;
+    }
+
+    // 圆角
+    .rounded-l {
+        border-radius: 0 0.375rem 0.375rem 0;
+    }
+
+    .rounded-r {
+        border-radius: 0.375rem 0 0 0.375rem;
+    }
+
+    // 图标
+    .icon {
+        transform: scaleX(-1);
+    }
+
+    // 列表
+    ul,
+    ol {
+        padding-right: 1.5em;
+        padding-left: 0;
+    }
+
+    // 表格
+    table {
+        direction: rtl;
+    }
+
+    th,
+    td {
+        text-align: right;
+    }
+
+    // 输入框
+    input,
+    textarea {
+        text-align: right;
+    }
+
+    // 下拉菜单
+    .ant-select-dropdown {
+        direction: rtl;
+    }
+
+    // 模态框
+    .ant-modal {
+        direction: rtl;
+    }
+
+    // 抽屉
+    .ant-drawer {
+        direction: rtl;
+    }
+
+    // 消息提示
+    .ant-message {
+        direction: rtl;
+    }
+
+    // 通知提醒
+    .ant-notification {
+        direction: rtl;
+    }
+}

+ 67 - 0
src/styles/tailwind.css

@@ -0,0 +1,67 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+@layer components {
+    .flex-c {
+        @apply flex justify-center items-center;
+    }
+
+    .flex-ac {
+        @apply flex justify-around items-center;
+    }
+
+    .flex-bc {
+        @apply flex justify-between items-center;
+    }
+
+    .navbar-bg-hover {
+        @apply dark:text-white dark:hover:!bg-[#242424];
+    }
+}
+
+@layer utilities {
+    .no-scrollbar::-webkit-scrollbar {
+        display: none;
+    }
+
+    .no-scrollbar {
+        -ms-overflow-style: none;
+        scrollbar-width: none;
+    }
+
+    .abs-c {
+        position: absolute;
+        top: 50%;
+        left: 50%;
+        transform: translate(-50%, -50%);
+    }
+
+    .abs-tc {
+        position: absolute;
+        top: 0;
+        left: 50%;
+        transform: translateX(-50%);
+    }
+
+    .abs-lc {
+        position: absolute;
+        top: 50%;
+        left: 0;
+        transform: translateY(-50%);
+    }
+
+    .abs-bc {
+        position: absolute;
+        bottom: 0;
+        left: 50%;
+        transform: translateX(-50%);
+    }
+
+    .abs-rc {
+        position: absolute;
+        top: 50%;
+        right: 0;
+        transform: translateY(-50%);
+    }
+}

+ 108 - 0
src/styles/variables.scss

@@ -0,0 +1,108 @@
+// 主题色
+$primary-color: #1890ff;
+$success-color: #52c41a;
+$warning-color: #faad14;
+$error-color: #f5222d;
+
+// 文字颜色
+$text-color: rgba(0, 0, 0, 0.85);
+$text-color-secondary: rgba(0, 0, 0, 0.45);
+$disabled-color: rgba(0, 0, 0, 0.25);
+
+// 背景色
+$bg-color: #f0f2f5;
+$bg-color-light: #fafafa;
+
+// 边框颜色
+$border-color: #d9d9d9;
+$border-color-split: #f0f0f0;
+
+// 字体大小
+$font-size-base: 14px;
+$font-size-lg: 16px;
+$font-size-sm: 12px;
+
+// 圆角
+$border-radius-base: 2px;
+$border-radius-sm: 2px;
+$border-radius-lg: 4px;
+
+// 间距
+$spacing-unit: 8px;
+$spacing-xs: $spacing-unit;
+$spacing-sm: $spacing-unit * 2;
+$spacing-md: $spacing-unit * 3;
+$spacing-lg: $spacing-unit * 4;
+$spacing-xl: $spacing-unit * 5;
+
+// 阴影
+$box-shadow-base: 0 2px 8px rgba(0, 0, 0, 0.15);
+$box-shadow-card:
+    0 1px 2px -2px rgba(0, 0, 0, 0.16),
+    0 3px 6px 0 rgba(0, 0, 0, 0.12),
+    0 5px 12px 4px rgba(0, 0, 0, 0.09);
+
+// 响应式断点
+$screen-xs: 480px;
+$screen-sm: 576px;
+$screen-md: 768px;
+$screen-lg: 992px;
+$screen-xl: 1200px;
+$screen-xxl: 1600px;
+
+// 混合器
+@mixin flex-center {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+}
+
+@mixin text-ellipsis {
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+}
+
+@mixin multi-line-ellipsis($lines: 2) {
+    display: -webkit-box;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp: $lines;
+    overflow: hidden;
+}
+
+@mixin responsive($breakpoint) {
+    @if $breakpoint == xs {
+        @media (max-width: $screen-xs) {
+            @content;
+        }
+    } @else if $breakpoint == sm {
+        @media (max-width: $screen-sm) {
+            @content;
+        }
+    } @else if $breakpoint == md {
+        @media (max-width: $screen-md) {
+            @content;
+        }
+    } @else if $breakpoint == lg {
+        @media (max-width: $screen-lg) {
+            @content;
+        }
+    } @else if $breakpoint == xl {
+        @media (max-width: $screen-xl) {
+            @content;
+        }
+    } @else if $breakpoint == xxl {
+        @media (max-width: $screen-xxl) {
+            @content;
+        }
+    }
+}
+
+// 函数
+@function rem($px) {
+    @return calc($px / 16) + rem;
+}
+
+@function vw($px, $base: 375) {
+    @return calc($px / $base * 100) + vw;
+}

+ 76 - 0
src/utils/authUtils.ts

@@ -0,0 +1,76 @@
+import Cookies from 'js-cookie';
+
+import { createLocalTools } from '@/utils/localUtils';
+
+import { currentJsTimestamp } from './timeUtils';
+
+const ls = createLocalTools();
+
+export const userKey = 'user-info';
+export const tokenKey = 'authorized-token';
+
+/** 获取`token` */
+export function getToken(): API.UserInfo {
+    return Cookies.get(tokenKey) ? JSON.parse(Cookies.get(tokenKey)!) : ls.getLocal(userKey);
+}
+
+/**
+ * @description 设置`token`以及一些必要信息并采用无感刷新`token`方案
+ * 无感刷新:后端返回`accessToken`(访问接口使用的`token`)、`refreshToken`(用于调用刷新`accessToken`的接口时所需的`token`,`refreshToken`的过期时间(比如30天)应大于`accessToken`的过期时间(比如2小时))、`expires`(`accessToken`的过期时间)
+ * 将`accessToken`、`expires`、`refreshToken`这三条信息放在key值为authorized-token的cookie里(过期自动销毁)
+ * 将`username`、`nickname`、`avatar`、`roles`、`permissions`、`refreshToken`、`expires`这七条信息放在key值为`user-info`的localStorage里
+ */
+export function setToken(data: API.UserInfo) {
+    const { accessToken = '', expires = 0, refreshToken = '' } = data;
+    const cookieString = JSON.stringify({ accessToken, expires, refreshToken });
+
+    if (expires > 0) {
+        Cookies.set(tokenKey, cookieString, {
+            expires: (expires * 1000 - currentJsTimestamp()) / 86400000,
+        });
+    } else {
+        Cookies.set(tokenKey, cookieString);
+    }
+
+    function setUserKey({ avatar, username, nickname, roles, permissions }: API.UserInfo) {
+        ls.setLocal(userKey, {
+            username,
+            nickname,
+            avatar,
+            roles,
+            permissions,
+            refreshToken,
+            expires,
+        });
+    }
+
+    if (data.username && data.roles) {
+        const { username, roles } = data;
+        setUserKey({
+            username,
+            nickname: data?.nickname ?? '',
+            avatar: data?.avatar ?? '',
+            roles,
+            permissions: data?.permissions ?? [],
+        });
+    } else {
+        const d = ls.getLocal<API.UserInfo>(userKey);
+        const username = d?.username ?? '';
+        const nickname = d?.nickname ?? '';
+        const avatar = d?.avatar ?? '';
+        const roles = d?.roles ?? [];
+        const permissions = d?.permissions ?? [];
+        setUserKey({ username, nickname, avatar, roles, permissions });
+    }
+}
+
+/** 删除`token`以及key值为`user-info`的session信息 */
+export function removeToken() {
+    Cookies.remove(tokenKey);
+    ls.removeLocal(userKey);
+}
+
+/** 格式化token(jwt格式) */
+export const formatToken = (token: string): string => {
+    return 'Bearer ' + token;
+};

+ 25 - 0
src/utils/clipboard.ts

@@ -0,0 +1,25 @@
+import copy from 'copy-to-clipboard';
+
+export const copyText = async (text: string): Promise<boolean> => {
+    const copyByNavigator = async () => {
+        try {
+            if (navigator.clipboard?.writeText) {
+                await navigator.clipboard.writeText(text);
+                return true;
+            }
+            return false;
+        } catch {
+            return false;
+        }
+    };
+
+    try {
+        let success = await copyByNavigator();
+        if (!success) {
+            success = copy(text);
+        }
+        return success;
+    } catch {
+        return false;
+    }
+};

+ 146 - 0
src/utils/crypto/index.ts

@@ -0,0 +1,146 @@
+import AES from 'crypto-js/aes';
+import encBase64 from 'crypto-js/enc-base64';
+import encUtf8 from 'crypto-js/enc-utf8';
+import MD5 from 'crypto-js/md5';
+import Rabbit from 'crypto-js/rabbit';
+import SHA1 from 'crypto-js/sha1';
+import SHA256 from 'crypto-js/sha256';
+
+export function md5(str: string, lowerCase?: boolean): string {
+    return lowerCase ? String(MD5(str)).toLowerCase() : String(MD5(str)).toUpperCase();
+}
+
+export function sha1(str: string, lowerCase?: boolean): string {
+    return lowerCase ? String(SHA1(str)).toLowerCase() : String(SHA1(str)).toUpperCase();
+}
+
+export function sha256(str: string, lowerCase?: boolean): string {
+    return lowerCase ? String(SHA256(str)).toLowerCase() : String(SHA256(str)).toUpperCase();
+}
+
+export function base64encode(raw: string): string {
+    try {
+        return encBase64.stringify(encUtf8.parse(raw));
+    } catch {
+        return '';
+    }
+}
+
+export function base64decode(str: string): string {
+    try {
+        return encBase64.parse(str).toString(encUtf8);
+    } catch {
+        return '';
+    }
+}
+
+/**
+ * 生成随机密钥
+ * @param length 密钥长度
+ * @returns 随机密钥
+ */
+export const generateKey = (length: number = 32): string => {
+    const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
+    let result = '';
+    for (let i = 0; i < length; i++) {
+        result += chars.charAt(Math.floor(Math.random() * chars.length));
+    }
+    return result;
+};
+
+/**
+ * 生成随机 IV
+ * @param length 初始化向量长度
+ * @returns 16 字节的随机 IV
+ */
+const generateIV = (length: number = 16): string => {
+    return generateKey(length);
+};
+
+/**
+ * 加密数据
+ * @param data 要加密的字符串数据
+ * @param key 加密密钥
+ * @param iv 可选的初始化向量,如果不提供则随机生成
+ * @returns 加密后的字符串(如果未提供 IV,则包含 IV)
+ */
+export const aesEncrypt = (data: string, key: string, iv?: string): string => {
+    if (!data || !key) return '';
+    // aes算法要求密钥长度为 16、24 或 32 字节,因此我们这里保证密钥长度为 32 个字符
+    const paddedKey = key.padEnd(32, '0').slice(0, 32);
+    // aes算法要求 IV 长度为 16 字节,因此我们这里保证 IV 长度为 16 个字符
+    const ivValue = iv ? iv.padEnd(16, '0').slice(0, 16) : generateIV(16);
+    const keyHex = encUtf8.parse(paddedKey);
+    const ivHex = encUtf8.parse(ivValue);
+    const encrypted = AES.encrypt(data, keyHex, { iv: ivHex });
+    return iv ? encrypted.toString() : ivValue + encrypted.toString();
+};
+
+/**
+ * 解密数据
+ * @param encryptedData 加密的字符串(如果加密时未提供 IV,则包含 IV)
+ * @param key 解密密钥
+ * @param iv 可选的初始化向量,如果不提供则从加密数据中提取
+ * @returns 解密后的字符串
+ */
+export const aesDecrypt = (encryptedData: string, key: string, iv?: string): string => {
+    if (!encryptedData || !key) return '';
+    try {
+        // aes算法要求密钥长度为 16、24 或 32 字节,因此我们这里保证密钥长度为 32 个字符
+        const paddedKey = key.padEnd(32, '0').slice(0, 32);
+        // aes算法要求 IV 长度为 16 字节,因此我们这里保证 IV 长度为 16 个字符
+        const ivValue = iv ? iv.padEnd(16, '0').slice(0, 16) : encryptedData.slice(0, 16);
+        const data = iv ? encryptedData : encryptedData.slice(16);
+        const keyHex = encUtf8.parse(paddedKey);
+        const ivHex = encUtf8.parse(ivValue);
+        const decrypted = AES.decrypt(data, keyHex, { iv: ivHex });
+        return decrypted.toString(encUtf8);
+    } catch (error) {
+        console.error('AES decrypt error:', error);
+        return '';
+    }
+};
+
+/**
+ * Rabbit 加密
+ * @param data 要加密的数据
+ * @param key 加密密钥
+ * @param iv 可选的初始化向量,如果不提供则随机生成
+ * @returns 加密后的数据(如果未提供 IV,则包含 IV)
+ */
+export const rabbitEncrypt = (data: string, key: string, iv?: string): string => {
+    if (!data || !key) return '';
+    // Rabbit 算法要求密钥长度为 16 字节,因此我们这里保证密钥长度为 16 个字符
+    const paddedKey = key.padEnd(16, '0').slice(0, 16);
+    // Rabbit 算法要求 IV 长度为 8 字节,因此我们这里保证 IV 长度为 8 个字符
+    const ivValue = iv ? iv.padEnd(8, '0').slice(0, 8) : generateIV(8);
+    const keyHex = encUtf8.parse(paddedKey);
+    const ivHex = encUtf8.parse(ivValue);
+    const encrypted = Rabbit.encrypt(data, keyHex, { iv: ivHex });
+    return iv ? encrypted.toString() : ivValue + encrypted.toString();
+};
+
+/**
+ * Rabbit 解密
+ * @param encryptedData 加密的数据(如果加密时未提供 IV,则包含 IV)
+ * @param key 解密密钥
+ * @param iv 可选的初始化向量,如果不提供则从加密数据中提取
+ * @returns 解密后的数据
+ */
+export const rabbitDecrypt = (encryptedData: string, key: string, iv?: string): string => {
+    if (!encryptedData || !key) return '';
+    try {
+        // Rabbit 算法要求密钥长度为 16 字节,因此我们这里保证密钥长度为 16 个字符
+        const paddedKey = key.padEnd(16, '0').slice(0, 16);
+        // Rabbit 算法要求 IV 长度为 8 字节,因此我们这里保证 IV 长度为 8 个字符
+        const ivValue = iv ? iv.padEnd(8, '0').slice(0, 8) : encryptedData.slice(0, 8);
+        const data = iv ? encryptedData : encryptedData.slice(8);
+        const keyHex = encUtf8.parse(paddedKey);
+        const ivHex = encUtf8.parse(ivValue);
+        const decrypted = Rabbit.decrypt(data, keyHex, { iv: ivHex });
+        return decrypted.toString(encUtf8);
+    } catch (error) {
+        console.error('Rabbit decrypt error:', error);
+        return '';
+    }
+};

+ 74 - 0
src/utils/localUtils.ts

@@ -0,0 +1,74 @@
+import globalConfig from '@/config';
+import { createLocalStorage, StorageOptions, decryptKey } from '@/utils/storage';
+
+/**
+ * 创建 localStorage 工具实例
+ * @see 在 src/utils/storage 的基础上,添加了命名空间,如果 encryptKey 为 false,能有效避免多个应用在同一个域名下的数据冲突。
+ * @param opts {StorageOptions} 本实例使用的全局配置
+ * @returns
+ */
+function createLocalTools(storageOptions: StorageOptions = {}) {
+    const ls = createLocalStorage(storageOptions);
+
+    /**
+     * 保存数据
+     * @param key
+     * @param value
+     * @param opts 当传递了 opts 时,opts 中存在的配置项会覆盖当前实例的全局配置中的配置项。
+     */
+    function setLocal<T = any>(key: string, value: T, opts?: StorageOptions) {
+        ls.set<T>(`${globalConfig.app.storageNameSpace}${key}`, value, opts);
+    }
+
+    /**
+     * 读取数据
+     * @param key
+     * @param opts 当传递了 opts 时,opts 中存在的配置项会覆盖当前实例的全局配置中的配置项。
+     * @returns
+     */
+    function getLocal<T>(key: string, opts?: StorageOptions) {
+        return ls.get<T>(`${globalConfig.app.storageNameSpace}${key}`, opts);
+    }
+
+    /**
+     * 删除数据
+     * @param key
+     * @param opts 当传递了 opts 时,opts 中存在的配置项会覆盖当前实例的全局配置中的配置项。
+     */
+    function removeLocal(key: string, opts?: StorageOptions) {
+        ls.remove(`${globalConfig.app.storageNameSpace}${key}`, opts);
+    }
+
+    /**
+     * 清除 localStorage 中的所有数据。**慎用**
+     */
+    function clearLocal() {
+        const removedKeys = [];
+
+        for (let i = 0; i < window.localStorage.length; i++) {
+            const key = window.localStorage.key(i);
+            if (!key) continue;
+
+            // 先检查原始 key 是否属于当前命名空间
+            if (key.startsWith(globalConfig.app.storageNameSpace)) {
+                removedKeys.push(key);
+                continue;
+            }
+
+            // 如果不是,尝试解密后检查是否属于当前命名空间
+            const decryptedKey = decryptKey(key);
+            if (decryptedKey && decryptedKey.startsWith(globalConfig.app.storageNameSpace)) {
+                removedKeys.push(key);
+            }
+        }
+
+        // 删除所有匹配的 key
+        for (const key of removedKeys) {
+            ls.remove(key, { encryptKey: false });
+        }
+    }
+
+    return { setLocal, getLocal, removeLocal, clearLocal };
+}
+
+export { createLocalTools };

+ 10 - 0
src/utils/model/autoImportModels.ts

@@ -0,0 +1,10 @@
+import { ModelInstance } from './createModel';
+
+// 自动导入所有 model
+const modelModules = import.meta.glob('@/models/*.ts', { eager: true });
+const models: ModelInstance<any>[] = Object.values(modelModules).map((module: any) => {
+    const modelName = Object.keys(module)[0];
+    return module[modelName];
+});
+
+export default models;

+ 24 - 0
src/utils/model/createModel.tsx

@@ -0,0 +1,24 @@
+import React, { createContext, useContext } from 'react';
+
+export type ModelInstance<T> = {
+    Provider: React.FC<{ children: React.ReactNode }>;
+    useModel: () => T;
+    namespace: string;
+};
+
+export function createModel<T>(useHook: () => T, namespace: string): ModelInstance<T> {
+    const Context = createContext<T | null>(null);
+
+    const Provider = ({ children }: { children: React.ReactNode }) => {
+        const value = useHook();
+        return <Context.Provider value={value}>{children}</Context.Provider>;
+    };
+
+    const useModel = () => {
+        const context = useContext(Context);
+        if (!context) throw new Error(`Model '${namespace}' must be used inside its Provider`);
+        return context;
+    };
+
+    return { Provider, useModel, namespace };
+}

+ 18 - 0
src/utils/model/model.tsx

@@ -0,0 +1,18 @@
+import React from 'react';
+
+import { ModelInstance } from './createModel';
+
+export type ModelsContextType = Record<string, ModelInstance<any>>;
+
+export const ModelsProvider: React.FC<{
+    children: React.ReactNode;
+    models: ModelsContextType;
+}> = ({ children, models }) => {
+    return (
+        <>
+            {Object.entries(models).map(([key, { Provider }]) => (
+                <Provider key={key}>{children}</Provider>
+            ))}
+        </>
+    );
+};

+ 108 - 0
src/utils/numberUtils.ts

@@ -0,0 +1,108 @@
+import { isNumber } from 'lodash-es';
+/**
+ * 格式化数字,保留 count 位小数,小数不足 count 位时低位补 0,多余的小数则四舍五入
+ * @param num
+ * @param count
+ * @returns 如果 num 不是数字则原样返回,否则返回处理后的字符串
+ */
+export const toFixed = (num: number, count: number) => {
+    if (!isNumber(num)) return num;
+    return num.toFixed(count);
+};
+
+/**
+ * 格式化数字,最多保留 limit 位小数,多余的小数四舍五入
+ * @param num
+ * @param limit
+ * @returns 如果 num 不是数字则原样返回,否则返回处理后的字符串
+ */
+export const toFixedLimit = (num: number, limit: number) => {
+    if (!isNumber(num)) return num;
+    return num.toFixed(limit).replace(/(?<=\d+)\.?0+$/, '');
+};
+
+/**
+ * 格式化数字,保留 count 位小数,小数不足 count 位时低位补 0,多余的小数则直接丢弃,不进行四舍五入
+ * @param num
+ * @param count
+ * @returns 如果 num 不是数字则原样返回,否则返回处理后的字符串
+ */
+export const toTruncate = (num: number, count: number) => {
+    if (!isNumber(num)) return num;
+    const factor = Math.pow(10, count);
+    const truncated = Math.trunc(num * factor) / factor;
+    return truncated.toFixed(count);
+};
+
+/**
+ * 格式化数字,最多保留 limit 位小数,多余的小数直接丢弃,不进行四舍五入
+ * @param num
+ * @param count
+ * @returns 如果 num 不是数字则原样返回,否则返回处理后的字符串
+ */
+export const toTruncateLimit = (num: number, limit: number) => {
+    if (!isNumber(num)) return num;
+    const factor = Math.pow(10, limit);
+    const truncated = Math.trunc(num * factor) / factor;
+    return truncated.toString();
+};
+
+/**
+ * 格式化数字,添加千位分隔符,保留 count 位小数,小数不足 count 位时低位补 0,多余的小数则四舍五入
+ * @param num
+ * @param count
+ * @returns 如果 num 不是数字则原样返回,否则返回处理后的字符串
+ */
+export const toCommaFixed = (num: number, count: number) => {
+    if (!isNumber(num)) return num;
+    const fixedNum = num.toFixed(count);
+    const [i, d] = fixedNum.split('.');
+    const integerPart = i.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
+    return `${integerPart}.${d}`;
+};
+
+/**
+ * 格式化数字,添加千位分隔符,最多保留 limit 位小数,多余的小数四舍五入
+ * @param num
+ * @param limit
+ * @returns 如果 num 不是数字则原样返回,否则返回处理后的字符串
+ */
+export const toCommaFixedLimit = (num: number, limit: number) => {
+    if (!isNumber(num)) return num;
+    const fixedNum = num.toFixed(limit).replace(/(?<=\d+)\.?0+$/, '');
+    const [i, d] = fixedNum.split('.');
+    const integerPart = i.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
+    const decimalPart = d ? `.${d}` : '';
+    return integerPart + decimalPart;
+};
+
+/**
+ * 格式化数字,添加千位分隔符,保留 count 位小数,小数不足 count 位时低位补 0,多余的小数则直接丢弃,不进行四舍五入
+ * @param num
+ * @param count
+ * @returns 如果 num 不是数字则原样返回,否则返回处理后的字符串
+ */
+export const toCommaTruncate = (num: number, count: number) => {
+    if (!isNumber(num)) return num;
+    const factor = Math.pow(10, count);
+    const truncated = Math.trunc(num * factor) / factor;
+    const [i, d] = truncated.toFixed(count).split('.');
+    const integerPart = i.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
+    return `${integerPart}.${d}`;
+};
+
+/**
+ * 格式化数字,添加千位分隔符,最多保留 limit 位小数,多余的小数直接丢弃,不进行四舍五入
+ * @param num
+ * @param limit
+ * @returns 如果 num 不是数字则原样返回,否则返回处理后的字符串
+ */
+export const toCommaTruncateLimit = (num: number, limit: number) => {
+    if (!isNumber(num)) return num;
+    const factor = Math.pow(10, limit);
+    const truncated = Math.trunc(num * factor) / factor;
+    const [i, d] = truncated.toString().split('.');
+    const integerPart = i.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
+    const decimalPart = d ? `.${d}` : '';
+    return integerPart + decimalPart;
+};

+ 150 - 0
src/utils/request/index.ts

@@ -0,0 +1,150 @@
+import axios, {
+    type AxiosInstance,
+    type AxiosRequestConfig,
+    type AxiosResponse,
+    type AxiosError,
+    InternalAxiosRequestConfig,
+} from 'axios';
+
+import config from '@/config/request';
+
+import {
+    IRequest,
+    IRequestInterceptorAxios,
+    IRequestInterceptorRequest,
+    IRequestInterceptorTuple,
+    IRequestOptions,
+    IResponseInterceptorTuple,
+} from './types.ts';
+
+export * from './types';
+
+let requestInstance: AxiosInstance;
+
+const getRequestInstance = (): AxiosInstance => {
+    if (requestInstance) return requestInstance;
+    requestInstance = axios.create(config);
+
+    config?.requestInterceptors?.forEach((interceptor) => {
+        if (interceptor instanceof Array) {
+            requestInstance.interceptors.request.use(async (config) => {
+                const { url } = config;
+                if (interceptor[0].length === 2) {
+                    const { url: newUrl, options } = await (
+                        interceptor[0] as IRequestInterceptorRequest
+                    )(url!, config);
+                    return { ...options, url: newUrl } as InternalAxiosRequestConfig;
+                }
+                return (interceptor[0] as IRequestInterceptorAxios)(
+                    config
+                ) as InternalAxiosRequestConfig;
+            }, interceptor[1]);
+        } else {
+            requestInstance.interceptors.request.use(async (config) => {
+                const { url } = config;
+                if (interceptor.length === 2) {
+                    const { url: newUrl, options } = await (
+                        interceptor as IRequestInterceptorRequest
+                    )(url!, config);
+                    return { ...options, url: newUrl } as InternalAxiosRequestConfig;
+                }
+                return (interceptor as IRequestInterceptorAxios)(
+                    config
+                ) as InternalAxiosRequestConfig;
+            });
+        }
+    });
+
+    config?.responseInterceptors?.forEach((interceptor) => {
+        if (interceptor instanceof Array) {
+            requestInstance.interceptors.response.use(interceptor[0], interceptor[1]);
+        } else {
+            requestInstance.interceptors.response.use(interceptor);
+        }
+    });
+
+    // 当响应的数据 success 是 false 的时候,抛出 error 以供 errorHandler 处理。
+    requestInstance.interceptors.response.use((response) => {
+        const { data } = response;
+        if (data?.success === false && config?.errorConfig?.errorThrower) {
+            config.errorConfig.errorThrower(data);
+        }
+        return response;
+    });
+    return requestInstance;
+};
+
+const request: IRequest = (url: string, opts: IRequestOptions = { method: 'GET' }) => {
+    const requestInstance = getRequestInstance();
+    const { getResponse = false, requestInterceptors, responseInterceptors } = opts;
+    const requestInterceptorsToEject = requestInterceptors?.map(
+        (interceptor: IRequestInterceptorTuple) => {
+            if (interceptor instanceof Array) {
+                return requestInstance.interceptors.request.use(async (config) => {
+                    const { url } = config;
+                    if (interceptor[0].length === 2) {
+                        const { url: newUrl, options } = await (
+                            interceptor[0] as IRequestInterceptorRequest
+                        )(url!, config);
+                        return { ...options, url: newUrl } as InternalAxiosRequestConfig;
+                    }
+                    return (interceptor[0] as IRequestInterceptorAxios)(
+                        config
+                    ) as InternalAxiosRequestConfig;
+                }, interceptor[1]);
+            } else {
+                return requestInstance.interceptors.request.use(async (config) => {
+                    const { url } = config;
+                    if (interceptor.length === 2) {
+                        const { url: newUrl, options } = await (
+                            interceptor as IRequestInterceptorRequest
+                        )(url!, config);
+                        return { ...options, url: newUrl } as InternalAxiosRequestConfig;
+                    }
+                    return (interceptor as IRequestInterceptorAxios)(
+                        config
+                    ) as InternalAxiosRequestConfig;
+                });
+            }
+        }
+    );
+    const responseInterceptorsToEject = responseInterceptors?.map(
+        (interceptor: IResponseInterceptorTuple) => {
+            return interceptor instanceof Array
+                ? requestInstance.interceptors.response.use(interceptor[0], interceptor[1])
+                : requestInstance.interceptors.response.use(interceptor);
+        }
+    );
+    return new Promise<AxiosResponse>((resolve, reject) => {
+        requestInstance
+            .request({ ...opts, url })
+            .then((res) => {
+                requestInterceptorsToEject?.forEach((interceptor) => {
+                    requestInstance.interceptors.request.eject(interceptor);
+                });
+                responseInterceptorsToEject?.forEach((interceptor) => {
+                    requestInstance.interceptors.response.eject(interceptor);
+                });
+                resolve(getResponse ? res : res.data);
+            })
+            .catch((error) => {
+                requestInterceptorsToEject?.forEach((interceptor) => {
+                    requestInstance.interceptors.request.eject(interceptor);
+                });
+                responseInterceptorsToEject?.forEach((interceptor) => {
+                    requestInstance.interceptors.response.eject(interceptor);
+                });
+                try {
+                    const handler = config?.errorConfig?.errorHandler;
+                    if (handler) handler(error, Object.assign({}, config, opts));
+                } catch (e) {
+                    reject(e);
+                }
+                reject(error);
+            });
+    });
+};
+
+export { request, getRequestInstance };
+
+export type { AxiosInstance, AxiosRequestConfig, AxiosResponse, AxiosError, IRequest as Request };

+ 60 - 0
src/utils/request/types.ts

@@ -0,0 +1,60 @@
+import { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios';
+
+// request 方法 opts 参数的接口
+export interface IRequestOptions extends AxiosRequestConfig {
+    requestInterceptors?: IRequestInterceptorTuple[];
+    responseInterceptors?: IResponseInterceptorTuple[];
+    [key: string]: any;
+}
+
+export interface IRequestOptionsWithResponse extends IRequestOptions {
+    getResponse: true;
+}
+
+export interface IRequestOptionsWithoutResponse extends IRequestOptions {
+    getResponse: false;
+}
+
+export interface IRequest {
+    <T = any>(url: string, opts: IRequestOptionsWithResponse): Promise<AxiosResponse<T>>;
+    <T = any>(url: string, opts: IRequestOptionsWithoutResponse): Promise<T>;
+    <T = any>(url: string, opts?: IRequestOptions): Promise<T>; // getResponse 默认是 false, 因此不提供该参数时,只返回 data,不提供 opts 时,默认使用 'GET' method,并且默认返回 data
+}
+
+export type RequestError = AxiosError | Error;
+
+export interface IErrorHandler {
+    (error: RequestError, opts: IRequestOptions): void;
+}
+export type WithPromise<T> = T | Promise<T>;
+
+export type IRequestInterceptorAxios = (config: IRequestOptions) => WithPromise<IRequestOptions>;
+export type IRequestInterceptorRequest = (
+    url: string,
+    config: IRequestOptions
+) => WithPromise<{ url: string; options: IRequestOptions }>;
+export type IRequestInterceptor = IRequestInterceptorAxios | IRequestInterceptorRequest;
+export type IErrorInterceptor = (error: Error) => Promise<Error>;
+export type IResponseInterceptor = <T = any>(
+    response: AxiosResponse<T>
+) => WithPromise<AxiosResponse<T>>;
+export type IRequestInterceptorTuple =
+    | [IRequestInterceptor, IErrorInterceptor]
+    | [IRequestInterceptor]
+    | IRequestInterceptor;
+export type IResponseInterceptorTuple =
+    | [IResponseInterceptor, IErrorInterceptor]
+    | [IResponseInterceptor]
+    | IResponseInterceptor;
+
+export interface RequestConfig<T = any> extends IRequestOptions {
+    skipErrorHandler?: boolean;
+    encryption?: {
+        enabled: boolean;
+        key: string;
+    };
+    errorConfig?: {
+        errorHandler?: IErrorHandler;
+        errorThrower?: (res: T) => void;
+    };
+}

+ 35 - 0
src/utils/requestUtils.ts

@@ -0,0 +1,35 @@
+import { request } from '@/utils/request';
+
+export const postJson = async <T extends API.Result = API.Result>(
+    url: string,
+    params?: { [key: string]: any },
+    options?: { [key: string]: any }
+) => {
+    const data = { ...(params || {}) };
+
+    console.log('postJson request:', data);
+
+    const promise = request<T>(url, {
+        method: 'POST',
+        credentials: 'include',
+        requestType: 'json',
+        responseType: 'json',
+        data: data,
+        ...(options || {}),
+    }).then((resp) => {
+        console.log('postJson response:', resp);
+        return resp;
+    });
+
+    if (options && options.skipErrorHandler) {
+        return promise;
+    }
+
+    return promise.catch((err) => {
+        console.error('postJson error: ', err);
+        return {
+            success: false,
+            errorMessage: err.message,
+        } as T;
+    });
+};

+ 36 - 0
src/utils/routerUtils.ts

@@ -0,0 +1,36 @@
+import { stringify } from 'qs';
+import { useNavigate, useSearchParams } from 'react-router-dom';
+
+export const loginPath = '/login';
+
+export const toLoginPage = () => {
+    const { search, pathname } = window.location;
+    const urlParams = new URL(window.location.href).searchParams;
+    const redirect = urlParams.get('redirect');
+    if (window.location.pathname !== loginPath && !redirect) {
+        window.location.href =
+            loginPath +
+            '?' +
+            stringify({
+                redirect: pathname + search,
+            });
+    }
+};
+
+export const useSmartRouter = () => {
+    const navigate = useNavigate();
+    const [searchParams] = useSearchParams();
+
+    const smartNavigate = (path: string, params?: Record<string, any>) => {
+        const currentParams = new URLSearchParams(searchParams);
+        if (params) {
+            Object.entries(params).forEach(([key, value]) => {
+                currentParams.set(key, value);
+            });
+        }
+        const queryString = currentParams.toString();
+        navigate(`${path}${queryString ? `?${queryString}` : ''}`);
+    };
+
+    return smartNavigate;
+};

+ 74 - 0
src/utils/sessionUtils.ts

@@ -0,0 +1,74 @@
+import globalConfig from '@/config';
+import { createSessionStorage, decryptKey, StorageOptions } from '@/utils/storage';
+
+/**
+ * 创建 sessionStorage 工具实例
+ * @see 在 src/utils/storage 的基础上,添加了命名空间,如果 encryptKey 为 false,能有效避免多个应用在同一个域名下的数据冲突。
+ * @param opts {StorageOptions} 本实例使用的全局配置
+ * @returns
+ */
+function createSessionTools(storageOptions: StorageOptions = {}) {
+    const ss = createSessionStorage(storageOptions);
+
+    /**
+     * 保存数据
+     * @param key
+     * @param value
+     * @param opts 当传递了 opts 时,opts 中存在的配置项会覆盖当前实例的全局配置中的配置项。
+     */
+    function setSession<T = any>(key: string, value: T, opts?: StorageOptions) {
+        ss.set<T>(`${globalConfig.app.storageNameSpace}${key}`, value, opts);
+    }
+
+    /**
+     * 读取数据
+     * @param key
+     * @param opts 当传递了 opts 时,opts 中存在的配置项会覆盖当前实例的全局配置中的配置项。
+     * @returns
+     */
+    function getSession<T>(key: string, opts?: StorageOptions) {
+        return ss.get<T>(`${globalConfig.app.storageNameSpace}${key}`, opts);
+    }
+
+    /**
+     * 删除数据
+     * @param key
+     * @param opts 当传递了 opts 时,opts 中存在的配置项会覆盖当前实例的全局配置中的配置项。
+     */
+    function removeSession(key: string, opts?: StorageOptions) {
+        ss.remove(`${globalConfig.app.storageNameSpace}${key}`, opts);
+    }
+
+    /**
+     * 清除 sessionStorage 中的所有数据。**慎用**
+     */
+    function clearSession() {
+        const removedKeys = [];
+
+        for (let i = 0; i < window.sessionStorage.length; i++) {
+            const key = window.sessionStorage.key(i);
+            if (!key) continue;
+
+            // 先检查原始 key 是否属于当前命名空间
+            if (key.startsWith(globalConfig.app.storageNameSpace)) {
+                removedKeys.push(key);
+                continue;
+            }
+
+            // 如果不是,尝试解密后检查是否属于当前命名空间
+            const decryptedKey = decryptKey(key);
+            if (decryptedKey && decryptedKey.startsWith(globalConfig.app.storageNameSpace)) {
+                removedKeys.push(key);
+            }
+        }
+
+        // 删除所有匹配的 key
+        for (const key of removedKeys) {
+            ss.remove(key, { encryptKey: false });
+        }
+    }
+
+    return { setSession, getSession, removeSession, clearSession };
+}
+
+export { createSessionTools };

+ 247 - 0
src/utils/storage/index.ts

@@ -0,0 +1,247 @@
+import globalConfig from '@/config';
+import { md5, aesEncrypt, aesDecrypt, rabbitEncrypt, rabbitDecrypt } from '@/utils/crypto';
+
+const storageKeyIV = md5(`${globalConfig.app.title}_${globalConfig.app.version}`).slice(0, 8);
+console.log('storageKeyIV:', storageKeyIV);
+
+export function encryptKey(key: string) {
+    return rabbitEncrypt(key, globalConfig.security.storageEncryptionKey, storageKeyIV);
+}
+
+export function decryptKey(key: string) {
+    return rabbitDecrypt(key, globalConfig.security.storageEncryptionKey, storageKeyIV);
+}
+
+export function encryptData(data: string) {
+    return aesEncrypt(data, globalConfig.security.storageEncryptionKey);
+}
+
+export function decryptData(data: string) {
+    return aesDecrypt(data, globalConfig.security.storageEncryptionKey);
+}
+
+export interface StorageOptions {
+    /**
+     * 过期时间(秒), 0 为永远不过期
+     * @default 0
+     */
+    expire?: number;
+    /**
+     * 是否加密key
+     * @default false
+     */
+    encryptKey?: boolean;
+    /**
+     * 是否加密数据
+     * @default false
+     */
+    encryptData?: boolean;
+}
+
+interface StorageData<T = any> {
+    data: T;
+    expire: number;
+}
+
+function shouldEncryptKey(functionOptions?: StorageOptions, instanceOptions?: StorageOptions) {
+    if (globalConfig.security.enableStorageEncryption) {
+        return functionOptions?.encryptKey ?? instanceOptions?.encryptKey ?? false;
+    }
+    return false;
+}
+
+function shouldEncryptData(funcOpts?: StorageOptions, instanceOpts?: StorageOptions) {
+    if (globalConfig.security.enableStorageEncryption) {
+        return funcOpts?.encryptData ?? instanceOpts?.encryptData ?? false;
+    }
+    return false;
+}
+
+/**
+ * 创建 localStorage 工具实例
+ * @param opts {StorageOptions} 本实例使用的全局配置
+ * @returns
+ */
+export function createLocalStorage({
+    expire: confExpire = 0,
+    encryptKey: confEncryptKey = false,
+    encryptData: confEncryptData = false,
+}: StorageOptions = {}) {
+    /**
+     * 保存数据
+     * @param key
+     * @param data
+     * @param opts 当传递了 opts 时,opts 中存在的配置项会覆盖当前实例的全局配置中的配置项。
+     */
+    function set<T = any>(key: string, data: T, opts?: StorageOptions) {
+        const expire = opts?.expire ?? confExpire;
+        const isEncryptKey = shouldEncryptKey(opts, { encryptKey: confEncryptKey });
+        const isEncryptData = shouldEncryptData(opts, { encryptData: confEncryptData });
+
+        const storageData: StorageData<T> = {
+            data,
+            expire: expire !== 0 ? new Date().getTime() + expire * 1000 : 0,
+        };
+
+        const json = JSON.stringify(storageData);
+        const finalKey = isEncryptKey ? encryptKey(key) : key;
+        const finalData = isEncryptData ? encryptData(json) : json;
+
+        window.localStorage.setItem(finalKey, finalData);
+    }
+
+    /**
+     * 读取数据
+     * @param key
+     * @param opts 当传递了 opts 时,opts 中存在的配置项会覆盖当前实例的全局配置中的配置项。
+     * @returns
+     */
+    function get<T = any>(key: string, opts?: StorageOptions) {
+        const isEncryptKey = shouldEncryptKey(opts, { encryptKey: confEncryptKey });
+        const isEncryptData = shouldEncryptData(opts, { encryptData: confEncryptData });
+
+        const finalKey = isEncryptKey ? encryptKey(key) : key;
+        let data = window.localStorage.getItem(finalKey);
+        if (!data) return null;
+
+        if (isEncryptData) {
+            data = decryptData(data);
+        }
+        if (!data) return null;
+
+        let storageData: StorageData | null = null;
+
+        try {
+            storageData = JSON.parse(data);
+        } catch {
+            // Prevent failure
+        }
+
+        if (storageData) {
+            const { data, expire = 0 } = storageData;
+            if (expire === 0 || expire >= Date.now()) return data as T;
+        }
+
+        return null;
+    }
+
+    /**
+     * 删除数据
+     * @param key
+     * @param opts 当传递了 opts 时,opts 中存在的配置项会覆盖当前实例的全局配置中的配置项。
+     */
+    function remove(key: string, opts?: StorageOptions) {
+        const isEncryptKey = shouldEncryptKey(opts, { encryptKey: confEncryptKey });
+        const finalKey = isEncryptKey ? encryptKey(key) : key;
+        window.localStorage.removeItem(finalKey);
+    }
+
+    /**
+     * 清除 localStorage 中的所有数据。**慎用**
+     */
+    function clear() {
+        window.localStorage.clear();
+    }
+
+    return { set, get, remove, clear };
+}
+
+/**
+ * 创建 sessionStorage 工具实例
+ * @param opts {StorageOptions} 本实例使用的全局配置
+ * @returns
+ */
+export function createSessionStorage({
+    expire: confExpire = 0,
+    encryptKey: confEncryptKey = false,
+    encryptData: confEncryptData = false,
+}: StorageOptions = {}) {
+    /**
+     * 保存数据
+     * @param key
+     * @param data
+     * @param opts 当传递了 opts 时,opts 中存在的配置项会覆盖当前实例的全局配置中的配置项。
+     */
+    function set<T = any>(key: string, data: T, opts?: StorageOptions) {
+        const expire = opts?.expire ?? confExpire;
+        const isEncryptKey = shouldEncryptKey(opts, { encryptKey: confEncryptKey });
+        const isEncryptData = shouldEncryptData(opts, { encryptData: confEncryptData });
+
+        const storageData: StorageData<T> = {
+            data,
+            expire: expire !== 0 ? new Date().getTime() + expire * 1000 : 0,
+        };
+
+        const json = JSON.stringify(storageData);
+        const finalKey = isEncryptKey ? encryptKey(key) : key;
+        const finalData = isEncryptData ? encryptData(json) : json;
+
+        window.sessionStorage.setItem(finalKey, finalData);
+    }
+
+    /**
+     * 读取数据
+     * @param key
+     * @param opts 当传递了 opts 时,opts 中存在的配置项会覆盖当前实例的全局配置中的配置项。
+     * @returns
+     */
+    function get<T = any>(key: string, opts?: StorageOptions) {
+        const isEncryptKey = shouldEncryptKey(opts, { encryptKey: confEncryptKey });
+        const isEncryptData = shouldEncryptData(opts, { encryptData: confEncryptData });
+
+        const finalKey = isEncryptKey ? encryptKey(key) : key;
+        let data = window.sessionStorage.getItem(finalKey);
+        if (!data) return null;
+
+        if (isEncryptData) {
+            data = decryptData(data);
+        }
+        if (!data) return null;
+
+        let storageData: StorageData | null = null;
+
+        try {
+            storageData = JSON.parse(data);
+        } catch {
+            // Prevent failure
+        }
+
+        if (storageData) {
+            const { data, expire = 0 } = storageData;
+            if (expire === 0 || expire >= Date.now()) return data as T;
+        }
+
+        return null;
+    }
+
+    /**
+     * 删除数据
+     * @param key
+     * @param opts 当传递了 opts 时,opts 中存在的配置项会覆盖当前实例的全局配置中的配置项。
+     */
+    function remove(key: string, opts?: StorageOptions) {
+        const isEncryptKey = shouldEncryptKey(opts, { encryptKey: confEncryptKey });
+        const finalKey = isEncryptKey ? encryptKey(key) : key;
+        window.sessionStorage.removeItem(finalKey);
+    }
+
+    /**
+     * 清除 sessionStorage 中的所有数据。**慎用**
+     */
+    function clear() {
+        window.sessionStorage.clear();
+    }
+
+    return { set, get, remove, clear };
+}
+
+export const ls = createLocalStorage({
+    expire: 60 * 60 * 24 * 7,
+    encryptKey: true,
+    encryptData: true,
+});
+export const ss = createSessionStorage({
+    expire: 60 * 60 * 24 * 7,
+    encryptKey: true,
+    encryptData: true,
+});

+ 95 - 0
src/utils/stringUtils.ts

@@ -0,0 +1,95 @@
+import compose from 'ramda/es/compose';
+import filter from 'ramda/es/filter';
+import isNil from 'ramda/es/isNil';
+import map from 'ramda/es/map';
+import split from 'ramda/es/split';
+import trim from 'ramda/es/trim';
+
+/**
+ * 移除字符串首尾的指定字符
+ * @returns
+ */
+function trimChar(char: string, str: string): string;
+function trimChar(char: string): (str: string) => string;
+function trimChar(char: string, str?: string) {
+    if (isNil(str)) {
+        return (str1: string) => {
+            let result = str1;
+            if (result.charAt(0) === char) {
+                result = result.slice(1);
+            }
+            if (result.charAt(result.length - 1) === char) {
+                result = result.slice(0, -1);
+            }
+            return result;
+        };
+    } else {
+        let result = str;
+        if (result.charAt(0) === char) {
+            result = result.slice(1);
+        }
+        if (result.charAt(result.length - 1) === char) {
+            result = result.slice(0, -1);
+        }
+        return result;
+    }
+}
+
+export { trimChar };
+
+/**
+ * 将字符串的首字母转换为小写字母
+ * @param str
+ * @returns
+ */
+export function toLowerCaseFirstLetter(str: string) {
+    if (!str) return str; // 如果字符串为空,直接返回
+    return str.charAt(0).toLowerCase() + str.slice(1);
+}
+
+/**
+ * 将字符串的首字母转换为大写字母
+ * @param str
+ * @returns
+ */
+export function toUpperCaseFirstLetter(str: string) {
+    if (!str) return str; // 如果字符串为空,直接返回
+    return str.charAt(0).toUpperCase() + str.slice(1);
+}
+
+export function isEmail(str: string): boolean {
+    return /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/.test(str);
+}
+
+/**
+ * 生成具备加密强度的唯一ID,该算法能保证在同一时刻生成的ID不会重复,并具有加密强度(不可预测),但效率稍低(需调用底层的操作系统加密API,实测100000次调用,需450毫秒左右)
+ * @returns
+ */
+export function getCryptoUniqueSign() {
+    const v = Array.from(crypto.getRandomValues(new Uint32Array(3)))
+        .map((num) => num.toString().padStart(10, '0'))
+        .join('');
+    return BigInt(`${Date.now()}${v}`).toString(36);
+}
+
+/**
+ * 生成唯一ID,该算法能保证在同一时刻生成的ID不会重复,不具有加密强度(可预测),但效率较高(实测100000次调用,需100毫秒左右)
+ * @returns
+ */
+export function getUniqueSign() {
+    const v = [Math.floor(Math.random() * 2 ** 32), Math.floor(Math.random() * 2 ** 32)]
+        .map((num) => num.toString().padStart(10, '0'))
+        .join('');
+    return BigInt(`${Date.now()}${v}`).toString(36);
+}
+
+/**
+ * 字符串转数组,支持逗号分隔、换行分隔、空格分隔
+ */
+export const toStrArray = compose(
+    filter((v) => v !== ''),
+    map((v) => trim(v)),
+    split(/[,\s]+/),
+    trimChar(','),
+    trim
+);

+ 308 - 0
src/utils/timeUtils.ts

@@ -0,0 +1,308 @@
+import dayjs from 'dayjs';
+
+// JS 中 utcTime 与 localTime 及 Date.getTimezoneOffset() 的关系:
+// Date.getTimezoneOffset() = utcTime - localTime;
+
+/**
+ * 获取当前的 unix 时间戳(10位 秒级)
+ * @returns
+ */
+export function currentUnixTimestamp() {
+    return dayjs().unix();
+}
+
+/**
+ * 获取当前的 js 时间戳(13位 毫秒级)
+ * @returns
+ */
+export function currentJsTimestamp() {
+    return dayjs().valueOf();
+}
+
+/**
+ * 获取当前时间
+ * @param fmt 返回的时间格式,默认为 YYYY-MM-DD HH:mm:ss
+ * @returns
+ */
+export function currentDateTime(fmt = 'YYYY-MM-DD HH:mm:ss') {
+    return dayjs().format(fmt);
+}
+
+/**
+ * 获取当前的 UTC 时间
+ * @param fmt 返回的时间格式,默认为 YYYY-MM-DD HH:mm:ss
+ * @returns
+ */
+export function currentUtcDateTime(fmt = 'YYYY-MM-DD HH:mm:ss') {
+    return dayjs().utc().format(fmt);
+}
+
+/**
+ * 基于当前时间,计算 days 天前的时间
+ * @param days
+ * @param fmt 返回的时间格式,默认为 YYYY-MM-DD HH:mm:ss
+ * @returns
+ */
+export function getDateTimeString(days: number, fmt = 'YYYY-MM-DD HH:mm:ss') {
+    return dayjs().subtract(days, 'day').format(fmt);
+}
+
+/**
+ * 基于当前时间,计算 days 天前的 UTC 时间
+ * @param days
+ * @param fmt 返回的时间格式,默认为 YYYY-MM-DD HH:mm:ss
+ * @returns
+ */
+export function getUtcDateTimeString(days: number, fmt = 'YYYY-MM-DD HH:mm:ss') {
+    return dayjs().subtract(days, 'day').utc().format(fmt);
+
+    // 不使用 dayjs 的 utc 插件时,可以用如下代码:
+    // const date = new Date();
+    // const utcDt = date.getTime() + date.getTimezoneOffset() * 60 * 1000 - days * 24 * 3600 * 1000; //公式:utcTime = localTime + date.getTimezoneOffset()
+    // return dayjs(utcDt).format(fmt);
+
+    // 也可以使用如下代码,更容易理解
+    // const date = new Date();
+    // const crtUtcDate = new Date(
+    //     date.getUTCFullYear(),
+    //     date.getUTCMonth(),
+    //     date.getUTCDate(),
+    //     date.getUTCHours(),
+    //     date.getUTCMinutes(),
+    //     date.getUTCSeconds()
+    // ).getTime();
+    // const distUtcDt = crtUtcDate - days * 24 * 3600 * 1000;
+    // return dayjs(distUtcDt).format(fmt);
+}
+
+/**
+ * 格式化 unix 时间戳
+ * @param unixTimestamp
+ * @param fmt 返回的时间格式,默认为 YYYY-MM-DD HH:mm:ss
+ * @returns
+ */
+export function unixTimeFormat(unixTimestamp: number, fmt = 'YYYY-MM-DD HH:mm:ss') {
+    return dayjs.unix(unixTimestamp).format(fmt); // 格式化时间戳
+}
+
+/**
+ * 格式化 unix 时间戳为 UTC 时间
+ * @param unixTimestamp
+ * @param fmt 返回的时间格式,默认为 YYYY-MM-DD HH:mm:ss
+ * @returns
+ */
+export function unixTimeFormatToUtc(unixTimestamp: number, fmt = 'YYYY-MM-DD HH:mm:ss') {
+    return dayjs.unix(unixTimestamp).utc().format(fmt);
+    // const oDt = new Date(unixTime * 1000);
+    // const dt = new Date(
+    //     oDt.getUTCFullYear(),
+    //     oDt.getUTCMonth(),
+    //     oDt.getUTCDate(),
+    //     oDt.getUTCHours(),
+    //     oDt.getUTCMinutes(),
+    //     oDt.getUTCSeconds()
+    // ).getTime();
+    // return dayjs(dt).format(fmt);
+}
+
+/**
+ * 格式化 JavaScript 时间戳
+ * @param jsTimestamp
+ * @param fmt 返回的时间格式,默认为 YYYY-MM-DD HH:mm:ss
+ * @returns
+ */
+export function jsTimeFormat(jsTimestamp: number, fmt = 'YYYY-MM-DD HH:mm:ss') {
+    return dayjs(jsTimestamp).format(fmt); // 格式化时间戳
+}
+
+/**
+ * 格式化 JavaScript 时间戳为 UTC 时间
+ * @param jsTimestamp
+ * @param fmt 返回的时间格式,默认为 YYYY-MM-DD HH:mm:ss
+ * @returns
+ */
+export function jsTimeFormatToUtc(jsTimestamp: number, fmt = 'YYYY-MM-DD HH:mm:ss') {
+    return dayjs(jsTimestamp).utc().format(fmt); // 格式化时间戳
+}
+
+/**
+ * 将一个 inFmt 格式的时间字符串格式化为 fmt 格式的时间字符串
+ * @param dateTime
+ * @param inFmt
+ * @param fmt
+ * @returns
+ */
+export function stringTimeFormat(dateTime: string, inFmt: string, fmt = 'YYYY-MM-DD HH:mm:ss') {
+    return dayjs(dateTime, inFmt).format(fmt);
+}
+
+/**
+ * 将一个 inFmt 格式的时间字符串格式化为 fmt 格式的utc的时间字符串
+ * @param dateTime
+ * @param inFmt
+ * @param fmt
+ * @returns
+ */
+export function stringTimeFormatToUtc(
+    dateTime: string,
+    inFmt: string,
+    fmt = 'YYYY-MM-DD HH:mm:ss'
+) {
+    return dayjs(dateTime, inFmt).utc().format(fmt);
+}
+
+/**
+ * 严格根据格式模板,格式化秒数,仅支持天、时、分、秒,低于2位时,高位补0
+ * @param seconds
+ * @param fmt 返回的时间格式,默认为 DD HH:mm:ss
+ * @returns
+ */
+export function secondsFormat(seconds: number, fmt = 'DD HH:mm:ss') {
+    let result = fmt;
+    const sec = seconds % 86400;
+    const o = {
+        '[Dd]+': Math.trunc(seconds / 86400),
+        '[Hh]+': Math.trunc(sec / 3600),
+        'm+': Math.trunc((sec % 3600) / 60),
+        's+': sec % 60,
+    };
+    for (const k in o) {
+        if (Object.prototype.hasOwnProperty.call(o, k)) {
+            const regex = new RegExp(`(${k})`);
+            const match = regex.exec(fmt);
+            if (match) {
+                const val = o[k as keyof typeof o];
+                const str = `${val}`;
+                result = result.replace(
+                    match[1],
+                    match[1].length === 1 ? str : str.padStart(2, '0')
+                );
+            }
+        }
+    }
+    return result;
+}
+
+/**
+ * 严格根据格式模板,格式化秒数,仅支持天、时、分、秒,不显示为0的级别,例如 seconds 为 61 时,返回 1分钟1秒
+ * @param seconds
+ * @param fmt 返回的时间格式,默认为 DD天HH小时mm分钟ss秒
+ * @returns
+ */
+export function secondsFormatFit(seconds: number, fmt = 'DD天HH小时mm分钟ss秒') {
+    if (seconds <= 0) {
+        return '';
+    }
+
+    let result = fmt;
+
+    const sec = seconds % 86400;
+    const o = {
+        DD: Math.trunc(seconds / 86400),
+        HH: Math.trunc(sec / 3600),
+        mm: Math.trunc((sec % 3600) / 60),
+        ss: sec % 60,
+    };
+
+    for (const k in o) {
+        if (Object.prototype.hasOwnProperty.call(o, k)) {
+            const regex = new RegExp(`(${k})([^DHms]*)`);
+            const match = regex.exec(fmt);
+            if (match) {
+                const val = o[k as keyof typeof o];
+                const str = `${val}`;
+                if (val > 0 || k === 'ss') {
+                    result = result.replace(match[0], str + match[2]);
+                } else {
+                    result = result.replace(match[0], '');
+                }
+            }
+        }
+    }
+    return result.trim();
+}
+
+/**
+ * 输入一个时间字符串,返回其对应的 js 时间戳(13位 毫秒级)
+ * @param dateTimeString 时间字符串,若不指定 fmt,可以支持的格式类似 '2013-11-11T15:30:00Z'、'2013-11-11T15:30:00+08:00'、'Thu Nov 14 2024 14:57:29 GMT+0800 (中国标准时间)'
+ * @param fmt 时间字符串的格式,默认为 YYYY-MM-DD HH:mm:ss
+ * @returns
+ */
+export function getTimeFromDateTimeString(
+    dateTimeString: string,
+    fmt = 'YYYY-MM-DD HH:mm:ss'
+): number {
+    if (
+        /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$/.test(dateTimeString) ||
+        /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{2}:\d{2}$/.test(dateTimeString) ||
+        /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{2} \d{4} \d{2}:\d{2}:\d{2} GMT[+-]\d{4}( \(.+\))?$/.test(
+            dateTimeString
+        )
+    ) {
+        return dayjs(dateTimeString).valueOf();
+    } else {
+        return dayjs(dateTimeString, fmt).valueOf();
+    }
+}
+
+/**
+ *  输入一个表示 UTC 时间的字符串,返回其对应的 js 时间戳(13位 毫秒级)
+ * @param utcDateTimeString UTC 时间字符串,若不指定 fmt,可以支持的格式类似 '2013-11-11T15:30:00Z'、'2013-11-11T15:30:00+08:00'、'Thu Nov 14 2024 14:57:29 GMT+0800 (中国标准时间)'
+ * @param fmt 时间字符串的格式,默认为 YYYY-MM-DD HH:mm:ss
+ * @returns
+ */
+export function getTimeFromUtcDateTimeString(
+    utcDateTimeString: string,
+    fmt = 'YYYY-MM-DD HH:mm:ss'
+): number {
+    if (
+        /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$/.test(utcDateTimeString) ||
+        /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{2}:\d{2}$/.test(utcDateTimeString) ||
+        /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{2} \d{4} \d{2}:\d{2}:\d{2} GMT[+-]\d{4}( \(.+\))?$/.test(
+            utcDateTimeString
+        )
+    ) {
+        return dayjs.utc(utcDateTimeString).valueOf();
+    } else {
+        return dayjs.utc(utcDateTimeString, fmt).valueOf();
+    }
+
+    // if (
+    //     /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$/.test(utcDateTimeString) ||
+    //     /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}[+-]\d{2}:\d{2}$/.test(utcDateTimeString) ||
+    //     /^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d{2} \d{4} \d{2}:\d{2}:\d{2} GMT[+-]\d{4}( \(.+\))?$/.test(
+    //         utcDateTimeString
+    //     )
+    // ) {
+    //     return new Date(utcDateTimeString).getTime();
+    // } else {
+    //     const dt = dayjs(utcDateTimeString, fmt).toDate();
+    //     return dt.getTime() - dt.getTimezoneOffset() * 60 * 1000;
+    // }
+}
+
+/**
+ * 输入一个时间字符串,返回其对应的 unix 时间戳(10位 秒级)
+ * @param dateTimeString 时间字符串,若不指定 fmt,可以支持的格式类似 '2013-11-11T15:30:00Z'、'2013-11-11T15:30:00+08:00'、'Thu Nov 14 2024 14:57:29 GMT+0800 (中国标准时间)'
+ * @param fmt 时间字符串的格式,默认为 YYYY-MM-DD HH:mm:ss
+ * @returns
+ */
+export function getUnixFromDateTimeString(
+    dateTimeString: string,
+    fmt = 'YYYY-MM-DD HH:mm:ss'
+): number {
+    return Math.floor(getTimeFromDateTimeString(dateTimeString, fmt) / 1000);
+}
+
+/**
+ *  输入一个表示 UTC 时间的字符串,返回其对应的 unix 时间戳(10位 秒级)
+ * @param utcDateTimeString UTC 时间字符串,若不指定 fmt,可以支持的格式类似 '2013-11-11T15:30:00Z'、'2013-11-11T15:30:00+08:00'、'Thu Nov 14 2024 14:57:29 GMT+0800 (中国标准时间)'
+ * @param fmt 时间字符串的格式,默认为 YYYY-MM-DD HH:mm:ss
+ * @returns
+ */
+export function getUnixFromUtcDateTimeString(
+    utcDateTimeString: string,
+    fmt = 'YYYY-MM-DD HH:mm:ss'
+): number {
+    return Math.floor(getTimeFromUtcDateTimeString(utcDateTimeString, fmt) / 1000);
+}

+ 18 - 0
tailwind.config.js

@@ -0,0 +1,18 @@
+/** @type {import('tailwindcss').Config} */
+// import rtl from 'tailwindcss-rtl';
+// import flip from 'tailwindcss-flip';
+
+export default {
+    content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'],
+    theme: {
+        extend: {},
+    },
+    // plugins: [rtl, flip],
+    corePlugins: {
+        preflight: false,
+    },
+    future: {
+        hoverOnlyWhenSupported: true,
+    },
+    darkMode: 'class',
+};

+ 35 - 0
tsconfig.json

@@ -0,0 +1,35 @@
+{
+  "compilerOptions": {
+    "target": "ES2015",
+    "useDefineForClassFields": true,
+    "lib": [
+      "ES2015",
+      "DOM",
+      "DOM.Iterable",
+      "ESNext"
+    ],
+    "module": "ESNext",
+    "skipLibCheck": true,
+    "moduleResolution": "bundler",
+    "allowImportingTsExtensions": true,
+    "resolveJsonModule": true,
+    "isolatedModules": true,
+    "noEmit": true,
+    "jsx": "react-jsx",
+    "strict": true,
+    "noUnusedLocals": true,
+    "noUnusedParameters": true,
+    "noFallthroughCasesInSwitch": true,
+    "baseUrl": ".",
+    "paths": {
+      "@/*": [
+        "src/*"
+      ]
+    }
+  },
+  "include": [
+    "src",
+    "types",
+    "vite.config.ts"
+  ]
+}

+ 45 - 0
types/typings.d.ts

@@ -0,0 +1,45 @@
+
+declare namespace API {
+    interface Result<T = any> {
+      success?: boolean;
+      data?: T;
+      errorCode?: number;
+      errorMessage?: string;
+      showType?: ErrorShowType;
+      traceId?: string;
+      host?: string;
+    }
+  
+    type SvrResultList<T = any> = Result<{
+      total: number;
+      list: T[];
+    }>;
+  
+    interface ResultList<T = any> extends Result<T[]> {
+      total: number;
+    }
+  
+    interface AntdPageParams {
+      current?: number;
+      pageSize?: number;
+      keyword?: string;
+      [key: string]: any;
+    }
+  
+    type ReqList<T> = T & AntdPageParams;
+  
+    interface SortBy {
+      column: string;
+      asc: boolean;
+    }
+  
+    type SvrReqList<T> = T & {
+      page: number;
+      pageSize: number;
+      sortBy?: string | SortBy | SortBy[];
+    };
+  
+    interface ReqDelete<T extends number | string = number> {
+      ids: T[];
+    }
+  }

+ 59 - 0
types/vite-env.d.ts

@@ -0,0 +1,59 @@
+/// <reference types="vite/client" />
+
+type Recordable<T = any> = Record<string, T>;
+
+/**
+ * 打包压缩格式的类型声明
+ */
+type BuildCompression =
+    | 'none'
+    | 'gzip'
+    | 'brotli'
+    | 'both'
+    | 'gzip-clear'
+    | 'brotli-clear'
+    | 'both-clear';
+
+interface ImportMetaEnv {
+    // 覆盖原本的字段定义
+    BASE_URL?: string;
+    MODE?: string;
+    DEV?: boolean;
+    PROD?: boolean;
+    SSR?: boolean;
+
+    [key: string]: any;
+
+    /**端口号 */
+    VITE_DEV_PORT?: number;
+
+    /**发布路径 */
+    VITE_BUILD_PUBLIC_PATH?: string;
+    /**压缩选项 */
+    VITE_BUILD_COMPRESSION?: BuildCompression;
+
+    /**应用标题 */
+    VITE_APP_TITLE?: string;
+    /**应用版本 */
+    VITE_APP_VERSION?: string;
+    /**路由模式 */
+    VITE_ROUTER_MODE?: 'hash' | 'history';
+    /**存储命名空间 */
+    VITE_STORAGE_NAME_SPACE?: string;
+
+    /**是否启用请求加密 */
+    VITE_ENABLE_REQUEST_ENCRYPTION?: string;
+    /**请求加密密钥 */
+    VITE_REQUEST_ENCRYPTION_KEY?: string;
+    /**存储加密总开关,如果设置为 false,则会忽略 StorageOptions 中的加密配置,不对存储进行加密 */
+    VITE_ENABLE_STORAGE_ENCRYPTION?: string;
+    /**存储加密密钥 */
+    VITE_STORAGE_ENCRYPTION_KEY?: string;
+
+    /**API基础URL */
+    VITE_API_BASE_URL?: string;
+}
+
+interface ImportMeta {
+    readonly env: ImportMetaEnv;
+}

+ 92 - 0
vite.config.ts

@@ -0,0 +1,92 @@
+import react from '@vitejs/plugin-react';
+import { defineConfig, loadEnv } from 'vite';
+import removeConsole from 'vite-plugin-remove-console';
+
+import { viteBuildInfo } from './build/buildInfo';
+import { configCompressPlugin } from './build/compress';
+import svgConvert from './build/svgConvert';
+import { root, alias, wrapperEnv } from './build/utils';
+
+// https://vitejs.dev/config/
+export default defineConfig(({ mode }) => {
+    const env = wrapperEnv(loadEnv(mode, root));
+    const isProd = mode === 'production';
+
+    return {
+        base: env.VITE_BUILD_PUBLIC_PATH,
+        plugins: [
+            react(),
+            isProd &&
+                removeConsole({
+                    includes: ['log', 'warn'],
+                    external: ['error'],
+                }),
+            svgConvert(),
+            viteBuildInfo(),
+            configCompressPlugin(env.VITE_BUILD_COMPRESSION!),
+        ].filter(Boolean),
+        resolve: { alias },
+        css: {
+            preprocessorOptions: {
+                less: {
+                    javascriptEnabled: true,
+                },
+                scss: {
+                    additionalData: `@use "@/styles/variables" as *;`,
+                },
+            },
+        },
+        server: {
+            port: env.VITE_DEV_PORT,
+            host: '0.0.0.0',
+            open: true,
+            proxy: {
+                '/dev/api/v1': {
+                    target: env.VITE_DEV_PROXY_TARGET_API_BASE_URL,
+                    changeOrigin: true,
+                    rewrite: (path) => path.replace(/^\/dev\/api\/v1/, ''),
+                    secure: false,
+                    configure: (proxy) => {
+                        proxy.on('error', (err) => {
+                            console.log('proxy error', err);
+                        });
+                        proxy.on('proxyReq', (_, req) => {
+                            console.log(
+                                'Sending Request to the Target:',
+                                req.method,
+                                req.url,
+                                env.VITE_DEV_PROXY_TARGET_API_BASE_URL
+                            );
+                        });
+                        proxy.on('proxyRes', (proxyRes, req) => {
+                            console.log(
+                                'Received Response from the Target:',
+                                proxyRes.statusCode,
+                                req.url
+                            );
+                        });
+                    },
+                },
+            },
+            warmup: {
+                clientFiles: ['./index.html', './src/{pages,components}/*'],
+            },
+        },
+        build: {
+            outDir: 'dist',
+            sourcemap: !isProd,
+            target: ['es2015', 'chrome87', 'safari13', 'firefox78', 'edge88'],
+            cssTarget: ['chrome87', 'safari13', 'firefox78', 'edge88'],
+            rollupOptions: {
+                output: {
+                    manualChunks: {
+                        'react-vendor': ['react', 'react-dom', 'react-router-dom'],
+                        'antd-vendor': ['antd'],
+                        'utils-vendor': ['lodash-es', 'ramda'],
+                    },
+                },
+            },
+            chunkSizeWarningLimit: 1500,
+        },
+    };
+});

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