diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
new file mode 100644
index 0000000..71cdd02
--- /dev/null
+++ b/.github/workflows/deploy.yml
@@ -0,0 +1,43 @@
+name: Deploy to GitHub Pages
+
+on:
+ push:
+ branches:
+ - main # 当推送到main分支时触发
+ # 允许手动触发工作流
+ workflow_dispatch:
+
+# 权限设置
+permissions:
+ contents: write
+
+jobs:
+ build-and-deploy:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout 🛎️
+ uses: actions/checkout@v3
+
+ - name: Setup Node.js 🔧
+ uses: actions/setup-node@v3
+ with:
+ node-version: '18'
+ cache: 'npm'
+ cache-dependency-path: './script-hook-website/package-lock.json'
+
+ - name: Install Dependencies 📦
+ run: |
+ cd script-hook-website
+ npm ci
+
+ - name: Build 🏗️
+ run: |
+ cd script-hook-website
+ npm run build
+
+ - name: Deploy 🚀
+ uses: JamesIves/github-pages-deploy-action@v4
+ with:
+ folder: script-hook-website/dist # 要部署的文件夹
+ branch: gh-pages # 部署到的分支
+ clean: true # 在部署前清理目标分支
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index e715dab..8b77f8c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -119,6 +119,9 @@ dist
# TernJS port file
.tern-port
+# VS Code settings
+.vscode/
+
# Stores VSCode versions used for testing VSCode extensions
.vscode-test
diff --git a/.vscode/settings.json b/.vscode/settings.json
deleted file mode 100644
index db348fb..0000000
--- a/.vscode/settings.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "codeQL.githubDatabase.download": "never"
-}
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1d33b64..336cd7a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,12 +1,19 @@
# Change Log
-# v0.0.1(2021年-01-02)
+# v0.1(2021年-01-02)
- 在逆向时有初步的心得,并将其整理为一个简单的脚本。
-# v0.0.2(不记得了)
+# v0.2(不记得了)
- 具体啥功能不记得了,应该是进行了一些优化
-# v0.0.3(2025-01-09)
+# v0.3(2025-01-09)
- 完全重做,增加了界面、控制台的支持,对Hook功能也进行了增强。
+# v0.4
+- 重构为使用TypeScript
+
+
+
+
+
diff --git a/script-hook-website/README.md b/script-hook-website/README.md
new file mode 100644
index 0000000..24fee6f
--- /dev/null
+++ b/script-hook-website/README.md
@@ -0,0 +1,151 @@
+# JS Script Hook Website
+
+
+
+## About
+
+This is the official website for the JS Script Hook project, featuring a React-based SPA that showcases the library's features, provides installation instructions, and offers community support resources.
+
+The website is built with React, TypeScript, and supports full internationalization with both English and Chinese languages.
+
+## Features
+
+- Responsive design that works on all devices
+- Comprehensive internationalization (i18n) support for English and Chinese
+- Optimized SEO metadata with language-specific content
+- Interactive UI components to demonstrate the library's capabilities
+- Social sharing functionality
+
+## Development
+
+### Prerequisites
+
+- Node.js (v14.0.0 or higher)
+- npm or yarn
+
+### Installation
+
+```bash
+# Clone the repository
+git clone https://github.com/JSREI/js-script-hook.git
+cd js-script-hook/script-hook-website
+
+# Install dependencies
+npm install
+# or
+yarn install
+```
+
+### Development Server
+
+```bash
+# Start the development server
+npm start
+# or
+yarn start
+```
+
+The website will be available at `http://localhost:8080`.
+
+### Building for Production
+
+```bash
+# Build for production
+npm run build
+# or
+yarn build
+```
+
+The compiled website will be available in the `dist` directory.
+
+## Internationalization
+
+The website supports both English and Chinese languages. The language is automatically detected based on the user's browser settings, but can also be manually selected through the language switcher in the header.
+
+Translation files are located in:
+- `src/i18n/locales/en.json` (English)
+- `src/i18n/locales/zh.json` (Chinese)
+
+## Deployment
+
+The website is deployed to GitHub Pages automatically via GitHub Actions when changes are pushed to the main branch.
+
+---
+
+
+
JS Script Hook 网站
+
+
+
+
+## 简介
+
+这是JS Script Hook项目的官方网站,基于React的单页应用程序,展示了该库的功能特性,提供安装指南,并提供社区支持资源。
+
+该网站使用React和TypeScript构建,支持英文和中文的完整国际化。
+
+## 特性
+
+- 响应式设计,适用于所有设备
+- 全面支持英文和中文的国际化(i18n)
+- 针对不同语言优化的SEO元数据
+- 交互式UI组件,展示库的功能
+- 社交媒体分享功能
+
+## 开发
+
+### 环境要求
+
+- Node.js (v14.0.0或更高版本)
+- npm或yarn
+
+### 安装
+
+```bash
+# 克隆仓库
+git clone https://github.com/JSREI/js-script-hook.git
+cd js-script-hook/script-hook-website
+
+# 安装依赖
+npm install
+# 或
+yarn install
+```
+
+### 开发服务器
+
+```bash
+# 启动开发服务器
+npm start
+# 或
+yarn start
+```
+
+网站将在`http://localhost:8080`可访问。
+
+### 生产环境构建
+
+```bash
+# 构建生产版本
+npm run build
+# 或
+yarn build
+```
+
+编译后的网站将在`dist`目录中可用。
+
+## 国际化
+
+该网站支持英文和中文两种语言。语言会根据用户的浏览器设置自动检测,也可以通过页头的语言切换器手动选择。
+
+翻译文件位于:
+- `src/i18n/locales/en.json`(英文)
+- `src/i18n/locales/zh.json`(中文)
+
+## 部署
+
+当更改推送到主分支时,网站会通过GitHub Actions自动部署到GitHub Pages。
\ No newline at end of file
diff --git a/script-hook-website/package-lock.json b/script-hook-website/package-lock.json
new file mode 100644
index 0000000..23a35b3
--- /dev/null
+++ b/script-hook-website/package-lock.json
@@ -0,0 +1,6450 @@
+{
+ "name": "script-hook-website",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "script-hook-website",
+ "version": "1.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "@types/dompurify": "^3.0.5",
+ "@types/react": "^18.2.0",
+ "@types/react-dom": "^18.2.0",
+ "@types/react-router-dom": "^5.3.3",
+ "d3": "^7.9.0",
+ "dompurify": "^3.2.5",
+ "i18next": "^25.1.3",
+ "i18next-browser-languagedetector": "^8.1.0",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "react-i18next": "^15.5.1",
+ "react-medium-image-zoom": "^5.2.14",
+ "react-router-dom": "^7.6.0",
+ "react-syntax-highlighter": "^15.6.1",
+ "reactflow": "^11.11.4",
+ "typescript": "^5.0.0"
+ },
+ "devDependencies": {
+ "@types/react-syntax-highlighter": "^15.5.13",
+ "css-loader": "^6.7.3",
+ "gh-pages": "^6.3.0",
+ "html-webpack-plugin": "^5.5.1",
+ "style-loader": "^3.3.2",
+ "ts-loader": "^9.4.2",
+ "webpack": "^5.80.0",
+ "webpack-cli": "^5.0.2",
+ "webpack-dev-server": "^4.13.3"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.27.1.tgz",
+ "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@discoveryjs/json-ext": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmmirror.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
+ "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
+ "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/set-array": "^1.2.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.6.tgz",
+ "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.25",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@leichtgewicht/ip-codec": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmmirror.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz",
+ "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@reactflow/background": {
+ "version": "11.3.14",
+ "resolved": "https://registry.npmmirror.com/@reactflow/background/-/background-11.3.14.tgz",
+ "integrity": "sha512-Gewd7blEVT5Lh6jqrvOgd4G6Qk17eGKQfsDXgyRSqM+CTwDqRldG2LsWN4sNeno6sbqVIC2fZ+rAUBFA9ZEUDA==",
+ "license": "MIT",
+ "dependencies": {
+ "@reactflow/core": "11.11.4",
+ "classcat": "^5.0.3",
+ "zustand": "^4.4.1"
+ },
+ "peerDependencies": {
+ "react": ">=17",
+ "react-dom": ">=17"
+ }
+ },
+ "node_modules/@reactflow/controls": {
+ "version": "11.2.14",
+ "resolved": "https://registry.npmmirror.com/@reactflow/controls/-/controls-11.2.14.tgz",
+ "integrity": "sha512-MiJp5VldFD7FrqaBNIrQ85dxChrG6ivuZ+dcFhPQUwOK3HfYgX2RHdBua+gx+40p5Vw5It3dVNp/my4Z3jF0dw==",
+ "license": "MIT",
+ "dependencies": {
+ "@reactflow/core": "11.11.4",
+ "classcat": "^5.0.3",
+ "zustand": "^4.4.1"
+ },
+ "peerDependencies": {
+ "react": ">=17",
+ "react-dom": ">=17"
+ }
+ },
+ "node_modules/@reactflow/core": {
+ "version": "11.11.4",
+ "resolved": "https://registry.npmmirror.com/@reactflow/core/-/core-11.11.4.tgz",
+ "integrity": "sha512-H4vODklsjAq3AMq6Np4LE12i1I4Ta9PrDHuBR9GmL8uzTt2l2jh4CiQbEMpvMDcp7xi4be0hgXj+Ysodde/i7Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3": "^7.4.0",
+ "@types/d3-drag": "^3.0.1",
+ "@types/d3-selection": "^3.0.3",
+ "@types/d3-zoom": "^3.0.1",
+ "classcat": "^5.0.3",
+ "d3-drag": "^3.0.0",
+ "d3-selection": "^3.0.0",
+ "d3-zoom": "^3.0.0",
+ "zustand": "^4.4.1"
+ },
+ "peerDependencies": {
+ "react": ">=17",
+ "react-dom": ">=17"
+ }
+ },
+ "node_modules/@reactflow/minimap": {
+ "version": "11.7.14",
+ "resolved": "https://registry.npmmirror.com/@reactflow/minimap/-/minimap-11.7.14.tgz",
+ "integrity": "sha512-mpwLKKrEAofgFJdkhwR5UQ1JYWlcAAL/ZU/bctBkuNTT1yqV+y0buoNVImsRehVYhJwffSWeSHaBR5/GJjlCSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@reactflow/core": "11.11.4",
+ "@types/d3-selection": "^3.0.3",
+ "@types/d3-zoom": "^3.0.1",
+ "classcat": "^5.0.3",
+ "d3-selection": "^3.0.0",
+ "d3-zoom": "^3.0.0",
+ "zustand": "^4.4.1"
+ },
+ "peerDependencies": {
+ "react": ">=17",
+ "react-dom": ">=17"
+ }
+ },
+ "node_modules/@reactflow/node-resizer": {
+ "version": "2.2.14",
+ "resolved": "https://registry.npmmirror.com/@reactflow/node-resizer/-/node-resizer-2.2.14.tgz",
+ "integrity": "sha512-fwqnks83jUlYr6OHcdFEedumWKChTHRGw/kbCxj0oqBd+ekfs+SIp4ddyNU0pdx96JIm5iNFS0oNrmEiJbbSaA==",
+ "license": "MIT",
+ "dependencies": {
+ "@reactflow/core": "11.11.4",
+ "classcat": "^5.0.4",
+ "d3-drag": "^3.0.0",
+ "d3-selection": "^3.0.0",
+ "zustand": "^4.4.1"
+ },
+ "peerDependencies": {
+ "react": ">=17",
+ "react-dom": ">=17"
+ }
+ },
+ "node_modules/@reactflow/node-toolbar": {
+ "version": "1.3.14",
+ "resolved": "https://registry.npmmirror.com/@reactflow/node-toolbar/-/node-toolbar-1.3.14.tgz",
+ "integrity": "sha512-rbynXQnH/xFNu4P9H+hVqlEUafDCkEoCy0Dg9mG22Sg+rY/0ck6KkrAQrYrTgXusd+cEJOMK0uOOFCK2/5rSGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@reactflow/core": "11.11.4",
+ "classcat": "^5.0.3",
+ "zustand": "^4.4.1"
+ },
+ "peerDependencies": {
+ "react": ">=17",
+ "react-dom": ">=17"
+ }
+ },
+ "node_modules/@types/body-parser": {
+ "version": "1.19.5",
+ "resolved": "https://registry.npmmirror.com/@types/body-parser/-/body-parser-1.19.5.tgz",
+ "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/connect": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/bonjour": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmmirror.com/@types/bonjour/-/bonjour-3.5.13.tgz",
+ "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/connect": {
+ "version": "3.4.38",
+ "resolved": "https://registry.npmmirror.com/@types/connect/-/connect-3.4.38.tgz",
+ "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/connect-history-api-fallback": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmmirror.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz",
+ "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/express-serve-static-core": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/d3": {
+ "version": "7.4.3",
+ "resolved": "https://registry.npmmirror.com/@types/d3/-/d3-7.4.3.tgz",
+ "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-array": "*",
+ "@types/d3-axis": "*",
+ "@types/d3-brush": "*",
+ "@types/d3-chord": "*",
+ "@types/d3-color": "*",
+ "@types/d3-contour": "*",
+ "@types/d3-delaunay": "*",
+ "@types/d3-dispatch": "*",
+ "@types/d3-drag": "*",
+ "@types/d3-dsv": "*",
+ "@types/d3-ease": "*",
+ "@types/d3-fetch": "*",
+ "@types/d3-force": "*",
+ "@types/d3-format": "*",
+ "@types/d3-geo": "*",
+ "@types/d3-hierarchy": "*",
+ "@types/d3-interpolate": "*",
+ "@types/d3-path": "*",
+ "@types/d3-polygon": "*",
+ "@types/d3-quadtree": "*",
+ "@types/d3-random": "*",
+ "@types/d3-scale": "*",
+ "@types/d3-scale-chromatic": "*",
+ "@types/d3-selection": "*",
+ "@types/d3-shape": "*",
+ "@types/d3-time": "*",
+ "@types/d3-time-format": "*",
+ "@types/d3-timer": "*",
+ "@types/d3-transition": "*",
+ "@types/d3-zoom": "*"
+ }
+ },
+ "node_modules/@types/d3-array": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmmirror.com/@types/d3-array/-/d3-array-3.2.1.tgz",
+ "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-axis": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmmirror.com/@types/d3-axis/-/d3-axis-3.0.6.tgz",
+ "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-selection": "*"
+ }
+ },
+ "node_modules/@types/d3-brush": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmmirror.com/@types/d3-brush/-/d3-brush-3.0.6.tgz",
+ "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-selection": "*"
+ }
+ },
+ "node_modules/@types/d3-chord": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmmirror.com/@types/d3-chord/-/d3-chord-3.0.6.tgz",
+ "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-color": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmmirror.com/@types/d3-color/-/d3-color-3.1.3.tgz",
+ "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-contour": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmmirror.com/@types/d3-contour/-/d3-contour-3.0.6.tgz",
+ "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-array": "*",
+ "@types/geojson": "*"
+ }
+ },
+ "node_modules/@types/d3-delaunay": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmmirror.com/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz",
+ "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-dispatch": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmmirror.com/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz",
+ "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-drag": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmmirror.com/@types/d3-drag/-/d3-drag-3.0.7.tgz",
+ "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-selection": "*"
+ }
+ },
+ "node_modules/@types/d3-dsv": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmmirror.com/@types/d3-dsv/-/d3-dsv-3.0.7.tgz",
+ "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-ease": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmmirror.com/@types/d3-ease/-/d3-ease-3.0.2.tgz",
+ "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-fetch": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmmirror.com/@types/d3-fetch/-/d3-fetch-3.0.7.tgz",
+ "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-dsv": "*"
+ }
+ },
+ "node_modules/@types/d3-force": {
+ "version": "3.0.10",
+ "resolved": "https://registry.npmmirror.com/@types/d3-force/-/d3-force-3.0.10.tgz",
+ "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-format": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmmirror.com/@types/d3-format/-/d3-format-3.0.4.tgz",
+ "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-geo": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/@types/d3-geo/-/d3-geo-3.1.0.tgz",
+ "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/geojson": "*"
+ }
+ },
+ "node_modules/@types/d3-hierarchy": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmmirror.com/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz",
+ "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-interpolate": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmmirror.com/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz",
+ "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-color": "*"
+ }
+ },
+ "node_modules/@types/d3-path": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/@types/d3-path/-/d3-path-3.1.1.tgz",
+ "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-polygon": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmmirror.com/@types/d3-polygon/-/d3-polygon-3.0.2.tgz",
+ "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-quadtree": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmmirror.com/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz",
+ "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-random": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmmirror.com/@types/d3-random/-/d3-random-3.0.3.tgz",
+ "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-scale": {
+ "version": "4.0.9",
+ "resolved": "https://registry.npmmirror.com/@types/d3-scale/-/d3-scale-4.0.9.tgz",
+ "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-time": "*"
+ }
+ },
+ "node_modules/@types/d3-scale-chromatic": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz",
+ "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-selection": {
+ "version": "3.0.11",
+ "resolved": "https://registry.npmmirror.com/@types/d3-selection/-/d3-selection-3.0.11.tgz",
+ "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-shape": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmmirror.com/@types/d3-shape/-/d3-shape-3.1.7.tgz",
+ "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-path": "*"
+ }
+ },
+ "node_modules/@types/d3-time": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmmirror.com/@types/d3-time/-/d3-time-3.0.4.tgz",
+ "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-time-format": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmmirror.com/@types/d3-time-format/-/d3-time-format-4.0.3.tgz",
+ "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-timer": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmmirror.com/@types/d3-timer/-/d3-timer-3.0.2.tgz",
+ "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/d3-transition": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmmirror.com/@types/d3-transition/-/d3-transition-3.0.9.tgz",
+ "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-selection": "*"
+ }
+ },
+ "node_modules/@types/d3-zoom": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmmirror.com/@types/d3-zoom/-/d3-zoom-3.0.8.tgz",
+ "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/d3-interpolate": "*",
+ "@types/d3-selection": "*"
+ }
+ },
+ "node_modules/@types/dompurify": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmmirror.com/@types/dompurify/-/dompurify-3.0.5.tgz",
+ "integrity": "sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/trusted-types": "*"
+ }
+ },
+ "node_modules/@types/eslint": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmmirror.com/@types/eslint/-/eslint-9.6.1.tgz",
+ "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "*",
+ "@types/json-schema": "*"
+ }
+ },
+ "node_modules/@types/eslint-scope": {
+ "version": "3.7.7",
+ "resolved": "https://registry.npmmirror.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
+ "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/eslint": "*",
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.7.tgz",
+ "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/express": {
+ "version": "4.17.22",
+ "resolved": "https://registry.npmmirror.com/@types/express/-/express-4.17.22.tgz",
+ "integrity": "sha512-eZUmSnhRX9YRSkplpz0N+k6NljUUn5l3EWZIKZvYzhvMphEuNiyyy1viH/ejgt66JWgALwC/gtSUAeQKtSwW/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/body-parser": "*",
+ "@types/express-serve-static-core": "^4.17.33",
+ "@types/qs": "*",
+ "@types/serve-static": "*"
+ }
+ },
+ "node_modules/@types/express-serve-static-core": {
+ "version": "4.19.6",
+ "resolved": "https://registry.npmmirror.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz",
+ "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "@types/qs": "*",
+ "@types/range-parser": "*",
+ "@types/send": "*"
+ }
+ },
+ "node_modules/@types/geojson": {
+ "version": "7946.0.16",
+ "resolved": "https://registry.npmmirror.com/@types/geojson/-/geojson-7946.0.16.tgz",
+ "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/hast": {
+ "version": "2.3.10",
+ "resolved": "https://registry.npmmirror.com/@types/hast/-/hast-2.3.10.tgz",
+ "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^2"
+ }
+ },
+ "node_modules/@types/history": {
+ "version": "4.7.11",
+ "resolved": "https://registry.npmmirror.com/@types/history/-/history-4.7.11.tgz",
+ "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/html-minifier-terser": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmmirror.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
+ "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/http-errors": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmmirror.com/@types/http-errors/-/http-errors-2.0.4.tgz",
+ "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/http-proxy": {
+ "version": "1.17.16",
+ "resolved": "https://registry.npmmirror.com/@types/http-proxy/-/http-proxy-1.17.16.tgz",
+ "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/mime": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmmirror.com/@types/mime/-/mime-1.3.5.tgz",
+ "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "22.15.18",
+ "resolved": "https://registry.npmmirror.com/@types/node/-/node-22.15.18.tgz",
+ "integrity": "sha512-v1DKRfUdyW+jJhZNEI1PYy29S2YRxMV5AOO/x/SjKmW0acCIOqmbj6Haf9eHAhsPmrhlHSxEhv/1WszcLWV4cg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~6.21.0"
+ }
+ },
+ "node_modules/@types/node-forge": {
+ "version": "1.3.11",
+ "resolved": "https://registry.npmmirror.com/@types/node-forge/-/node-forge-1.3.11.tgz",
+ "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/prop-types": {
+ "version": "15.7.14",
+ "resolved": "https://registry.npmmirror.com/@types/prop-types/-/prop-types-15.7.14.tgz",
+ "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==",
+ "license": "MIT"
+ },
+ "node_modules/@types/qs": {
+ "version": "6.14.0",
+ "resolved": "https://registry.npmmirror.com/@types/qs/-/qs-6.14.0.tgz",
+ "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/range-parser": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmmirror.com/@types/range-parser/-/range-parser-1.2.7.tgz",
+ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/react": {
+ "version": "18.3.21",
+ "resolved": "https://registry.npmmirror.com/@types/react/-/react-18.3.21.tgz",
+ "integrity": "sha512-gXLBtmlcRJeT09/sI4PxVwyrku6SaNUj/6cMubjE6T6XdY1fDmBL7r0nX0jbSZPU/Xr0KuwLLZh6aOYY5d91Xw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/prop-types": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "18.3.7",
+ "resolved": "https://registry.npmmirror.com/@types/react-dom/-/react-dom-18.3.7.tgz",
+ "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^18.0.0"
+ }
+ },
+ "node_modules/@types/react-router": {
+ "version": "5.1.20",
+ "resolved": "https://registry.npmmirror.com/@types/react-router/-/react-router-5.1.20.tgz",
+ "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/history": "^4.7.11",
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/react-router-dom": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmmirror.com/@types/react-router-dom/-/react-router-dom-5.3.3.tgz",
+ "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/history": "^4.7.11",
+ "@types/react": "*",
+ "@types/react-router": "*"
+ }
+ },
+ "node_modules/@types/react-syntax-highlighter": {
+ "version": "15.5.13",
+ "resolved": "https://registry.npmmirror.com/@types/react-syntax-highlighter/-/react-syntax-highlighter-15.5.13.tgz",
+ "integrity": "sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmmirror.com/@types/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/send": {
+ "version": "0.17.4",
+ "resolved": "https://registry.npmmirror.com/@types/send/-/send-0.17.4.tgz",
+ "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/mime": "^1",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/serve-index": {
+ "version": "1.9.4",
+ "resolved": "https://registry.npmmirror.com/@types/serve-index/-/serve-index-1.9.4.tgz",
+ "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/express": "*"
+ }
+ },
+ "node_modules/@types/serve-static": {
+ "version": "1.15.7",
+ "resolved": "https://registry.npmmirror.com/@types/serve-static/-/serve-static-1.15.7.tgz",
+ "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/http-errors": "*",
+ "@types/node": "*",
+ "@types/send": "*"
+ }
+ },
+ "node_modules/@types/sockjs": {
+ "version": "0.3.36",
+ "resolved": "https://registry.npmmirror.com/@types/sockjs/-/sockjs-0.3.36.tgz",
+ "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/trusted-types": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmmirror.com/@types/trusted-types/-/trusted-types-2.0.7.tgz",
+ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/unist": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmmirror.com/@types/unist/-/unist-2.0.11.tgz",
+ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
+ "license": "MIT"
+ },
+ "node_modules/@types/ws": {
+ "version": "8.18.1",
+ "resolved": "https://registry.npmmirror.com/@types/ws/-/ws-8.18.1.tgz",
+ "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@webassemblyjs/ast": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.14.1.tgz",
+ "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/helper-numbers": "1.13.2",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
+ "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-api-error": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
+ "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-buffer": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
+ "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-numbers": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz",
+ "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/floating-point-hex-parser": "1.13.2",
+ "@webassemblyjs/helper-api-error": "1.13.2",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
+ "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/helper-wasm-section": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz",
+ "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/wasm-gen": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/ieee754": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz",
+ "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "node_modules/@webassemblyjs/leb128": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz",
+ "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/utf8": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
+ "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@webassemblyjs/wasm-edit": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz",
+ "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/helper-wasm-section": "1.14.1",
+ "@webassemblyjs/wasm-gen": "1.14.1",
+ "@webassemblyjs/wasm-opt": "1.14.1",
+ "@webassemblyjs/wasm-parser": "1.14.1",
+ "@webassemblyjs/wast-printer": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-gen": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz",
+ "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/ieee754": "1.13.2",
+ "@webassemblyjs/leb128": "1.13.2",
+ "@webassemblyjs/utf8": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-opt": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz",
+ "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/wasm-gen": "1.14.1",
+ "@webassemblyjs/wasm-parser": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-parser": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz",
+ "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-api-error": "1.13.2",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/ieee754": "1.13.2",
+ "@webassemblyjs/leb128": "1.13.2",
+ "@webassemblyjs/utf8": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/wast-printer": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz",
+ "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webpack-cli/configtest": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/@webpack-cli/configtest/-/configtest-2.1.1.tgz",
+ "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.15.0"
+ },
+ "peerDependencies": {
+ "webpack": "5.x.x",
+ "webpack-cli": "5.x.x"
+ }
+ },
+ "node_modules/@webpack-cli/info": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/@webpack-cli/info/-/info-2.0.2.tgz",
+ "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.15.0"
+ },
+ "peerDependencies": {
+ "webpack": "5.x.x",
+ "webpack-cli": "5.x.x"
+ }
+ },
+ "node_modules/@webpack-cli/serve": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmmirror.com/@webpack-cli/serve/-/serve-2.0.5.tgz",
+ "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.15.0"
+ },
+ "peerDependencies": {
+ "webpack": "5.x.x",
+ "webpack-cli": "5.x.x"
+ },
+ "peerDependenciesMeta": {
+ "webpack-dev-server": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@xtuc/ieee754": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@xtuc/long": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmmirror.com/@xtuc/long/-/long-4.2.2.tgz",
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/accepts/node_modules/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.14.1",
+ "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.14.1.tgz",
+ "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-formats": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/ajv-formats/-/ajv-formats-2.1.1.tgz",
+ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
+ }
+ },
+ "node_modules/ansi-html-community": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmmirror.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
+ "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==",
+ "dev": true,
+ "engines": [
+ "node >= 0.8.0"
+ ],
+ "license": "Apache-2.0",
+ "bin": {
+ "ansi-html": "bin/ansi-html"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/async": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmmirror.com/async/-/async-3.2.6.tgz",
+ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/batch": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmmirror.com/batch/-/batch-0.6.1.tgz",
+ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/body-parser": {
+ "version": "1.20.3",
+ "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.3.tgz",
+ "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "content-type": "~1.0.5",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "on-finished": "2.4.1",
+ "qs": "6.13.0",
+ "raw-body": "2.5.2",
+ "type-is": "~1.6.18",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/bonjour-service": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/bonjour-service/-/bonjour-service-1.3.0.tgz",
+ "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "multicast-dns": "^7.2.5"
+ }
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.24.5",
+ "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.24.5.tgz",
+ "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001716",
+ "electron-to-chromium": "^1.5.149",
+ "node-releases": "^2.0.19",
+ "update-browserslist-db": "^1.1.3"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/camel-case": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/camel-case/-/camel-case-4.1.2.tgz",
+ "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pascal-case": "^3.1.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001718",
+ "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz",
+ "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/character-entities": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmmirror.com/character-entities/-/character-entities-1.2.4.tgz",
+ "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-legacy": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
+ "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-reference-invalid": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
+ "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chrome-trace-event": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
+ "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/classcat": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmmirror.com/classcat/-/classcat-5.0.5.tgz",
+ "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==",
+ "license": "MIT"
+ },
+ "node_modules/clean-css": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmmirror.com/clean-css/-/clean-css-5.3.3.tgz",
+ "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "source-map": "~0.6.0"
+ },
+ "engines": {
+ "node": ">= 10.0"
+ }
+ },
+ "node_modules/clone-deep": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/clone-deep/-/clone-deep-4.0.1.tgz",
+ "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-plain-object": "^2.0.4",
+ "kind-of": "^6.0.2",
+ "shallow-clone": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/colorette": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmmirror.com/colorette/-/colorette-2.0.20.tgz",
+ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/comma-separated-tokens": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmmirror.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz",
+ "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/commander": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz",
+ "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": ">= 1.43.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/compression": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmmirror.com/compression/-/compression-1.8.0.tgz",
+ "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "compressible": "~2.0.18",
+ "debug": "2.6.9",
+ "negotiator": "~0.6.4",
+ "on-headers": "~1.0.2",
+ "safe-buffer": "5.2.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/connect-history-api-fallback": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz",
+ "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/content-disposition": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.7.1.tgz",
+ "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/css-loader": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmmirror.com/css-loader/-/css-loader-6.11.0.tgz",
+ "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "icss-utils": "^5.1.0",
+ "postcss": "^8.4.33",
+ "postcss-modules-extract-imports": "^3.1.0",
+ "postcss-modules-local-by-default": "^4.0.5",
+ "postcss-modules-scope": "^3.2.0",
+ "postcss-modules-values": "^4.0.0",
+ "postcss-value-parser": "^4.2.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "@rspack/core": "0.x || 1.x",
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@rspack/core": {
+ "optional": true
+ },
+ "webpack": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/css-select": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/css-select/-/css-select-4.3.0.tgz",
+ "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.0.1",
+ "domhandler": "^4.3.1",
+ "domutils": "^2.8.0",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz",
+ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "license": "MIT"
+ },
+ "node_modules/d3": {
+ "version": "7.9.0",
+ "resolved": "https://registry.npmmirror.com/d3/-/d3-7.9.0.tgz",
+ "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-array": "3",
+ "d3-axis": "3",
+ "d3-brush": "3",
+ "d3-chord": "3",
+ "d3-color": "3",
+ "d3-contour": "4",
+ "d3-delaunay": "6",
+ "d3-dispatch": "3",
+ "d3-drag": "3",
+ "d3-dsv": "3",
+ "d3-ease": "3",
+ "d3-fetch": "3",
+ "d3-force": "3",
+ "d3-format": "3",
+ "d3-geo": "3",
+ "d3-hierarchy": "3",
+ "d3-interpolate": "3",
+ "d3-path": "3",
+ "d3-polygon": "3",
+ "d3-quadtree": "3",
+ "d3-random": "3",
+ "d3-scale": "4",
+ "d3-scale-chromatic": "3",
+ "d3-selection": "3",
+ "d3-shape": "3",
+ "d3-time": "3",
+ "d3-time-format": "4",
+ "d3-timer": "3",
+ "d3-transition": "3",
+ "d3-zoom": "3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-array": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmmirror.com/d3-array/-/d3-array-3.2.4.tgz",
+ "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",
+ "license": "ISC",
+ "dependencies": {
+ "internmap": "1 - 2"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-axis": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/d3-axis/-/d3-axis-3.0.0.tgz",
+ "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-brush": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/d3-brush/-/d3-brush-3.0.0.tgz",
+ "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-dispatch": "1 - 3",
+ "d3-drag": "2 - 3",
+ "d3-interpolate": "1 - 3",
+ "d3-selection": "3",
+ "d3-transition": "3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-chord": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/d3-chord/-/d3-chord-3.0.1.tgz",
+ "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-path": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-color": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/d3-color/-/d3-color-3.1.0.tgz",
+ "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-contour": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/d3-contour/-/d3-contour-4.0.2.tgz",
+ "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-array": "^3.2.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-delaunay": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmmirror.com/d3-delaunay/-/d3-delaunay-6.0.4.tgz",
+ "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==",
+ "license": "ISC",
+ "dependencies": {
+ "delaunator": "5"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-dispatch": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz",
+ "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-drag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/d3-drag/-/d3-drag-3.0.0.tgz",
+ "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-dispatch": "1 - 3",
+ "d3-selection": "3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-dsv": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/d3-dsv/-/d3-dsv-3.0.1.tgz",
+ "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==",
+ "license": "ISC",
+ "dependencies": {
+ "commander": "7",
+ "iconv-lite": "0.6",
+ "rw": "1"
+ },
+ "bin": {
+ "csv2json": "bin/dsv2json.js",
+ "csv2tsv": "bin/dsv2dsv.js",
+ "dsv2dsv": "bin/dsv2dsv.js",
+ "dsv2json": "bin/dsv2json.js",
+ "json2csv": "bin/json2dsv.js",
+ "json2dsv": "bin/json2dsv.js",
+ "json2tsv": "bin/json2dsv.js",
+ "tsv2csv": "bin/dsv2dsv.js",
+ "tsv2json": "bin/dsv2json.js"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-dsv/node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/d3-dsv/node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/d3-ease": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/d3-ease/-/d3-ease-3.0.1.tgz",
+ "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-fetch": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/d3-fetch/-/d3-fetch-3.0.1.tgz",
+ "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-dsv": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-force": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/d3-force/-/d3-force-3.0.0.tgz",
+ "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-dispatch": "1 - 3",
+ "d3-quadtree": "1 - 3",
+ "d3-timer": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-format": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/d3-format/-/d3-format-3.1.0.tgz",
+ "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-geo": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/d3-geo/-/d3-geo-3.1.1.tgz",
+ "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-array": "2.5.0 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-hierarchy": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz",
+ "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-interpolate": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
+ "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-color": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-path": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/d3-path/-/d3-path-3.1.0.tgz",
+ "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-polygon": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/d3-polygon/-/d3-polygon-3.0.1.tgz",
+ "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-quadtree": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz",
+ "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-random": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/d3-random/-/d3-random-3.0.1.tgz",
+ "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-scale": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/d3-scale/-/d3-scale-4.0.2.tgz",
+ "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-array": "2.10.0 - 3",
+ "d3-format": "1 - 3",
+ "d3-interpolate": "1.2.0 - 3",
+ "d3-time": "2.1.1 - 3",
+ "d3-time-format": "2 - 4"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-scale-chromatic": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz",
+ "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-color": "1 - 3",
+ "d3-interpolate": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-selection": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/d3-selection/-/d3-selection-3.0.0.tgz",
+ "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-shape": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmmirror.com/d3-shape/-/d3-shape-3.2.0.tgz",
+ "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-path": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-time": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/d3-time/-/d3-time-3.1.0.tgz",
+ "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-array": "2 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-time-format": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/d3-time-format/-/d3-time-format-4.1.0.tgz",
+ "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-time": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-timer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/d3-timer/-/d3-timer-3.0.1.tgz",
+ "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/d3-transition": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/d3-transition/-/d3-transition-3.0.1.tgz",
+ "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-color": "1 - 3",
+ "d3-dispatch": "1 - 3",
+ "d3-ease": "1 - 3",
+ "d3-interpolate": "1 - 3",
+ "d3-timer": "1 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "peerDependencies": {
+ "d3-selection": "2 - 3"
+ }
+ },
+ "node_modules/d3-zoom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/d3-zoom/-/d3-zoom-3.0.0.tgz",
+ "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==",
+ "license": "ISC",
+ "dependencies": {
+ "d3-dispatch": "1 - 3",
+ "d3-drag": "2 - 3",
+ "d3-interpolate": "1 - 3",
+ "d3-selection": "2 - 3",
+ "d3-transition": "2 - 3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/default-gateway": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmmirror.com/default-gateway/-/default-gateway-6.0.3.tgz",
+ "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "execa": "^5.0.0"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/define-lazy-prop": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
+ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/delaunator": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/delaunator/-/delaunator-5.0.1.tgz",
+ "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==",
+ "license": "ISC",
+ "dependencies": {
+ "robust-predicates": "^3.0.2"
+ }
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/detect-node": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/detect-node/-/detect-node-2.1.0.tgz",
+ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dns-packet": {
+ "version": "5.6.1",
+ "resolved": "https://registry.npmmirror.com/dns-packet/-/dns-packet-5.6.1.tgz",
+ "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@leichtgewicht/ip-codec": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/dom-converter": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmmirror.com/dom-converter/-/dom-converter-0.2.0.tgz",
+ "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "utila": "~0.4"
+ }
+ },
+ "node_modules/dom-serializer": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.4.1.tgz",
+ "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.2.0",
+ "entities": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/domhandler": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.1.tgz",
+ "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.2.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/dompurify": {
+ "version": "3.2.5",
+ "resolved": "https://registry.npmmirror.com/dompurify/-/dompurify-3.2.5.tgz",
+ "integrity": "sha512-mLPd29uoRe9HpvwP2TxClGQBzGXeEC/we/q+bFlmPPmj2p2Ugl3r6ATu/UU1v77DXNcehiBg9zsr1dREyA/dJQ==",
+ "license": "(MPL-2.0 OR Apache-2.0)",
+ "optionalDependencies": {
+ "@types/trusted-types": "^2.0.7"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz",
+ "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.2.0",
+ "domhandler": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/dot-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmmirror.com/dot-case/-/dot-case-3.0.4.tgz",
+ "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.155",
+ "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.155.tgz",
+ "integrity": "sha512-ps5KcGGmwL8VaeJlvlDlu4fORQpv3+GIcF5I3f9tUKUlJ/wsysh6HU8P5L1XWRYeXfA0oJd4PyM8ds8zTFf6Ng==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/email-addresses": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/email-addresses/-/email-addresses-5.0.0.tgz",
+ "integrity": "sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.18.1",
+ "resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz",
+ "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/envinfo": {
+ "version": "7.14.0",
+ "resolved": "https://registry.npmmirror.com/envinfo/-/envinfo-7.14.0.tgz",
+ "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "envinfo": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
+ "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmmirror.com/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/express": {
+ "version": "4.21.2",
+ "resolved": "https://registry.npmmirror.com/express/-/express-4.21.2.tgz",
+ "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.8",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.20.3",
+ "content-disposition": "0.5.4",
+ "content-type": "~1.0.4",
+ "cookie": "0.7.1",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "1.3.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "merge-descriptors": "1.0.3",
+ "methods": "~1.1.2",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.12",
+ "proxy-addr": "~2.0.7",
+ "qs": "6.13.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.2.1",
+ "send": "0.19.0",
+ "serve-static": "1.16.2",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-uri": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmmirror.com/fast-uri/-/fast-uri-3.0.6.tgz",
+ "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/fastest-levenshtein": {
+ "version": "1.0.16",
+ "resolved": "https://registry.npmmirror.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
+ "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4.9.1"
+ }
+ },
+ "node_modules/fastq": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.19.1.tgz",
+ "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fault": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/fault/-/fault-1.0.4.tgz",
+ "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==",
+ "license": "MIT",
+ "dependencies": {
+ "format": "^0.2.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/faye-websocket": {
+ "version": "0.11.4",
+ "resolved": "https://registry.npmmirror.com/faye-websocket/-/faye-websocket-0.11.4.tgz",
+ "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "websocket-driver": ">=0.5.1"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/filename-reserved-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
+ "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/filenamify": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/filenamify/-/filenamify-4.3.0.tgz",
+ "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "filename-reserved-regex": "^2.0.0",
+ "strip-outer": "^1.0.1",
+ "trim-repeated": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.3.1.tgz",
+ "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "statuses": "2.0.1",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/find-cache-dir": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmmirror.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
+ "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "commondir": "^1.0.1",
+ "make-dir": "^3.0.2",
+ "pkg-dir": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/flat": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmmirror.com/flat/-/flat-5.0.2.tgz",
+ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "bin": {
+ "flat": "cli.js"
+ }
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.9",
+ "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.9.tgz",
+ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/format": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmmirror.com/format/-/format-0.2.2.tgz",
+ "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==",
+ "engines": {
+ "node": ">=0.4.x"
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "11.3.0",
+ "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.3.0.tgz",
+ "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/fs-monkey": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmmirror.com/fs-monkey/-/fs-monkey-1.0.6.tgz",
+ "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==",
+ "dev": true,
+ "license": "Unlicense"
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/gh-pages": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmmirror.com/gh-pages/-/gh-pages-6.3.0.tgz",
+ "integrity": "sha512-Ot5lU6jK0Eb+sszG8pciXdjMXdBJ5wODvgjR+imihTqsUWF2K6dJ9HST55lgqcs8wWcw6o6wAsUzfcYRhJPXbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "async": "^3.2.4",
+ "commander": "^13.0.0",
+ "email-addresses": "^5.0.0",
+ "filenamify": "^4.3.0",
+ "find-cache-dir": "^3.3.1",
+ "fs-extra": "^11.1.1",
+ "globby": "^11.1.0"
+ },
+ "bin": {
+ "gh-pages": "bin/gh-pages.js",
+ "gh-pages-clean": "bin/gh-pages-clean.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/gh-pages/node_modules/commander": {
+ "version": "13.1.0",
+ "resolved": "https://registry.npmmirror.com/commander/-/commander-13.1.0.tgz",
+ "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+ "dev": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/handle-thing": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/handle-thing/-/handle-thing-2.0.1.tgz",
+ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/hast-util-parse-selector": {
+ "version": "2.2.5",
+ "resolved": "https://registry.npmmirror.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz",
+ "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hastscript": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmmirror.com/hastscript/-/hastscript-6.0.0.tgz",
+ "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^2.0.0",
+ "comma-separated-tokens": "^1.0.0",
+ "hast-util-parse-selector": "^2.0.0",
+ "property-information": "^5.0.0",
+ "space-separated-tokens": "^1.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/highlight.js": {
+ "version": "10.7.3",
+ "resolved": "https://registry.npmmirror.com/highlight.js/-/highlight.js-10.7.3.tgz",
+ "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/highlightjs-vue": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/highlightjs-vue/-/highlightjs-vue-1.0.0.tgz",
+ "integrity": "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/hpack.js": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmmirror.com/hpack.js/-/hpack.js-2.1.6.tgz",
+ "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "obuf": "^1.0.0",
+ "readable-stream": "^2.0.1",
+ "wbuf": "^1.1.0"
+ }
+ },
+ "node_modules/hpack.js/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/hpack.js/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/hpack.js/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/html-entities": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmmirror.com/html-entities/-/html-entities-2.6.0.tgz",
+ "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/mdevils"
+ },
+ {
+ "type": "patreon",
+ "url": "https://patreon.com/mdevils"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/html-minifier-terser": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmmirror.com/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
+ "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "camel-case": "^4.1.2",
+ "clean-css": "^5.2.2",
+ "commander": "^8.3.0",
+ "he": "^1.2.0",
+ "param-case": "^3.0.4",
+ "relateurl": "^0.2.7",
+ "terser": "^5.10.0"
+ },
+ "bin": {
+ "html-minifier-terser": "cli.js"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/html-parse-stringify": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz",
+ "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==",
+ "license": "MIT",
+ "dependencies": {
+ "void-elements": "3.1.0"
+ }
+ },
+ "node_modules/html-webpack-plugin": {
+ "version": "5.6.3",
+ "resolved": "https://registry.npmmirror.com/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz",
+ "integrity": "sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/html-minifier-terser": "^6.0.0",
+ "html-minifier-terser": "^6.0.2",
+ "lodash": "^4.17.21",
+ "pretty-error": "^4.0.0",
+ "tapable": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/html-webpack-plugin"
+ },
+ "peerDependencies": {
+ "@rspack/core": "0.x || 1.x",
+ "webpack": "^5.20.0"
+ },
+ "peerDependenciesMeta": {
+ "@rspack/core": {
+ "optional": true
+ },
+ "webpack": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/htmlparser2": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-6.1.0.tgz",
+ "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
+ "dev": true,
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.0.0",
+ "domutils": "^2.5.2",
+ "entities": "^2.0.0"
+ }
+ },
+ "node_modules/http-deceiver": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmmirror.com/http-deceiver/-/http-deceiver-1.2.7.tgz",
+ "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/http-parser-js": {
+ "version": "0.5.10",
+ "resolved": "https://registry.npmmirror.com/http-parser-js/-/http-parser-js-0.5.10.tgz",
+ "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/http-proxy": {
+ "version": "1.18.1",
+ "resolved": "https://registry.npmmirror.com/http-proxy/-/http-proxy-1.18.1.tgz",
+ "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eventemitter3": "^4.0.0",
+ "follow-redirects": "^1.0.0",
+ "requires-port": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/http-proxy-middleware": {
+ "version": "2.0.9",
+ "resolved": "https://registry.npmmirror.com/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz",
+ "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/http-proxy": "^1.17.8",
+ "http-proxy": "^1.18.1",
+ "is-glob": "^4.0.1",
+ "is-plain-obj": "^3.0.0",
+ "micromatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "@types/express": "^4.17.13"
+ },
+ "peerDependenciesMeta": {
+ "@types/express": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/i18next": {
+ "version": "25.1.3",
+ "resolved": "https://registry.npmmirror.com/i18next/-/i18next-25.1.3.tgz",
+ "integrity": "sha512-VY1iKox3YWPRTNMHFdgk5TV+Jq6rNKexLCLpPmP5oXXJ5Kl7yDBi3ycZ5fyEKZ1tNBW5gOqD4WV0XqE7rl3JUg==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://locize.com"
+ },
+ {
+ "type": "individual",
+ "url": "https://locize.com/i18next.html"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.27.1"
+ },
+ "peerDependencies": {
+ "typescript": "^5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/i18next-browser-languagedetector": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmmirror.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.1.0.tgz",
+ "integrity": "sha512-mHZxNx1Lq09xt5kCauZ/4bsXOEA2pfpwSoU11/QTJB+pD94iONFwp+ohqi///PwiFvjFOxe1akYCdHyFo1ng5Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.23.2"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/icss-utils": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmmirror.com/icss-utils/-/icss-utils-5.1.0.tgz",
+ "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-local": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmmirror.com/import-local/-/import-local-3.2.0.tgz",
+ "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pkg-dir": "^4.2.0",
+ "resolve-cwd": "^3.0.0"
+ },
+ "bin": {
+ "import-local-fixture": "fixtures/cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/internmap": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/internmap/-/internmap-2.0.3.tgz",
+ "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/interpret": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/interpret/-/interpret-3.1.1.tgz",
+ "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/ipaddr.js": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz",
+ "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/is-alphabetical": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
+ "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-alphanumerical": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
+ "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
+ "license": "MIT",
+ "dependencies": {
+ "is-alphabetical": "^1.0.0",
+ "is-decimal": "^1.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.16.1",
+ "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.16.1.tgz",
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-decimal": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/is-decimal/-/is-decimal-1.0.4.tgz",
+ "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-hexadecimal": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz",
+ "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
+ "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-docker": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/jest-worker": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-worker/-/jest-worker-27.5.1.tgz",
+ "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/jest-worker/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "license": "MIT"
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/launch-editor": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmmirror.com/launch-editor/-/launch-editor-2.10.0.tgz",
+ "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "picocolors": "^1.0.0",
+ "shell-quote": "^1.8.1"
+ }
+ },
+ "node_modules/loader-runner": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.0.tgz",
+ "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.11.5"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/lower-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/lowlight": {
+ "version": "1.20.0",
+ "resolved": "https://registry.npmmirror.com/lowlight/-/lowlight-1.20.0.tgz",
+ "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==",
+ "license": "MIT",
+ "dependencies": {
+ "fault": "^1.0.0",
+ "highlight.js": "~10.7.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/make-dir/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/memfs": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmmirror.com/memfs/-/memfs-3.5.3.tgz",
+ "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==",
+ "dev": true,
+ "license": "Unlicense",
+ "dependencies": {
+ "fs-monkey": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/merge-descriptors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/multicast-dns": {
+ "version": "7.2.5",
+ "resolved": "https://registry.npmmirror.com/multicast-dns/-/multicast-dns-7.2.5.tgz",
+ "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dns-packet": "^5.2.2",
+ "thunky": "^1.0.2"
+ },
+ "bin": {
+ "multicast-dns": "cli.js"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/negotiator": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.4.tgz",
+ "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/no-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmmirror.com/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/node-forge": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmmirror.com/node-forge/-/node-forge-1.3.1.tgz",
+ "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==",
+ "dev": true,
+ "license": "(BSD-3-Clause OR GPL-2.0)",
+ "engines": {
+ "node": ">= 6.13.0"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.19",
+ "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.19.tgz",
+ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/obuf": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/obuf/-/obuf-1.1.2.tgz",
+ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/on-headers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz",
+ "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/open": {
+ "version": "8.4.2",
+ "resolved": "https://registry.npmmirror.com/open/-/open-8.4.2.tgz",
+ "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-lazy-prop": "^2.0.0",
+ "is-docker": "^2.1.1",
+ "is-wsl": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-retry": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmmirror.com/p-retry/-/p-retry-4.6.2.tgz",
+ "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/retry": "0.12.0",
+ "retry": "^0.13.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/param-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmmirror.com/param-case/-/param-case-3.0.4.tgz",
+ "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/parse-entities": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/parse-entities/-/parse-entities-2.0.0.tgz",
+ "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
+ "license": "MIT",
+ "dependencies": {
+ "character-entities": "^1.0.0",
+ "character-entities-legacy": "^1.0.0",
+ "character-reference-invalid": "^1.0.0",
+ "is-alphanumerical": "^1.0.0",
+ "is-decimal": "^1.0.0",
+ "is-hexadecimal": "^1.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/pascal-case": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmmirror.com/pascal-case/-/pascal-case-3.1.2.tgz",
+ "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/path-to-regexp": {
+ "version": "0.1.12",
+ "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
+ "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmmirror.com/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.3",
+ "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.3.tgz",
+ "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.8",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-modules-extract-imports": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz",
+ "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-local-by-default": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmmirror.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz",
+ "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "icss-utils": "^5.0.0",
+ "postcss-selector-parser": "^7.0.0",
+ "postcss-value-parser": "^4.1.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-scope": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmmirror.com/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz",
+ "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-values": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+ "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "icss-utils": "^5.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
+ "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/pretty-error": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/pretty-error/-/pretty-error-4.0.0.tgz",
+ "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lodash": "^4.17.20",
+ "renderkid": "^3.0.0"
+ }
+ },
+ "node_modules/prismjs": {
+ "version": "1.30.0",
+ "resolved": "https://registry.npmmirror.com/prismjs/-/prismjs-1.30.0.tgz",
+ "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/property-information": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmmirror.com/property-information/-/property-information-5.6.0.tgz",
+ "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==",
+ "license": "MIT",
+ "dependencies": {
+ "xtend": "^4.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/proxy-addr/node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmmirror.com/qs/-/qs-6.13.0.tgz",
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.0.6"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.2.tgz",
+ "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/react": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmmirror.com/react/-/react-18.3.1.tgz",
+ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmmirror.com/react-dom/-/react-dom-18.3.1.tgz",
+ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.2"
+ },
+ "peerDependencies": {
+ "react": "^18.3.1"
+ }
+ },
+ "node_modules/react-i18next": {
+ "version": "15.5.1",
+ "resolved": "https://registry.npmmirror.com/react-i18next/-/react-i18next-15.5.1.tgz",
+ "integrity": "sha512-C8RZ7N7H0L+flitiX6ASjq9p5puVJU1Z8VyL3OgM/QOMRf40BMZX+5TkpxzZVcTmOLPX5zlti4InEX5pFyiVeA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.25.0",
+ "html-parse-stringify": "^3.0.1"
+ },
+ "peerDependencies": {
+ "i18next": ">= 23.2.3",
+ "react": ">= 16.8.0",
+ "typescript": "^5"
+ },
+ "peerDependenciesMeta": {
+ "react-dom": {
+ "optional": true
+ },
+ "react-native": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-medium-image-zoom": {
+ "version": "5.2.14",
+ "resolved": "https://registry.npmmirror.com/react-medium-image-zoom/-/react-medium-image-zoom-5.2.14.tgz",
+ "integrity": "sha512-nfTVYcAUnBzXQpPDcZL+cG/e6UceYUIG+zDcnemL7jtAqbJjVVkA85RgneGtJeni12dTyiRPZVM6Szkmwd/o8w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/rpearce"
+ }
+ ],
+ "license": "BSD-3-Clause",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/react-router": {
+ "version": "7.6.0",
+ "resolved": "https://registry.npmmirror.com/react-router/-/react-router-7.6.0.tgz",
+ "integrity": "sha512-GGufuHIVCJDbnIAXP3P9Sxzq3UUsddG3rrI3ut1q6m0FI6vxVBF3JoPQ38+W/blslLH4a5Yutp8drkEpXoddGQ==",
+ "license": "MIT",
+ "dependencies": {
+ "cookie": "^1.0.1",
+ "set-cookie-parser": "^2.6.0"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=18",
+ "react-dom": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-router-dom": {
+ "version": "7.6.0",
+ "resolved": "https://registry.npmmirror.com/react-router-dom/-/react-router-dom-7.6.0.tgz",
+ "integrity": "sha512-DYgm6RDEuKdopSyGOWZGtDfSm7Aofb8CCzgkliTjtu/eDuB0gcsv6qdFhhi8HdtmA+KHkt5MfZ5K2PdzjugYsA==",
+ "license": "MIT",
+ "dependencies": {
+ "react-router": "7.6.0"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=18",
+ "react-dom": ">=18"
+ }
+ },
+ "node_modules/react-router/node_modules/cookie": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/cookie/-/cookie-1.0.2.tgz",
+ "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/react-syntax-highlighter": {
+ "version": "15.6.1",
+ "resolved": "https://registry.npmmirror.com/react-syntax-highlighter/-/react-syntax-highlighter-15.6.1.tgz",
+ "integrity": "sha512-OqJ2/vL7lEeV5zTJyG7kmARppUjiB9h9udl4qHQjjgEos66z00Ia0OckwYfRxCSFrW8RJIBnsBwQsHZbVPspqg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.3.1",
+ "highlight.js": "^10.4.1",
+ "highlightjs-vue": "^1.0.0",
+ "lowlight": "^1.17.0",
+ "prismjs": "^1.27.0",
+ "refractor": "^3.6.0"
+ },
+ "peerDependencies": {
+ "react": ">= 0.14.0"
+ }
+ },
+ "node_modules/reactflow": {
+ "version": "11.11.4",
+ "resolved": "https://registry.npmmirror.com/reactflow/-/reactflow-11.11.4.tgz",
+ "integrity": "sha512-70FOtJkUWH3BAOsN+LU9lCrKoKbtOPnz2uq0CV2PLdNSwxTXOhCbsZr50GmZ+Rtw3jx8Uv7/vBFtCGixLfd4Og==",
+ "license": "MIT",
+ "dependencies": {
+ "@reactflow/background": "11.3.14",
+ "@reactflow/controls": "11.2.14",
+ "@reactflow/core": "11.11.4",
+ "@reactflow/minimap": "11.7.14",
+ "@reactflow/node-resizer": "2.2.14",
+ "@reactflow/node-toolbar": "1.3.14"
+ },
+ "peerDependencies": {
+ "react": ">=17",
+ "react-dom": ">=17"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/rechoir": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmmirror.com/rechoir/-/rechoir-0.8.0.tgz",
+ "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "resolve": "^1.20.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/refractor": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmmirror.com/refractor/-/refractor-3.6.0.tgz",
+ "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==",
+ "license": "MIT",
+ "dependencies": {
+ "hastscript": "^6.0.0",
+ "parse-entities": "^2.0.0",
+ "prismjs": "~1.27.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/refractor/node_modules/prismjs": {
+ "version": "1.27.0",
+ "resolved": "https://registry.npmmirror.com/prismjs/-/prismjs-1.27.0.tgz",
+ "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/relateurl": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmmirror.com/relateurl/-/relateurl-0.2.7.tgz",
+ "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/renderkid": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/renderkid/-/renderkid-3.0.0.tgz",
+ "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "css-select": "^4.1.3",
+ "dom-converter": "^0.2.0",
+ "htmlparser2": "^6.1.0",
+ "lodash": "^4.17.21",
+ "strip-ansi": "^6.0.1"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/resolve": {
+ "version": "1.22.10",
+ "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.10.tgz",
+ "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.16.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-cwd": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+ "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/retry": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmmirror.com/retry/-/retry-0.13.1.tgz",
+ "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/robust-predicates": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmmirror.com/robust-predicates/-/robust-predicates-3.0.2.tgz",
+ "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==",
+ "license": "Unlicense"
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/rw": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmmirror.com/rw/-/rw-1.3.3.tgz",
+ "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "license": "MIT"
+ },
+ "node_modules/scheduler": {
+ "version": "0.23.2",
+ "resolved": "https://registry.npmmirror.com/scheduler/-/scheduler-0.23.2.tgz",
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "node_modules/schema-utils": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.3.2.tgz",
+ "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/select-hose": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/select-hose/-/select-hose-2.0.0.tgz",
+ "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/selfsigned": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmmirror.com/selfsigned/-/selfsigned-2.4.1.tgz",
+ "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node-forge": "^1.3.0",
+ "node-forge": "^1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.7.2",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/send": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmmirror.com/send/-/send-0.19.0.tgz",
+ "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/send/node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/send/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/serialize-javascript": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
+ "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/serve-index": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmmirror.com/serve-index/-/serve-index-1.9.1.tgz",
+ "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.4",
+ "batch": "0.6.1",
+ "debug": "2.6.9",
+ "escape-html": "~1.0.3",
+ "http-errors": "~1.6.2",
+ "mime-types": "~2.1.17",
+ "parseurl": "~1.3.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/serve-index/node_modules/depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-index/node_modules/http-errors": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-1.6.3.tgz",
+ "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.0",
+ "statuses": ">= 1.4.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-index/node_modules/inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/serve-index/node_modules/setprototypeof": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.1.0.tgz",
+ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/serve-index/node_modules/statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-static": {
+ "version": "1.16.2",
+ "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.16.2.tgz",
+ "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.19.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/set-cookie-parser": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmmirror.com/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz",
+ "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==",
+ "license": "MIT"
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/shallow-clone": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/shallow-clone/-/shallow-clone-3.0.1.tgz",
+ "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "kind-of": "^6.0.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shell-quote": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.2.tgz",
+ "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/sockjs": {
+ "version": "0.3.24",
+ "resolved": "https://registry.npmmirror.com/sockjs/-/sockjs-0.3.24.tgz",
+ "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "faye-websocket": "^0.11.3",
+ "uuid": "^8.3.2",
+ "websocket-driver": "^0.7.4"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/space-separated-tokens": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmmirror.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz",
+ "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/spdy": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/spdy/-/spdy-4.0.2.tgz",
+ "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.1.0",
+ "handle-thing": "^2.0.0",
+ "http-deceiver": "^1.2.7",
+ "select-hose": "^2.0.0",
+ "spdy-transport": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/spdy-transport": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/spdy-transport/-/spdy-transport-3.0.0.tgz",
+ "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.1.0",
+ "detect-node": "^2.0.4",
+ "hpack.js": "^2.1.6",
+ "obuf": "^1.1.2",
+ "readable-stream": "^3.0.6",
+ "wbuf": "^1.7.3"
+ }
+ },
+ "node_modules/spdy-transport/node_modules/debug": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz",
+ "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/spdy-transport/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/spdy/node_modules/debug": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz",
+ "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/spdy/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/strip-outer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/strip-outer/-/strip-outer-1.0.1.tgz",
+ "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "escape-string-regexp": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/style-loader": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmmirror.com/style-loader/-/style-loader-3.3.4.tgz",
+ "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/tapable": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmmirror.com/tapable/-/tapable-2.2.1.tgz",
+ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/terser": {
+ "version": "5.39.2",
+ "resolved": "https://registry.npmmirror.com/terser/-/terser-5.39.2.tgz",
+ "integrity": "sha512-yEPUmWve+VA78bI71BW70Dh0TuV4HHd+I5SHOAfS1+QBOmvmCiiffgjR8ryyEd3KIfvPGFqoADt8LdQ6XpXIvg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.3",
+ "acorn": "^8.14.0",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/terser-webpack-plugin": {
+ "version": "5.3.14",
+ "resolved": "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz",
+ "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jest-worker": "^27.4.5",
+ "schema-utils": "^4.3.0",
+ "serialize-javascript": "^6.0.2",
+ "terser": "^5.31.1"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.1.0"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "uglify-js": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/terser/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/thunky": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/thunky/-/thunky-1.1.0.tgz",
+ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/trim-repeated": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/trim-repeated/-/trim-repeated-1.0.0.tgz",
+ "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "escape-string-regexp": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ts-loader": {
+ "version": "9.5.2",
+ "resolved": "https://registry.npmmirror.com/ts-loader/-/ts-loader-9.5.2.tgz",
+ "integrity": "sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "enhanced-resolve": "^5.0.0",
+ "micromatch": "^4.0.0",
+ "semver": "^7.3.4",
+ "source-map": "^0.7.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "typescript": "*",
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/ts-loader/node_modules/source-map": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.7.4.tgz",
+ "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.8.3",
+ "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.8.3.tgz",
+ "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz",
+ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+ "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/use-sync-external-store": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmmirror.com/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz",
+ "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/utila": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmmirror.com/utila/-/utila-0.4.0.tgz",
+ "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/void-elements": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/void-elements/-/void-elements-3.1.0.tgz",
+ "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/watchpack": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.2.tgz",
+ "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.1.2"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/wbuf": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmmirror.com/wbuf/-/wbuf-1.7.3.tgz",
+ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "node_modules/webpack": {
+ "version": "5.99.8",
+ "resolved": "https://registry.npmmirror.com/webpack/-/webpack-5.99.8.tgz",
+ "integrity": "sha512-lQ3CPiSTpfOnrEGeXDwoq5hIGzSjmwD72GdfVzF7CQAI7t47rJG9eDWvcEkEn3CUQymAElVvDg3YNTlCYj+qUQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/eslint-scope": "^3.7.7",
+ "@types/estree": "^1.0.6",
+ "@types/json-schema": "^7.0.15",
+ "@webassemblyjs/ast": "^1.14.1",
+ "@webassemblyjs/wasm-edit": "^1.14.1",
+ "@webassemblyjs/wasm-parser": "^1.14.1",
+ "acorn": "^8.14.0",
+ "browserslist": "^4.24.0",
+ "chrome-trace-event": "^1.0.2",
+ "enhanced-resolve": "^5.17.1",
+ "es-module-lexer": "^1.2.1",
+ "eslint-scope": "5.1.1",
+ "events": "^3.2.0",
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.2.11",
+ "json-parse-even-better-errors": "^2.3.1",
+ "loader-runner": "^4.2.0",
+ "mime-types": "^2.1.27",
+ "neo-async": "^2.6.2",
+ "schema-utils": "^4.3.2",
+ "tapable": "^2.1.1",
+ "terser-webpack-plugin": "^5.3.11",
+ "watchpack": "^2.4.1",
+ "webpack-sources": "^3.2.3"
+ },
+ "bin": {
+ "webpack": "bin/webpack.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependenciesMeta": {
+ "webpack-cli": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-cli": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmmirror.com/webpack-cli/-/webpack-cli-5.1.4.tgz",
+ "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@discoveryjs/json-ext": "^0.5.0",
+ "@webpack-cli/configtest": "^2.1.1",
+ "@webpack-cli/info": "^2.0.2",
+ "@webpack-cli/serve": "^2.0.5",
+ "colorette": "^2.0.14",
+ "commander": "^10.0.1",
+ "cross-spawn": "^7.0.3",
+ "envinfo": "^7.7.3",
+ "fastest-levenshtein": "^1.0.12",
+ "import-local": "^3.0.2",
+ "interpret": "^3.1.1",
+ "rechoir": "^0.8.0",
+ "webpack-merge": "^5.7.3"
+ },
+ "bin": {
+ "webpack-cli": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=14.15.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "5.x.x"
+ },
+ "peerDependenciesMeta": {
+ "@webpack-cli/generators": {
+ "optional": true
+ },
+ "webpack-bundle-analyzer": {
+ "optional": true
+ },
+ "webpack-dev-server": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-cli/node_modules/commander": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmmirror.com/commander/-/commander-10.0.1.tgz",
+ "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/webpack-dev-middleware": {
+ "version": "5.3.4",
+ "resolved": "https://registry.npmmirror.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz",
+ "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "colorette": "^2.0.10",
+ "memfs": "^3.4.3",
+ "mime-types": "^2.1.31",
+ "range-parser": "^1.2.1",
+ "schema-utils": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.0.0 || ^5.0.0"
+ }
+ },
+ "node_modules/webpack-dev-server": {
+ "version": "4.15.2",
+ "resolved": "https://registry.npmmirror.com/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz",
+ "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/bonjour": "^3.5.9",
+ "@types/connect-history-api-fallback": "^1.3.5",
+ "@types/express": "^4.17.13",
+ "@types/serve-index": "^1.9.1",
+ "@types/serve-static": "^1.13.10",
+ "@types/sockjs": "^0.3.33",
+ "@types/ws": "^8.5.5",
+ "ansi-html-community": "^0.0.8",
+ "bonjour-service": "^1.0.11",
+ "chokidar": "^3.5.3",
+ "colorette": "^2.0.10",
+ "compression": "^1.7.4",
+ "connect-history-api-fallback": "^2.0.0",
+ "default-gateway": "^6.0.3",
+ "express": "^4.17.3",
+ "graceful-fs": "^4.2.6",
+ "html-entities": "^2.3.2",
+ "http-proxy-middleware": "^2.0.3",
+ "ipaddr.js": "^2.0.1",
+ "launch-editor": "^2.6.0",
+ "open": "^8.0.9",
+ "p-retry": "^4.5.0",
+ "rimraf": "^3.0.2",
+ "schema-utils": "^4.0.0",
+ "selfsigned": "^2.1.1",
+ "serve-index": "^1.9.1",
+ "sockjs": "^0.3.24",
+ "spdy": "^4.0.2",
+ "webpack-dev-middleware": "^5.3.4",
+ "ws": "^8.13.0"
+ },
+ "bin": {
+ "webpack-dev-server": "bin/webpack-dev-server.js"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.37.0 || ^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "webpack": {
+ "optional": true
+ },
+ "webpack-cli": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-merge": {
+ "version": "5.10.0",
+ "resolved": "https://registry.npmmirror.com/webpack-merge/-/webpack-merge-5.10.0.tgz",
+ "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "clone-deep": "^4.0.1",
+ "flat": "^5.0.2",
+ "wildcard": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/webpack-sources": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz",
+ "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/websocket-driver": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmmirror.com/websocket-driver/-/websocket-driver-0.7.4.tgz",
+ "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "http-parser-js": ">=0.5.1",
+ "safe-buffer": ">=5.1.0",
+ "websocket-extensions": ">=0.1.1"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/websocket-extensions": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmmirror.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
+ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/wildcard": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/wildcard/-/wildcard-2.0.1.tgz",
+ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/ws": {
+ "version": "8.18.2",
+ "resolved": "https://registry.npmmirror.com/ws/-/ws-8.18.2.tgz",
+ "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/zustand": {
+ "version": "4.5.7",
+ "resolved": "https://registry.npmmirror.com/zustand/-/zustand-4.5.7.tgz",
+ "integrity": "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==",
+ "license": "MIT",
+ "dependencies": {
+ "use-sync-external-store": "^1.2.2"
+ },
+ "engines": {
+ "node": ">=12.7.0"
+ },
+ "peerDependencies": {
+ "@types/react": ">=16.8",
+ "immer": ">=9.0.6",
+ "react": ">=16.8"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "immer": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ }
+ }
+ }
+ }
+}
diff --git a/script-hook-website/package.json b/script-hook-website/package.json
new file mode 100644
index 0000000..e7b2d77
--- /dev/null
+++ b/script-hook-website/package.json
@@ -0,0 +1,51 @@
+{
+ "name": "script-hook-website",
+ "version": "1.0.0",
+ "description": "JS Script Hook官方网站 | JS Script Hook Official Website",
+ "homepage": "https://jsrei.github.io/js-script-hook",
+ "main": "index.js",
+ "scripts": {
+ "start": "webpack serve --mode development --port auto --open",
+ "build": "webpack --mode production",
+ "predeploy": "npm run build",
+ "deploy": "gh-pages -d dist",
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "keywords": [
+ "js-script-hook",
+ "javascript",
+ "hook",
+ "intercept"
+ ],
+ "author": "JSREI",
+ "license": "MIT",
+ "dependencies": {
+ "@types/dompurify": "^3.0.5",
+ "@types/react": "^18.2.0",
+ "@types/react-dom": "^18.2.0",
+ "@types/react-router-dom": "^5.3.3",
+ "d3": "^7.9.0",
+ "dompurify": "^3.2.5",
+ "i18next": "^25.1.3",
+ "i18next-browser-languagedetector": "^8.1.0",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "react-i18next": "^15.5.1",
+ "react-medium-image-zoom": "^5.2.14",
+ "react-router-dom": "^7.6.0",
+ "react-syntax-highlighter": "^15.6.1",
+ "reactflow": "^11.11.4",
+ "typescript": "^5.0.0"
+ },
+ "devDependencies": {
+ "@types/react-syntax-highlighter": "^15.5.13",
+ "css-loader": "^6.7.3",
+ "gh-pages": "^6.3.0",
+ "html-webpack-plugin": "^5.5.1",
+ "style-loader": "^3.3.2",
+ "ts-loader": "^9.4.2",
+ "webpack": "^5.80.0",
+ "webpack-cli": "^5.0.2",
+ "webpack-dev-server": "^4.13.3"
+ }
+}
diff --git a/script-hook-website/public/404.html b/script-hook-website/public/404.html
new file mode 100644
index 0000000..d471e64
--- /dev/null
+++ b/script-hook-website/public/404.html
@@ -0,0 +1,22 @@
+
+
+
+
+ JS Script Hook
+
+
+
+
+
\ No newline at end of file
diff --git a/script-hook-website/public/images/ezgif-5-191ba6b41b.gif b/script-hook-website/public/images/ezgif-5-191ba6b41b.gif
new file mode 100644
index 0000000..7fcc105
Binary files /dev/null and b/script-hook-website/public/images/ezgif-5-191ba6b41b.gif differ
diff --git a/script-hook-website/public/images/logo.png b/script-hook-website/public/images/logo.png
new file mode 100644
index 0000000..30fd432
Binary files /dev/null and b/script-hook-website/public/images/logo.png differ
diff --git a/script-hook-website/public/index.html b/script-hook-website/public/index.html
new file mode 100644
index 0000000..601dfc6
--- /dev/null
+++ b/script-hook-website/public/index.html
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ JS Script Hook - 官方网站
+
+
+
+
+
+
+
+
+
+
+
+ 您需要启用JavaScript才能运行此应用。
+
+
+
\ No newline at end of file
diff --git a/script-hook-website/src/App.css b/script-hook-website/src/App.css
new file mode 100644
index 0000000..e570198
--- /dev/null
+++ b/script-hook-website/src/App.css
@@ -0,0 +1,39 @@
+.app {
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+ contain: layout style;
+ will-change: contents;
+}
+
+/* 防止滚动闪烁 */
+html {
+ scroll-behavior: smooth;
+ height: 100%;
+ overflow-anchor: none;
+}
+
+body {
+ min-height: 100%;
+ overflow-x: hidden;
+}
+
+/* 确保图片和其他元素在加载前预留空间 */
+img, iframe, video {
+ height: auto;
+ max-width: 100%;
+}
+
+/* 确保主要区域有最小高度,防止布局跳跃 */
+.container {
+ min-height: 50vh;
+ /* 减少布局计算 */
+ contain: layout style;
+}
+
+/* 优化滚动体验 */
+@media (prefers-reduced-motion: no-preference) {
+ html {
+ scroll-behavior: smooth;
+ }
+}
\ No newline at end of file
diff --git a/script-hook-website/src/App.tsx b/script-hook-website/src/App.tsx
new file mode 100644
index 0000000..5986242
--- /dev/null
+++ b/script-hook-website/src/App.tsx
@@ -0,0 +1,134 @@
+import React, { useEffect } from 'react';
+import { HashRouter as Router, Routes, Route, Navigate, useLocation } from 'react-router-dom';
+import { useTranslation } from 'react-i18next';
+import Header from './components/Header';
+import Hero from './components/Hero';
+import Features from './components/Features';
+import WorkflowDiagram from './components/WorkflowDiagram';
+import FeatureTree from './components/FeatureTree';
+import DetailedFeatures from './components/DetailedFeatures';
+import Installation from './components/Installation';
+import Support from './components/Support';
+import CommunityGroup from './components/CommunityGroup';
+import Footer from './components/Footer';
+import GitHubStarButton from './components/GitHubStarButton';
+import { I18nProvider } from './context/I18nContext';
+import './App.css';
+
+// 滚动恢复组件,防止路由切换时的滚动问题
+const ScrollToTop: React.FC = () => {
+ const { pathname, hash } = useLocation();
+
+ useEffect(() => {
+ // 只有当没有hash值或hash值为空时,才滚动到顶部
+ if (!hash) {
+ window.scrollTo(0, 0);
+ }
+ }, [pathname, hash]);
+
+ return null;
+};
+
+// 封装主页面内容为一个组件
+const HomePage: React.FC = () => {
+ const { t, i18n } = useTranslation();
+
+ // 更新文档标题和meta描述 - 重构后,将由I18nContext处理
+ useEffect(() => {
+ document.title = t('html.title');
+
+ // 更新meta描述
+ const metaDescription = document.querySelector('meta[name="description"]');
+ if (metaDescription) {
+ metaDescription.setAttribute('content', t('html.description'));
+ }
+
+ // 更新noscript消息
+ const noscriptElement = document.getElementById('noscript-message');
+ if (noscriptElement) {
+ noscriptElement.textContent = t('html.noscript');
+ }
+
+ // 更新社交媒体元数据
+ const updateMetaTag = (id: string, attr: string, value: string) => {
+ const tag = document.getElementById(id);
+ if (tag) tag.setAttribute(attr, value);
+ };
+
+ updateMetaTag('og-title', 'content', t('html.title'));
+ updateMetaTag('og-description', 'content', t('html.description'));
+ updateMetaTag('twitter-title', 'content', t('html.title'));
+ updateMetaTag('twitter-description', 'content', t('html.description'));
+
+ // 更新语言标签
+ document.documentElement.setAttribute('lang', i18n.language);
+ }, [t, i18n.language]);
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+};
+
+const App: React.FC = () => {
+ // 禁用滚动恢复
+ useEffect(() => {
+ // 如果存在 history.scrollRestoration 属性,则禁用自动滚动恢复
+ if ('scrollRestoration' in history) {
+ history.scrollRestoration = 'manual';
+ }
+
+ // 防止滚动跳跃
+ let isScrolling = false;
+ let scrollTimeout: number | null = null;
+
+ const handleScroll = () => {
+ isScrolling = true;
+
+ if (scrollTimeout !== null) {
+ window.clearTimeout(scrollTimeout);
+ }
+
+ scrollTimeout = window.setTimeout(() => {
+ isScrolling = false;
+ }, 150);
+ };
+
+ window.addEventListener('scroll', handleScroll, { passive: true });
+
+ return () => {
+ window.removeEventListener('scroll', handleScroll);
+ if (scrollTimeout !== null) {
+ window.clearTimeout(scrollTimeout);
+ }
+ };
+ }, []);
+
+ return (
+
+
+
+
+
+ } />
+ {/* 添加其他路由,如果未来需要子页面 */}
+ } />
+
+
+
+
+ );
+};
+
+export default App;
\ No newline at end of file
diff --git a/script-hook-website/src/components/CommunityGroup.css b/script-hook-website/src/components/CommunityGroup.css
new file mode 100644
index 0000000..321401a
--- /dev/null
+++ b/script-hook-website/src/components/CommunityGroup.css
@@ -0,0 +1,227 @@
+.community-section {
+ padding: 100px 0;
+ background-color: #f5f7fa;
+ min-height: 100vh;
+}
+
+.section-header {
+ text-align: center;
+ margin-bottom: 60px;
+}
+
+.section-header h2 {
+ font-size: 2.8rem;
+ color: #333;
+ margin-bottom: 20px;
+}
+
+.section-header p {
+ font-size: 1.3rem;
+ color: #666;
+ max-width: 700px;
+ margin: 0 auto;
+}
+
+/* 交流群容器 */
+.community-groups {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
+ gap: 40px;
+ justify-content: center;
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 0 20px;
+}
+
+/* 单个交流群项目 */
+.community-group-item {
+ background-color: #fff;
+ border-radius: 12px;
+ padding: 50px 30px;
+ box-shadow: 0 5px 15px rgba(0, 0, 0, 0.08);
+ text-align: center;
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ min-height: 520px;
+ justify-content: space-between;
+}
+
+.community-group-item:hover {
+ transform: translateY(-5px);
+ box-shadow: 0 15px 30px rgba(0, 0, 0, 0.15);
+}
+
+/* 卡片内部结构 */
+.group-header, .group-content, .group-footer {
+ width: 100%;
+}
+
+.group-header {
+ margin-bottom: 30px;
+ padding-top: 10px;
+}
+
+.group-content {
+ flex-grow: 1;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 10px 0;
+}
+
+.group-footer {
+ margin-top: 30px;
+ padding-bottom: 10px;
+}
+
+.community-group-item h3 {
+ font-size: 1.8rem;
+ color: #333;
+ margin: 0;
+ padding-bottom: 10px;
+}
+
+/* 二维码样式 */
+.qr-code-wrapper {
+ width: 220px;
+ height: 220px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin: 10px auto;
+ flex-shrink: 0;
+}
+
+.qr-code-image {
+ max-width: 100%;
+ max-height: 100%;
+ border-radius: 8px;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+ transition: transform 0.2s ease;
+}
+
+.qr-code-image:hover {
+ transform: scale(1.05);
+}
+
+/* 描述文字 */
+.group-description {
+ font-size: 1.1rem;
+ color: #555;
+ line-height: 1.6;
+ margin: 0;
+ padding: 10px 0;
+}
+
+.group-description a {
+ color: #1976d2;
+ font-weight: 500;
+ text-decoration: none;
+ transition: color 0.2s ease;
+}
+
+.group-description a:hover {
+ color: #0d47a1;
+ text-decoration: underline;
+}
+
+/* 响应式调整 */
+@media (max-width: 992px) {
+ .community-section {
+ padding: 80px 0;
+ }
+
+ .community-groups {
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
+ gap: 30px;
+ }
+
+ .section-header h2 {
+ font-size: 2.4rem;
+ }
+
+ .community-group-item {
+ padding: 40px 25px;
+ min-height: 480px;
+ }
+
+ .group-header {
+ margin-bottom: 25px;
+ }
+
+ .group-footer {
+ margin-top: 25px;
+ }
+}
+
+@media (max-width: 768px) {
+ .community-section {
+ padding: 70px 0;
+ min-height: auto;
+ }
+
+ .section-header {
+ margin-bottom: 50px;
+ }
+
+ .section-header h2 {
+ font-size: 2.2rem;
+ }
+
+ .section-header p {
+ font-size: 1.2rem;
+ }
+
+ .qr-code-wrapper {
+ width: 200px;
+ height: 200px;
+ margin: 5px auto;
+ }
+
+ .community-group-item {
+ min-height: 450px;
+ padding: 35px 25px;
+ }
+
+ .community-group-item h3 {
+ font-size: 1.6rem;
+ }
+
+ .group-header {
+ margin-bottom: 20px;
+ }
+
+ .group-footer {
+ margin-top: 20px;
+ }
+}
+
+@media (max-width: 576px) {
+ .community-section {
+ padding: 60px 0;
+ }
+
+ .community-groups {
+ grid-template-columns: 1fr;
+ max-width: 320px;
+ margin: 0 auto;
+ gap: 25px;
+ }
+
+ .community-group-item {
+ min-height: 420px;
+ padding: 30px 20px;
+ }
+
+ .qr-code-wrapper {
+ width: 200px;
+ height: 200px;
+ margin-bottom: 25px;
+ }
+
+ .section-header h2 {
+ font-size: 2rem;
+ }
+}
\ No newline at end of file
diff --git a/script-hook-website/src/components/CommunityGroup.tsx b/script-hook-website/src/components/CommunityGroup.tsx
new file mode 100644
index 0000000..96b54c7
--- /dev/null
+++ b/script-hook-website/src/components/CommunityGroup.tsx
@@ -0,0 +1,76 @@
+import React from 'react';
+import { useTranslation } from 'react-i18next';
+import './CommunityGroup.css';
+import Zoom from 'react-medium-image-zoom';
+import 'react-medium-image-zoom/dist/styles.css';
+
+const CommunityGroup: React.FC = () => {
+ const { t } = useTranslation();
+
+ const groups = [
+ {
+ title: t('community.groups.wechat.title'),
+ image: 'https://cdn.jsdelivr.net/gh/JSREI/.github/profile/README.assets/image-20241016230653669.png',
+ description: t('community.groups.wechat.description')
+ },
+ {
+ title: t('community.groups.personalWechat.title'),
+ image: 'https://cdn.jsdelivr.net/gh/JSREI/.github/profile/README.assets/image-20231030132026541-7614065.png',
+ description: t('community.groups.personalWechat.description')
+ },
+ {
+ title: t('community.groups.telegram.title'),
+ image: 'https://cdn.jsdelivr.net/gh/JSREI/.github/profile/README.assets/image-20241016231143315.png',
+ description: t('community.groups.telegram.description'),
+ link: 'https://t.me/jsreijsrei'
+ }
+ ];
+
+ return (
+
+ );
+};
+
+export default CommunityGroup;
\ No newline at end of file
diff --git a/script-hook-website/src/components/DetailedFeatures.css b/script-hook-website/src/components/DetailedFeatures.css
new file mode 100644
index 0000000..9f90bf1
--- /dev/null
+++ b/script-hook-website/src/components/DetailedFeatures.css
@@ -0,0 +1,164 @@
+.detailed-features {
+ padding: 80px 0;
+ background-color: #ffffff;
+}
+
+.tabs {
+ display: flex;
+ justify-content: center;
+ margin: 40px auto 30px;
+ gap: 10px;
+ max-width: 600px;
+}
+
+.tabs button {
+ padding: 12px 24px;
+ background-color: transparent;
+ border: 2px solid #e0e0e0;
+ border-radius: 30px;
+ font-size: 16px;
+ font-weight: 500;
+ color: #546e7a;
+ cursor: pointer;
+ transition: all 0.3s;
+}
+
+.tabs button:hover {
+ border-color: #1976d2;
+ color: #1976d2;
+}
+
+.tabs button.active {
+ background-color: #1976d2;
+ border-color: #1976d2;
+ color: white;
+}
+
+.detailed-content {
+ animation: fadeIn 0.5s ease;
+}
+
+.content-container {
+ display: flex;
+ gap: 50px;
+ align-items: flex-start;
+}
+
+.content-text {
+ flex: 1;
+}
+
+.content-text h3 {
+ font-size: 28px;
+ color: #2c3e50;
+ margin-bottom: 20px;
+}
+
+.content-description {
+ font-size: 18px;
+ line-height: 1.6;
+ color: #546e7a;
+ margin-bottom: 30px;
+}
+
+.feature-item {
+ margin-bottom: 30px;
+}
+
+.feature-item h4 {
+ font-size: 20px;
+ color: #1976d2;
+ margin-bottom: 15px;
+ position: relative;
+ padding-left: 20px;
+}
+
+.feature-item h4::before {
+ content: '';
+ position: absolute;
+ left: 0;
+ top: 50%;
+ transform: translateY(-50%);
+ width: 10px;
+ height: 10px;
+ background-color: #1976d2;
+ border-radius: 50%;
+}
+
+.feature-item ul {
+ padding-left: 25px;
+}
+
+.feature-item li {
+ font-size: 16px;
+ color: #546e7a;
+ line-height: 1.7;
+ margin-bottom: 10px;
+ position: relative;
+}
+
+.feature-item li::before {
+ content: '•';
+ color: #1976d2;
+ font-weight: bold;
+ display: inline-block;
+ width: 1em;
+ margin-left: -1em;
+}
+
+.content-image {
+ flex: 1;
+ max-width: 500px;
+}
+
+.content-image img {
+ width: 100%;
+ border-radius: 10px;
+ box-shadow: 0 5px 20px rgba(0, 0, 0, 0.1);
+ transition: transform 0.3s ease;
+}
+
+.content-image img:hover {
+ transform: scale(1.02);
+}
+
+@keyframes fadeIn {
+ from {
+ opacity: 0;
+ transform: translateY(10px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+@media (max-width: 992px) {
+ .content-container {
+ flex-direction: column-reverse;
+ }
+
+ .content-image {
+ margin-bottom: 40px;
+ max-width: 100%;
+ }
+}
+
+@media (max-width: 768px) {
+ .tabs {
+ flex-direction: column;
+ gap: 10px;
+ }
+
+ .tabs button {
+ width: 100%;
+ }
+
+ .content-text h3 {
+ font-size: 24px;
+ }
+
+ .feature-item h4 {
+ font-size: 18px;
+ }
+}
\ No newline at end of file
diff --git a/script-hook-website/src/components/DetailedFeatures.tsx b/script-hook-website/src/components/DetailedFeatures.tsx
new file mode 100644
index 0000000..89b3d1b
--- /dev/null
+++ b/script-hook-website/src/components/DetailedFeatures.tsx
@@ -0,0 +1,98 @@
+import React, { useState } from 'react';
+import { useTranslation } from 'react-i18next';
+import './DetailedFeatures.css';
+
+const DetailedFeatures: React.FC = () => {
+ const { t } = useTranslation();
+ const [activeTab, setActiveTab] = useState<'interface' | 'console' | 'breakpoint'>('interface');
+
+ const getTabContent = (tab: 'interface' | 'console' | 'breakpoint') => {
+ const items = [
+ {
+ title: t(`detailedFeatures.${tab}.${tab === 'interface' ? 'globalConfig' : tab === 'console' ? 'interfaceAnalysis' : 'requestAnalysis'}.title`),
+ points: t(`detailedFeatures.${tab}.${tab === 'interface' ? 'globalConfig' : tab === 'console' ? 'interfaceAnalysis' : 'requestAnalysis'}.points`, { returnObjects: true }) as string[]
+ },
+ {
+ title: t(`detailedFeatures.${tab}.${tab === 'interface' ? 'breakpointConfig' : tab === 'console' ? 'targetFilter' : 'responseExtraction'}.title`),
+ points: t(`detailedFeatures.${tab}.${tab === 'interface' ? 'breakpointConfig' : tab === 'console' ? 'targetFilter' : 'responseExtraction'}.points`, { returnObjects: true }) as string[]
+ }
+ ];
+
+ return {
+ title: t(`detailedFeatures.${tab}.title`),
+ description: t(`detailedFeatures.${tab}.description`),
+ image: tab === 'interface'
+ ? "https://github.com/JSREI/js-script-hook/raw/main/README.assets/image-20250109024541404.png"
+ : tab === 'console'
+ ? "https://github.com/JSREI/js-script-hook/raw/main/README.assets/image-20250109024829101.png"
+ : "https://github.com/JSREI/js-script-hook/raw/main/README.assets/image-20250109024918866.png",
+ items
+ };
+ };
+
+ const renderTabContent = () => {
+ const content = getTabContent(activeTab);
+
+ return (
+
+
+
+
{content.title}
+
{content.description}
+
+ {content.items.map((item, index) => (
+
+
{item.title}
+
+ {item.points.map((point, i) => (
+ {point}
+ ))}
+
+
+ ))}
+
+
+
+
+
+
+
+ );
+ };
+
+ return (
+
+
+
+
{t('detailedFeatures.title')}
+
{t('detailedFeatures.description')}
+
+
+
+ setActiveTab('interface')}
+ >
+ {t('detailedFeatures.tabs.interface')}
+
+ setActiveTab('console')}
+ >
+ {t('detailedFeatures.tabs.console')}
+
+ setActiveTab('breakpoint')}
+ >
+ {t('detailedFeatures.tabs.breakpoint')}
+
+
+
+ {renderTabContent()}
+
+
+ );
+};
+
+export default DetailedFeatures;
\ No newline at end of file
diff --git a/script-hook-website/src/components/FeatureTree.css b/script-hook-website/src/components/FeatureTree.css
new file mode 100644
index 0000000..8ef8d0a
--- /dev/null
+++ b/script-hook-website/src/components/FeatureTree.css
@@ -0,0 +1,220 @@
+.feature-tree {
+ padding: 80px 0;
+ background-color: #f9f9f9;
+ overflow: hidden;
+}
+
+.feature-tree-container {
+ position: relative;
+ height: 800px;
+ margin-top: 40px;
+ border-radius: 12px;
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
+ background-color: #fff;
+ overflow: hidden;
+}
+
+/* 自定义节点样式 */
+.custom-node {
+ padding: 12px 16px;
+ border-radius: 8px;
+ min-width: 150px;
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
+ transition: all 0.3s ease;
+ font-family: 'Roboto', sans-serif;
+ cursor: grab;
+ user-select: none;
+}
+
+.custom-node:hover {
+ transform: translateY(-3px);
+ box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15);
+}
+
+.custom-node:active {
+ cursor: grabbing;
+}
+
+.custom-node .node-label {
+ font-weight: 500;
+ color: #333;
+ text-align: center;
+}
+
+.custom-node .node-description {
+ font-size: 12px;
+ color: #666;
+ margin-top: 4px;
+ text-align: center;
+ font-style: italic;
+}
+
+/* 主节点样式 */
+.custom-node.main {
+ background-color: #bbdefb;
+ border: 2px solid #1976d2;
+ min-width: 180px;
+}
+
+.custom-node.main .node-label {
+ font-size: 18px;
+ font-weight: 600;
+ color: #0d47a1;
+}
+
+/* 一级节点样式 */
+.custom-node.primary {
+ background-color: #ffccbc;
+ border: 2px solid #e74c3c;
+}
+
+.custom-node.primary .node-label {
+ color: #c0392b;
+ font-weight: 500;
+}
+
+/* 二级节点样式 */
+.custom-node.secondary {
+ background-color: #e8f5e9;
+ border: 2px solid #4caf50;
+}
+
+.custom-node.secondary .node-label {
+ color: #2e7d32;
+}
+
+/* 三级节点样式 */
+.custom-node.tertiary {
+ background-color: #f5f5f5;
+ border: 2px solid #9e9e9e;
+}
+
+.custom-node.tertiary .node-label {
+ color: #424242;
+ font-size: 14px;
+}
+
+/* 自定义节点连接点 */
+.react-flow__handle {
+ width: 8px;
+ height: 8px;
+ background-color: #555;
+ border: 2px solid #fff;
+}
+
+.react-flow__handle-left {
+ left: -5px;
+}
+
+.react-flow__handle-right {
+ right: -5px;
+}
+
+/* 图例样式 */
+.feature-tree-legend {
+ position: absolute;
+ bottom: 20px;
+ right: 20px;
+ background-color: rgba(255, 255, 255, 0.9);
+ padding: 12px;
+ border-radius: 8px;
+ display: flex;
+ gap: 16px;
+ z-index: 10;
+ border: 1px solid #eee;
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
+}
+
+.legend-item {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+}
+
+.legend-color {
+ width: 20px;
+ height: 20px;
+ border-radius: 4px;
+}
+
+.legend-color.main {
+ background-color: #bbdefb;
+ border: 2px solid #1976d2;
+}
+
+.legend-color.primary {
+ background-color: #ffccbc;
+ border: 2px solid #e74c3c;
+}
+
+.legend-color.secondary {
+ background-color: #e8f5e9;
+ border: 2px solid #4caf50;
+}
+
+.legend-color.tertiary {
+ background-color: #f5f5f5;
+ border: 2px solid #9e9e9e;
+}
+
+/* 操作提示 */
+.feature-tree-instructions {
+ position: absolute;
+ top: 20px;
+ right: 20px;
+ background-color: rgba(255, 255, 255, 0.9);
+ padding: 12px 16px;
+ border-radius: 8px;
+ z-index: 10;
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
+ border: 1px solid #eee;
+ animation: fadeIn 0.5s ease-in-out;
+ animation-delay: 1.5s;
+ animation-fill-mode: both;
+}
+
+.feature-tree-instructions p {
+ margin: 0;
+ font-size: 14px;
+ color: #555;
+}
+
+/* 动画效果 */
+@keyframes fadeIn {
+ from {
+ opacity: 0;
+ transform: translateY(-10px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+/* 响应式样式 */
+@media (max-width: 768px) {
+ .feature-tree-container {
+ height: 600px;
+ }
+
+ .feature-tree-legend {
+ flex-wrap: wrap;
+ justify-content: center;
+ bottom: 10px;
+ left: 50%;
+ transform: translateX(-50%);
+ width: 90%;
+ max-width: 400px;
+ right: auto;
+ }
+
+ .feature-tree-instructions {
+ top: 10px;
+ left: 50%;
+ transform: translateX(-50%);
+ width: 90%;
+ max-width: 300px;
+ right: auto;
+ text-align: center;
+ }
+}
\ No newline at end of file
diff --git a/script-hook-website/src/components/FeatureTree.tsx b/script-hook-website/src/components/FeatureTree.tsx
new file mode 100644
index 0000000..a2714f6
--- /dev/null
+++ b/script-hook-website/src/components/FeatureTree.tsx
@@ -0,0 +1,412 @@
+import React, { useState, useCallback, useEffect } from 'react';
+import { useTranslation } from 'react-i18next';
+import ReactFlow, {
+ MiniMap,
+ Controls,
+ Background,
+ useNodesState,
+ useEdgesState,
+ Handle,
+ Position,
+ MarkerType,
+ NodeProps,
+ ReactFlowProvider
+} from 'reactflow';
+import 'reactflow/dist/style.css';
+import './FeatureTree.css';
+
+// 节点数据类型
+interface NodeData {
+ label: string;
+ description?: string;
+ nodeType?: 'main' | 'primary' | 'secondary' | 'tertiary' | 'default';
+}
+
+// 自定义节点组件
+const CustomNode: React.FC> = ({ data, isConnectable }) => {
+ return (
+
+
+
+
{data.label}
+ {data.description &&
{data.description}
}
+
+
+
+ );
+};
+
+const nodeTypes = {
+ custom: CustomNode,
+};
+
+const FlowDiagram: React.FC = () => {
+ const { t } = useTranslation();
+ const [nodes, setNodes, onNodesChange] = useNodesState([]);
+ const [edges, setEdges, onEdgesChange] = useEdgesState([]);
+ const [windowSize, setWindowSize] = useState({
+ width: window.innerWidth,
+ height: 800
+ });
+
+ // 响应式宽度调整
+ useEffect(() => {
+ const handleResize = () => {
+ setWindowSize({
+ width: window.innerWidth,
+ height: 800
+ });
+ };
+
+ window.addEventListener('resize', handleResize);
+ return () => {
+ window.removeEventListener('resize', handleResize);
+ };
+ }, []);
+
+ // 初始化节点和边
+ useEffect(() => {
+ // 中心主节点
+ const initialNodes = [
+ {
+ id: 'jsrei',
+ position: { x: windowSize.width / 2 - 100, y: 350 },
+ data: {
+ label: t('featureTree.nodes.main'),
+ nodeType: 'main' as const
+ },
+ type: 'custom'
+ },
+
+ // 一级节点:Hook功能
+ {
+ id: 'hook',
+ position: { x: windowSize.width / 2 - 300, y: 150 },
+ data: {
+ label: t('featureTree.nodes.hook.title'),
+ nodeType: 'primary' as const
+ },
+ type: 'custom'
+ },
+ // Hook的子节点
+ {
+ id: 'request-hook',
+ position: { x: windowSize.width / 2 - 500, y: 80 },
+ data: {
+ label: t('featureTree.nodes.hook.requestHook.title'),
+ description: t('featureTree.nodes.hook.requestHook.description'),
+ nodeType: 'secondary' as const
+ },
+ type: 'custom'
+ },
+ {
+ id: 'response-hook',
+ position: { x: windowSize.width / 2 - 500, y: 180 },
+ data: {
+ label: t('featureTree.nodes.hook.responseHook.title'),
+ description: t('featureTree.nodes.hook.responseHook.description'),
+ nodeType: 'secondary' as const
+ },
+ type: 'custom'
+ },
+
+ // 一级节点:分析器
+ {
+ id: 'analyzer',
+ position: { x: windowSize.width / 2 - 300, y: 350 },
+ data: {
+ label: t('featureTree.nodes.analyzer.title'),
+ nodeType: 'primary' as const
+ },
+ type: 'custom'
+ },
+ // 分析器的子节点
+ {
+ id: 'request-analyzer',
+ position: { x: windowSize.width / 2 - 500, y: 290 },
+ data: {
+ label: t('featureTree.nodes.analyzer.requestAnalyzer.title'),
+ nodeType: 'secondary' as const
+ },
+ type: 'custom'
+ },
+ {
+ id: 'response-analyzer',
+ position: { x: windowSize.width / 2 - 500, y: 410 },
+ data: {
+ label: t('featureTree.nodes.analyzer.responseAnalyzer.title'),
+ nodeType: 'secondary' as const
+ },
+ type: 'custom'
+ },
+ // 请求分析器的子节点
+ {
+ id: 'callback-detect',
+ position: { x: windowSize.width / 2 - 700, y: 250 },
+ data: {
+ label: t('featureTree.nodes.analyzer.requestAnalyzer.callbackDetect'),
+ nodeType: 'tertiary' as const
+ },
+ type: 'custom'
+ },
+ {
+ id: 'auto-breakpoint',
+ position: { x: windowSize.width / 2 - 700, y: 330 },
+ data: {
+ label: t('featureTree.nodes.analyzer.requestAnalyzer.autoBreakpoint.title'),
+ description: t('featureTree.nodes.analyzer.requestAnalyzer.autoBreakpoint.description'),
+ nodeType: 'tertiary' as const
+ },
+ type: 'custom'
+ },
+ // 响应分析器的子节点
+ {
+ id: 'static-analyze',
+ position: { x: windowSize.width / 2 - 700, y: 410 },
+ data: {
+ label: t('featureTree.nodes.analyzer.responseAnalyzer.staticAnalyze'),
+ nodeType: 'tertiary' as const
+ },
+ type: 'custom'
+ },
+
+ // 一级节点:全局设置
+ {
+ id: 'settings',
+ position: { x: windowSize.width / 2 + 150, y: 200 },
+ data: {
+ label: t('featureTree.nodes.settings.title'),
+ nodeType: 'primary' as const
+ },
+ type: 'custom'
+ },
+ // 全局设置的子节点
+ {
+ id: 'ui-language',
+ position: { x: windowSize.width / 2 + 350, y: 100 },
+ data: {
+ label: t('featureTree.nodes.settings.language.title'),
+ description: t('featureTree.nodes.settings.language.description'),
+ nodeType: 'secondary' as const
+ },
+ type: 'custom'
+ },
+ {
+ id: 'hook-method',
+ position: { x: windowSize.width / 2 + 350, y: 200 },
+ data: {
+ label: t('featureTree.nodes.settings.hookMethod.title'),
+ nodeType: 'secondary' as const
+ },
+ type: 'custom'
+ },
+ {
+ id: 'flag-options',
+ position: { x: windowSize.width / 2 + 350, y: 300 },
+ data: {
+ label: t('featureTree.nodes.settings.flagOptions'),
+ nodeType: 'secondary' as const
+ },
+ type: 'custom'
+ },
+ // Hook方式的子节点
+ {
+ id: 'proxy-method',
+ position: { x: windowSize.width / 2 + 580, y: 160 },
+ data: {
+ label: t('featureTree.nodes.settings.hookMethod.proxyMethod'),
+ nodeType: 'tertiary' as const
+ },
+ type: 'custom'
+ },
+ {
+ id: 'redeclare-method',
+ position: { x: windowSize.width / 2 + 580, y: 240 },
+ data: {
+ label: t('featureTree.nodes.settings.hookMethod.redeclareMethod'),
+ nodeType: 'tertiary' as const
+ },
+ type: 'custom'
+ },
+
+ // 一级节点:UI界面
+ {
+ id: 'ui',
+ position: { x: windowSize.width / 2 + 150, y: 500 },
+ data: {
+ label: t('featureTree.nodes.ui.title'),
+ nodeType: 'primary' as const
+ },
+ type: 'custom'
+ },
+ // UI界面的子节点
+ {
+ id: 'new-url-config',
+ position: { x: windowSize.width / 2 + 350, y: 400 },
+ data: {
+ label: t('featureTree.nodes.ui.urlConfig.title'),
+ description: t('featureTree.nodes.ui.urlConfig.description'),
+ nodeType: 'secondary' as const
+ },
+ type: 'custom'
+ },
+ {
+ id: 'breakpoint-setting',
+ position: { x: windowSize.width / 2 + 350, y: 500 },
+ data: {
+ label: t('featureTree.nodes.ui.breakpointSetting'),
+ nodeType: 'secondary' as const
+ },
+ type: 'custom'
+ },
+ {
+ id: 'response-breakpoint',
+ position: { x: windowSize.width / 2 + 350, y: 600 },
+ data: {
+ label: t('featureTree.nodes.ui.responseBreakpoint'),
+ nodeType: 'secondary' as const
+ },
+ type: 'custom'
+ },
+
+ // 一级节点:控制台
+ {
+ id: 'console',
+ position: { x: windowSize.width / 2 - 300, y: 550 },
+ data: {
+ label: t('featureTree.nodes.console.title'),
+ nodeType: 'primary' as const
+ },
+ type: 'custom'
+ },
+ // 控制台的子节点
+ {
+ id: 'print-style',
+ position: { x: windowSize.width / 2 - 500, y: 550 },
+ data: {
+ label: t('featureTree.nodes.console.printStyle'),
+ nodeType: 'secondary' as const
+ },
+ type: 'custom'
+ },
+ ];
+
+ // 定义连接关系
+ const initialEdges = [
+ // 主节点到一级节点的连接
+ { id: 'jsrei-hook', source: 'jsrei', target: 'hook', animated: true, type: 'smoothstep', style: { stroke: '#e74c3c' }, markerEnd: { type: MarkerType.ArrowClosed } },
+ { id: 'jsrei-analyzer', source: 'jsrei', target: 'analyzer', animated: true, type: 'smoothstep', style: { stroke: '#f1c40f' }, markerEnd: { type: MarkerType.ArrowClosed } },
+ { id: 'jsrei-settings', source: 'jsrei', target: 'settings', animated: true, type: 'smoothstep', style: { stroke: '#3498db' }, markerEnd: { type: MarkerType.ArrowClosed } },
+ { id: 'jsrei-ui', source: 'jsrei', target: 'ui', animated: true, type: 'smoothstep', style: { stroke: '#3498db' }, markerEnd: { type: MarkerType.ArrowClosed } },
+ { id: 'jsrei-console', source: 'jsrei', target: 'console', animated: true, type: 'smoothstep', style: { stroke: '#e74c3c' }, markerEnd: { type: MarkerType.ArrowClosed } },
+
+ // Hook连接
+ { id: 'hook-request', source: 'hook', target: 'request-hook', type: 'smoothstep', style: { stroke: '#e74c3c' } },
+ { id: 'hook-response', source: 'hook', target: 'response-hook', type: 'smoothstep', style: { stroke: '#e74c3c' } },
+
+ // 分析器连接
+ { id: 'analyzer-request', source: 'analyzer', target: 'request-analyzer', type: 'smoothstep', style: { stroke: '#f1c40f' } },
+ { id: 'analyzer-response', source: 'analyzer', target: 'response-analyzer', type: 'smoothstep', style: { stroke: '#f1c40f' } },
+
+ // 请求分析器连接
+ { id: 'request-callback', source: 'request-analyzer', target: 'callback-detect', type: 'smoothstep', style: { stroke: '#f1c40f' } },
+ { id: 'request-auto', source: 'request-analyzer', target: 'auto-breakpoint', type: 'smoothstep', style: { stroke: '#f1c40f' } },
+
+ // 响应分析器连接
+ { id: 'response-static', source: 'response-analyzer', target: 'static-analyze', type: 'smoothstep', style: { stroke: '#f1c40f' } },
+
+ // 全局设置连接
+ { id: 'settings-language', source: 'settings', target: 'ui-language', type: 'smoothstep', style: { stroke: '#3498db' } },
+ { id: 'settings-hook', source: 'settings', target: 'hook-method', type: 'smoothstep', style: { stroke: '#3498db' } },
+ { id: 'settings-flag', source: 'settings', target: 'flag-options', type: 'smoothstep', style: { stroke: '#3498db' } },
+
+ // Hook方式连接
+ { id: 'hook-proxy', source: 'hook-method', target: 'proxy-method', type: 'smoothstep', style: { stroke: '#3498db' } },
+ { id: 'hook-redeclare', source: 'hook-method', target: 'redeclare-method', type: 'smoothstep', style: { stroke: '#3498db' } },
+
+ // UI界面连接
+ { id: 'ui-config', source: 'ui', target: 'new-url-config', type: 'smoothstep', style: { stroke: '#3498db' } },
+ { id: 'ui-breakpoint', source: 'ui', target: 'breakpoint-setting', type: 'smoothstep', style: { stroke: '#3498db' } },
+ { id: 'ui-response', source: 'ui', target: 'response-breakpoint', type: 'smoothstep', style: { stroke: '#3498db' } },
+
+ // 控制台连接
+ { id: 'console-print', source: 'console', target: 'print-style', type: 'smoothstep', style: { stroke: '#e74c3c' } },
+ ];
+
+ setNodes(initialNodes);
+ setEdges(initialEdges);
+ }, [windowSize.width, setNodes, setEdges, t]);
+
+ return (
+
+
+
+ {
+ if (n.data?.nodeType === 'main') return '#1976d2';
+ if (n.data?.nodeType === 'primary') return '#e74c3c';
+ return '#333';
+ }}
+ nodeColor={(n) => {
+ if (n.data?.nodeType === 'main') return '#bbdefb';
+ if (n.data?.nodeType === 'primary') return '#ffccbc';
+ if (n.data?.nodeType === 'secondary') return '#e8f5e9';
+ return '#f5f5f5';
+ }}
+ maskColor="rgba(240, 240, 240, 0.6)"
+ />
+
+ );
+};
+
+// 主组件,添加ReactFlowProvider
+const FeatureTree: React.FC = () => {
+ const { t } = useTranslation();
+
+ return (
+
+
+
+
{t('featureTree.title')}
+
{t('featureTree.description')}
+
+
+
+
+
+
+
+
+
{t('featureTree.legend.core')}
+
+
+
+
{t('featureTree.legend.mainModule')}
+
+
+
+
{t('featureTree.legend.subFeature')}
+
+
+
+
{t('featureTree.legend.implementation')}
+
+
+
+
{t('featureTree.instructions')}
+
+
+
+
+ );
+};
+
+export default FeatureTree;
\ No newline at end of file
diff --git a/script-hook-website/src/components/Features.css b/script-hook-website/src/components/Features.css
new file mode 100644
index 0000000..4cf4ee8
--- /dev/null
+++ b/script-hook-website/src/components/Features.css
@@ -0,0 +1,72 @@
+.features {
+ padding: 80px 0;
+ background-color: #ffffff;
+}
+
+.section-header {
+ text-align: center;
+ margin-bottom: 60px;
+}
+
+.section-header h2 {
+ font-size: 36px;
+ font-weight: 700;
+ color: #2c3e50;
+ margin-bottom: 16px;
+}
+
+.section-header p {
+ font-size: 18px;
+ color: #546e7a;
+ max-width: 600px;
+ margin: 0 auto;
+}
+
+.features-grid {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 30px;
+}
+
+.feature-card {
+ background-color: #f9f9f9;
+ border-radius: 8px;
+ padding: 30px;
+ transition: all 0.3s;
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
+}
+
+.feature-card:hover {
+ transform: translateY(-5px);
+ box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1);
+}
+
+.feature-icon {
+ font-size: 40px;
+ margin-bottom: 20px;
+}
+
+.feature-card h3 {
+ font-size: 22px;
+ font-weight: 600;
+ margin-bottom: 15px;
+ color: #1976d2;
+}
+
+.feature-card p {
+ font-size: 16px;
+ line-height: 1.6;
+ color: #546e7a;
+}
+
+@media (max-width: 992px) {
+ .features-grid {
+ grid-template-columns: repeat(2, 1fr);
+ }
+}
+
+@media (max-width: 576px) {
+ .features-grid {
+ grid-template-columns: 1fr;
+ }
+}
\ No newline at end of file
diff --git a/script-hook-website/src/components/Features.tsx b/script-hook-website/src/components/Features.tsx
new file mode 100644
index 0000000..8709069
--- /dev/null
+++ b/script-hook-website/src/components/Features.tsx
@@ -0,0 +1,79 @@
+import React from 'react';
+import { useTranslation } from 'react-i18next';
+import './Features.css';
+
+interface FeatureCardProps {
+ icon: string;
+ title: string;
+ description: string;
+}
+
+const FeatureCard: React.FC = ({ icon, title, description }) => {
+ return (
+
+
{icon}
+
{title}
+
{description}
+
+ );
+};
+
+const Features: React.FC = () => {
+ const { t } = useTranslation();
+
+ const features = [
+ {
+ icon: '🔌',
+ title: t('features.items.scriptInterception.title'),
+ description: t('features.items.scriptInterception.description')
+ },
+ {
+ icon: '⚡',
+ title: t('features.items.jsonpParsing.title'),
+ description: t('features.items.jsonpParsing.description')
+ },
+ {
+ icon: '🛠️',
+ title: t('features.items.breakpointControl.title'),
+ description: t('features.items.breakpointControl.description')
+ },
+ {
+ icon: '🔍',
+ title: t('features.items.dataExtraction.title'),
+ description: t('features.items.dataExtraction.description')
+ },
+ {
+ icon: '🧩',
+ title: t('features.items.hookStrategies.title'),
+ description: t('features.items.hookStrategies.description')
+ },
+ {
+ icon: '📦',
+ title: t('features.items.stealthMode.title'),
+ description: t('features.items.stealthMode.description')
+ }
+ ];
+
+ return (
+
+
+
+
{t('features.title')}
+
{t('features.description')}
+
+
+ {features.map((feature, index) => (
+
+ ))}
+
+
+
+ );
+};
+
+export default Features;
\ No newline at end of file
diff --git a/script-hook-website/src/components/Footer.css b/script-hook-website/src/components/Footer.css
new file mode 100644
index 0000000..2e0987e
--- /dev/null
+++ b/script-hook-website/src/components/Footer.css
@@ -0,0 +1,85 @@
+.footer {
+ background-color: #2c3e50;
+ color: #f5f5f5;
+ padding: 60px 0 30px;
+ margin-top: auto;
+}
+
+.footer-content {
+ display: grid;
+ grid-template-columns: 2fr 1fr 1fr;
+ gap: 40px;
+ margin-bottom: 40px;
+}
+
+.footer-section h4 {
+ font-size: 20px;
+ font-weight: 600;
+ margin-bottom: 20px;
+ color: #ffffff;
+}
+
+/* 标题链接样式 */
+.footer-title-link {
+ color: #ffffff !important; /* 使用与标题相同的白色 */
+ text-decoration: none;
+ transition: color 0.3s;
+}
+
+.footer-title-link:hover {
+ color: #64b5f6 !important; /* 悬停时变为蓝色 */
+ text-decoration: none;
+}
+
+.footer-section p {
+ font-size: 16px;
+ line-height: 1.6;
+ color: #b3b3b3;
+}
+
+.footer-section ul {
+ list-style: none;
+ padding: 0;
+}
+
+.footer-section li {
+ margin-bottom: 10px;
+}
+
+.footer-section a {
+ color: #b3b3b3;
+ text-decoration: none;
+ transition: color 0.3s;
+}
+
+.footer-section a:hover {
+ color: #ffffff;
+}
+
+.footer-bottom {
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
+ padding-top: 30px;
+ text-align: center;
+}
+
+.footer-bottom p {
+ margin: 5px 0;
+ font-size: 14px;
+ color: #b3b3b3;
+}
+
+.footer-bottom a {
+ color: #64b5f6;
+ text-decoration: none;
+}
+
+.footer-bottom a:hover {
+ text-decoration: underline;
+}
+
+@media (max-width: 768px) {
+ .footer-content {
+ grid-template-columns: 1fr;
+ gap: 30px;
+ }
+}
\ No newline at end of file
diff --git a/script-hook-website/src/components/Footer.tsx b/script-hook-website/src/components/Footer.tsx
new file mode 100644
index 0000000..2b92343
--- /dev/null
+++ b/script-hook-website/src/components/Footer.tsx
@@ -0,0 +1,48 @@
+import React from 'react';
+import { useTranslation } from 'react-i18next';
+import './Footer.css';
+
+const Footer: React.FC = () => {
+ const { t } = useTranslation();
+ const currentYear = new Date().getFullYear();
+
+ return (
+
+
+
+
+
+
{t('footer.description')}
+
+
+
+
{t('footer.links.title')}
+
+
+
+
+
{t('footer.resources.title')}
+
+
+
+
+
+
© {currentYear} JS Script Hook . {t('footer.copyright')}
+
{t('footer.developedBy')} JSREI {t('footer.team')}
+
+
+
+ );
+};
+
+export default Footer;
\ No newline at end of file
diff --git a/script-hook-website/src/components/GitHubStarButton.css b/script-hook-website/src/components/GitHubStarButton.css
new file mode 100644
index 0000000..9b29323
--- /dev/null
+++ b/script-hook-website/src/components/GitHubStarButton.css
@@ -0,0 +1,34 @@
+.github-corner {
+ position: fixed;
+ top: 0;
+ right: 0;
+ width: 80px;
+ height: 80px;
+ z-index: 9999;
+ cursor: pointer;
+}
+
+.github-corner:hover .octo-arm {
+ animation: octocat-wave 560ms ease-in-out;
+}
+
+@keyframes octocat-wave {
+ 0%, 100% {
+ transform: rotate(0);
+ }
+ 20%, 60% {
+ transform: rotate(-25deg);
+ }
+ 40%, 80% {
+ transform: rotate(10deg);
+ }
+}
+
+@media (max-width: 500px) {
+ .github-corner:hover .octo-arm {
+ animation: none;
+ }
+ .github-corner .octo-arm {
+ animation: octocat-wave 560ms ease-in-out;
+ }
+}
\ No newline at end of file
diff --git a/script-hook-website/src/components/GitHubStarButton.tsx b/script-hook-website/src/components/GitHubStarButton.tsx
new file mode 100644
index 0000000..8adca15
--- /dev/null
+++ b/script-hook-website/src/components/GitHubStarButton.tsx
@@ -0,0 +1,31 @@
+import React from 'react';
+import { useTranslation } from 'react-i18next';
+import './GitHubStarButton.css';
+
+const GitHubStarButton: React.FC = () => {
+ const { t } = useTranslation();
+
+ return (
+
+
+
+
+
+
+
+ );
+};
+
+export default GitHubStarButton;
\ No newline at end of file
diff --git a/script-hook-website/src/components/Header.css b/script-hook-website/src/components/Header.css
new file mode 100644
index 0000000..a74722c
--- /dev/null
+++ b/script-hook-website/src/components/Header.css
@@ -0,0 +1,336 @@
+.header {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ background-color: #ffffff;
+ padding: 8px 0;
+ height: 60px;
+ display: flex;
+ align-items: center;
+ transition: all 0.3s ease;
+ z-index: 1000;
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
+}
+
+.header.scrolled {
+ padding: 5px 0;
+ height: 50px;
+}
+
+.header-container {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 0 15px;
+ height: 100%;
+ position: relative;
+ width: 100%;
+}
+
+.logo {
+ flex: 0 0 auto;
+ margin-right: 20px;
+}
+
+.logo a {
+ display: flex;
+ align-items: center;
+}
+
+.site-logo {
+ height: 36px;
+ margin-right: 8px;
+ transition: all 0.3s ease;
+ background-color: transparent;
+ mix-blend-mode: multiply;
+}
+
+.header.scrolled .site-logo {
+ height: 30px;
+}
+
+.site-name {
+ font-size: 24px;
+ font-weight: 700;
+ transition: all 0.3s ease;
+}
+
+.header.scrolled .site-name {
+ font-size: 20px;
+}
+
+.main-nav {
+ display: flex;
+ align-items: center;
+ flex: 1;
+ justify-content: space-between;
+}
+
+.main-nav ul {
+ display: flex;
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ gap: 20px;
+ align-items: center;
+ justify-content: flex-start;
+}
+
+.main-nav a {
+ font-size: 16px;
+ font-weight: 500;
+ position: relative;
+ padding-bottom: 5px;
+ color: #333;
+ text-decoration: none;
+ transition: color 0.3s;
+ line-height: 1;
+ display: inline-block;
+ vertical-align: middle;
+}
+
+.main-nav a:after {
+ content: "";
+ position: absolute;
+ bottom: -4px;
+ left: 0;
+ width: 0;
+ height: 2px;
+ background-color: #1976d2;
+ transition: width 0.3s;
+}
+
+.main-nav a:hover:after, .main-nav a.active:after {
+ width: 100%;
+}
+
+.main-nav a.active {
+ color: #1976d2;
+ font-weight: 600;
+}
+
+/* 确保语言切换器在导航栏中正确显示 */
+.main-nav .language-switcher {
+ display: flex;
+ margin-left: 20px;
+}
+
+.mobile-menu-button {
+ display: none;
+ flex-direction: column;
+ justify-content: space-between;
+ width: 30px;
+ height: 21px;
+ cursor: pointer;
+}
+
+.mobile-menu-button div {
+ width: 100%;
+ height: 3px;
+ background-color: #1976d2;
+ border-radius: 3px;
+ transition: all 0.3s;
+}
+
+@media (max-width: 768px) {
+ .header-container {
+ justify-content: space-between;
+ padding-right: 15px;
+ }
+
+ .site-logo {
+ height: 28px;
+ }
+
+ .site-name {
+ font-size: 20px;
+ }
+
+ .mobile-menu-button {
+ display: flex;
+ margin-left: 0;
+ order: 2;
+ }
+
+ .logo {
+ order: 1;
+ }
+
+ .main-nav {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ right: 0;
+ background-color: #ffffff;
+ box-shadow: 0 5px 10px rgba(0, 0, 0, 0.1);
+ max-height: 0;
+ overflow: hidden;
+ transition: max-height 0.3s ease;
+ width: 100%;
+ padding-left: 0;
+ order: 3;
+ flex-direction: column;
+ align-items: flex-start;
+ }
+
+ .main-nav.open {
+ max-height: 350px; /* 增加高度以适应语言切换器 */
+ padding-bottom: 10px;
+ }
+
+ .main-nav ul {
+ flex-direction: column;
+ padding: 20px 20px 10px;
+ gap: 15px;
+ width: 100%;
+ }
+
+ /* 移动端下的语言切换器样式 */
+ .language-switcher {
+ width: calc(100% - 40px);
+ margin: 0 20px 10px;
+ justify-content: flex-start;
+ }
+
+ .language-button {
+ width: 100%;
+ max-width: 200px;
+ justify-content: space-between;
+ background-color: rgba(25, 118, 210, 0.15);
+ }
+
+ .language-dropdown {
+ width: 100%;
+ max-width: 200px;
+ position: relative;
+ margin-top: 5px;
+ }
+
+ /* 移动端菜单按钮交互效果 */
+ .mobile-menu-button.active div:first-child {
+ transform: translateY(9px) rotate(45deg);
+ }
+
+ .mobile-menu-button.active div:nth-child(2) {
+ opacity: 0;
+ }
+
+ .mobile-menu-button.active div:last-child {
+ transform: translateY(-9px) rotate(-45deg);
+ }
+}
+
+/* 透明背景类 */
+.transparent-bg {
+ background-color: transparent !important;
+ filter: drop-shadow(0 0 0 transparent);
+}
+
+/* 以下几个样式不再需要,因为导航栏始终为白色背景 */
+/* 在深色背景上保持logo文字可见 */
+.header:not(.scrolled) .site-name {
+ color: #1976d2; /* 统一使用默认的品牌色 */
+}
+
+/* 在深色背景上适应导航链接 */
+.header:not(.scrolled) .main-nav a {
+ color: #333; /* 使用适合白色背景的深色文本 */
+}
+
+/* 语言切换器样式 - 增强可见性 */
+.language-switcher {
+ position: relative;
+ display: flex;
+ margin-left: 20px;
+ z-index: 1001; /* 确保dropdown在其他元素之上 */
+}
+
+.language-button {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ background-color: rgba(25, 118, 210, 0.1);
+ border: 1px solid rgba(25, 118, 210, 0.3);
+ border-radius: 4px;
+ padding: 8px 12px;
+ cursor: pointer;
+ color: #1976d2;
+ font-size: 14px;
+ transition: all 0.2s ease;
+ min-width: 90px;
+}
+
+.language-button:hover {
+ background-color: rgba(25, 118, 210, 0.2);
+}
+
+.current-language {
+ margin-right: 8px;
+ font-weight: 500;
+}
+
+.arrow-down {
+ font-size: 10px;
+ transition: transform 0.2s ease;
+}
+
+.arrow-down.open {
+ transform: rotate(180deg);
+}
+
+.language-dropdown {
+ position: absolute;
+ top: calc(100% + 5px);
+ right: 0;
+ background-color: #fff;
+ border-radius: 4px;
+ box-shadow: 0 3px 10px rgba(0, 0, 0, 0.2);
+ overflow: hidden;
+ min-width: 120px;
+}
+
+.language-option {
+ display: block;
+ width: 100%;
+ padding: 8px 12px;
+ text-align: left;
+ background: none;
+ border: none;
+ cursor: pointer;
+ color: #333;
+ transition: background-color 0.2s;
+}
+
+.language-option:hover:not(:disabled) {
+ background-color: #f5f5f5;
+}
+
+.language-option.active {
+ background-color: #f0f0f0;
+ font-weight: 500;
+ cursor: default;
+}
+
+@media (max-width: 768px) {
+ /* ... existing mobile styles ... */
+
+ .language-switcher {
+ margin: 15px auto 5px;
+ width: 100%;
+ max-width: 200px;
+ justify-content: center;
+ }
+
+ .language-button {
+ width: 100%;
+ justify-content: center;
+ background-color: rgba(25, 118, 210, 0.15);
+ }
+
+ .language-dropdown {
+ width: 100%;
+ position: static;
+ margin-top: 5px;
+ }
+}
\ No newline at end of file
diff --git a/script-hook-website/src/components/Header.tsx b/script-hook-website/src/components/Header.tsx
new file mode 100644
index 0000000..a38e11d
--- /dev/null
+++ b/script-hook-website/src/components/Header.tsx
@@ -0,0 +1,144 @@
+import React, { useState, useEffect } from 'react';
+import { useTranslation } from 'react-i18next';
+import './Header.css';
+
+const Header: React.FC = () => {
+ const { t, i18n } = useTranslation();
+ const [isScrolled, setIsScrolled] = useState(false);
+ const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);
+ const [activeSection, setActiveSection] = useState('');
+ const [currentLang, setCurrentLang] = useState(i18n.language.split('-')[0]);
+ const [isLangMenuOpen, setIsLangMenuOpen] = useState(false);
+
+ // 支持的语言
+ const languages = [
+ { code: 'zh', name: '简体中文' },
+ { code: 'en', name: 'English' }
+ ];
+
+ // 切换语言函数
+ const handleLanguageChange = (langCode: string) => {
+ console.log("切换语言到:", langCode);
+ i18n.changeLanguage(langCode).then(() => {
+ setCurrentLang(langCode);
+ setIsLangMenuOpen(false);
+
+ // 更新HTML标签
+ document.documentElement.setAttribute('lang', langCode);
+
+ // 更新meta标签
+ document.title = t('html.title');
+ const metaDesc = document.getElementById('meta-description');
+ if (metaDesc) {
+ metaDesc.setAttribute('content', t('html.description'));
+ }
+
+ // 更新社交媒体元数据
+ const updateMetaTag = (id: string, attr: string, value: string) => {
+ const tag = document.getElementById(id);
+ if (tag) tag.setAttribute(attr, value);
+ };
+
+ updateMetaTag('og-title', 'content', t('html.title'));
+ updateMetaTag('og-description', 'content', t('html.description'));
+ updateMetaTag('twitter-title', 'content', t('html.title'));
+ updateMetaTag('twitter-description', 'content', t('html.description'));
+
+ // 存储用户语言选择
+ localStorage.setItem('language', langCode);
+ });
+ };
+
+ useEffect(() => {
+ const handleScroll = () => {
+ setIsScrolled(window.scrollY > 50);
+
+ // 计算当前活跃部分
+ const sections = [
+ 'features',
+ 'installation',
+ 'support',
+ 'community'
+ ];
+
+ // 找到视口中可见的部分
+ const current = sections.find(section => {
+ const element = document.getElementById(section);
+ if (element) {
+ const rect = element.getBoundingClientRect();
+ // 当元素上边缘在视口的上半部分时设为活跃
+ return rect.top <= 150 && rect.bottom >= 0;
+ }
+ return false;
+ });
+
+ if (current) {
+ setActiveSection(current);
+ }
+ };
+
+ window.addEventListener('scroll', handleScroll);
+ handleScroll(); // 初始检查
+ return () => window.removeEventListener('scroll', handleScroll);
+ }, []);
+
+ return (
+
+
+
+
+
setIsMobileMenuOpen(!isMobileMenuOpen)}>
+
+
+
+
+
+
+
+
+ {/* 直接在这里实现语言切换器,确保它显示 */}
+
+
setIsLangMenuOpen(!isLangMenuOpen)}
+ aria-label={t('language.switchLanguage')}
+ aria-expanded={isLangMenuOpen}
+ >
+
+ {currentLang === 'zh' ? '中文' : 'English'}
+
+ ▼
+
+
+ {isLangMenuOpen && (
+
+ {languages.map(lang => (
+ handleLanguageChange(lang.code)}
+ aria-selected={currentLang === lang.code}
+ role="menuitem"
+ >
+ {lang.name}
+
+ ))}
+
+ )}
+
+
+
+
+ );
+};
+
+export default Header;
\ No newline at end of file
diff --git a/script-hook-website/src/components/Hero.css b/script-hook-website/src/components/Hero.css
new file mode 100644
index 0000000..c5ad9bf
--- /dev/null
+++ b/script-hook-website/src/components/Hero.css
@@ -0,0 +1,172 @@
+.hero {
+ padding-top: 150px;
+ padding-bottom: 80px;
+ margin-top: 0;
+ background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
+ position: relative;
+ overflow: hidden;
+ box-sizing: border-box;
+}
+
+.hero .container {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 40px;
+ position: relative;
+}
+
+.hero-content {
+ max-width: 500px;
+ position: relative;
+ z-index: 5;
+ padding-top: 30px;
+}
+
+h1 {
+ font-size: 48px;
+ font-weight: 700;
+ margin-bottom: 20px;
+ color: #2c3e50;
+}
+
+.subtitle {
+ font-size: 24px;
+ font-weight: 600;
+ color: #1976d2;
+ margin-bottom: 20px;
+}
+
+/* 徽章样式 */
+.hero-badges {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ margin-bottom: 20px;
+}
+
+.hero-badges img {
+ height: 20px;
+ transition: transform 0.3s ease;
+}
+
+.hero-badges img:hover {
+ transform: translateY(-2px);
+}
+
+.description {
+ font-size: 18px;
+ line-height: 1.6;
+ margin-bottom: 30px;
+ color: #546e7a;
+}
+
+.hero-buttons {
+ display: flex;
+ gap: 16px;
+ flex-wrap: wrap;
+}
+
+.btn {
+ display: inline-block;
+ padding: 12px 24px;
+ font-size: 16px;
+ font-weight: 500;
+ text-align: center;
+ border-radius: 4px;
+ transition: all 0.3s;
+}
+
+.btn-primary {
+ background-color: #1976d2;
+ color: white;
+}
+
+.btn-primary:hover {
+ background-color: #0d47a1;
+ color: white;
+}
+
+.btn-secondary {
+ background-color: transparent;
+ border: 2px solid #1976d2;
+ color: #1976d2;
+}
+
+.btn-secondary:hover {
+ background-color: rgba(25, 118, 210, 0.1);
+}
+
+/* 视频按钮样式 */
+.btn-video {
+ display: inline-flex;
+ align-items: center;
+ background-color: #ff6b6b;
+ color: white;
+ border: none;
+ gap: 8px;
+}
+
+.btn-video:hover {
+ background-color: #e53e3e;
+ color: white;
+ transform: translateY(-2px);
+}
+
+.video-icon {
+ margin-right: 4px;
+}
+
+.hero-image {
+ flex: 1;
+ max-width: 600px;
+ position: relative;
+ z-index: 1;
+}
+
+@media (max-width: 992px) {
+ .hero {
+ padding-top: 130px;
+ padding-bottom: 60px;
+ margin-top: 0;
+ }
+
+ .hero .container {
+ flex-direction: column;
+ gap: 60px;
+ }
+
+ .hero-content {
+ max-width: 100%;
+ text-align: center;
+ z-index: 5;
+ }
+
+ .hero-buttons {
+ justify-content: center;
+ }
+
+ .hero-badges {
+ justify-content: center;
+ }
+
+ .hero-image {
+ margin-top: 20px;
+ max-width: 100%;
+ }
+}
+
+/* 针对特定尺寸屏幕的优化 */
+@media (min-width: 993px) and (max-width: 1200px) {
+ .hero .container {
+ gap: 30px;
+ }
+
+ .hero-content {
+ max-width: 45%;
+ }
+
+ .hero-image {
+ max-width: 50%;
+ }
+}
\ No newline at end of file
diff --git a/script-hook-website/src/components/Hero.tsx b/script-hook-website/src/components/Hero.tsx
new file mode 100644
index 0000000..2cd44da
--- /dev/null
+++ b/script-hook-website/src/components/Hero.tsx
@@ -0,0 +1,47 @@
+import React from 'react';
+import { useTranslation } from 'react-i18next';
+import './Hero.css';
+import Monitor from './Monitor';
+
+const Hero: React.FC = () => {
+ const { t } = useTranslation();
+
+ return (
+
+
+
+
JS Script Hook
+
{t('hero.subtitle')}
+
+
+ {t('hero.description')}
+
+
+
+
+
+
+
+
+ );
+};
+
+export default Hero;
\ No newline at end of file
diff --git a/script-hook-website/src/components/Installation.css b/script-hook-website/src/components/Installation.css
new file mode 100644
index 0000000..3342808
--- /dev/null
+++ b/script-hook-website/src/components/Installation.css
@@ -0,0 +1,266 @@
+.installation {
+ padding: 80px 0;
+ background-color: #f5f5f5;
+}
+
+/* 主安装方式切换标签 */
+.installation-method-tabs {
+ display: flex;
+ justify-content: center;
+ margin: 40px 0 30px;
+ gap: 15px;
+}
+
+.installation-method-tabs button {
+ background-color: transparent;
+ border: none;
+ padding: 12px 24px;
+ font-size: 18px;
+ font-weight: 500;
+ cursor: pointer;
+ border-radius: 5px;
+ transition: all 0.3s;
+ color: #546e7a;
+ position: relative;
+}
+
+.installation-method-tabs button.active {
+ background-color: #1976d2;
+ color: white;
+}
+
+.installation-method-tabs button.active::after {
+ content: '';
+ position: absolute;
+ bottom: -8px;
+ left: 50%;
+ transform: translateX(-50%);
+ width: 0;
+ height: 0;
+ border-left: 8px solid transparent;
+ border-right: 8px solid transparent;
+ border-top: 8px solid #1976d2;
+}
+
+/* 源码安装包管理器标签 */
+.source-tabs {
+ display: flex;
+ justify-content: center;
+ margin-bottom: 25px;
+ gap: 10px;
+}
+
+.source-tabs button {
+ background-color: transparent;
+ border: none;
+ padding: 8px 16px;
+ font-size: 16px;
+ font-weight: 500;
+ cursor: pointer;
+ border-radius: 4px;
+ transition: all 0.3s;
+ color: #546e7a;
+}
+
+.source-tabs button.active {
+ background-color: #1976d2;
+ color: white;
+}
+
+/* 代码块容器样式 */
+.code-block-container {
+ position: relative;
+ margin-bottom: 25px;
+ border-radius: 8px;
+ overflow: visible;
+ width: 100%;
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
+ border: 1px solid rgba(0, 0, 0, 0.1);
+ background-color: #1e1e1e !important;
+}
+
+.code-block-container pre {
+ margin: 0 !important;
+ border-radius: 6px !important;
+ overflow-x: auto !important;
+ min-height: 50px !important;
+ max-height: 300px !important;
+ background-color: #1e1e1e !important;
+}
+
+.code-block-container code {
+ font-family: 'Consolas', 'Courier New', monospace !important;
+ font-size: 14px !important;
+ line-height: 1.5 !important;
+ width: 100%;
+ white-space: pre !important;
+}
+
+.code-block-container code span {
+ display: inline-block !important;
+}
+
+/* 复制按钮样式 */
+.copy-btn {
+ position: absolute;
+ top: 8px;
+ right: 8px;
+ background-color: rgba(45, 45, 45, 0.9) !important;
+ color: white;
+ border: 1px solid rgba(255, 255, 255, 0.3);
+ padding: 6px 12px;
+ border-radius: 4px;
+ font-size: 14px;
+ font-weight: 500;
+ cursor: pointer;
+ transition: all 0.2s;
+ z-index: 100;
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
+ opacity: 0.9;
+ visibility: visible;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ min-width: 80px;
+}
+
+/* 成功复制状态 */
+.copy-btn:has(path[d="M20 6L9 17l-5-5"]) {
+ background-color: #28a745 !important;
+ border-color: #28a745;
+}
+
+.copy-btn:hover {
+ background-color: rgba(50, 50, 50, 1) !important;
+ transform: translateY(-1px);
+ box-shadow: 0 3px 8px rgba(0, 0, 0, 0.3);
+ opacity: 1;
+}
+
+.copy-btn:active {
+ transform: translateY(0);
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
+}
+
+/* 确保代码不会被复制按钮遮挡 */
+.code-block-container pre > code {
+ padding-right: 90px !important;
+ display: inline-block;
+ min-width: 100%;
+ box-sizing: border-box;
+}
+
+/* 安装步骤样式 */
+.installation-steps {
+ max-width: 800px;
+ margin: 0 auto;
+ background-color: white;
+ border-radius: 10px;
+ padding: 30px;
+ box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05);
+}
+
+.installation-steps h3 {
+ font-size: 20px;
+ margin-bottom: 15px;
+ color: #2c3e50;
+ font-weight: 600;
+}
+
+.installation-steps p {
+ margin-bottom: 20px;
+ line-height: 1.6;
+ color: #555;
+}
+
+.installation-steps ul,
+.installation-steps ol {
+ margin-bottom: 25px;
+ padding-left: 25px;
+}
+
+.installation-steps li {
+ margin-bottom: 8px;
+ line-height: 1.6;
+}
+
+/* 安装按钮样式 */
+.install-button {
+ display: inline-flex;
+ align-items: center;
+ background-color: #4caf50;
+ color: white;
+ text-decoration: none;
+ padding: 12px 24px;
+ border-radius: 30px;
+ font-weight: 500;
+ margin: 20px 0;
+ transition: all 0.3s;
+}
+
+.install-button:hover {
+ background-color: #388e3c;
+ transform: translateY(-2px);
+ box-shadow: 0 5px 15px rgba(76, 175, 80, 0.3);
+}
+
+.install-button svg {
+ margin-right: 10px;
+}
+
+/* 注意事项样式 */
+.note-box {
+ background-color: #fff8e1;
+ border-left: 4px solid #ffb300;
+ padding: 15px 20px;
+ margin: 20px 0;
+ border-radius: 4px;
+}
+
+.note-box h4 {
+ color: #f57c00;
+ margin-bottom: 10px;
+ font-size: 16px;
+}
+
+.note-box ul {
+ margin-bottom: 0;
+}
+
+.note-box code {
+ background-color: rgba(0, 0, 0, 0.05);
+ padding: 2px 6px;
+ border-radius: 3px;
+ font-family: 'Fira Code', monospace;
+}
+
+/* 响应式样式 */
+@media (max-width: 768px) {
+ .installation-method-tabs {
+ flex-direction: column;
+ gap: 10px;
+ align-items: center;
+ }
+
+ .installation-method-tabs button {
+ width: 80%;
+ max-width: 300px;
+ }
+
+ .installation-method-tabs button.active::after {
+ display: none;
+ }
+
+ .installation-steps {
+ padding: 20px;
+ }
+}
+
+/* 强制应用深色背景 */
+.code-block-container pre,
+.code-block-container code,
+.code-block-container pre > code,
+.code-block-container .prism-code,
+.react-syntax-highlighter-line-number {
+ background-color: #1e1e1e !important;
+}
\ No newline at end of file
diff --git a/script-hook-website/src/components/Installation.tsx b/script-hook-website/src/components/Installation.tsx
new file mode 100644
index 0000000..1b5156f
--- /dev/null
+++ b/script-hook-website/src/components/Installation.tsx
@@ -0,0 +1,377 @@
+import React, { useState } from 'react';
+import { useTranslation } from 'react-i18next';
+import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';
+import { vscDarkPlus } from 'react-syntax-highlighter/dist/esm/styles/prism';
+import './Installation.css';
+
+const Installation: React.FC = () => {
+ const { t } = useTranslation();
+ // 主安装方式切换(油猴安装 vs 源码编译安装)
+ const [installMethod, setInstallMethod] = useState<'userscript' | 'source'>('userscript');
+
+ // 源码编译的包管理器选择
+ const [packageManager, setPackageManager] = useState<'npm' | 'yarn'>('npm');
+
+ // 复制成功提示状态
+ const [copySuccess, setCopySuccess] = useState(null);
+
+ const handleCopy = (text: string, index: number) => {
+ navigator.clipboard.writeText(text);
+ setCopySuccess(index);
+ setTimeout(() => setCopySuccess(null), 2000);
+ };
+
+ const installationGuide = {
+ npm: {
+ command: 'npm install js-script-hook',
+ usage: `
+// 直接引入脚本即可自动开始工作
+// JS Script Hook会自动拦截document.createElement
+// 并为创建的script元素添加钩子
+
+// 可以通过配置控制行为
+import { getGlobalConfig } from 'js-script-hook';
+
+// 添加调试规则
+getGlobalConfig().debugRules.push({
+ // 匹配URL
+ urlPattern: "api.example.com/data",
+ // JSONP回调参数名
+ callbackFunctionName: "callback",
+ // 响应匹配规则(可选)
+ responsePattern: /\"id\"\\s*:\\s*\"123\"/
+});
+
+// 设置钩子实现方式
+getGlobalConfig().hookType = "use-proxy-function"; // 或 "use-redeclare-function"`
+ },
+ yarn: {
+ command: 'yarn add js-script-hook',
+ usage: `
+// 直接引入脚本即可自动开始工作
+// JS Script Hook会自动拦截document.createElement
+// 并为创建的script元素添加钩子
+
+// 可以通过配置控制行为
+import { getGlobalConfig } from 'js-script-hook';
+
+// 添加调试规则
+getGlobalConfig().debugRules.push({
+ // 匹配URL
+ urlPattern: "api.example.com/data",
+ // JSONP回调参数名
+ callbackFunctionName: "callback",
+ // 响应匹配规则(可选)
+ responsePattern: /\"id\"\\s*:\\s*\"123\"/
+});
+
+// 设置钩子实现方式
+getGlobalConfig().hookType = "use-proxy-function"; // 或 "use-redeclare-function"`
+ },
+ cdn: {
+ command: '',
+ usage: `
+`
+ }
+ };
+
+ return (
+
+
+
+
{t('installation.title')}
+
{t('installation.description')}
+
+
+ {/* 主安装方式选择 */}
+
+ setInstallMethod('userscript')}
+ >
+ {t('installation.methods.userscript')}
+
+ setInstallMethod('source')}
+ >
+ {t('installation.methods.source')}
+
+
+
+ {/* 油猴脚本安装方式 */}
+ {installMethod === 'userscript' && (
+
+
+
{t('installation.userscript.step1.title')}
+
{t('installation.userscript.step1.description')}
+
+
+
{t('installation.userscript.step2.title')}
+
{t('installation.userscript.step2.description')}
+
+
+
+
+
+
+
+ {t('installation.userscript.step2.button')}
+
+
+
+
{t('installation.userscript.notes.title')}
+
+ {(t('installation.userscript.notes.items', { returnObjects: true }) as string[]).map((note: string, index: number) => (
+ {note}
+ ))}
+
+
+
+
+ )}
+
+ {/* 源码编译安装方式 */}
+ {installMethod === 'source' && (
+
+
+ setPackageManager('npm')}
+ >
+ {t('installation.source.tabs.npm')}
+
+ setPackageManager('yarn')}
+ >
+ {t('installation.source.tabs.yarn')}
+
+
+
+
+
{t('installation.source.step1.title')}
+
+
+ {t('installation.source.step1.command')}
+
+
handleCopy(t('installation.source.step1.command'), 1)}
+ >
+ {copySuccess === 1 ? (
+ <>
+
+
+
+ {t('installation.source.copied')}
+ >
+ ) : (
+ <>
+
+
+
+
+ {t('installation.source.copy')}
+ >
+ )}
+
+
+
+
{t('installation.source.step2.title')}
+
+
+ {t('installation.source.step2.command')}
+
+
handleCopy(t('installation.source.step2.command'), 2)}
+ >
+ {copySuccess === 2 ? (
+ <>
+
+
+
+ {t('installation.source.copied')}
+ >
+ ) : (
+ <>
+
+
+
+
+ {t('installation.source.copy')}
+ >
+ )}
+
+
+
+
{t('installation.source.step3.title')}
+
+
+ {packageManager === 'npm'
+ ? t('installation.source.step3.npmCommand')
+ : t('installation.source.step3.yarnCommand')
+ }
+
+
handleCopy(
+ packageManager === 'npm'
+ ? t('installation.source.step3.npmCommand')
+ : t('installation.source.step3.yarnCommand'),
+ 3
+ )}
+ >
+ {copySuccess === 3 ? (
+ <>
+
+
+
+ {t('installation.source.copied')}
+ >
+ ) : (
+ <>
+
+
+
+
+ {t('installation.source.copy')}
+ >
+ )}
+
+
+
+
{t('installation.source.usage.title')}
+
{t('installation.source.usage.description')}
+
+
+
+ {installationGuide[packageManager].usage}
+
+
handleCopy(installationGuide[packageManager].usage, 4)}
+ >
+ {copySuccess === 4 ? (
+ <>
+
+
+
+ {t('installation.source.copied')}
+ >
+ ) : (
+ <>
+
+
+
+
+ {t('installation.source.copy')}
+ >
+ )}
+
+
+
+
+ )}
+
+
+ );
+};
+
+export default Installation;
\ No newline at end of file
diff --git a/script-hook-website/src/components/LanguageSwitcher.css b/script-hook-website/src/components/LanguageSwitcher.css
new file mode 100644
index 0000000..926589e
--- /dev/null
+++ b/script-hook-website/src/components/LanguageSwitcher.css
@@ -0,0 +1,139 @@
+.language-switcher {
+ position: relative;
+ display: inline-block;
+ margin-left: 20px;
+ transition: opacity 0.3s ease;
+}
+
+/* 切换语言时的视觉反馈 */
+.language-switcher.switching {
+ opacity: 0.7;
+ pointer-events: none;
+}
+
+.language-button {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ background-color: transparent;
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ border-radius: 4px;
+ padding: 6px 12px;
+ cursor: pointer;
+ color: #fff;
+ font-size: 14px;
+ transition: all 0.2s ease;
+ min-width: 110px;
+}
+
+.language-button:hover {
+ background-color: rgba(255, 255, 255, 0.1);
+ border-color: rgba(255, 255, 255, 0.3);
+}
+
+.language-button:disabled {
+ opacity: 0.6;
+ cursor: not-allowed;
+}
+
+.current-language {
+ margin-right: 8px;
+ font-weight: 500;
+}
+
+.arrow-down {
+ font-size: 10px;
+ transition: transform 0.2s ease;
+}
+
+/* 箭头动画 */
+.arrow-down.open {
+ transform: rotate(180deg);
+}
+
+.language-dropdown {
+ position: absolute;
+ top: calc(100% + 4px);
+ right: 0;
+ background-color: #fff;
+ border-radius: 4px;
+ box-shadow: 0 3px 10px rgba(0, 0, 0, 0.2);
+ width: 100%;
+ overflow: hidden;
+ z-index: 1000;
+ animation: fadeIn 0.2s ease;
+}
+
+/* 淡入动画 */
+@keyframes fadeIn {
+ from {
+ opacity: 0;
+ transform: translateY(-10px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.language-option {
+ display: block;
+ width: 100%;
+ padding: 8px 12px;
+ text-align: left;
+ background: none;
+ border: none;
+ cursor: pointer;
+ color: #333;
+ transition: background-color 0.2s;
+}
+
+.language-option:hover:not(:disabled) {
+ background-color: #f5f5f5;
+}
+
+.language-option:disabled {
+ cursor: not-allowed;
+ opacity: 0.6;
+}
+
+.language-option.active {
+ background-color: #f0f0f0;
+ font-weight: 500;
+ cursor: default;
+}
+
+/* 响应式调整 */
+@media (max-width: 768px) {
+ .language-switcher {
+ margin-left: 0;
+ margin-top: 15px;
+ width: 100%;
+ }
+
+ .language-button {
+ width: 100%;
+ justify-content: center;
+ }
+
+ .language-dropdown {
+ position: static;
+ margin-top: 5px;
+ box-shadow: none;
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ background-color: rgba(0, 0, 0, 0.2);
+ }
+
+ .language-option {
+ color: #fff;
+ text-align: center;
+ }
+
+ .language-option:hover {
+ background-color: rgba(255, 255, 255, 0.1);
+ }
+
+ .language-option.active {
+ background-color: rgba(255, 255, 255, 0.15);
+ }
+}
\ No newline at end of file
diff --git a/script-hook-website/src/components/LanguageSwitcher.tsx b/script-hook-website/src/components/LanguageSwitcher.tsx
new file mode 100644
index 0000000..1ff0a98
--- /dev/null
+++ b/script-hook-website/src/components/LanguageSwitcher.tsx
@@ -0,0 +1,77 @@
+import React, { useState, useEffect, useRef } from 'react';
+import { useTranslation } from 'react-i18next';
+import { useI18n } from '../context/I18nContext';
+import './LanguageSwitcher.css';
+
+// 语言切换器组件
+const LanguageSwitcher: React.FC = () => {
+ const { t } = useTranslation();
+ const { currentLanguage, supportedLanguages, changeLanguage, isSwitching } = useI18n();
+ const [isOpen, setIsOpen] = useState(false);
+ const dropdownRef = useRef(null);
+
+ // 关闭下拉菜单的点击外部事件处理
+ useEffect(() => {
+ const handleClickOutside = (event: MouseEvent) => {
+ if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {
+ setIsOpen(false);
+ }
+ };
+
+ document.addEventListener('mousedown', handleClickOutside);
+ return () => {
+ document.removeEventListener('mousedown', handleClickOutside);
+ };
+ }, []);
+
+ // 处理语言切换
+ const handleLanguageChange = (lang: string) => {
+ if (lang === currentLanguage || isSwitching) {
+ setIsOpen(false);
+ return;
+ }
+
+ changeLanguage(lang).then(() => {
+ setIsOpen(false);
+ });
+ };
+
+ // 添加调试信息
+ console.log('Language switcher rendering', { currentLanguage, supportedLanguages });
+
+ return (
+
+
setIsOpen(!isOpen)}
+ aria-label={t('language.switchLanguage')}
+ aria-expanded={isOpen}
+ disabled={isSwitching}
+ >
+
+ {currentLanguage === 'zh' ? '中文' : 'English'}
+
+ ▼
+
+
+ {isOpen && (
+
+ {supportedLanguages.map(lang => (
+ handleLanguageChange(lang.code)}
+ disabled={isSwitching || currentLanguage === lang.code}
+ aria-selected={currentLanguage === lang.code}
+ role="menuitem"
+ >
+ {lang.name}
+
+ ))}
+
+ )}
+
+ );
+};
+
+export default LanguageSwitcher;
\ No newline at end of file
diff --git a/script-hook-website/src/components/LocalizedDate.tsx b/script-hook-website/src/components/LocalizedDate.tsx
new file mode 100644
index 0000000..d8c9eb9
--- /dev/null
+++ b/script-hook-website/src/components/LocalizedDate.tsx
@@ -0,0 +1,56 @@
+import React from 'react';
+import { useTranslation } from 'react-i18next';
+import { formatDate, getRelativeTime } from '../utils/dateUtils';
+
+interface LocalizedDateProps {
+ date: Date | string | number;
+ format?: 'full' | 'short' | 'relative';
+ className?: string;
+ showTime?: boolean;
+}
+
+/**
+ * 本地化日期组件
+ * 支持完整日期、短日期和相对时间显示
+ */
+const LocalizedDate: React.FC = ({
+ date,
+ format = 'full',
+ className,
+ showTime = false
+}) => {
+ const { i18n } = useTranslation();
+ const locale = i18n.language === 'zh' ? 'zh-CN' : 'en-US';
+
+ let formattedDate: string;
+
+ try {
+ const dateObj = new Date(date);
+
+ if (format === 'relative') {
+ formattedDate = getRelativeTime(dateObj);
+ } else {
+ // 选择日期格式化选项
+ const options: Intl.DateTimeFormatOptions = {
+ year: 'numeric',
+ month: format === 'full' ? 'long' : 'short',
+ day: 'numeric'
+ };
+
+ // 如果需要显示时间
+ if (showTime) {
+ options.hour = '2-digit';
+ options.minute = '2-digit';
+ }
+
+ formattedDate = new Intl.DateTimeFormat(locale, options).format(dateObj);
+ }
+ } catch (error) {
+ console.error('Date formatting error:', error);
+ formattedDate = new Date(date).toLocaleString();
+ }
+
+ return {formattedDate} ;
+};
+
+export default LocalizedDate;
\ No newline at end of file
diff --git a/script-hook-website/src/components/LocalizedLink.tsx b/script-hook-website/src/components/LocalizedLink.tsx
new file mode 100644
index 0000000..9873bd2
--- /dev/null
+++ b/script-hook-website/src/components/LocalizedLink.tsx
@@ -0,0 +1,50 @@
+import React from 'react';
+import { getLocalizedLink } from '../utils/urlUtils';
+
+interface LocalizedLinkProps {
+ linkKey: string;
+ children: React.ReactNode;
+ className?: string;
+ target?: string;
+ rel?: string;
+ title?: string;
+ onClick?: () => void;
+}
+
+/**
+ * 本地化链接组件
+ * 根据当前语言环境自动选择合适的链接URL
+ */
+const LocalizedLink: React.FC = ({
+ linkKey,
+ children,
+ className,
+ target = '_blank',
+ rel = 'noopener noreferrer',
+ title,
+ onClick
+}) => {
+ const url = getLocalizedLink(linkKey);
+
+ // 如果没有找到对应的链接,则返回一个span而不是a标签
+ if (!url) {
+ console.warn(`No URL found for key: ${linkKey}`);
+ return {children} ;
+ }
+
+ // 使用本地化链接创建a标签
+ return (
+
+ {children}
+
+ );
+};
+
+export default LocalizedLink;
\ No newline at end of file
diff --git a/script-hook-website/src/components/LocalizedNumber.tsx b/script-hook-website/src/components/LocalizedNumber.tsx
new file mode 100644
index 0000000..14a8d45
--- /dev/null
+++ b/script-hook-website/src/components/LocalizedNumber.tsx
@@ -0,0 +1,74 @@
+import React from 'react';
+import { useTranslation } from 'react-i18next';
+
+interface LocalizedNumberProps {
+ value: number;
+ type?: 'decimal' | 'percent' | 'currency' | 'compact';
+ currencyCode?: string;
+ minimumFractionDigits?: number;
+ maximumFractionDigits?: number;
+ className?: string;
+}
+
+/**
+ * 本地化数字组件
+ * 支持不同的数字格式化选项和本地化显示
+ */
+const LocalizedNumber: React.FC = ({
+ value,
+ type = 'decimal',
+ currencyCode = 'USD',
+ minimumFractionDigits = 0,
+ maximumFractionDigits = 2,
+ className
+}) => {
+ const { i18n } = useTranslation();
+ const locale = i18n.language === 'zh' ? 'zh-CN' : 'en-US';
+
+ let formattedValue: string;
+
+ try {
+ switch (type) {
+ case 'percent':
+ formattedValue = new Intl.NumberFormat(locale, {
+ style: 'percent',
+ minimumFractionDigits,
+ maximumFractionDigits
+ }).format(value);
+ break;
+
+ case 'currency':
+ formattedValue = new Intl.NumberFormat(locale, {
+ style: 'currency',
+ currency: currencyCode,
+ minimumFractionDigits,
+ maximumFractionDigits
+ }).format(value);
+ break;
+
+ case 'compact':
+ formattedValue = new Intl.NumberFormat(locale, {
+ notation: 'compact',
+ compactDisplay: 'short',
+ minimumFractionDigits,
+ maximumFractionDigits
+ }).format(value);
+ break;
+
+ case 'decimal':
+ default:
+ formattedValue = new Intl.NumberFormat(locale, {
+ minimumFractionDigits,
+ maximumFractionDigits
+ }).format(value);
+ break;
+ }
+ } catch (error) {
+ console.error('Number formatting error:', error);
+ formattedValue = value.toString();
+ }
+
+ return {formattedValue} ;
+};
+
+export default LocalizedNumber;
\ No newline at end of file
diff --git a/script-hook-website/src/components/LocalizedRichText.tsx b/script-hook-website/src/components/LocalizedRichText.tsx
new file mode 100644
index 0000000..2b7d67d
--- /dev/null
+++ b/script-hook-website/src/components/LocalizedRichText.tsx
@@ -0,0 +1,56 @@
+import React from 'react';
+import { useTranslation } from 'react-i18next';
+import DOMPurify from 'dompurify';
+
+interface LocalizedRichTextProps {
+ translationKey: string;
+ className?: string;
+ variables?: Record;
+ tagName?: keyof JSX.IntrinsicElements;
+}
+
+/**
+ * 本地化富文本组件
+ * 支持HTML内容的i18n翻译,同时确保安全性
+ */
+const LocalizedRichText: React.FC = ({
+ translationKey,
+ className,
+ variables = {},
+ tagName: TagName = 'div'
+}) => {
+ const { t } = useTranslation();
+
+ // 支持HTML内容的翻译并替换变量
+ let htmlContent = t(translationKey, variables);
+
+ // 使用DOMPurify清理HTML,防止XSS攻击
+ // 注意:DOMPurify需要安装: npm install dompurify @types/dompurify
+ const sanitizedHtml = DOMPurify.sanitize(htmlContent);
+
+ return (
+
+ );
+};
+
+export default LocalizedRichText;
+
+// 使用说明:
+// 1. 安装DOMPurify: npm install dompurify @types/dompurify
+// 2. 在翻译文件中,如zh.json中添加带HTML标签的内容:
+// "richText": {
+// "example": "这是一段富文本 内容,包含链接 和强调 "
+// }
+// 3. 在组件中使用:
+//
+//
+// 还可以传递变量:
+//
+//
+// 对应的翻译内容: "欢迎 {{name}} ,您有 {{count}} 条新消息"
\ No newline at end of file
diff --git a/script-hook-website/src/components/Monitor.css b/script-hook-website/src/components/Monitor.css
new file mode 100644
index 0000000..7f4079c
--- /dev/null
+++ b/script-hook-website/src/components/Monitor.css
@@ -0,0 +1,258 @@
+/* 显示器样式 */
+.monitor-wrapper {
+ position: relative;
+ max-width: 550px;
+ margin: 0 auto;
+ perspective: 1200px;
+}
+
+.simple-monitor {
+ position: relative;
+ transform: perspective(1000px) rotateY(-3deg);
+ transition: all 0.4s ease;
+ margin-bottom: 80px;
+}
+
+.simple-monitor:hover {
+ transform: perspective(1000px) rotateY(0);
+}
+
+/* 显示器框架 */
+.monitor-frame {
+ background-color: #25292e;
+ border-radius: 15px;
+ overflow: hidden;
+ box-shadow: 0 15px 35px rgba(0, 0, 0, 0.3);
+ border: 8px solid #333;
+ border-bottom-width: 24px;
+ position: relative;
+ padding: 0;
+ z-index: 2;
+}
+
+/* 屏幕 */
+.monitor-screen {
+ background-color: #000;
+ overflow: hidden;
+ border-radius: 6px;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ position: relative;
+ transition: background-color 0.3s ease;
+}
+
+/* 屏幕电源状态 */
+.monitor-screen.power-on {
+ background-color: #000; /* 开启状态下的背景色 */
+}
+
+.monitor-screen.power-off {
+ background-color: #000; /* 关闭状态下的背景色 - 纯黑 */
+}
+
+/* 关闭状态下的黑屏占位元素 */
+.black-screen {
+ display: block;
+ width: 100%;
+ background-color: #000;
+}
+
+/* 关闭效果的叠加层 */
+.power-off-overlay {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: radial-gradient(
+ ellipse at center,
+ rgba(30, 30, 30, 0.4) 0%,
+ rgba(10, 10, 10, 0.7) 60%,
+ rgba(0, 0, 0, 0.9) 100%
+ );
+ z-index: 10;
+ pointer-events: none;
+}
+
+/* 添加反光效果 */
+.power-off-overlay::after {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: linear-gradient(
+ 135deg,
+ rgba(255, 255, 255, 0.05) 0%,
+ rgba(255, 255, 255, 0) 50%,
+ rgba(0, 0, 0, 0.1) 100%
+ );
+ z-index: 11;
+}
+
+.demo-gif {
+ display: block;
+ width: 100%;
+ height: auto;
+ vertical-align: bottom;
+}
+
+/* 隐藏但不影响布局的元素 */
+.demo-gif.invisible {
+ opacity: 0;
+}
+
+/* 底部控制区域 */
+.monitor-controls {
+ position: relative;
+ width: 100%;
+ height: 0;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ z-index: 100;
+}
+
+/* 底座 */
+.monitor-stand {
+ position: absolute;
+ bottom: -60px;
+ left: 50%;
+ transform: translateX(-50%);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ width: 100%;
+ z-index: 1;
+}
+
+.stand-neck {
+ width: 50px;
+ height: 60px;
+ background-color: #555;
+ border-radius: 0 0 5px 5px;
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
+ margin-top: 3px;
+}
+
+.stand-base {
+ width: 200px;
+ height: 25px;
+ background-color: #444;
+ border-radius: 40% / 100%;
+ margin-top: -2px;
+ box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2);
+}
+
+/* 铭牌标识 */
+.brand-badge {
+ position: absolute;
+ bottom: 3px;
+ left: 50%;
+ transform: translateX(-50%);
+ padding: 3px 14px;
+ color: #b5a36a;
+ font-size: 8px;
+ font-weight: 500;
+ letter-spacing: 1.5px;
+ text-transform: uppercase;
+ font-family: Arial, sans-serif;
+ text-align: center;
+ white-space: nowrap;
+ text-shadow: 0px 1px 1px rgba(0,0,0,0.3);
+ z-index: 100;
+}
+
+/* 铭牌链接样式 */
+.brand-link {
+ color: #b5a36a !important;
+ text-decoration: none;
+ cursor: pointer;
+ transition: filter 0.2s ease;
+}
+
+/* 所有链接状态下保持金色 */
+.brand-link:visited, .brand-link:active, .brand-link:link {
+ color: #b5a36a !important;
+ text-decoration: none;
+}
+
+/* 只在悬停时增加亮度 */
+.brand-link:hover {
+ color: #b5a36a !important;
+ text-decoration: none;
+ filter: brightness(1.5);
+}
+
+/* 电源按钮 */
+.power-button {
+ position: absolute;
+ right: 15px;
+ bottom: 8px;
+ width: 10px;
+ height: 10px;
+ border-radius: 50%;
+ border: 2px solid #555;
+ background-color: #222;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 0;
+ outline: none;
+ transition: all 0.2s ease;
+ box-shadow: 0 0 8px rgba(0, 0, 0, 0.8), 0 0 2px rgba(255, 255, 255, 0.3);
+ z-index: 100;
+}
+
+.power-button:hover {
+ transform: scale(1.15);
+}
+
+.power-button:active {
+ transform: scale(0.95);
+}
+
+/* 电源指示灯 */
+.power-indicator {
+ width: 8px;
+ height: 8px;
+ border-radius: 50%;
+ transition: background-color 0.3s ease, box-shadow 0.3s ease;
+}
+
+/* 开启状态 */
+.power-button.on .power-indicator {
+ background-color: #4CAF50; /* 绿色 */
+ box-shadow: 0 0 5px #4CAF50, 0 0 10px rgba(76, 175, 80, 0.5);
+}
+
+/* 关闭状态 */
+.power-button.off .power-indicator {
+ background-color: #555;
+ box-shadow: none;
+}
+
+@media (max-width: 992px) {
+ .simple-monitor {
+ transform: perspective(1000px) rotateY(0);
+ max-width: 500px;
+ margin: 0 auto;
+ }
+
+ .monitor-wrapper {
+ max-width: 90%;
+ }
+}
+
+/* 修复在特定视口宽度下的布局问题 */
+@media (min-width: 769px) and (max-width: 1200px) {
+ .hero .container {
+ align-items: flex-start; /* 避免垂直居中导致的重叠 */
+ gap: 60px; /* 增加间距 */
+ }
+
+ .hero-content {
+ padding-top: 40px; /* 添加顶部内边距 */
+ }
+}
\ No newline at end of file
diff --git a/script-hook-website/src/components/Monitor.tsx b/script-hook-website/src/components/Monitor.tsx
new file mode 100644
index 0000000..769144a
--- /dev/null
+++ b/script-hook-website/src/components/Monitor.tsx
@@ -0,0 +1,112 @@
+import React, { useState, useRef, useEffect } from 'react';
+import { useTranslation } from 'react-i18next';
+import './Monitor.css';
+
+interface MonitorProps {
+ imageUrl: string;
+ imageAlt?: string;
+ title?: string;
+}
+
+const Monitor: React.FC = ({
+ imageUrl,
+ imageAlt,
+ title
+}) => {
+ const { t } = useTranslation();
+ // 添加电源开关状态
+ const [isPowerOn, setIsPowerOn] = useState(true);
+ // 跟踪图片高度
+ const [imageHeight, setImageHeight] = useState(0);
+ const imageRef = useRef(null);
+
+ // 切换电源状态
+ const togglePower = () => {
+ setIsPowerOn(!isPowerOn);
+ };
+
+ // 当图片加载完成时,存储它的高度
+ useEffect(() => {
+ const updateHeight = () => {
+ if (imageRef.current) {
+ setImageHeight(imageRef.current.offsetHeight);
+ }
+ };
+
+ // 如果图片已经加载了
+ if (imageRef.current && imageRef.current.complete) {
+ updateHeight();
+ }
+
+ // 图片加载完成后设置高度
+ const currentImage = imageRef.current;
+ if (currentImage) {
+ currentImage.addEventListener('load', updateHeight);
+
+ return () => {
+ currentImage.removeEventListener('load', updateHeight);
+ };
+ }
+ }, [imageUrl]);
+
+ return (
+
+
+ {/* 显示器框架 */}
+
+ {/* 屏幕内容 - 保持尺寸一致 */}
+
+ {/* 无论开关状态如何,都保持图片在DOM中,只是在关闭时隐藏它 */}
+
+
+ {/* 关闭时显示黑屏,高度与图片完全一致 */}
+ {!isPowerOn && (
+
+ )}
+
+
+
+ {/* 底部控制区域 - 包含铭牌和电源按钮 */}
+
+ {/* 铭牌 */}
+
+
+ {/* 电源按钮 */}
+
+
+
+
+
+ {/* 显示器底座 */}
+
+
+
+ );
+};
+
+export default Monitor;
\ No newline at end of file
diff --git a/script-hook-website/src/components/StarHistory.css b/script-hook-website/src/components/StarHistory.css
new file mode 100644
index 0000000..09edbe0
--- /dev/null
+++ b/script-hook-website/src/components/StarHistory.css
@@ -0,0 +1,98 @@
+.star-history-section {
+ padding: 80px 0;
+ background-color: #f8f9fa;
+}
+
+.section-header {
+ text-align: center;
+ margin-bottom: 50px;
+}
+
+.section-header h2 {
+ font-size: 2.5rem;
+ color: #333;
+ margin-bottom: 15px;
+}
+
+.section-header p {
+ font-size: 1.2rem;
+ color: #666;
+ max-width: 800px;
+ margin: 0 auto;
+}
+
+.star-history-content {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ max-width: 1000px;
+ margin: 0 auto;
+}
+
+.star-chart {
+ width: 100%;
+ margin-bottom: 30px;
+ background-color: white;
+ border-radius: 10px;
+ padding: 20px;
+ box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05);
+}
+
+.star-chart-image {
+ width: 100%;
+ height: auto;
+ border-radius: 5px;
+}
+
+.star-action {
+ text-align: center;
+ margin-top: 10px;
+}
+
+.star-action p {
+ font-size: 1.1rem;
+ color: #555;
+ margin-bottom: 15px;
+}
+
+.star-button {
+ display: inline-flex;
+ align-items: center;
+ background-color: #1976d2;
+ color: white;
+ text-decoration: none;
+ padding: 12px 24px;
+ border-radius: 30px;
+ font-weight: 500;
+ transition: all 0.3s;
+}
+
+.star-button:hover {
+ background-color: #1565c0;
+ transform: translateY(-2px);
+ box-shadow: 0 5px 15px rgba(25, 118, 210, 0.3);
+}
+
+/* 响应式调整 */
+@media (max-width: 768px) {
+ .star-history-section {
+ padding: 60px 0;
+ }
+
+ .section-header h2 {
+ font-size: 2.2rem;
+ }
+
+ .section-header p {
+ font-size: 1.1rem;
+ }
+
+ .star-action p {
+ font-size: 1rem;
+ }
+
+ .star-button {
+ padding: 10px 20px;
+ font-size: 0.9rem;
+ }
+}
\ No newline at end of file
diff --git a/script-hook-website/src/components/StarHistory.tsx b/script-hook-website/src/components/StarHistory.tsx
new file mode 100644
index 0000000..31b3f85
--- /dev/null
+++ b/script-hook-website/src/components/StarHistory.tsx
@@ -0,0 +1,45 @@
+import React from 'react';
+import { useTranslation } from 'react-i18next';
+import './StarHistory.css';
+
+const StarHistory: React.FC = () => {
+ const { t } = useTranslation();
+
+ return (
+
+
+
+
{t('starHistory.title')}
+
{t('starHistory.description')}
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default StarHistory;
\ No newline at end of file
diff --git a/script-hook-website/src/components/Support.css b/script-hook-website/src/components/Support.css
new file mode 100644
index 0000000..978adca
--- /dev/null
+++ b/script-hook-website/src/components/Support.css
@@ -0,0 +1,205 @@
+.support {
+ padding: 80px 0;
+ background-color: #f9f9f9;
+}
+
+.support-grid {
+ display: grid;
+ grid-template-columns: repeat(2, 1fr);
+ gap: 30px;
+ margin-top: 50px;
+}
+
+.support-card {
+ background-color: white;
+ border-radius: 12px;
+ padding: 30px;
+ box-shadow: 0 4px 15px rgba(0, 0, 0, 0.07);
+ transition: all 0.3s ease;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+}
+
+.support-card:hover {
+ transform: translateY(-5px);
+ box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1);
+}
+
+.card-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 20px;
+}
+
+.card-header h3 {
+ font-size: 22px;
+ color: #2c3e50;
+ margin: 0;
+ font-weight: 600;
+}
+
+.card-header .icon {
+ color: #1976d2;
+ width: 32px;
+ height: 32px;
+}
+
+.support-card p {
+ font-size: 16px;
+ color: #546e7a;
+ line-height: 1.6;
+ margin-bottom: 20px;
+ flex-grow: 1;
+}
+
+.button-container {
+ display: flex;
+ justify-content: flex-start;
+ margin-top: auto;
+}
+
+.btn-outline {
+ display: inline-block;
+ padding: 10px 20px;
+ border: 2px solid #1976d2;
+ color: #1976d2;
+ background-color: transparent;
+ border-radius: 4px;
+ font-weight: 500;
+ transition: all 0.3s;
+ text-align: center;
+}
+
+.btn-outline:hover {
+ background-color: #1976d2;
+ color: white;
+ transform: translateY(-2px);
+}
+
+/* 贡献者头像 */
+.contributors-avatars {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 15px;
+ justify-content: center;
+ margin-top: auto;
+}
+
+.contributor-link {
+ display: block;
+ transition: all 0.3s ease;
+ position: relative;
+}
+
+.contributor-link:hover {
+ transform: translateY(-5px);
+}
+
+.contributor-avatar {
+ width: 80px;
+ height: 80px;
+ border-radius: 50%;
+ border: 3px solid white;
+ box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1);
+ transition: all 0.3s ease;
+}
+
+.contributor-link:hover .contributor-avatar {
+ box-shadow: 0 8px 20px rgba(0, 0, 0, 0.15);
+ border-color: #1976d2;
+}
+
+.contributor-link::after {
+ content: attr(title);
+ position: absolute;
+ bottom: -30px;
+ left: 50%;
+ transform: translateX(-50%);
+ background-color: rgba(0, 0, 0, 0.8);
+ color: white;
+ padding: 5px 10px;
+ border-radius: 4px;
+ font-size: 12px;
+ white-space: nowrap;
+ opacity: 0;
+ transition: opacity 0.3s ease;
+ pointer-events: none;
+}
+
+.contributor-link:hover::after {
+ opacity: 1;
+}
+
+/* 响应式设计 */
+@media (max-width: 1200px) {
+ .support-grid {
+ grid-template-columns: repeat(2, 1fr);
+ }
+}
+
+@media (max-width: 768px) {
+ .support-card {
+ padding: 20px;
+ }
+
+ .card-header h3 {
+ font-size: 20px;
+ }
+
+ .support-grid {
+ grid-template-columns: 1fr;
+ }
+
+ .contributor-avatar {
+ width: 70px;
+ height: 70px;
+ }
+}
+
+/* 加载状态样式 */
+.loading-spinner {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ padding: 20px;
+ margin-top: 10px;
+}
+
+.spinner {
+ border: 4px solid rgba(0, 0, 0, 0.1);
+ border-radius: 50%;
+ border-top: 4px solid #1976d2;
+ width: 36px;
+ height: 36px;
+ animation: spin 1s linear infinite;
+ margin-bottom: 10px;
+}
+
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
+}
+
+.loading-spinner p {
+ color: #546e7a;
+ margin: 0;
+ font-size: 14px;
+}
+
+/* 错误信息样式 */
+.error-message {
+ background-color: #ffebee;
+ border-left: 4px solid #f44336;
+ padding: 12px 15px;
+ margin: 15px 0;
+ border-radius: 4px;
+ color: #d32f2f;
+}
+
+.error-message p {
+ margin: 0;
+ font-size: 14px;
+}
\ No newline at end of file
diff --git a/script-hook-website/src/components/Support.tsx b/script-hook-website/src/components/Support.tsx
new file mode 100644
index 0000000..ffc70a5
--- /dev/null
+++ b/script-hook-website/src/components/Support.tsx
@@ -0,0 +1,121 @@
+import React, { useState, useEffect } from 'react';
+import { useTranslation } from 'react-i18next';
+import './Support.css';
+
+interface Contributor {
+ username: string;
+ avatarUrl: string;
+ profileUrl: string;
+ contributions: number;
+}
+
+const Support: React.FC = () => {
+ const { t } = useTranslation();
+ const [contributors, setContributors] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [error, setError] = useState(null);
+
+ useEffect(() => {
+ const fetchContributors = async () => {
+ try {
+ setLoading(true);
+ const response = await fetch('https://api.github.com/repos/JSREI/js-script-hook/contributors');
+
+ if (!response.ok) {
+ throw new Error(`${t('support.error.githubApiFailed')}: ${response.status}`);
+ }
+
+ const data = await response.json();
+
+ // 转换数据为我们需要的格式
+ const formattedContributors = data.map((contributor: any) => ({
+ username: contributor.login,
+ avatarUrl: contributor.avatar_url,
+ profileUrl: contributor.html_url,
+ contributions: contributor.contributions
+ }));
+
+ setContributors(formattedContributors);
+ setLoading(false);
+ } catch (err) {
+ console.error(`${t('support.error.failedToLoad')}:`, err);
+ setError(t('support.error.cannotLoadContributors'));
+ setLoading(false);
+ }
+ };
+
+ fetchContributors();
+ }, [t]);
+
+ return (
+
+
+
+
{t('support.title')}
+
{t('support.description')}
+
+
+
+ {/* 问题反馈 */}
+
+
+
{t('support.feedback.title')}
+
+
+
+
+
{t('support.feedback.description')}
+
+
+
+ {/* 贡献者墙 */}
+
+
+
{t('support.contributors.title')}
+
+
+
+
+
{t('support.contributors.description')}
+
+ {loading ? (
+
+
+
{t('support.contributors.loading')}
+
+ ) : error ? (
+
+ ) : (
+
+ {contributors.map((contributor, index) => (
+
+
+
+ ))}
+
+ )}
+
+
+
+
+ );
+};
+
+export default Support;
\ No newline at end of file
diff --git a/script-hook-website/src/components/WorkflowDiagram.css b/script-hook-website/src/components/WorkflowDiagram.css
new file mode 100644
index 0000000..bcba91f
--- /dev/null
+++ b/script-hook-website/src/components/WorkflowDiagram.css
@@ -0,0 +1,178 @@
+.workflow {
+ padding: 80px 0;
+ background-color: #ffffff;
+}
+
+.workflow-diagram {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ margin-top: 60px;
+ position: relative;
+ padding-bottom: 40px;
+}
+
+/* 图表区块通用样式 */
+.diagram-block {
+ display: flex;
+ align-items: center;
+ position: relative;
+ width: 100%;
+ max-width: 600px;
+ margin: 0 auto;
+ min-height: 100px;
+}
+
+/* 标签样式 */
+.diagram-label {
+ position: absolute;
+ left: -180px;
+ display: flex;
+ align-items: center;
+}
+
+.diagram-label span {
+ font-weight: 500;
+ color: #333;
+ margin-right: 10px;
+ font-size: 16px;
+ white-space: nowrap;
+}
+
+.arrow-line {
+ width: 60px;
+ height: 2px;
+ background-color: #333;
+ position: relative;
+}
+
+.arrow-line::after {
+ content: '';
+ position: absolute;
+ right: 0;
+ top: -4px;
+ width: 0;
+ height: 0;
+ border-left: 8px solid #333;
+ border-top: 5px solid transparent;
+ border-bottom: 5px solid transparent;
+}
+
+/* 内容框样式 */
+.diagram-box {
+ background-color: #e8f5e9;
+ border: 2px solid #4caf50;
+ border-radius: 6px;
+ padding: 15px 20px;
+ width: 100%;
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
+ transition: all 0.3s ease;
+}
+
+.diagram-box p {
+ margin: 0;
+ text-align: center;
+ font-size: 16px;
+ line-height: 1.5;
+}
+
+/* 黄色框样式 */
+.yellow-box {
+ background-color: #fff8e1;
+ border-color: #ffb300;
+}
+
+/* 箭头样式 */
+.diagram-arrow {
+ width: 2px;
+ height: 50px;
+ background-color: #333;
+ position: relative;
+ margin: 10px 0;
+}
+
+.diagram-arrow.down::after {
+ content: '';
+ position: absolute;
+ bottom: 0;
+ left: -4px;
+ width: 0;
+ height: 0;
+ border-top: 8px solid #333;
+ border-left: 5px solid transparent;
+ border-right: 5px solid transparent;
+}
+
+/* 可选注释样式 */
+.optional-note {
+ position: absolute;
+ right: -220px;
+ display: flex;
+ align-items: center;
+}
+
+.optional-note span {
+ font-size: 14px;
+ color: #757575;
+ font-style: italic;
+}
+
+.arrow-line.right {
+ width: 60px;
+ margin-right: 10px;
+}
+
+/* 生命周期标注 */
+.lifecycle-note {
+ position: absolute;
+ top: -30px;
+ left: 50%;
+ transform: translateX(-50%);
+ background-color: #f5f5f5;
+ padding: 5px 15px;
+ border-radius: 20px;
+ font-size: 14px;
+ color: #757575;
+}
+
+/* 响应式样式 */
+@media (max-width: 992px) {
+ .diagram-label {
+ position: relative;
+ left: 0;
+ margin-bottom: 15px;
+ justify-content: center;
+ }
+
+ .optional-note {
+ position: relative;
+ right: 0;
+ margin-top: 15px;
+ justify-content: center;
+ }
+
+ .diagram-block {
+ flex-direction: column;
+ margin-bottom: 20px;
+ }
+
+ .workflow-diagram {
+ padding: 0 20px;
+ }
+}
+
+@media (max-width: 768px) {
+ .diagram-box {
+ padding: 12px 15px;
+ }
+
+ .diagram-box p {
+ font-size: 14px;
+ }
+
+ .lifecycle-note {
+ position: relative;
+ top: 0;
+ margin-bottom: 30px;
+ }
+}
\ No newline at end of file
diff --git a/script-hook-website/src/components/WorkflowDiagram.tsx b/script-hook-website/src/components/WorkflowDiagram.tsx
new file mode 100644
index 0000000..b841ba8
--- /dev/null
+++ b/script-hook-website/src/components/WorkflowDiagram.tsx
@@ -0,0 +1,66 @@
+import React from 'react';
+import { useTranslation } from 'react-i18next';
+import './WorkflowDiagram.css';
+
+const WorkflowDiagram: React.FC = () => {
+ const { t } = useTranslation();
+
+ return (
+
+
+
+
{t('workflow.title')}
+
{t('workflow.description')}
+
+
+
+ {/* 请求断点部分 */}
+
+
+
{t('workflow.requestPoint')}
+
+
+
+
{t('workflow.requestDescription')}
+
+
+
+ {/* 连接箭头 */}
+
+
+ {/* 服务器处理部分 */}
+
+
+
{t('workflow.serverProcess')}
+
+
+
+ {/* 连接箭头 */}
+
+
+ {/* 响应断点部分 */}
+
+
+
{t('workflow.responsePoint')}
+
+
+
+
{t('workflow.responseDescription')}
+
+
+
+
{t('workflow.optionalNote')}
+
+
+
+ {/* 文本说明 */}
+
+ {t('workflow.lifecycleNote')}
+
+
+
+
+ );
+};
+
+export default WorkflowDiagram;
\ No newline at end of file
diff --git a/script-hook-website/src/context/I18nContext.tsx b/script-hook-website/src/context/I18nContext.tsx
new file mode 100644
index 0000000..a2de877
--- /dev/null
+++ b/script-hook-website/src/context/I18nContext.tsx
@@ -0,0 +1,146 @@
+import React, { createContext, useContext, useState, useEffect, useCallback } from 'react';
+import { useTranslation } from 'react-i18next';
+
+interface I18nContextType {
+ /**
+ * 当前语言
+ */
+ currentLanguage: string;
+
+ /**
+ * 支持的语言列表
+ */
+ supportedLanguages: { code: string; name: string }[];
+
+ /**
+ * 切换语言
+ */
+ changeLanguage: (lang: string) => Promise;
+
+ /**
+ * 语言是否正在切换中
+ */
+ isSwitching: boolean;
+
+ /**
+ * 设置文档方向 (RTL/LTR)
+ */
+ setDocumentDirection: (lang: string) => void;
+}
+
+// 支持的语言列表
+export const supportedLanguages = [
+ { code: 'zh', name: '简体中文' },
+ { code: 'en', name: 'English' }
+];
+
+// 创建上下文
+const I18nContext = createContext(undefined);
+
+/**
+ * i18n上下文提供者组件
+ */
+export const I18nProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
+ const { i18n } = useTranslation();
+ const [isSwitching, setIsSwitching] = useState(false);
+
+ // 获取当前语言
+ const currentLanguage = i18n.language.split('-')[0];
+
+ /**
+ * 设置文档的方向 (RTL/LTR)
+ * 如果将来添加阿拉伯语等RTL语言,这将非常有用
+ */
+ const setDocumentDirection = useCallback((lang: string) => {
+ // 目前只有中文和英文,都是LTR方向
+ document.documentElement.setAttribute('dir', 'ltr');
+
+ // 如果未来添加RTL语言,如阿拉伯语,可以这样处理:
+ // const rtlLanguages = ['ar', 'he', 'ur'];
+ // document.documentElement.setAttribute('dir', rtlLanguages.includes(lang) ? 'rtl' : 'ltr');
+ }, []);
+
+ /**
+ * 切换语言并更新相关设置
+ */
+ const changeLanguage = useCallback(async (lang: string) => {
+ if (lang === currentLanguage || isSwitching) {
+ return;
+ }
+
+ setIsSwitching(true);
+
+ try {
+ // 存储用户语言选择
+ localStorage.setItem('language', lang);
+
+ // 切换i18next语言
+ await i18n.changeLanguage(lang);
+
+ // 更新HTML标签
+ document.documentElement.setAttribute('lang', lang);
+
+ // 设置文档方向
+ setDocumentDirection(lang);
+
+ // 更新社交媒体元数据
+ const updateMetaTag = (id: string, attr: string, value: string) => {
+ const tag = document.getElementById(id);
+ if (tag) tag.setAttribute(attr, value);
+ };
+
+ // 使用新语言的翻译更新元数据
+ const t = i18n.getFixedT(lang);
+ document.title = t('html.title');
+
+ updateMetaTag('meta-description', 'content', t('html.description'));
+ updateMetaTag('og-title', 'content', t('html.title'));
+ updateMetaTag('og-description', 'content', t('html.description'));
+ updateMetaTag('twitter-title', 'content', t('html.title'));
+ updateMetaTag('twitter-description', 'content', t('html.description'));
+
+ // 更新noscript消息
+ const noscriptElement = document.getElementById('noscript-message');
+ if (noscriptElement) {
+ noscriptElement.textContent = t('html.noscript');
+ }
+ } catch (error) {
+ console.error('Failed to change language:', error);
+ } finally {
+ setIsSwitching(false);
+ }
+ }, [currentLanguage, i18n, isSwitching, setDocumentDirection]);
+
+ // 初始化时设置文档方向
+ useEffect(() => {
+ setDocumentDirection(currentLanguage);
+ }, [currentLanguage, setDocumentDirection]);
+
+ // 提供上下文值
+ const contextValue: I18nContextType = {
+ currentLanguage,
+ supportedLanguages,
+ changeLanguage,
+ isSwitching,
+ setDocumentDirection
+ };
+
+ return (
+
+ {children}
+
+ );
+};
+
+/**
+ * 使用i18n上下文的Hook
+ */
+export const useI18n = (): I18nContextType => {
+ const context = useContext(I18nContext);
+ if (context === undefined) {
+ throw new Error('useI18n must be used within an I18nProvider');
+ }
+ return context;
+};
+
+export default I18nContext;
\ No newline at end of file
diff --git a/script-hook-website/src/i18n/index.ts b/script-hook-website/src/i18n/index.ts
new file mode 100644
index 0000000..61e183f
--- /dev/null
+++ b/script-hook-website/src/i18n/index.ts
@@ -0,0 +1,55 @@
+import i18n from 'i18next';
+import { initReactI18next } from 'react-i18next';
+import LanguageDetector from 'i18next-browser-languagedetector';
+
+import translationZH from './locales/zh.json';
+import translationEN from './locales/en.json';
+
+// Language resources
+const resources = {
+ zh: {
+ translation: translationZH
+ },
+ en: {
+ translation: translationEN
+ }
+};
+
+// 获取支持的语言列表
+const supportedLngs = Object.keys(resources);
+
+i18n
+ // Use browser language detector
+ .use(LanguageDetector)
+ // Pass i18n instance to react-i18next
+ .use(initReactI18next)
+ // Initialize i18next
+ .init({
+ resources,
+ fallbackLng: 'en', // English as default fallback language
+ supportedLngs, // List of supported languages
+ load: 'languageOnly', // only load language without region (e.g. 'en' instead of 'en-US')
+
+ interpolation: {
+ escapeValue: false // Do not escape HTML tags
+ },
+
+ detection: {
+ // Get language preference in this order
+ order: ['localStorage', 'navigator', 'htmlTag'],
+ // Cache user language preference
+ caches: ['localStorage'],
+ // Use 'language' as the localStorage key
+ lookupLocalStorage: 'language'
+ },
+
+ // Debug in development mode
+ debug: process.env.NODE_ENV === 'development'
+ });
+
+// Helper function to get current language
+export const getCurrentLanguage = (): string => {
+ return i18n.language.split('-')[0];
+};
+
+export default i18n;
\ No newline at end of file
diff --git a/script-hook-website/src/i18n/locales/en.json b/script-hook-website/src/i18n/locales/en.json
new file mode 100644
index 0000000..1aacf0f
--- /dev/null
+++ b/script-hook-website/src/i18n/locales/en.json
@@ -0,0 +1,362 @@
+{
+ "nav": {
+ "features": "Features",
+ "installation": "Installation",
+ "support": "Support",
+ "community": "Community"
+ },
+ "language": {
+ "zh": "简体中文",
+ "en": "English",
+ "switchLanguage": "Switch Language"
+ },
+ "hero": {
+ "subtitle": "JavaScript Request Interception Tool Designed for Web Reverse Engineering",
+ "description": "A lightweight JavaScript library focused on aiding web reverse engineering, precisely intercepting and analyzing script requests and JSONP calls, helping you quickly locate key interfaces, simplify reverse analysis processes, and improve debugging efficiency.",
+ "buttons": {
+ "quickStart": "Quick Start",
+ "github": "GitHub",
+ "watchDemo": "Watch Demo"
+ },
+ "monitor": {
+ "title": "Core Features Demo",
+ "imageAlt": "JS Script Hook Feature Demo"
+ },
+ "badges": {
+ "downloads": "Greasy Fork Downloads",
+ "rating": "Greasy Fork Rating",
+ "license": "License",
+ "release": "GitHub Release"
+ }
+ },
+ "features": {
+ "title": "Main Features",
+ "description": "JS Script Hook is designed for web reverse analysis, helping you efficiently identify and extract key request data",
+ "items": {
+ "scriptInterception": {
+ "title": "Script Request Interception",
+ "description": "Precisely intercept all dynamically loaded script elements in web pages, assisting in reverse analysis of data interaction processes."
+ },
+ "jsonpParsing": {
+ "title": "JSONP Reverse Analysis",
+ "description": "Designed for reverse analysis of JSONP requests, automatically capturing callback functions and parameters, revealing interface data structures."
+ },
+ "breakpointControl": {
+ "title": "Precise Breakpoint Control",
+ "description": "Intelligently set breakpoints based on URL characteristics, locate key requests and callback functions, simplifying reverse analysis processes."
+ },
+ "dataExtraction": {
+ "title": "Interface Data Extraction",
+ "description": "Monitor and analyze request and response data in real-time, easily obtain interface parameter structures, improving reverse engineering efficiency."
+ },
+ "hookStrategies": {
+ "title": "Various Hook Strategies",
+ "description": "Support proxy functions and redeclared functions, two hook implementations, flexibly coping with various anti-debugging scenarios."
+ },
+ "stealthMode": {
+ "title": "Stealth Monitoring Mode",
+ "description": "Intelligent filtering and precise logging, minimizing tool signatures, effectively avoiding website's anti-reverse detection mechanisms."
+ }
+ }
+ },
+ "workflow": {
+ "title": "How It Works",
+ "description": "How JS Script Hook intercepts and processes script request lifecycle",
+ "requestPoint": "Request Breakpoint",
+ "requestDescription": "Browser JS initiates request using script tag",
+ "serverProcess": "Server receives, processes request and returns response",
+ "responsePoint": "Response Breakpoint",
+ "responseDescription": "Browser receives server response, callback function processes response",
+ "optionalNote": "Optional, may not have callback function",
+ "lifecycleNote": "Lifecycle of a JSONP request"
+ },
+ "featureTree": {
+ "title": "Feature System",
+ "description": "Comprehensive feature system to meet reverse analysis needs in different scenarios",
+ "legend": {
+ "core": "Core Features",
+ "mainModule": "Main Modules",
+ "subFeature": "Sub-features",
+ "implementation": "Implementation Details"
+ },
+ "instructions": "Tip: Drag and zoom to view the complete feature tree, use the mini-map for quick navigation",
+ "nodes": {
+ "main": "JSREI Script Hook",
+ "hook": {
+ "title": "Hook",
+ "requestHook": {
+ "title": "Pre-request Interception",
+ "description": "For analyzing callback parameters in request parameters"
+ },
+ "responseHook": {
+ "title": "Post-response Interception",
+ "description": "For analyzing contents in JSONP responses"
+ }
+ },
+ "analyzer": {
+ "title": "Analyzer",
+ "requestAnalyzer": {
+ "title": "Request Analyzer",
+ "callbackDetect": "Built-in algorithm to automatically detect JSONP callback parameters",
+ "autoBreakpoint": {
+ "title": "Auto-set breakpoints for possible callback functions",
+ "description": "(beta)"
+ }
+ },
+ "responseAnalyzer": {
+ "title": "Response Analyzer",
+ "staticAnalyze": "Not yet implemented, current approach is sufficient"
+ }
+ },
+ "settings": {
+ "title": "Global Settings",
+ "language": {
+ "title": "Internationalization",
+ "description": "(Simplified Chinese only for now)"
+ },
+ "hookMethod": {
+ "title": "Two Script Hook Methods",
+ "proxyMethod": "Using proxy function method for hooking",
+ "redeclareMethod": "Modifying original function code for redefinition"
+ },
+ "flagOptions": "Hook Flag Options"
+ },
+ "ui": {
+ "title": "UI Interface",
+ "urlConfig": {
+ "title": "New URL Configuration Interface",
+ "description": "(Configure multiple rules simultaneously)"
+ },
+ "breakpointSetting": "Enable Request Breakpoints",
+ "responseBreakpoint": "Enable Response Breakpoints"
+ },
+ "console": {
+ "title": "Console",
+ "printStyle": "Table Format Printing"
+ }
+ }
+ },
+ "detailedFeatures": {
+ "title": "Reverse Engineering Toolkit",
+ "description": "Professional tools supporting web reverse engineering, simplifying interface analysis and data extraction",
+ "tabs": {
+ "interface": "Interface Settings",
+ "console": "Request Monitoring",
+ "breakpoint": "Reverse Breakpoints"
+ },
+ "interface": {
+ "title": "Interface Settings",
+ "description": "JS Script Hook offers an optimized configuration interface for web reverse engineering, with flexible interception strategies.",
+ "globalConfig": {
+ "title": "Global Configuration",
+ "points": [
+ "Interface language: Supports Simplified Chinese and English for different usage scenarios.",
+ "Hook strategy selection: Choose the most suitable interception method based on the target website's protection mechanism.",
+ "Custom Hook identifiers: Reduce feature recognition risk, avoiding anti-debugging detection.",
+ "Fine-grained request filtering: Targeted monitoring of specific requests, optimizing reverse analysis efficiency."
+ ]
+ },
+ "breakpointConfig": {
+ "title": "Breakpoint Configuration",
+ "points": [
+ "Intelligent breakpoint control: Quickly enable/disable breakpoints for specific URLs.",
+ "Multi-mode URL matching: Supports exact, prefix, suffix, regex, and other matching methods.",
+ "Bi-directional breakpoint mechanism: Intercept both request initiation and data return key points.",
+ "Automatic JSONP recognition: Built-in callback parameter inference engine for quick location of key functions."
+ ]
+ }
+ },
+ "console": {
+ "title": "Request Monitoring",
+ "description": "Comprehensive capture of script and JSONP requests, intuitive display of data flow for reverse analysis of API calls.",
+ "interfaceAnalysis": {
+ "title": "Interface Data Analysis",
+ "points": [
+ "Request URL parsing: Complete recording and analysis of interface addresses and parameter structures.",
+ "JSONP identification marker: Automatic distinction between regular scripts and JSONP requests.",
+ "Callback function extraction: Precise identification and display of data processing functions.",
+ "Request sequence recording: Analysis of logical relationships and call order between requests."
+ ]
+ },
+ "targetFilter": {
+ "title": "Target Request Filtering",
+ "points": [
+ "Intelligent filtering system: Focus on key requests, reducing interference information.",
+ "Static resource exclusion: Optionally ignore regular js files, focusing on data interfaces.",
+ "JSONP request focusing: Precise targeting of data communication channels.",
+ "Clear log display: Structured recording of interface information for easy tracking and analysis."
+ ]
+ }
+ },
+ "breakpoint": {
+ "title": "Reverse Breakpoints",
+ "description": "Precisely locate key interfaces and data processing functions, deeply analyze request parameters and response data structures.",
+ "requestAnalysis": {
+ "title": "Request Parameter Analysis",
+ "points": [
+ "Pre-request interception: Capture critical moments before script loading, analyzing parameter construction processes.",
+ "Context information access: Complete access to request environment and parameter generation logic.",
+ "Target precise positioning: Intelligently trigger breakpoints based on URL characteristics.",
+ "Parameter encryption analysis: Facilitates reverse analysis of parameter encryption algorithms and signature generation mechanisms."
+ ]
+ },
+ "responseExtraction": {
+ "title": "Response Data Extraction",
+ "points": [
+ "Callback function interception: Precise capture of JSONP data processing moments.",
+ "Response content parsing: Intuitive view of the complete data structure returned by the interface.",
+ "Dual-mode breakpoint support: Flexible response to different anti-debugging scenarios.",
+ "Data processing tracking: Analysis of the website's subsequent processing logic for returned data."
+ ]
+ }
+ }
+ },
+ "installation": {
+ "title": "Installation & Usage",
+ "description": "JS Script Hook offers two installation methods, choose the one that works best for you",
+ "methods": {
+ "userscript": "Userscript Installation",
+ "source": "Source Code Installation"
+ },
+ "userscript": {
+ "step1": {
+ "title": "Step 1: Install a Userscript Manager",
+ "description": "First, you need to install a userscript manager extension in your browser:",
+ "recommended": "(Recommended, supports Chrome, Firefox, Edge, Safari, etc.)"
+ },
+ "step2": {
+ "title": "Step 2: Install JS Script Hook Script",
+ "description": "After installing the userscript manager, click the button below to visit Greasy Fork, then click \"Install this script\":",
+ "button": "Go to Greasy Fork to Install Script"
+ },
+ "notes": {
+ "title": "Notes:",
+ "items": [
+ "After installation, the script will automatically run and start intercepting script requests matching the rules",
+ "Script has been tested on Chrome 87+ versions",
+ "Other browsers may require additional configuration"
+ ]
+ }
+ },
+ "source": {
+ "tabs": {
+ "npm": "Using NPM",
+ "yarn": "Using Yarn"
+ },
+ "step1": {
+ "title": "Step 1: Clone Repository",
+ "command": "git clone https://github.com/JSREI/js-script-hook.git"
+ },
+ "step2": {
+ "title": "Step 2: Enter Project Directory",
+ "command": "cd js-script-hook"
+ },
+ "step3": {
+ "title": "Step 3: Install Dependencies and Build",
+ "npmCommand": "npm install && npm run build",
+ "yarnCommand": "yarn install && yarn build"
+ },
+ "copy": "Copy",
+ "copied": "Copied",
+ "usage": {
+ "title": "Usage Example",
+ "description": "After building, you can use it in your project as follows:"
+ }
+ }
+ },
+ "support": {
+ "title": "Support & Contribution",
+ "description": "Join our community and help drive the project forward",
+ "error": {
+ "githubApiFailed": "GitHub API request failed",
+ "failedToLoad": "Failed to load contributor data",
+ "cannotLoadContributors": "Cannot load contributor data"
+ },
+ "feedback": {
+ "title": "Feedback",
+ "description": "When encountering issues, please provide feedback through GitHub Issues. This helps us track and resolve problems, and also makes it easier for other users to reference.",
+ "createIssue": "Create Issue"
+ },
+ "contributors": {
+ "title": "Contributors",
+ "description": "Thanks to all developers who have contributed to the project. Welcome to submit PRs to enhance product features.",
+ "loading": "Loading contributor data...",
+ "commits": "commits",
+ "avatarAlt": "{{username}}'s avatar"
+ }
+ },
+ "community": {
+ "title": "Reverse Engineering Community",
+ "description": "Join our community groups for the latest information and technical support",
+ "qrCode": "{{group}} QR Code",
+ "clickHere": "Click here",
+ "orScanCode": "or scan the QR code to join the Telegram group",
+ "groups": {
+ "wechat": {
+ "title": "WeChat Group",
+ "description": "Scan to join our reverse engineering WeChat group"
+ },
+ "personalWechat": {
+ "title": "Personal WeChat",
+ "description": "If group QR code expires, add this WeChat and send [Reverse Group]"
+ },
+ "telegram": {
+ "title": "Telegram Group",
+ "description": "Click or scan to join our Telegram group"
+ }
+ }
+ },
+ "footer": {
+ "description": "A tool for assisting with reverse engineering script requests, helping to analyze and debug script requests.",
+ "links": {
+ "title": "Links",
+ "issues": "Issues",
+ "license": "License"
+ },
+ "resources": {
+ "title": "Resources",
+ "installation": "Installation Guide",
+ "documentation": "Documentation"
+ },
+ "copyright": "All rights reserved.",
+ "developedBy": "Developed by",
+ "team": "team"
+ },
+ "github": {
+ "viewOnGithub": "View on GitHub"
+ },
+ "monitor": {
+ "defaultImageAlt": "Feature Demo",
+ "powerButton": {
+ "turnOn": "Turn On Monitor",
+ "turnOff": "Turn Off Monitor"
+ }
+ },
+ "html": {
+ "title": "JS Script Hook - Official Website",
+ "description": "JS Script Hook - Advanced JavaScript Script Hooking Tool",
+ "noscript": "You need to enable JavaScript to run this app."
+ },
+ "starHistory": {
+ "title": "Star History",
+ "description": "GitHub star growth trend since the project was created. Thanks for the continuous support from the community!",
+ "chartAlt": "Star History Chart",
+ "likeCta": "Like this project? Give us a star!",
+ "starButton": "Support with a Star"
+ },
+ "socialShare": {
+ "title": "Share with Friends",
+ "defaultTitle": "JS Script Hook - Advanced JavaScript Script Hooking Tool",
+ "defaultDescription": "A powerful JavaScript script hooking library with multiple interception methods and rich customization options",
+ "shareOn": "Share on {{platform}}",
+ "copiedToClipboard": "Link copied to clipboard",
+ "copyLink": "Copy Link"
+ },
+ "richText": {
+ "welcome": "Welcome to JS Script Hook , your reliable assistant for Web Reverse Engineering!",
+ "installGuide": "Installation is very simple, just click here to get the latest version.",
+ "apiUsage": "Check out the API documentation for JS Script Hook to learn more about its usage.",
+ "news": "The latest version {{version}} has been released with many new features and improvements!",
+ "supportInfo": "If you encounter any issues while using it, feel free to provide feedback on GitHub Issues , or join our community for help."
+ }
+}
\ No newline at end of file
diff --git a/script-hook-website/src/i18n/locales/zh.json b/script-hook-website/src/i18n/locales/zh.json
new file mode 100644
index 0000000..4fa8f26
--- /dev/null
+++ b/script-hook-website/src/i18n/locales/zh.json
@@ -0,0 +1,362 @@
+{
+ "nav": {
+ "features": "功能",
+ "installation": "安装",
+ "support": "支持",
+ "community": "交流群"
+ },
+ "language": {
+ "zh": "简体中文",
+ "en": "English",
+ "switchLanguage": "切换语言"
+ },
+ "hero": {
+ "subtitle": "专为Web逆向分析设计的JavaScript请求拦截工具",
+ "description": "一个专注于辅助Web逆向工程的轻量级JavaScript库,精准拦截和分析script请求与JSONP调用,帮助您快速定位关键接口,简化逆向分析流程,提升调试效率。",
+ "buttons": {
+ "quickStart": "快速开始",
+ "github": "GitHub",
+ "watchDemo": "观看演示视频"
+ },
+ "monitor": {
+ "title": "核心功能演示",
+ "imageAlt": "JS Script Hook 功能演示"
+ },
+ "badges": {
+ "downloads": "Greasy Fork 下载量",
+ "rating": "Greasy Fork 评分",
+ "license": "许可证",
+ "release": "GitHub 发布版本"
+ }
+ },
+ "features": {
+ "title": "主要功能",
+ "description": "JS Script Hook专为Web逆向分析设计,帮助您高效识别与提取关键请求数据",
+ "items": {
+ "scriptInterception": {
+ "title": "Script请求拦截",
+ "description": "精准拦截网页中所有动态加载的script元素,协助逆向分析数据交互流程。"
+ },
+ "jsonpParsing": {
+ "title": "JSONP逆向解析",
+ "description": "专为逆向分析JSONP请求设计,自动捕获回调函数及参数,揭示接口数据结构。"
+ },
+ "breakpointControl": {
+ "title": "精确断点控制",
+ "description": "根据URL特征智能设置断点,定位关键请求和回调函数,简化逆向分析流程。"
+ },
+ "dataExtraction": {
+ "title": "接口数据提取",
+ "description": "实时监控并分析请求和响应数据,轻松获取接口参数结构,提升逆向效率。"
+ },
+ "hookStrategies": {
+ "title": "多样Hook策略",
+ "description": "支持代理函数与重声明函数两种钩子实现,灵活应对各类反调试场景。"
+ },
+ "stealthMode": {
+ "title": "隐蔽监控模式",
+ "description": "智能过滤和精确日志,最小化工具特征,有效规避网站的反逆向检测机制。"
+ }
+ }
+ },
+ "workflow": {
+ "title": "工作原理",
+ "description": "JS Script Hook 如何拦截和处理脚本请求的生命周期",
+ "requestPoint": "请求断点",
+ "requestDescription": "浏览器JS使用script标签发起请求",
+ "serverProcess": "服务器收到请求处理并返回响应",
+ "responsePoint": "响应断点",
+ "responseDescription": "浏览器收到服务器响应,回调callback函数处理响应",
+ "optionalNote": "可选,可能没有回调函数",
+ "lifecycleNote": "一次jsonp请求的生命周期"
+ },
+ "featureTree": {
+ "title": "功能体系",
+ "description": "全面的功能体系,满足不同场景的逆向分析需求",
+ "legend": {
+ "core": "核心功能",
+ "mainModule": "主要模块",
+ "subFeature": "子功能",
+ "implementation": "实现细节"
+ },
+ "instructions": "提示: 可拖动、缩放查看完整功能树,使用小地图快速导航",
+ "nodes": {
+ "main": "JSREI Script Hook",
+ "hook": {
+ "title": "Hook",
+ "requestHook": {
+ "title": "请求之前拦截",
+ "description": "用于分析请求参数中有的回调参数"
+ },
+ "responseHook": {
+ "title": "响应之后拦截",
+ "description": "用于分析jsonp响应中有的内容"
+ }
+ },
+ "analyzer": {
+ "title": "分析器",
+ "requestAnalyzer": {
+ "title": "请求分析器",
+ "callbackDetect": "内置算法自动探测jsonp的callback参数",
+ "autoBreakpoint": {
+ "title": "自动给新参数可能的回调方式断点",
+ "description": "(beta)"
+ }
+ },
+ "responseAnalyzer": {
+ "title": "响应分析器",
+ "staticAnalyze": "暂未实现,目前采取已经足够"
+ }
+ },
+ "settings": {
+ "title": "全局设置",
+ "language": {
+ "title": "国际化多语言",
+ "description": "(仅提供简体中文)"
+ },
+ "hookMethod": {
+ "title": "两种脚本Hook方式",
+ "proxyMethod": "使用代理函数方式拦Hook",
+ "redeclareMethod": "修改原函数代码覆盖定义"
+ },
+ "flagOptions": "Hook Flag选项"
+ },
+ "ui": {
+ "title": "UI界面",
+ "urlConfig": {
+ "title": "新的URL配置界面",
+ "description": "(可同时配置多个规则)"
+ },
+ "breakpointSetting": "是否开启请求断点",
+ "responseBreakpoint": "是否开启响应断点"
+ },
+ "console": {
+ "title": "控制台",
+ "printStyle": "表格形式打印"
+ }
+ }
+ },
+ "detailedFeatures": {
+ "title": "逆向分析工具箱",
+ "description": "全方位支持Web逆向工程的专业工具,简化接口分析与数据提取流程",
+ "tabs": {
+ "interface": "界面设置",
+ "console": "请求监控",
+ "breakpoint": "逆向断点"
+ },
+ "interface": {
+ "title": "界面设置",
+ "description": "JS Script Hook提供针对Web逆向工程优化的配置界面,灵活设置拦截策略。",
+ "globalConfig": {
+ "title": "全局配置",
+ "points": [
+ "界面语言:支持简体中文和English,适应不同使用场景。",
+ "Hook策略选择:根据目标网站的防护机制,选择最合适的拦截方式。",
+ "自定义Hook标识:减少特征识别风险,规避反调试检测。",
+ "精细请求过滤:针对性监控特定请求,优化逆向分析效率。"
+ ]
+ },
+ "breakpointConfig": {
+ "title": "断点配置",
+ "points": [
+ "智能断点控制:快速启用/禁用特定URL的断点。",
+ "多模式URL匹配:支持精确、前缀、后缀、正则等多种匹配方式。",
+ "双向断点机制:拦截请求发起和数据返回两个关键节点。",
+ "自动JSONP识别:内置回调参数推断引擎,快速定位关键函数。"
+ ]
+ }
+ },
+ "console": {
+ "title": "请求监控",
+ "description": "全方位捕获script和JSONP请求,直观展示数据流,便于逆向分析接口调用。",
+ "interfaceAnalysis": {
+ "title": "接口数据分析",
+ "points": [
+ "请求URL解析:完整记录并分析接口地址及参数结构。",
+ "JSONP识别标记:自动区分普通script和JSONP请求。",
+ "回调函数提取:精确识别并显示数据处理函数。",
+ "请求时序记录:分析请求间的逻辑关系和调用顺序。"
+ ]
+ },
+ "targetFilter": {
+ "title": "目标请求过滤",
+ "points": [
+ "智能过滤系统:聚焦关键请求,减少干扰信息。",
+ "静态资源排除:可选忽略普通js文件,专注数据接口。",
+ "JSONP请求聚焦:精准定位数据交互通道。",
+ "清晰日志展示:结构化记录接口信息,便于追踪分析。"
+ ]
+ }
+ },
+ "breakpoint": {
+ "title": "逆向断点",
+ "description": "精确定位关键接口和数据处理函数,深入分析请求参数和响应数据结构。",
+ "requestAnalysis": {
+ "title": "请求参数分析",
+ "points": [
+ "请求前拦截:捕获脚本加载前的关键时刻,分析参数构造过程。",
+ "上下文信息获取:完整访问请求环境和参数生成逻辑。",
+ "目标精准定位:根据URL特征智能触发断点。",
+ "参数加密分析:便于逆向分析参数加密算法和签名生成机制。"
+ ]
+ },
+ "responseExtraction": {
+ "title": "响应数据提取",
+ "points": [
+ "回调函数拦截:精确捕获JSONP数据处理时刻。",
+ "响应内容解析:直观查看接口返回的完整数据结构。",
+ "双模式断点支持:灵活应对不同反调试场景。",
+ "数据处理跟踪:分析网站对返回数据的后续处理逻辑。"
+ ]
+ }
+ }
+ },
+ "installation": {
+ "title": "安装与使用",
+ "description": "JS Script Hook 提供两种安装方式,选择最适合您的方式",
+ "methods": {
+ "userscript": "油猴脚本安装",
+ "source": "源码编译安装"
+ },
+ "userscript": {
+ "step1": {
+ "title": "步骤 1:安装用户脚本管理器",
+ "description": "首先,您需要在浏览器中安装一个用户脚本管理器扩展:",
+ "recommended": "(推荐,支持 Chrome、Firefox、Edge、Safari 等)"
+ },
+ "step2": {
+ "title": "步骤 2:安装 JS Script Hook 脚本",
+ "description": "安装好用户脚本管理器后,点击下方按钮访问 Greasy Fork,然后点击\"安装此脚本\":",
+ "button": "前往 Greasy Fork 安装脚本"
+ },
+ "notes": {
+ "title": "注意事项:",
+ "items": [
+ "安装后脚本会自动运行并开始拦截匹配规则的脚本请求",
+ "脚本已在 Chrome 87+ 版本测试通过",
+ "其他浏览器可能需要额外配置"
+ ]
+ }
+ },
+ "source": {
+ "tabs": {
+ "npm": "使用 NPM",
+ "yarn": "使用 Yarn"
+ },
+ "step1": {
+ "title": "步骤 1:克隆仓库",
+ "command": "git clone https://github.com/JSREI/js-script-hook.git"
+ },
+ "step2": {
+ "title": "步骤 2:进入项目目录",
+ "command": "cd js-script-hook"
+ },
+ "step3": {
+ "title": "步骤 3:安装依赖并构建",
+ "npmCommand": "npm install && npm run build",
+ "yarnCommand": "yarn install && yarn build"
+ },
+ "copy": "复制",
+ "copied": "已复制",
+ "usage": {
+ "title": "使用示例",
+ "description": "构建完成后,可以通过以下方式在您的项目中使用:"
+ }
+ }
+ },
+ "support": {
+ "title": "支持与贡献",
+ "description": "加入我们的社区,共同推动项目发展",
+ "error": {
+ "githubApiFailed": "GitHub API 请求失败",
+ "failedToLoad": "获取贡献者数据失败",
+ "cannotLoadContributors": "无法加载贡献者数据"
+ },
+ "feedback": {
+ "title": "问题反馈",
+ "description": "遇到问题时,请通过GitHub Issues进行反馈。这有助于我们追踪和解决问题,同时也方便其他用户查阅。",
+ "createIssue": "创建Issue"
+ },
+ "contributors": {
+ "title": "贡献者",
+ "description": "感谢所有为项目做出贡献的开发者。欢迎提交PR,提升产品功能。",
+ "loading": "正在加载贡献者数据...",
+ "commits": "次提交",
+ "avatarAlt": "{{username}}的头像"
+ }
+ },
+ "community": {
+ "title": "逆向技术交流群",
+ "description": "加入我们的交流群,获取最新信息与技术支持",
+ "qrCode": "{{group}}二维码",
+ "clickHere": "点此",
+ "orScanCode": "或扫码加入TG交流群",
+ "groups": {
+ "wechat": {
+ "title": "微信交流群",
+ "description": "扫码加入逆向技术微信交流群"
+ },
+ "personalWechat": {
+ "title": "个人微信",
+ "description": "群二维码过期,可加此微信发送【逆向群】"
+ },
+ "telegram": {
+ "title": "Telegram交流群",
+ "description": "点击或扫码加入TG交流群"
+ }
+ }
+ },
+ "footer": {
+ "description": "用于辅助逆向script类型请求的工具,帮助分析和调试脚本请求。",
+ "links": {
+ "title": "链接",
+ "issues": "问题反馈",
+ "license": "许可协议"
+ },
+ "resources": {
+ "title": "资源",
+ "installation": "安装指南",
+ "documentation": "文档"
+ },
+ "copyright": "保留所有权利。",
+ "developedBy": "由",
+ "team": "团队开发"
+ },
+ "github": {
+ "viewOnGithub": "在GitHub上查看"
+ },
+ "monitor": {
+ "defaultImageAlt": "功能演示",
+ "powerButton": {
+ "turnOn": "打开显示器",
+ "turnOff": "关闭显示器"
+ }
+ },
+ "html": {
+ "title": "JS Script Hook - 官方网站",
+ "description": "JS Script Hook - 高级JavaScript脚本钩子工具",
+ "noscript": "您需要启用JavaScript才能运行此应用。"
+ },
+ "starHistory": {
+ "title": "Star历史",
+ "description": "项目自创建以来的GitHub星标增长趋势,感谢社区的持续支持!",
+ "chartAlt": "Star历史图表",
+ "likeCta": "喜欢这个项目?给我们点个Star吧!",
+ "starButton": "Star支持一下"
+ },
+ "socialShare": {
+ "title": "分享给朋友",
+ "defaultTitle": "JS Script Hook - 高级JavaScript脚本钩子工具",
+ "defaultDescription": "一个功能强大的JavaScript脚本钩子库,支持多种拦截方式和丰富的自定义选项",
+ "shareOn": "分享到{{platform}}",
+ "copiedToClipboard": "链接已复制到剪贴板",
+ "copyLink": "复制链接"
+ },
+ "richText": {
+ "welcome": "欢迎使用 JS Script Hook ,Web逆向工程的得力助手!",
+ "installGuide": "安装非常简单,只需要点击这里 即可获取最新版本。",
+ "apiUsage": "查看 JS Script Hook 的 API文档 了解更多用法。",
+ "news": "最新版本 {{version}} 已发布,包含许多新特性和改进!",
+ "supportInfo": "如果您在使用过程中遇到任何问题,欢迎在GitHub Issues 上反馈,或加入我们的社区获取帮助。"
+ }
+}
\ No newline at end of file
diff --git a/script-hook-website/src/index.css b/script-hook-website/src/index.css
new file mode 100644
index 0000000..4850145
--- /dev/null
+++ b/script-hook-website/src/index.css
@@ -0,0 +1,43 @@
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: 'Roboto', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Oxygen',
+ 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
+ sans-serif;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ background-color: #f5f5f5;
+ color: #333;
+}
+
+code {
+ font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
+ monospace;
+ background-color: #f1f1f1;
+ padding: 2px 4px;
+ border-radius: 3px;
+}
+
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 0 20px;
+}
+
+a {
+ color: #1976d2;
+ text-decoration: none;
+ transition: color 0.3s;
+}
+
+a:hover {
+ color: #0d47a1;
+}
+
+button {
+ cursor: pointer;
+}
\ No newline at end of file
diff --git a/script-hook-website/src/index.tsx b/script-hook-website/src/index.tsx
new file mode 100644
index 0000000..4328710
--- /dev/null
+++ b/script-hook-website/src/index.tsx
@@ -0,0 +1,16 @@
+import React from 'react';
+import ReactDOM from 'react-dom/client';
+import './index.css';
+import App from './App';
+// 引入i18n配置
+import './i18n';
+
+const root = ReactDOM.createRoot(
+ document.getElementById('root') as HTMLElement
+);
+
+root.render(
+
+
+
+);
\ No newline at end of file
diff --git a/script-hook-website/src/utils/dateUtils.ts b/script-hook-website/src/utils/dateUtils.ts
new file mode 100644
index 0000000..5de41e3
--- /dev/null
+++ b/script-hook-website/src/utils/dateUtils.ts
@@ -0,0 +1,71 @@
+import i18next from 'i18next';
+
+/**
+ * 根据当前语言格式化日期
+ * Format date based on current language
+ */
+export const formatDate = (date: Date | string | number): string => {
+ const dateObj = new Date(date);
+ const language = i18next.language.split('-')[0];
+
+ try {
+ // 使用Intl.DateTimeFormat进行本地化格式化
+ return new Intl.DateTimeFormat(language === 'zh' ? 'zh-CN' : 'en-US', {
+ year: 'numeric',
+ month: 'short',
+ day: 'numeric'
+ }).format(dateObj);
+ } catch (error) {
+ // 降级处理,使用基本格式
+ return dateObj.toLocaleDateString();
+ }
+};
+
+/**
+ * 根据当前语言获取相对时间描述(例如:3天前)
+ * Get relative time description based on current language (e.g., 3 days ago)
+ */
+export const getRelativeTime = (date: Date | string | number): string => {
+ const dateObj = new Date(date);
+ const now = new Date();
+ const diffInSeconds = Math.floor((now.getTime() - dateObj.getTime()) / 1000);
+ const language = i18next.language.split('-')[0];
+
+ try {
+ // 使用Intl.RelativeTimeFormat进行相对时间的本地化
+ const rtf = new Intl.RelativeTimeFormat(language === 'zh' ? 'zh-CN' : 'en-US', {
+ numeric: 'auto'
+ });
+
+ if (diffInSeconds < 60) {
+ return rtf.format(-Math.floor(diffInSeconds), 'second');
+ } else if (diffInSeconds < 3600) {
+ return rtf.format(-Math.floor(diffInSeconds / 60), 'minute');
+ } else if (diffInSeconds < 86400) {
+ return rtf.format(-Math.floor(diffInSeconds / 3600), 'hour');
+ } else if (diffInSeconds < 2592000) {
+ return rtf.format(-Math.floor(diffInSeconds / 86400), 'day');
+ } else if (diffInSeconds < 31536000) {
+ return rtf.format(-Math.floor(diffInSeconds / 2592000), 'month');
+ } else {
+ return rtf.format(-Math.floor(diffInSeconds / 31536000), 'year');
+ }
+ } catch (error) {
+ // 降级处理,返回格式化的日期
+ return formatDate(dateObj);
+ }
+};
+
+/**
+ * 本地化数字格式
+ * Localize number format
+ */
+export const formatNumber = (num: number): string => {
+ const language = i18next.language.split('-')[0];
+
+ try {
+ return new Intl.NumberFormat(language === 'zh' ? 'zh-CN' : 'en-US').format(num);
+ } catch (error) {
+ return num.toString();
+ }
+};
\ No newline at end of file
diff --git a/script-hook-website/src/utils/urlUtils.ts b/script-hook-website/src/utils/urlUtils.ts
new file mode 100644
index 0000000..8285133
--- /dev/null
+++ b/script-hook-website/src/utils/urlUtils.ts
@@ -0,0 +1,83 @@
+import i18next from 'i18next';
+
+/**
+ * 获取基于当前语言的链接
+ * Get links based on current language
+ */
+export const getLocalizedLink = (key: string): string => {
+ const language = i18next.language.split('-')[0];
+
+ // 这里定义可能需要本地化的链接映射表
+ const linkMap: Record> = {
+ // GitHub 相关链接
+ 'github': {
+ 'zh': 'https://github.com/JSREI/js-script-hook',
+ 'en': 'https://github.com/JSREI/js-script-hook'
+ },
+ 'issues': {
+ 'zh': 'https://github.com/JSREI/js-script-hook/issues',
+ 'en': 'https://github.com/JSREI/js-script-hook/issues'
+ },
+ 'releases': {
+ 'zh': 'https://github.com/JSREI/js-script-hook/releases',
+ 'en': 'https://github.com/JSREI/js-script-hook/releases'
+ },
+
+ // 文档相关链接
+ 'docs': {
+ 'zh': 'https://github.com/JSREI/js-script-hook/blob/main/README.md',
+ 'en': 'https://github.com/JSREI/js-script-hook/blob/main/README.md'
+ },
+
+ // Greasy Fork 安装链接
+ 'greasyfork': {
+ 'zh': 'https://greasyfork.org/zh-CN/scripts/443008-js-script-hook',
+ 'en': 'https://greasyfork.org/en/scripts/443008-js-script-hook'
+ },
+
+ // 扩展商店链接
+ 'tampermonkey': {
+ 'zh': 'https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo',
+ 'en': 'https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo'
+ },
+ 'violentmonkey': {
+ 'zh': 'https://chrome.google.com/webstore/detail/violentmonkey/jinjaccalgkegednnccohejagnlnfdag',
+ 'en': 'https://chrome.google.com/webstore/detail/violentmonkey/jinjaccalgkegednnccohejagnlnfdag'
+ }
+ };
+
+ // 如果找不到对应语言的链接或者链接本身不存在,返回英文版或空字符串
+ if (!linkMap[key]) {
+ console.warn(`Link key "${key}" not found in localized links`);
+ return '';
+ }
+
+ return linkMap[key][language] || linkMap[key]['en'] || '';
+};
+
+/**
+ * 获取语言化的API路径
+ * Get localized API paths
+ */
+export const getLocalizedApiPath = (key: string): string => {
+ const language = i18next.language.split('-')[0];
+
+ // 这里定义需要本地化的API路径
+ const apiMap: Record> = {
+ 'contributors': {
+ 'zh': 'https://api.github.com/repos/JSREI/js-script-hook/contributors?per_page=10',
+ 'en': 'https://api.github.com/repos/JSREI/js-script-hook/contributors?per_page=10'
+ },
+ 'starHistory': {
+ 'zh': 'https://api.star-history.com/svg?repos=JSREI/js-script-hook&type=Date',
+ 'en': 'https://api.star-history.com/svg?repos=JSREI/js-script-hook&type=Date'
+ }
+ };
+
+ if (!apiMap[key]) {
+ console.warn(`API key "${key}" not found in localized API paths`);
+ return '';
+ }
+
+ return apiMap[key][language] || apiMap[key]['en'] || '';
+};
\ No newline at end of file
diff --git a/script-hook-website/tsconfig.json b/script-hook-website/tsconfig.json
new file mode 100644
index 0000000..29067b6
--- /dev/null
+++ b/script-hook-website/tsconfig.json
@@ -0,0 +1,21 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": ["dom", "dom.iterable", "esnext"],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "esModuleInterop": true,
+ "allowSyntheticDefaultImports": true,
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "noFallthroughCasesInSwitch": true,
+ "module": "esnext",
+ "moduleResolution": "node",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": false,
+ "jsx": "react-jsx",
+ "outDir": "./dist"
+ },
+ "include": ["src"]
+}
\ No newline at end of file
diff --git a/script-hook-website/webpack.config.js b/script-hook-website/webpack.config.js
new file mode 100644
index 0000000..4db4b80
--- /dev/null
+++ b/script-hook-website/webpack.config.js
@@ -0,0 +1,71 @@
+const path = require('path');
+const HtmlWebpackPlugin = require('html-webpack-plugin');
+
+module.exports = (env, argv) => {
+ const isProduction = argv.mode === 'production';
+
+ return {
+ entry: './src/index.tsx',
+ output: {
+ path: path.resolve(__dirname, 'dist'),
+ filename: '[name].[contenthash:8].js',
+ publicPath: isProduction ? './' : '/',
+ clean: true,
+ },
+ resolve: {
+ extensions: ['.ts', '.tsx', '.js', '.jsx'],
+ },
+ module: {
+ rules: [
+ {
+ test: /\.tsx?$/,
+ use: 'ts-loader',
+ exclude: /node_modules/,
+ },
+ {
+ test: /\.css$/,
+ use: ['style-loader', 'css-loader'],
+ },
+ {
+ test: /\.(png|jpe?g|gif|svg)$/i,
+ type: 'asset/resource',
+ },
+ ],
+ },
+ plugins: [
+ new HtmlWebpackPlugin({
+ template: './public/index.html',
+ meta: {
+ 'Cache-Control': {'http-equiv': 'Cache-Control', 'content': 'no-cache, no-store, must-revalidate'},
+ 'Pragma': {'http-equiv': 'Pragma', 'content': 'no-cache'},
+ 'Expires': {'http-equiv': 'Expires', 'content': '0'}
+ }
+ }),
+ ],
+ devServer: {
+ static: {
+ directory: path.join(__dirname, 'public'),
+ },
+ compress: true,
+ port: 'auto',
+ hot: true,
+ historyApiFallback: true,
+ devMiddleware: {
+ publicPath: '/'
+ }
+ },
+ optimization: {
+ runtimeChunk: 'single',
+ splitChunks: {
+ chunks: 'all',
+ cacheGroups: {
+ vendor: {
+ test: /[\\/]node_modules[\\/]/,
+ name: 'vendors',
+ chunks: 'all',
+ },
+ },
+ },
+ },
+ };
+};
\ No newline at end of file