From 538de50bb1a4e55340abbd24a7382771c6b5627e Mon Sep 17 00:00:00 2001 From: yuzhiran-dev Date: Mon, 1 Jun 2026 23:14:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B3=A8=E5=86=8C=E6=94=AF=E6=8C=81=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=90=8D/=E6=89=8B=E6=9C=BA=E5=8F=B7/=E9=82=AE?= =?UTF-8?q?=E7=AE=B1=20+=20=E9=95=9C=E5=83=8F=E7=AB=99=E9=83=A8=E7=BD=B2?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=20+=20AI=20=E5=8A=A9=E6=89=8B=20Tool=20Calli?= =?UTF-8?q?ng=20=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Prisma User 模型新增 username 字段(唯一索引) - 注册先查重复再创建,返回友好中文提示(非 500) - 登录支持用户名/手机号/邮箱三种方式 - 前端注册表单增加用户名输入框,预校验 2-20 位格式 - 新增 scripts/deploy.sh:一键构建并部署主站+镜像站+重启后端+重载 Nginx - 镜像站 www.yuzhiran.com.cn Nginx 配置与主站同步 - AI 助手架构升级:用户端/管理后台均采用完整 Tool Calling 架构 - 新增 UserAiAssistantService(18 工具)+ AiAssistantController - admin 助手新增 search + mark-all-notifications-read 工具 - 修复注册 500 错误:catch Prisma P2002 → BadRequestException - Baidu Analytics Script 注入 root layout --- .github/workflows/ci.yml | 97 - .gitignore | 0 AGENTS.md | 2 +- README.md | 0 backend/.dockerignore | 0 backend/.env.example | 0 backend/.eslintrc.js | 23 + backend/Dockerfile | 0 backend/admin/index.html | 0 backend/jest-e2e.json | 0 backend/jest.config.json | 0 backend/nest-cli.json | 0 backend/package-lock.json | 1569 +++++- backend/package.json | 6 +- backend/prisma/schema.prisma | 23 +- backend/prisma/seed.d.ts | 0 backend/prisma/seed.js | 0 backend/prisma/seed.ts | 0 backend/prisma/tsconfig.json | 0 backend/src/app.module.ts | 27 +- .../common/filters/global-exception.filter.ts | 0 backend/src/common/index.ts | 0 .../interceptors/logging.interceptor.ts | 0 backend/src/main.ts | 0 backend/src/modules/admin/admin.controller.ts | 127 +- backend/src/modules/admin/admin.guard.ts | 0 backend/src/modules/admin/admin.module.ts | 3 +- backend/src/modules/admin/admin.service.ts | 0 .../src/modules/admin/ai-assistant.service.ts | 35 + .../src/modules/admin/analytics.controller.ts | 0 .../modules/admin/operations.controller.ts | 0 .../src/modules/admin/public.controller.ts | 0 .../src/modules/admin/settings.controller.ts | 0 .../modules/admin/tests/admin.service.spec.ts | 0 backend/src/modules/admin/users.controller.ts | 0 .../ai-assistant/ai-assistant.controller.ts | 73 + .../ai-assistant/ai-assistant.module.ts | 13 + .../ai-assistant/ai-assistant.service.ts | 431 ++ backend/src/modules/ai/ai-gateway.service.ts | 0 backend/src/modules/ai/ai.module.ts | 0 .../ai/tests/ai-gateway.service.spec.ts | 0 backend/src/modules/auth/auth.controller.ts | 3 +- backend/src/modules/auth/auth.module.ts | 0 backend/src/modules/auth/auth.service.ts | 31 +- backend/src/modules/auth/dto/login.dto.ts | 11 + backend/src/modules/auth/dto/register.dto.ts | 10 +- backend/src/modules/auth/jwt.strategy.ts | 0 .../modules/auth/tests/auth.service.spec.ts | 0 .../categories/categories.controller.ts | 0 .../modules/categories/categories.module.ts | 0 .../modules/community/circles.controller.ts | 0 .../modules/community/community.controller.ts | 0 .../src/modules/community/community.module.ts | 0 .../modules/community/community.service.ts | 0 .../community/tests/community.service.spec.ts | 0 .../modules/contents/contents.controller.ts | 0 .../src/modules/contents/contents.module.ts | 0 .../src/modules/contents/contents.service.ts | 0 .../src/modules/courses/courses.controller.ts | 0 backend/src/modules/courses/courses.module.ts | 0 .../src/modules/courses/courses.service.ts | 0 .../courses/tests/courses.service.spec.ts | 0 .../modules/dashboard/dashboard.controller.ts | 0 .../src/modules/dashboard/dashboard.module.ts | 0 .../modules/dashboard/dashboard.service.ts | 0 .../enterprise/enterprise.controller.ts | 0 .../modules/enterprise/enterprise.module.ts | 0 .../modules/enterprise/enterprise.service.ts | 0 .../tests/enterprise.service.spec.ts | 0 .../modules/learning/learning.controller.ts | 0 .../src/modules/learning/learning.module.ts | 0 .../src/modules/learning/learning.service.ts | 0 .../src/modules/models/models.controller.ts | 0 backend/src/modules/models/models.module.ts | 0 backend/src/modules/models/models.service.ts | 0 .../notifications/notification.controller.ts | 0 .../notifications/notification.module.ts | 0 .../notifications/notification.service.ts | 0 .../src/modules/orders/orders.controller.ts | 0 backend/src/modules/orders/orders.module.ts | 0 backend/src/modules/orders/orders.service.ts | 112 +- .../orders/subscriptions.controller.ts | 0 .../orders/tests/orders.service.spec.ts | 106 +- backend/src/modules/payment/alipay.service.ts | 300 ++ .../modules/payment/gateway-pay.service.ts | 321 ++ .../modules/payment/payment-config.service.ts | 72 + .../src/modules/payment/payment.controller.ts | 69 +- backend/src/modules/payment/payment.module.ts | 9 +- .../src/modules/payment/payment.service.ts | 6 +- .../payment/tests/payment.service.spec.ts | 0 .../src/modules/prompts/prompts.controller.ts | 0 backend/src/modules/prompts/prompts.module.ts | 0 .../src/modules/prompts/prompts.service.ts | 0 .../prompts/tests/prompts.service.spec.ts | 0 .../sandbox/sandbox-share.controller.ts | 0 .../src/modules/sandbox/sandbox.controller.ts | 0 backend/src/modules/sandbox/sandbox.module.ts | 0 .../src/modules/sandbox/sandbox.service.ts | 0 .../sandbox/tests/sandbox.service.spec.ts | 0 .../src/modules/search/search.controller.ts | 0 backend/src/modules/search/search.module.ts | 0 backend/src/modules/search/search.service.ts | 0 .../search/tests/search.service.spec.ts | 0 .../src/modules/skills/skills.controller.ts | 0 backend/src/modules/skills/skills.module.ts | 0 backend/src/modules/skills/skills.service.ts | 0 .../modules/tools/tests/tools.service.spec.ts | 0 backend/src/modules/tools/tools.controller.ts | 0 backend/src/modules/tools/tools.module.ts | 0 backend/src/modules/tools/tools.service.ts | 0 .../src/modules/upload/upload.controller.ts | 0 backend/src/modules/upload/upload.module.ts | 0 backend/src/modules/upload/upload.service.ts | 0 .../modules/users/tests/users.service.spec.ts | 0 backend/src/modules/users/users.controller.ts | 0 backend/src/modules/users/users.module.ts | 0 backend/src/modules/users/users.service.ts | 0 backend/src/prisma/prisma.module.ts | 0 backend/src/prisma/prisma.service.ts | 0 backend/test/app.e2e-spec.ts | 0 backend/tsconfig.json | 1 + backend/tsconfig.tsbuildinfo | 1 - .../843b1def-80bc-4339-9795-5a792512b1f4.png | Bin .../bba131c5-d294-46ae-a944-f07d0efe24fa.png | Bin .../d45cadcc-795c-4a2c-99c6-d08119c8ce7b.png | Bin docker-compose.yml | 74 - docs/admin-system-plan.md | 0 ...rogress-2026-05-12-before-notifications.md | 0 docs/design-tokens.md | 0 docs/progress.md | 239 +- docs/产品优化方向.md | 0 docs/产品规划书.md | 0 docs/合规与运营方案.md | 0 docs/技术架构设计.md | 0 ecosystem.config.js | 22 +- frontend/.dockerignore | 0 frontend/.env.example | 0 frontend/.eslintrc.json | 4 + frontend/.gitignore | 0 frontend/Dockerfile | 10 +- frontend/e2e/admin-pages.spec.ts | 0 frontend/e2e/dark-mode.spec.ts | 0 frontend/e2e/functional-pages.spec.ts | 0 frontend/e2e/homepage.spec.ts | 0 frontend/e2e/listing-pages.spec.ts | 0 frontend/e2e/navigation.spec.ts | 0 frontend/e2e/not-found.spec.ts | 0 frontend/e2e/static-pages.spec.ts | 0 frontend/e2e/user-pages.spec.ts | 0 frontend/next-env.d.ts | 0 frontend/next.config.js | 2 +- frontend/package-lock.json | 4739 ++++++++++++++++- frontend/package.json | 4 + frontend/playwright.config.ts | 0 frontend/postcss.config.js | 0 frontend/public/favicon.ico | Bin frontend/public/favicon.png | Bin frontend/public/icon.svg | 0 frontend/public/images/beian/gongan-beian.png | Bin 0 -> 1403 bytes frontend/public/images/yzr/kefu.png | Bin 0 -> 207462 bytes frontend/public/images/yzr/yuzhiran-tech.jpg | Bin 0 -> 27512 bytes frontend/public/images/yzr/yuzhiran-yhl.jpg | Bin 0 -> 48674 bytes frontend/public/images/yzr/yuzhiran.jpg | Bin 0 -> 27802 bytes frontend/server.js | 0 frontend/src/app/__tests__/home.test.tsx | 12 +- frontend/src/app/about/page.tsx | 0 frontend/src/app/admin/analytics/page.tsx | 0 frontend/src/app/admin/comments/page.tsx | 0 .../app/admin/contents/[id]/edit-content.tsx | 0 frontend/src/app/admin/contents/[id]/page.tsx | 0 frontend/src/app/admin/contents/new/page.tsx | 0 frontend/src/app/admin/contents/page.tsx | 0 .../app/admin/courses/[id]/edit-course.tsx | 0 frontend/src/app/admin/courses/[id]/page.tsx | 0 frontend/src/app/admin/courses/new/page.tsx | 0 frontend/src/app/admin/courses/page.tsx | 0 .../app/admin/enterprise/[id]/org-detail.tsx | 0 .../src/app/admin/enterprise/[id]/page.tsx | 0 .../app/admin/enterprise/[id]/report/page.tsx | 0 .../enterprise/[id]/report/report-page.tsx | 0 frontend/src/app/admin/enterprise/page.tsx | 0 frontend/src/app/admin/layout.tsx | 0 frontend/src/app/admin/login/page.tsx | 0 .../src/app/admin/operations/banners/page.tsx | 0 .../admin/operations/notifications/page.tsx | 0 frontend/src/app/admin/orders/page.tsx | 235 +- frontend/src/app/admin/page.tsx | 0 .../src/app/admin/prompts/[id]/client.tsx | 0 frontend/src/app/admin/prompts/[id]/page.tsx | 0 frontend/src/app/admin/prompts/new/page.tsx | 0 frontend/src/app/admin/prompts/page.tsx | 0 .../src/app/admin/settings/config/page.tsx | 0 .../src/app/admin/settings/roles/page.tsx | 0 frontend/src/app/admin/tools/[id]/client.tsx | 0 frontend/src/app/admin/tools/[id]/page.tsx | 0 frontend/src/app/admin/tools/new/page.tsx | 0 frontend/src/app/admin/tools/page.tsx | 0 frontend/src/app/admin/users/page.tsx | 0 frontend/src/app/ai-agreement/page.tsx | 0 frontend/src/app/auth/page.tsx | 43 +- frontend/src/app/circles/[id]/client.tsx | 0 frontend/src/app/circles/[id]/page.tsx | 0 frontend/src/app/circles/page.tsx | 0 frontend/src/app/community/[id]/client.tsx | 0 frontend/src/app/community/[id]/page.tsx | 0 frontend/src/app/community/page.tsx | 0 frontend/src/app/contents/[id]/client.tsx | 0 frontend/src/app/contents/[id]/page.tsx | 0 frontend/src/app/contents/page.tsx | 0 frontend/src/app/courses/[id]/client.tsx | 0 frontend/src/app/courses/[id]/page.tsx | 0 .../app/courses/__tests__/courses.vitest.tsx | 0 frontend/src/app/courses/page.tsx | 0 frontend/src/app/dashboard/page.tsx | 0 frontend/src/app/discover/daily/page.tsx | 0 frontend/src/app/discover/hot/page.tsx | 0 frontend/src/app/discover/page.tsx | 0 frontend/src/app/discover/tools/page.tsx | 0 frontend/src/app/error.tsx | 0 frontend/src/app/favicon.png | Bin frontend/src/app/global-error.tsx | 0 frontend/src/app/globals.css | 0 frontend/src/app/home-client.tsx | 0 frontend/src/app/layout-client.tsx | 0 frontend/src/app/layout.tsx | 10 + frontend/src/app/learning/analytics/page.tsx | 0 frontend/src/app/learning/path/page.tsx | 0 frontend/src/app/models/page.tsx | 0 frontend/src/app/my/dashboard/page.tsx | 0 frontend/src/app/my/favorites/page.tsx | 0 frontend/src/app/my/learning/page.tsx | 0 frontend/src/app/my/member/page.tsx | 94 +- frontend/src/app/my/page.tsx | 0 frontend/src/app/my/settings/page.tsx | 0 frontend/src/app/not-found.tsx | 0 frontend/src/app/notifications/page.tsx | 0 frontend/src/app/page.tsx | 0 frontend/src/app/privacy/page.tsx | 0 .../app/prompts/__tests__/prompts.vitest.tsx | 0 frontend/src/app/prompts/page.tsx | 0 frontend/src/app/prompts/workshop/page.tsx | 0 frontend/src/app/sandbox/code/page.tsx | 0 frontend/src/app/sandbox/compare/page.tsx | 0 frontend/src/app/sandbox/page.tsx | 0 frontend/src/app/sandbox/share/page.tsx | 0 frontend/src/app/search/page.tsx | 0 frontend/src/app/skills/[id]/client.tsx | 0 frontend/src/app/skills/[id]/page.tsx | 0 frontend/src/app/skills/page.tsx | 0 frontend/src/app/terms/page.tsx | 0 frontend/src/app/tools/page.tsx | 0 frontend/src/app/users/[id]/page.tsx | 0 frontend/src/app/users/[id]/user-profile.tsx | 0 .../src/components/admin-ai-assistant.tsx | 6 +- frontend/src/components/ai-assistant.tsx | 237 +- .../layout/__tests__/footer.test.tsx | 24 +- .../layout/__tests__/header.vitest.tsx | 0 frontend/src/components/layout/footer.tsx | 64 +- frontend/src/components/layout/header.tsx | 0 .../components/providers/theme-provider.tsx | 0 .../src/components/sandbox/learning-path.tsx | 0 frontend/src/components/ui/avatar.tsx | 0 frontend/src/components/ui/badge.tsx | 0 frontend/src/components/ui/button.tsx | 0 frontend/src/components/ui/card.tsx | 0 frontend/src/components/ui/code-block.tsx | 0 frontend/src/components/ui/dialog.tsx | 0 frontend/src/components/ui/input.tsx | 0 frontend/src/components/ui/model-selector.tsx | 0 frontend/src/components/ui/payment-modal.tsx | 122 +- frontend/src/components/ui/progress.tsx | 0 frontend/src/components/ui/skeleton.tsx | 0 frontend/src/components/ui/sonner.tsx | 0 frontend/src/components/ui/tabs.tsx | 0 frontend/src/components/ui/theme-toggle.tsx | 0 frontend/src/components/ui/tooltip.tsx | 0 frontend/src/i18n/index.ts | 0 frontend/src/i18n/locales/en.ts | 4 +- frontend/src/i18n/locales/zh.ts | 4 +- frontend/src/i18n/provider.tsx | 0 frontend/src/i18n/use-t.ts | 0 frontend/src/lib/assistant-actions.ts | 86 +- frontend/src/lib/assistant-context.ts | 90 +- frontend/src/lib/auth-context.tsx | 0 frontend/src/lib/auth.ts | 0 frontend/src/lib/config.ts | 2 +- frontend/src/lib/models.ts | 0 frontend/src/lib/utils.ts | 0 frontend/src/lib/wechat.ts | 0 frontend/src/test/setup.ts | 0 frontend/tailwind.config.js | 0 frontend/tsconfig.json | 1 + frontend/tsconfig.tsbuildinfo | 1 + frontend/vitest.config.ts | 0 mobile/index.html | 0 mobile/package.json | 0 mobile/src/App.vue | 0 mobile/src/api/index.ts | 0 mobile/src/env.d.ts | 0 mobile/src/main.ts | 0 mobile/src/manifest.json | 0 mobile/src/pages.json | 0 mobile/src/pages/circle-detail/index.vue | 0 mobile/src/pages/circles/index.vue | 0 mobile/src/pages/community/index.vue | 0 mobile/src/pages/course-detail/index.vue | 0 mobile/src/pages/courses/index.vue | 0 mobile/src/pages/create-post/index.vue | 0 mobile/src/pages/favorites/index.vue | 0 mobile/src/pages/index/index.vue | 0 mobile/src/pages/learning-progress/index.vue | 0 mobile/src/pages/lesson/index.vue | 0 mobile/src/pages/login/index.vue | 0 mobile/src/pages/membership/index.vue | 0 mobile/src/pages/post-detail/index.vue | 0 mobile/src/pages/profile/index.vue | 0 mobile/src/pages/prompt-detail/index.vue | 0 mobile/src/pages/prompts/index.vue | 0 mobile/src/pages/register/index.vue | 0 mobile/src/pages/sandbox/index.vue | 0 mobile/src/pages/search/index.vue | 0 mobile/src/store/user.ts | 0 mobile/src/styles/variables.css | 0 mobile/src/utils/request.ts | 0 mobile/src/utils/storage.ts | 0 mobile/tsconfig.json | 0 mobile/vite.config.ts | 0 scripts/deploy.sh | 35 + scripts/init.sql | 0 329 files changed, 8777 insertions(+), 868 deletions(-) delete mode 100644 .github/workflows/ci.yml mode change 100644 => 100755 .gitignore mode change 100644 => 100755 AGENTS.md mode change 100644 => 100755 README.md mode change 100644 => 100755 backend/.dockerignore mode change 100644 => 100755 backend/.env.example create mode 100644 backend/.eslintrc.js mode change 100644 => 100755 backend/Dockerfile mode change 100644 => 100755 backend/admin/index.html mode change 100644 => 100755 backend/jest-e2e.json mode change 100644 => 100755 backend/jest.config.json mode change 100644 => 100755 backend/nest-cli.json mode change 100644 => 100755 backend/package-lock.json mode change 100644 => 100755 backend/package.json mode change 100644 => 100755 backend/prisma/schema.prisma mode change 100644 => 100755 backend/prisma/seed.d.ts mode change 100644 => 100755 backend/prisma/seed.js mode change 100644 => 100755 backend/prisma/seed.ts mode change 100644 => 100755 backend/prisma/tsconfig.json mode change 100644 => 100755 backend/src/app.module.ts mode change 100644 => 100755 backend/src/common/filters/global-exception.filter.ts mode change 100644 => 100755 backend/src/common/index.ts mode change 100644 => 100755 backend/src/common/interceptors/logging.interceptor.ts mode change 100644 => 100755 backend/src/main.ts mode change 100644 => 100755 backend/src/modules/admin/admin.controller.ts mode change 100644 => 100755 backend/src/modules/admin/admin.guard.ts mode change 100644 => 100755 backend/src/modules/admin/admin.module.ts mode change 100644 => 100755 backend/src/modules/admin/admin.service.ts mode change 100644 => 100755 backend/src/modules/admin/ai-assistant.service.ts mode change 100644 => 100755 backend/src/modules/admin/analytics.controller.ts mode change 100644 => 100755 backend/src/modules/admin/operations.controller.ts mode change 100644 => 100755 backend/src/modules/admin/public.controller.ts mode change 100644 => 100755 backend/src/modules/admin/settings.controller.ts mode change 100644 => 100755 backend/src/modules/admin/tests/admin.service.spec.ts mode change 100644 => 100755 backend/src/modules/admin/users.controller.ts create mode 100644 backend/src/modules/ai-assistant/ai-assistant.controller.ts create mode 100644 backend/src/modules/ai-assistant/ai-assistant.module.ts create mode 100644 backend/src/modules/ai-assistant/ai-assistant.service.ts mode change 100644 => 100755 backend/src/modules/ai/ai-gateway.service.ts mode change 100644 => 100755 backend/src/modules/ai/ai.module.ts mode change 100644 => 100755 backend/src/modules/ai/tests/ai-gateway.service.spec.ts mode change 100644 => 100755 backend/src/modules/auth/auth.controller.ts mode change 100644 => 100755 backend/src/modules/auth/auth.module.ts mode change 100644 => 100755 backend/src/modules/auth/auth.service.ts create mode 100644 backend/src/modules/auth/dto/login.dto.ts mode change 100644 => 100755 backend/src/modules/auth/dto/register.dto.ts mode change 100644 => 100755 backend/src/modules/auth/jwt.strategy.ts mode change 100644 => 100755 backend/src/modules/auth/tests/auth.service.spec.ts mode change 100644 => 100755 backend/src/modules/categories/categories.controller.ts mode change 100644 => 100755 backend/src/modules/categories/categories.module.ts mode change 100644 => 100755 backend/src/modules/community/circles.controller.ts mode change 100644 => 100755 backend/src/modules/community/community.controller.ts mode change 100644 => 100755 backend/src/modules/community/community.module.ts mode change 100644 => 100755 backend/src/modules/community/community.service.ts mode change 100644 => 100755 backend/src/modules/community/tests/community.service.spec.ts mode change 100644 => 100755 backend/src/modules/contents/contents.controller.ts mode change 100644 => 100755 backend/src/modules/contents/contents.module.ts mode change 100644 => 100755 backend/src/modules/contents/contents.service.ts mode change 100644 => 100755 backend/src/modules/courses/courses.controller.ts mode change 100644 => 100755 backend/src/modules/courses/courses.module.ts mode change 100644 => 100755 backend/src/modules/courses/courses.service.ts mode change 100644 => 100755 backend/src/modules/courses/tests/courses.service.spec.ts mode change 100644 => 100755 backend/src/modules/dashboard/dashboard.controller.ts mode change 100644 => 100755 backend/src/modules/dashboard/dashboard.module.ts mode change 100644 => 100755 backend/src/modules/dashboard/dashboard.service.ts mode change 100644 => 100755 backend/src/modules/enterprise/enterprise.controller.ts mode change 100644 => 100755 backend/src/modules/enterprise/enterprise.module.ts mode change 100644 => 100755 backend/src/modules/enterprise/enterprise.service.ts mode change 100644 => 100755 backend/src/modules/enterprise/tests/enterprise.service.spec.ts mode change 100644 => 100755 backend/src/modules/learning/learning.controller.ts mode change 100644 => 100755 backend/src/modules/learning/learning.module.ts mode change 100644 => 100755 backend/src/modules/learning/learning.service.ts mode change 100644 => 100755 backend/src/modules/models/models.controller.ts mode change 100644 => 100755 backend/src/modules/models/models.module.ts mode change 100644 => 100755 backend/src/modules/models/models.service.ts mode change 100644 => 100755 backend/src/modules/notifications/notification.controller.ts mode change 100644 => 100755 backend/src/modules/notifications/notification.module.ts mode change 100644 => 100755 backend/src/modules/notifications/notification.service.ts mode change 100644 => 100755 backend/src/modules/orders/orders.controller.ts mode change 100644 => 100755 backend/src/modules/orders/orders.module.ts mode change 100644 => 100755 backend/src/modules/orders/orders.service.ts mode change 100644 => 100755 backend/src/modules/orders/subscriptions.controller.ts mode change 100644 => 100755 backend/src/modules/orders/tests/orders.service.spec.ts create mode 100644 backend/src/modules/payment/alipay.service.ts create mode 100644 backend/src/modules/payment/gateway-pay.service.ts create mode 100644 backend/src/modules/payment/payment-config.service.ts mode change 100644 => 100755 backend/src/modules/payment/payment.controller.ts mode change 100644 => 100755 backend/src/modules/payment/payment.module.ts mode change 100644 => 100755 backend/src/modules/payment/payment.service.ts mode change 100644 => 100755 backend/src/modules/payment/tests/payment.service.spec.ts mode change 100644 => 100755 backend/src/modules/prompts/prompts.controller.ts mode change 100644 => 100755 backend/src/modules/prompts/prompts.module.ts mode change 100644 => 100755 backend/src/modules/prompts/prompts.service.ts mode change 100644 => 100755 backend/src/modules/prompts/tests/prompts.service.spec.ts mode change 100644 => 100755 backend/src/modules/sandbox/sandbox-share.controller.ts mode change 100644 => 100755 backend/src/modules/sandbox/sandbox.controller.ts mode change 100644 => 100755 backend/src/modules/sandbox/sandbox.module.ts mode change 100644 => 100755 backend/src/modules/sandbox/sandbox.service.ts mode change 100644 => 100755 backend/src/modules/sandbox/tests/sandbox.service.spec.ts mode change 100644 => 100755 backend/src/modules/search/search.controller.ts mode change 100644 => 100755 backend/src/modules/search/search.module.ts mode change 100644 => 100755 backend/src/modules/search/search.service.ts mode change 100644 => 100755 backend/src/modules/search/tests/search.service.spec.ts mode change 100644 => 100755 backend/src/modules/skills/skills.controller.ts mode change 100644 => 100755 backend/src/modules/skills/skills.module.ts mode change 100644 => 100755 backend/src/modules/skills/skills.service.ts mode change 100644 => 100755 backend/src/modules/tools/tests/tools.service.spec.ts mode change 100644 => 100755 backend/src/modules/tools/tools.controller.ts mode change 100644 => 100755 backend/src/modules/tools/tools.module.ts mode change 100644 => 100755 backend/src/modules/tools/tools.service.ts mode change 100644 => 100755 backend/src/modules/upload/upload.controller.ts mode change 100644 => 100755 backend/src/modules/upload/upload.module.ts mode change 100644 => 100755 backend/src/modules/upload/upload.service.ts mode change 100644 => 100755 backend/src/modules/users/tests/users.service.spec.ts mode change 100644 => 100755 backend/src/modules/users/users.controller.ts mode change 100644 => 100755 backend/src/modules/users/users.module.ts mode change 100644 => 100755 backend/src/modules/users/users.service.ts mode change 100644 => 100755 backend/src/prisma/prisma.module.ts mode change 100644 => 100755 backend/src/prisma/prisma.service.ts mode change 100644 => 100755 backend/test/app.e2e-spec.ts mode change 100644 => 100755 backend/tsconfig.json delete mode 100644 backend/tsconfig.tsbuildinfo mode change 100644 => 100755 backend/uploads/843b1def-80bc-4339-9795-5a792512b1f4.png mode change 100644 => 100755 backend/uploads/bba131c5-d294-46ae-a944-f07d0efe24fa.png mode change 100644 => 100755 backend/uploads/d45cadcc-795c-4a2c-99c6-d08119c8ce7b.png delete mode 100644 docker-compose.yml mode change 100644 => 100755 docs/admin-system-plan.md mode change 100644 => 100755 docs/archive/progress-2026-05-12-before-notifications.md mode change 100644 => 100755 docs/design-tokens.md mode change 100644 => 100755 docs/progress.md mode change 100644 => 100755 docs/产品优化方向.md mode change 100644 => 100755 docs/产品规划书.md mode change 100644 => 100755 docs/合规与运营方案.md mode change 100644 => 100755 docs/技术架构设计.md mode change 100644 => 100755 ecosystem.config.js mode change 100644 => 100755 frontend/.dockerignore mode change 100644 => 100755 frontend/.env.example create mode 100644 frontend/.eslintrc.json mode change 100644 => 100755 frontend/.gitignore mode change 100644 => 100755 frontend/Dockerfile mode change 100644 => 100755 frontend/e2e/admin-pages.spec.ts mode change 100644 => 100755 frontend/e2e/dark-mode.spec.ts mode change 100644 => 100755 frontend/e2e/functional-pages.spec.ts mode change 100644 => 100755 frontend/e2e/homepage.spec.ts mode change 100644 => 100755 frontend/e2e/listing-pages.spec.ts mode change 100644 => 100755 frontend/e2e/navigation.spec.ts mode change 100644 => 100755 frontend/e2e/not-found.spec.ts mode change 100644 => 100755 frontend/e2e/static-pages.spec.ts mode change 100644 => 100755 frontend/e2e/user-pages.spec.ts mode change 100644 => 100755 frontend/next-env.d.ts mode change 100644 => 100755 frontend/next.config.js mode change 100644 => 100755 frontend/package-lock.json mode change 100644 => 100755 frontend/package.json mode change 100644 => 100755 frontend/playwright.config.ts mode change 100644 => 100755 frontend/postcss.config.js mode change 100644 => 100755 frontend/public/favicon.ico mode change 100644 => 100755 frontend/public/favicon.png mode change 100644 => 100755 frontend/public/icon.svg create mode 100755 frontend/public/images/beian/gongan-beian.png create mode 100755 frontend/public/images/yzr/kefu.png create mode 100755 frontend/public/images/yzr/yuzhiran-tech.jpg create mode 100755 frontend/public/images/yzr/yuzhiran-yhl.jpg create mode 100755 frontend/public/images/yzr/yuzhiran.jpg mode change 100644 => 100755 frontend/server.js mode change 100644 => 100755 frontend/src/app/__tests__/home.test.tsx mode change 100644 => 100755 frontend/src/app/about/page.tsx mode change 100644 => 100755 frontend/src/app/admin/analytics/page.tsx mode change 100644 => 100755 frontend/src/app/admin/comments/page.tsx mode change 100644 => 100755 frontend/src/app/admin/contents/[id]/edit-content.tsx mode change 100644 => 100755 frontend/src/app/admin/contents/[id]/page.tsx mode change 100644 => 100755 frontend/src/app/admin/contents/new/page.tsx mode change 100644 => 100755 frontend/src/app/admin/contents/page.tsx mode change 100644 => 100755 frontend/src/app/admin/courses/[id]/edit-course.tsx mode change 100644 => 100755 frontend/src/app/admin/courses/[id]/page.tsx mode change 100644 => 100755 frontend/src/app/admin/courses/new/page.tsx mode change 100644 => 100755 frontend/src/app/admin/courses/page.tsx mode change 100644 => 100755 frontend/src/app/admin/enterprise/[id]/org-detail.tsx mode change 100644 => 100755 frontend/src/app/admin/enterprise/[id]/page.tsx mode change 100644 => 100755 frontend/src/app/admin/enterprise/[id]/report/page.tsx mode change 100644 => 100755 frontend/src/app/admin/enterprise/[id]/report/report-page.tsx mode change 100644 => 100755 frontend/src/app/admin/enterprise/page.tsx mode change 100644 => 100755 frontend/src/app/admin/layout.tsx mode change 100644 => 100755 frontend/src/app/admin/login/page.tsx mode change 100644 => 100755 frontend/src/app/admin/operations/banners/page.tsx mode change 100644 => 100755 frontend/src/app/admin/operations/notifications/page.tsx mode change 100644 => 100755 frontend/src/app/admin/orders/page.tsx mode change 100644 => 100755 frontend/src/app/admin/page.tsx mode change 100644 => 100755 frontend/src/app/admin/prompts/[id]/client.tsx mode change 100644 => 100755 frontend/src/app/admin/prompts/[id]/page.tsx mode change 100644 => 100755 frontend/src/app/admin/prompts/new/page.tsx mode change 100644 => 100755 frontend/src/app/admin/prompts/page.tsx mode change 100644 => 100755 frontend/src/app/admin/settings/config/page.tsx mode change 100644 => 100755 frontend/src/app/admin/settings/roles/page.tsx mode change 100644 => 100755 frontend/src/app/admin/tools/[id]/client.tsx mode change 100644 => 100755 frontend/src/app/admin/tools/[id]/page.tsx mode change 100644 => 100755 frontend/src/app/admin/tools/new/page.tsx mode change 100644 => 100755 frontend/src/app/admin/tools/page.tsx mode change 100644 => 100755 frontend/src/app/admin/users/page.tsx mode change 100644 => 100755 frontend/src/app/ai-agreement/page.tsx mode change 100644 => 100755 frontend/src/app/auth/page.tsx mode change 100644 => 100755 frontend/src/app/circles/[id]/client.tsx mode change 100644 => 100755 frontend/src/app/circles/[id]/page.tsx mode change 100644 => 100755 frontend/src/app/circles/page.tsx mode change 100644 => 100755 frontend/src/app/community/[id]/client.tsx mode change 100644 => 100755 frontend/src/app/community/[id]/page.tsx mode change 100644 => 100755 frontend/src/app/community/page.tsx mode change 100644 => 100755 frontend/src/app/contents/[id]/client.tsx mode change 100644 => 100755 frontend/src/app/contents/[id]/page.tsx mode change 100644 => 100755 frontend/src/app/contents/page.tsx mode change 100644 => 100755 frontend/src/app/courses/[id]/client.tsx mode change 100644 => 100755 frontend/src/app/courses/[id]/page.tsx mode change 100644 => 100755 frontend/src/app/courses/__tests__/courses.vitest.tsx mode change 100644 => 100755 frontend/src/app/courses/page.tsx mode change 100644 => 100755 frontend/src/app/dashboard/page.tsx mode change 100644 => 100755 frontend/src/app/discover/daily/page.tsx mode change 100644 => 100755 frontend/src/app/discover/hot/page.tsx mode change 100644 => 100755 frontend/src/app/discover/page.tsx mode change 100644 => 100755 frontend/src/app/discover/tools/page.tsx mode change 100644 => 100755 frontend/src/app/error.tsx mode change 100644 => 100755 frontend/src/app/favicon.png mode change 100644 => 100755 frontend/src/app/global-error.tsx mode change 100644 => 100755 frontend/src/app/globals.css mode change 100644 => 100755 frontend/src/app/home-client.tsx mode change 100644 => 100755 frontend/src/app/layout-client.tsx mode change 100644 => 100755 frontend/src/app/layout.tsx mode change 100644 => 100755 frontend/src/app/learning/analytics/page.tsx mode change 100644 => 100755 frontend/src/app/learning/path/page.tsx mode change 100644 => 100755 frontend/src/app/models/page.tsx mode change 100644 => 100755 frontend/src/app/my/dashboard/page.tsx mode change 100644 => 100755 frontend/src/app/my/favorites/page.tsx mode change 100644 => 100755 frontend/src/app/my/learning/page.tsx mode change 100644 => 100755 frontend/src/app/my/member/page.tsx mode change 100644 => 100755 frontend/src/app/my/page.tsx mode change 100644 => 100755 frontend/src/app/my/settings/page.tsx mode change 100644 => 100755 frontend/src/app/not-found.tsx mode change 100644 => 100755 frontend/src/app/notifications/page.tsx mode change 100644 => 100755 frontend/src/app/page.tsx mode change 100644 => 100755 frontend/src/app/privacy/page.tsx mode change 100644 => 100755 frontend/src/app/prompts/__tests__/prompts.vitest.tsx mode change 100644 => 100755 frontend/src/app/prompts/page.tsx mode change 100644 => 100755 frontend/src/app/prompts/workshop/page.tsx mode change 100644 => 100755 frontend/src/app/sandbox/code/page.tsx mode change 100644 => 100755 frontend/src/app/sandbox/compare/page.tsx mode change 100644 => 100755 frontend/src/app/sandbox/page.tsx mode change 100644 => 100755 frontend/src/app/sandbox/share/page.tsx mode change 100644 => 100755 frontend/src/app/search/page.tsx mode change 100644 => 100755 frontend/src/app/skills/[id]/client.tsx mode change 100644 => 100755 frontend/src/app/skills/[id]/page.tsx mode change 100644 => 100755 frontend/src/app/skills/page.tsx mode change 100644 => 100755 frontend/src/app/terms/page.tsx mode change 100644 => 100755 frontend/src/app/tools/page.tsx mode change 100644 => 100755 frontend/src/app/users/[id]/page.tsx mode change 100644 => 100755 frontend/src/app/users/[id]/user-profile.tsx mode change 100644 => 100755 frontend/src/components/admin-ai-assistant.tsx mode change 100644 => 100755 frontend/src/components/ai-assistant.tsx mode change 100644 => 100755 frontend/src/components/layout/__tests__/footer.test.tsx mode change 100644 => 100755 frontend/src/components/layout/__tests__/header.vitest.tsx mode change 100644 => 100755 frontend/src/components/layout/footer.tsx mode change 100644 => 100755 frontend/src/components/layout/header.tsx mode change 100644 => 100755 frontend/src/components/providers/theme-provider.tsx mode change 100644 => 100755 frontend/src/components/sandbox/learning-path.tsx mode change 100644 => 100755 frontend/src/components/ui/avatar.tsx mode change 100644 => 100755 frontend/src/components/ui/badge.tsx mode change 100644 => 100755 frontend/src/components/ui/button.tsx mode change 100644 => 100755 frontend/src/components/ui/card.tsx mode change 100644 => 100755 frontend/src/components/ui/code-block.tsx mode change 100644 => 100755 frontend/src/components/ui/dialog.tsx mode change 100644 => 100755 frontend/src/components/ui/input.tsx mode change 100644 => 100755 frontend/src/components/ui/model-selector.tsx mode change 100644 => 100755 frontend/src/components/ui/payment-modal.tsx mode change 100644 => 100755 frontend/src/components/ui/progress.tsx mode change 100644 => 100755 frontend/src/components/ui/skeleton.tsx mode change 100644 => 100755 frontend/src/components/ui/sonner.tsx mode change 100644 => 100755 frontend/src/components/ui/tabs.tsx mode change 100644 => 100755 frontend/src/components/ui/theme-toggle.tsx mode change 100644 => 100755 frontend/src/components/ui/tooltip.tsx mode change 100644 => 100755 frontend/src/i18n/index.ts mode change 100644 => 100755 frontend/src/i18n/locales/en.ts mode change 100644 => 100755 frontend/src/i18n/locales/zh.ts mode change 100644 => 100755 frontend/src/i18n/provider.tsx mode change 100644 => 100755 frontend/src/i18n/use-t.ts mode change 100644 => 100755 frontend/src/lib/assistant-actions.ts mode change 100644 => 100755 frontend/src/lib/assistant-context.ts mode change 100644 => 100755 frontend/src/lib/auth-context.tsx mode change 100644 => 100755 frontend/src/lib/auth.ts mode change 100644 => 100755 frontend/src/lib/config.ts mode change 100644 => 100755 frontend/src/lib/models.ts mode change 100644 => 100755 frontend/src/lib/utils.ts mode change 100644 => 100755 frontend/src/lib/wechat.ts mode change 100644 => 100755 frontend/src/test/setup.ts mode change 100644 => 100755 frontend/tailwind.config.js mode change 100644 => 100755 frontend/tsconfig.json create mode 100755 frontend/tsconfig.tsbuildinfo mode change 100644 => 100755 frontend/vitest.config.ts mode change 100644 => 100755 mobile/index.html mode change 100644 => 100755 mobile/package.json mode change 100644 => 100755 mobile/src/App.vue mode change 100644 => 100755 mobile/src/api/index.ts mode change 100644 => 100755 mobile/src/env.d.ts mode change 100644 => 100755 mobile/src/main.ts mode change 100644 => 100755 mobile/src/manifest.json mode change 100644 => 100755 mobile/src/pages.json mode change 100644 => 100755 mobile/src/pages/circle-detail/index.vue mode change 100644 => 100755 mobile/src/pages/circles/index.vue mode change 100644 => 100755 mobile/src/pages/community/index.vue mode change 100644 => 100755 mobile/src/pages/course-detail/index.vue mode change 100644 => 100755 mobile/src/pages/courses/index.vue mode change 100644 => 100755 mobile/src/pages/create-post/index.vue mode change 100644 => 100755 mobile/src/pages/favorites/index.vue mode change 100644 => 100755 mobile/src/pages/index/index.vue mode change 100644 => 100755 mobile/src/pages/learning-progress/index.vue mode change 100644 => 100755 mobile/src/pages/lesson/index.vue mode change 100644 => 100755 mobile/src/pages/login/index.vue mode change 100644 => 100755 mobile/src/pages/membership/index.vue mode change 100644 => 100755 mobile/src/pages/post-detail/index.vue mode change 100644 => 100755 mobile/src/pages/profile/index.vue mode change 100644 => 100755 mobile/src/pages/prompt-detail/index.vue mode change 100644 => 100755 mobile/src/pages/prompts/index.vue mode change 100644 => 100755 mobile/src/pages/register/index.vue mode change 100644 => 100755 mobile/src/pages/sandbox/index.vue mode change 100644 => 100755 mobile/src/pages/search/index.vue mode change 100644 => 100755 mobile/src/store/user.ts mode change 100644 => 100755 mobile/src/styles/variables.css mode change 100644 => 100755 mobile/src/utils/request.ts mode change 100644 => 100755 mobile/src/utils/storage.ts mode change 100644 => 100755 mobile/tsconfig.json mode change 100644 => 100755 mobile/vite.config.ts create mode 100755 scripts/deploy.sh mode change 100644 => 100755 scripts/init.sql diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index 2e4b345..0000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,97 +0,0 @@ -name: CI - -on: - push: - branches: [main, develop] - pull_request: - branches: [main] - -jobs: - backend-lint-and-test: - runs-on: ubuntu-latest - defaults: - run: - working-directory: ./backend - - services: - mysql: - image: mysql:8.0 - env: - MYSQL_ROOT_PASSWORD: root123 - MYSQL_DATABASE: yuzhiran - ports: - - 3306:3306 - options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=5 - - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: 'npm' - cache-dependency-path: backend/package-lock.json - - - name: Install dependencies - run: npm ci - - - name: Generate Prisma client - run: npx prisma generate - env: - DATABASE_URL: mysql://root:root123@localhost:3306/yuzhiran - - - name: Type check - run: npx tsc --noEmit - - - name: Run tests - run: npm test - - frontend-lint-and-test: - runs-on: ubuntu-latest - defaults: - run: - working-directory: ./frontend - - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: 'npm' - cache-dependency-path: frontend/package-lock.json - - - name: Install dependencies - run: npm ci - - - name: Run tests - run: npm test - - - name: Build - run: npm run build - - docker-build: - runs-on: ubuntu-latest - needs: [backend-lint-and-test, frontend-lint-and-test] - if: github.ref == 'refs/heads/main' - - steps: - - uses: actions/checkout@v4 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Build backend - uses: docker/build-push-action@v5 - with: - context: ./backend - push: false - tags: yuzhiran/backend:latest - cache-from: type=gha - cache-to: type=gha,mode=max - - - name: Build frontend - uses: docker/build-push-action@v5 - with: - context: ./frontend - push: false - tags: yuzhiran/frontend:latest - cache-from: type=gha - cache-to: type=gha,mode=max diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 diff --git a/AGENTS.md b/AGENTS.md old mode 100644 new mode 100755 index f6770fe..0f643a1 --- a/AGENTS.md +++ b/AGENTS.md @@ -90,7 +90,7 @@ 1. **任务开始前** — 读 AGENTS.md + docs/progress.md,了解当前进度和上下文 2. **规划阶段** — 分析需求,拆解为 TODO 列表,按优先级排序 -3. **执行阶段** — 按 TODO 依次实施,每次完成后验证(lint/test/build) +3. **执行阶段** — 按 TODO 依次实施,完成后先做**代码评审修复**(检查代码风格、类型安全、边界情况、安全隐患、是否符合项目约定),再做**测试验证**(运行 lint/build + 相关测试,发现失败立即修复) 4. **任务完成后** — 更新 docs/progress.md(更新阶段状态、补充完成项) 5. **归档** — 旧版 progress.md 移到 `docs/archive/progress-YYYY-MM-DD.md` 6. **提交** — 只有在用户明确要求时才创建 git commit diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/backend/.dockerignore b/backend/.dockerignore old mode 100644 new mode 100755 diff --git a/backend/.env.example b/backend/.env.example old mode 100644 new mode 100755 diff --git a/backend/.eslintrc.js b/backend/.eslintrc.js new file mode 100644 index 0000000..22e42ff --- /dev/null +++ b/backend/.eslintrc.js @@ -0,0 +1,23 @@ +module.exports = { + parser: '@typescript-eslint/parser', + parserOptions: { + project: './tsconfig.json', + sourceType: 'module', + }, + plugins: ['@typescript-eslint'], + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + ], + root: true, + env: { + node: true, + jest: true, + }, + ignorePatterns: ['dist', 'node_modules'], + rules: { + '@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_' }], + '@typescript-eslint/no-explicit-any': 'warn', + 'no-console': 'off', + }, +}; diff --git a/backend/Dockerfile b/backend/Dockerfile old mode 100644 new mode 100755 diff --git a/backend/admin/index.html b/backend/admin/index.html old mode 100644 new mode 100755 diff --git a/backend/jest-e2e.json b/backend/jest-e2e.json old mode 100644 new mode 100755 diff --git a/backend/jest.config.json b/backend/jest.config.json old mode 100644 new mode 100755 diff --git a/backend/nest-cli.json b/backend/nest-cli.json old mode 100644 new mode 100755 diff --git a/backend/package-lock.json b/backend/package-lock.json old mode 100644 new mode 100755 index acf8bd6..a55b135 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -18,6 +18,7 @@ "@nestjs/serve-static": "^5.0.5", "@nestjs/swagger": "^11.4.2", "@prisma/client": "^5.22.0", + "alipay-sdk": "^4.14.0", "bcryptjs": "^3.0.3", "class-transformer": "^0.5.1", "class-validator": "^0.15.1", @@ -42,6 +43,9 @@ "@types/node": "^20.19.40", "@types/passport-jwt": "^4.0.1", "@types/supertest": "^7.2.0", + "@typescript-eslint/eslint-plugin": "^8.60.0", + "@typescript-eslint/parser": "^8.60.0", + "eslint": "^8.57.1", "jest": "^30.4.0", "supertest": "^7.2.2", "ts-jest": "^29.4.9", @@ -168,24 +172,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@angular-devkit/schematics-cli/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@angular-devkit/schematics-cli/node_modules/picomatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", @@ -199,22 +185,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@angular-devkit/schematics-cli/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@angular-devkit/schematics-cli/node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -280,24 +250,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@angular-devkit/schematics/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@angular-devkit/schematics/node_modules/picomatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", @@ -311,22 +263,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@angular-devkit/schematics/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@angular-devkit/schematics/node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -1394,6 +1330,103 @@ "node": ">=18" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/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/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@fidm/asn1": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@fidm/asn1/-/asn1-1.0.4.tgz", @@ -1416,6 +1449,44 @@ "node": ">= 8" } }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/@inquirer/ansi": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", @@ -3026,24 +3097,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@nestjs/schematics/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@nestjs/schematics/node_modules/picomatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", @@ -3057,22 +3110,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@nestjs/schematics/node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@nestjs/schematics/node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -3194,6 +3231,44 @@ "url": "https://paulmillr.com/funding/" } }, + "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/@nuxt/opencollective": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.4.1.tgz", @@ -3763,6 +3838,278 @@ "dev": true, "license": "MIT" }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.60.0.tgz", + "integrity": "sha512-QYb/sa74/s7OKMbACMjrYnGspj9Hs5YI5aaffSL65UfeBUzVzBJfVo3oWSpbzPurvm7yaCCo2Lk7lVj610HqKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/type-utils": "8.60.0", + "@typescript-eslint/utils": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.60.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-8.60.0.tgz", + "integrity": "sha512-fcqpj/MyK4sxDPcbe7STNPbpQL4RLZOPWuaTmwZYuc+hJKzRf58yRxfhqGpc6PIq9ZyfSBpfHgmUHmHs0KwHwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/project-service/-/project-service-8.60.0.tgz", + "integrity": "sha512-aZu74NNKJeUWqCjDddzdiKaS82dgYgV/vmf+Ui3ZdZejmgfXR/q+pRumgobnQ2cCJTgGTWp4ypiwsuofFubavg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.60.0", + "@typescript-eslint/types": "^8.60.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-8.60.0.tgz", + "integrity": "sha512-pFzqhllJMs+jghLQWzV00ds39xLzuyqPSev5pd8f4Ir0rtKR3ZLUB4/4dhjOFighWb9larvtfJvqL+4yKDI3Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.0.tgz", + "integrity": "sha512-BZPR3RGYlAXnly6ymAxfkVn5rCbZzQNou0rxv3GfWZ8cTQp+hhVd73khbGLAd8k1TlAPLISH337M+tAgAnaJDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-8.60.0.tgz", + "integrity": "sha512-SX46wEUtitCpq7AN38HkUU/+zvUpdKf7ephtWAFgckH8O7PQIyL5gvrhQgBLuEYgLfuKWOVvWVskMbuFHAz5xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0", + "@typescript-eslint/utils": "8.60.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-8.60.0.tgz", + "integrity": "sha512-AsE7x2XaAK+CVbeih0Fvbn+r1qHxtpLDJ3XUuFcIinT318T90yHMJC+Zgv+jUuDjQQd06HKwxnDu6sz1IcTilA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.60.0.tgz", + "integrity": "sha512-3AcZNBGMClm6CXDyo8kYvVGT/sx29sS0oBsIb9oZI2gunA4Vm2M3YHzRLPvsUBBsl+yB5FPtltq7gGH0iTlp9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.60.0", + "@typescript-eslint/tsconfig-utils": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-8.60.0.tgz", + "integrity": "sha512-HtXuPfrHTyBDkameWpl+vJb1Uevu2tznAyahM1Oc4AENidCLTPiZDWIo4GfcxNdC/RcfGcadzzkqbRG87dUrQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.60.0.tgz", + "integrity": "sha512-9WI52t8ZGLVGrPMBet25yAftqY/n95+zmoUUtJBBQTKDSKUu7OsPTroT2op7U9JatkoRccL0YkWDNMFfC4Sjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@ungap/structured-clone": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.1.tgz", @@ -4253,6 +4600,16 @@ "acorn": "^8.14.0" } }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/acorn-walk": { "version": "8.3.5", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", @@ -4314,6 +4671,26 @@ "ajv": "^8.8.2" } }, + "node_modules/alipay-sdk": { + "version": "4.14.0", + "resolved": "https://registry.npmmirror.com/alipay-sdk/-/alipay-sdk-4.14.0.tgz", + "integrity": "sha512-oiD/VP5Ei0RRacHHmE+N0uqgOj2xzce7c0fHrtyyh1P04O+o9I1r65LdGPzU8960J56xOxS/d3c+R/9lsPUH7g==", + "license": "MIT", + "dependencies": { + "@fidm/x509": "^1.2.1", + "bignumber.js": "^9.1.2", + "camelcase-keys": "^7.0.2", + "crypto-js": "^4.2.0", + "formstream": "^1.5.0", + "snakecase-keys": "^8.0.0", + "sse-decoder": "^1.0.0", + "urllib": "^4", + "utility": "^2.1.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -4589,6 +4966,15 @@ "bcrypt": "bin/bcrypt" } }, + "node_modules/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmmirror.com/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -4812,6 +5198,48 @@ "node": ">=6" } }, + "node_modules/camelcase-keys": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/camelcase-keys/-/camelcase-keys-7.0.2.tgz", + "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", + "license": "MIT", + "dependencies": { + "camelcase": "^6.3.0", + "map-obj": "^4.1.0", + "quick-lru": "^5.1.1", + "type-fest": "^1.2.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001792", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", @@ -5301,6 +5729,12 @@ "node": ">= 8" } }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT" + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -5333,6 +5767,13 @@ } } }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -5374,6 +5815,16 @@ "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==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -5405,6 +5856,29 @@ "node": ">=0.3.1" } }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/dotenv": { "version": "17.4.1", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.1.tgz", @@ -5660,6 +6134,63 @@ "node": ">=8" } }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -5674,6 +6205,160 @@ "node": ">=8.0.0" } }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/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/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -5688,6 +6373,29 @@ "node": ">=4" } }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/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/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -5721,6 +6429,16 @@ "node": ">=4.0" } }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -5842,6 +6560,18 @@ "url": "https://opencollective.com/express" } }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -5856,6 +6586,13 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, "node_modules/fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", @@ -5879,6 +6616,16 @@ ], "license": "BSD-3-Clause" }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", @@ -5889,6 +6636,19 @@ "bser": "2.1.1" } }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, "node_modules/file-type": { "version": "21.3.4", "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.3.4.tgz", @@ -5955,6 +6715,28 @@ "node": ">=8" } }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, "node_modules/follow-redirects": { "version": "1.16.0", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", @@ -6105,6 +6887,18 @@ "url": "https://ko-fi.com/tunnckoCore/commissions" } }, + "node_modules/formstream": { + "version": "1.5.2", + "resolved": "https://registry.npmmirror.com/formstream/-/formstream-1.5.2.tgz", + "integrity": "sha512-NASf0lgxC1AyKNXQIrXTEYkiX99LhCEXTkiGObXAkpBui86a4u8FjH1o2bGb3PpqI3kafC+yw4zWeK6l6VHTgg==", + "license": "MIT", + "dependencies": { + "destroy": "^1.0.4", + "mime": "^2.5.2", + "node-hex": "^1.0.1", + "pause-stream": "~0.0.11" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -6286,6 +7080,19 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", @@ -6332,6 +7139,35 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -6351,6 +7187,13 @@ "dev": true, "license": "ISC" }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, "node_modules/handlebars": { "version": "4.7.9", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", @@ -6514,6 +7357,16 @@ ], "license": "BSD-3-Clause" }, + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -6595,6 +7448,25 @@ "dev": true, "license": "MIT" }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -6615,6 +7487,19 @@ "node": ">=6" } }, + "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-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -6635,6 +7520,16 @@ "node": ">=0.12.0" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-promise": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", @@ -7671,6 +8566,13 @@ "node": ">=6" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -7685,6 +8587,13 @@ "dev": true, "license": "MIT" }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -7761,6 +8670,16 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -7771,6 +8690,20 @@ "node": ">=6" } }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/libphonenumber-js": { "version": "1.12.43", "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.43.tgz", @@ -7879,6 +8812,13 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -7902,6 +8842,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/lru-cache": { "version": "11.3.6", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.6.tgz", @@ -7955,6 +8904,18 @@ "tmpl": "1.0.5" } }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -8033,7 +8994,6 @@ "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, "license": "MIT", "bin": { "mime": "cli.js" @@ -8227,6 +9187,16 @@ "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==", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, "node_modules/node-abort-controller": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", @@ -8244,6 +9214,15 @@ "lodash": "^4.17.21" } }, + "node_modules/node-hex": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/node-hex/-/node-hex-1.0.1.tgz", + "integrity": "sha512-iwpZdvW6Umz12ICmu9IYPRxg0tOLGmU3Tq2tKetejCj3oZd7b2nUXwP3a7QA5M9glWy8wlPS1G3RwM/CdsUbdQ==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -8348,6 +9327,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", @@ -8583,6 +9580,18 @@ "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" }, + "node_modules/pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmmirror.com/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", + "license": [ + "MIT", + "Apache2" + ], + "dependencies": { + "through": "~2.3" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -8636,6 +9645,16 @@ "node": ">=4" } }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/pretty-format": { "version": "30.4.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.0.tgz", @@ -8748,6 +9767,39 @@ "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/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -8892,6 +9944,56 @@ "dev": true, "license": "ISC" }, + "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/rimraf/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/router": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", @@ -8908,6 +10010,30 @@ "node": ">= 18" } }, + "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/rxjs": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", @@ -9177,6 +10303,42 @@ "node": ">=8" } }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/snakecase-keys": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/snakecase-keys/-/snakecase-keys-8.1.0.tgz", + "integrity": "sha512-9/Eug2btrCiOi+9+vIXJnxUcKVfcbLy5Uwff4BrO6PQf3Oq/2iYQ/1zkmnrpIIjfel/DAasAlux7OvAmCa+Xnw==", + "license": "MIT", + "dependencies": { + "map-obj": "^4.2.0", + "snake-case": "^3.0.4", + "type-fest": "^4.15.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/snakecase-keys/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/source-map": { "version": "0.7.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", @@ -9215,6 +10377,15 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/sse-decoder": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/sse-decoder/-/sse-decoder-1.0.0.tgz", + "integrity": "sha512-JPopy3jfNmPcUz5Ru6skKhHNRJbsvcEW6Z4SirKkucLS8Jya1Bmf4FVX8giOkLm8xQJ7kK68P6GXoVSTkbedUA==", + "license": "MIT", + "engines": { + "node": ">= 14.19.3" + } + }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -9619,6 +10790,67 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmmirror.com/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -9666,6 +10898,19 @@ "url": "https://github.com/sponsors/Borewit" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/ts-jest": { "version": "29.4.9", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.9.tgz", @@ -9860,6 +11105,19 @@ "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", "license": "Unlicense" }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -9955,12 +11213,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/undici": { + "version": "7.26.0", + "resolved": "https://registry.npmmirror.com/undici/-/undici-7.26.0.tgz", + "integrity": "sha512-3O9Tf67pGhgOv9jM35AbhkXAKi13f3oy3aE4CSgr+TckGeY+/iu97ZXN+J7DpHPzLbVApFd1IFhcnBjREYXYcg==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, "node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, + "node_modules/unescape": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/unescape/-/unescape-1.0.1.tgz", + "integrity": "sha512-O0+af1Gs50lyH1nUu3ZyYS1cRh01Q/kUKatTOkSs7jukXE6/NebucDVxyiDsA9AQ4JC1V1jUH9EO8JX2nMDgGQ==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", @@ -10056,12 +11335,77 @@ "punycode": "^2.1.0" } }, + "node_modules/urllib": { + "version": "4.9.0", + "resolved": "https://registry.npmmirror.com/urllib/-/urllib-4.9.0.tgz", + "integrity": "sha512-Rp3DBvVqy9arSTMH6oN5N7OAN01U3dQ2xc19AadP86MzC4j67MDeqOup5shpWnjkDVGWfLfWPOd8CyqOtd6u3w==", + "license": "MIT", + "dependencies": { + "form-data": "^4.0.1", + "formstream": "^1.5.1", + "mime-types": "^2.1.35", + "qs": "^6.12.1", + "type-fest": "^4.20.1", + "undici": "^7.1.1", + "ylru": "^2.0.0" + }, + "engines": { + "node": ">= 18.19.0" + } + }, + "node_modules/urllib/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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/urllib/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==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/urllib/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, + "node_modules/utility": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/utility/-/utility-2.5.0.tgz", + "integrity": "sha512-lDbOVde5UAKgtxrSyZNhqrTA7f7anba6DTqbsDWgUFk6PZlmr7djqPYw0FnL5a6TbJvRt38VmYqt07zVLzXG2A==", + "license": "MIT", + "dependencies": { + "escape-html": "^1.0.3", + "unescape": "^1.0.1", + "ylru": "^2.0.0" + }, + "engines": { + "node": ">= 16.0.0" + } + }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -10294,6 +11638,16 @@ "node": ">= 8" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -10401,6 +11755,15 @@ "node": ">=12" } }, + "node_modules/ylru": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ylru/-/ylru-2.0.0.tgz", + "integrity": "sha512-T6hTrKcr9lKeUG0MQ/tO72D3UGptWVohgzpHG8ljU1jeBt2RCjcWxvsTPD8ZzUq1t1FvwROAw1kxg2euvg/THg==", + "license": "MIT", + "engines": { + "node": ">= 18.19.0" + } + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/backend/package.json b/backend/package.json old mode 100644 new mode 100755 index db972c4..b2580e3 --- a/backend/package.json +++ b/backend/package.json @@ -4,7 +4,7 @@ "description": "宇之然 AI - 后端 API 服务", "main": "dist/main.js", "scripts": { - "build": "nest build", + "build": "nest build --tsc", "start": "nest start", "dev": "nest start --watch", "start:prod": "node dist/main", @@ -38,6 +38,7 @@ "@nestjs/serve-static": "^5.0.5", "@nestjs/swagger": "^11.4.2", "@prisma/client": "^5.22.0", + "alipay-sdk": "^4.14.0", "bcryptjs": "^3.0.3", "class-transformer": "^0.5.1", "class-validator": "^0.15.1", @@ -62,6 +63,9 @@ "@types/node": "^20.19.40", "@types/passport-jwt": "^4.0.1", "@types/supertest": "^7.2.0", + "@typescript-eslint/eslint-plugin": "^8.60.0", + "@typescript-eslint/parser": "^8.60.0", + "eslint": "^8.57.1", "jest": "^30.4.0", "supertest": "^7.2.2", "ts-jest": "^29.4.9", diff --git a/backend/prisma/schema.prisma b/backend/prisma/schema.prisma old mode 100644 new mode 100755 index 74c8b5a..7eb4e54 --- a/backend/prisma/schema.prisma +++ b/backend/prisma/schema.prisma @@ -34,6 +34,7 @@ enum MemberPlan { model User { id Int @id @default(autoincrement()) + username String? @unique phone String? @unique email String? @unique passwordHash String? @@ -303,16 +304,18 @@ model SandboxSession { } model Order { - id Int @id @default(autoincrement()) - orderNo String @unique - userId Int - amount Float - planType String - status OrderStatus @default(PENDING) - payChannel String? - paidAt DateTime? - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + id Int @id @default(autoincrement()) + orderNo String @unique + userId Int + amount Float + planType String + status OrderStatus @default(PENDING) + payChannel String? + transactionId String? + gatewayOrderId String? + paidAt DateTime? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt user User @relation(fields: [userId], references: [id]) diff --git a/backend/prisma/seed.d.ts b/backend/prisma/seed.d.ts old mode 100644 new mode 100755 diff --git a/backend/prisma/seed.js b/backend/prisma/seed.js old mode 100644 new mode 100755 diff --git a/backend/prisma/seed.ts b/backend/prisma/seed.ts old mode 100644 new mode 100755 diff --git a/backend/prisma/tsconfig.json b/backend/prisma/tsconfig.json old mode 100644 new mode 100755 diff --git a/backend/src/app.module.ts b/backend/src/app.module.ts old mode 100644 new mode 100755 index ea0863c..1f04e21 --- a/backend/src/app.module.ts +++ b/backend/src/app.module.ts @@ -21,31 +21,18 @@ import { EnterpriseModule } from './modules/enterprise/enterprise.module'; import { NotificationModule } from './modules/notifications/notification.module'; import { LearningModule } from './modules/learning/learning.module'; import { SkillsModule } from './modules/skills/skills.module'; +import { AiAssistantModule } from './modules/ai-assistant/ai-assistant.module'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true }), PrismaModule, - AuthModule, - UsersModule, - CoursesModule, - ContentsModule, - PromptsModule, - ToolsModule, - SandboxModule, - OrdersModule, - AdminModule, - PaymentModule, - CategoriesModule, - DashboardModule, - SearchModule, - ModelsModule, - UploadModule, - CommunityModule, - EnterpriseModule, - NotificationModule, - LearningModule, - SkillsModule, + AuthModule, UsersModule, CoursesModule, ContentsModule, + PromptsModule, ToolsModule, SandboxModule, OrdersModule, + AdminModule, PaymentModule, CategoriesModule, DashboardModule, + SearchModule, ModelsModule, UploadModule, CommunityModule, + EnterpriseModule, NotificationModule, LearningModule, SkillsModule, + AiAssistantModule, ], }) export class AppModule {} diff --git a/backend/src/common/filters/global-exception.filter.ts b/backend/src/common/filters/global-exception.filter.ts old mode 100644 new mode 100755 diff --git a/backend/src/common/index.ts b/backend/src/common/index.ts old mode 100644 new mode 100755 diff --git a/backend/src/common/interceptors/logging.interceptor.ts b/backend/src/common/interceptors/logging.interceptor.ts old mode 100644 new mode 100755 diff --git a/backend/src/main.ts b/backend/src/main.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/admin/admin.controller.ts b/backend/src/modules/admin/admin.controller.ts old mode 100644 new mode 100755 index 5ac699b..be09870 --- a/backend/src/modules/admin/admin.controller.ts +++ b/backend/src/modules/admin/admin.controller.ts @@ -1,4 +1,4 @@ -import { Controller, Post, Get, Put, Body, UseGuards, Req, Param, HttpException, HttpStatus } from '@nestjs/common'; +import { Controller, Post, Get, Put, Body, UseGuards, Req, Param, Query, HttpException, HttpStatus } from '@nestjs/common'; import { ApiTags, ApiBearerAuth } from '@nestjs/swagger'; import { AuthGuard } from '@nestjs/passport'; import { AdminService } from './admin.service'; @@ -7,6 +7,7 @@ import { CoursesService } from '../courses/courses.service'; import { PrismaService } from '../../prisma/prisma.service'; import { AIGatewayService } from '../ai/ai-gateway.service'; import { AdminAiAssistantService } from './ai-assistant.service'; +import { GatewayPayService } from '../payment/gateway-pay.service'; @ApiTags('管理后台') @Controller('admin') @@ -17,6 +18,7 @@ export class AdminController { private prisma: PrismaService, private aiGateway: AIGatewayService, private aiAssistant: AdminAiAssistantService, + private gatewayPay: GatewayPayService, ) {} @Post('login') @@ -34,13 +36,124 @@ export class AdminController { @Get('orders') @UseGuards(AuthGuard('jwt'), AdminGuard) @ApiBearerAuth() - async orders(@Req() req: any) { - const items = await this.prisma.order.findMany({ - orderBy: { createdAt: 'desc' }, - take: 100, - include: { user: { select: { id: true, nickname: true, phone: true } } }, + async orders( + @Query('page') page?: string, + @Query('pageSize') pageSize?: string, + @Query('search') search?: string, + @Query('status') status?: string, + @Query('payChannel') payChannel?: string, + @Query('planType') planType?: string, + ) { + const p = Math.max(1, Number(page) || 1); + const ps = Math.min(100, Math.max(1, Number(pageSize) || 20)); + const skip = (p - 1) * ps; + + const where: any = {}; + if (status) where.status = status; + if (payChannel) where.payChannel = payChannel; + if (planType) where.planType = planType; + if (search) { + where.OR = [ + { orderNo: { contains: search } }, + { user: { nickname: { contains: search } } }, + { user: { phone: { contains: search } } }, + ]; + } + + const [items, total] = await Promise.all([ + this.prisma.order.findMany({ + where, + orderBy: { createdAt: 'desc' }, + skip, + take: ps, + include: { user: { select: { id: true, nickname: true, phone: true } } }, + }), + this.prisma.order.count({ where }), + ]); + + return { items, total, page: p, pageSize: ps }; + } + + @Get('orders/:orderNo') + @UseGuards(AuthGuard('jwt'), AdminGuard) + @ApiBearerAuth() + async orderDetail(@Param('orderNo') orderNo: string) { + const order = await this.prisma.order.findUnique({ + where: { orderNo }, + include: { user: { select: { id: true, nickname: true, phone: true, email: true, memberPlan: true, memberExpire: true } } }, }); - return { items }; + if (!order) throw new HttpException('订单不存在', HttpStatus.NOT_FOUND); + return order; + } + + @Post('orders/:orderNo/refund') + @UseGuards(AuthGuard('jwt'), AdminGuard) + @ApiBearerAuth() + async orderRefund(@Param('orderNo') orderNo: string, @Body() body: { amount?: number; reason?: string }) { + const order = await this.prisma.order.findUnique({ where: { orderNo } }); + if (!order) throw new HttpException('订单不存在', HttpStatus.NOT_FOUND); + if (order.status !== 'PAID') throw new HttpException('订单未支付,无法退款', HttpStatus.BAD_REQUEST); + + return this.gatewayPay.refund(orderNo, body.amount || order.amount, body.reason); + } + + @Post('orders/:orderNo/mark-paid') + @UseGuards(AuthGuard('jwt'), AdminGuard) + @ApiBearerAuth() + async markOrderPaid(@Param('orderNo') orderNo: string) { + const order = await this.prisma.order.findUnique({ where: { orderNo } }); + if (!order) throw new HttpException('订单不存在', HttpStatus.NOT_FOUND); + if (order.status !== 'PENDING') throw new HttpException('只能标记待支付订单为已支付', HttpStatus.BAD_REQUEST); + + await this.prisma.order.update({ + where: { id: order.id }, + data: { status: 'PAID', paidAt: new Date(), transactionId: `MANUAL_${Date.now()}` }, + }); + + // 激活订阅 + const mockOrder = { planType: order.planType, amount: order.amount }; + if (mockOrder.planType === 'MONTHLY' || mockOrder.planType === 'YEARLY') { + const durationDays = mockOrder.planType === 'MONTHLY' ? 30 : 365; + const now = new Date(); + let endDate: Date; + const existingSub = await this.prisma.subscription.findFirst({ + where: { userId: order.userId, status: 'ACTIVE', endDate: { gt: now } }, + }); + if (existingSub) { + endDate = new Date(existingSub.endDate.getTime() + durationDays * 24 * 60 * 60 * 1000); + await this.prisma.subscription.update({ where: { id: existingSub.id }, data: { endDate } }); + } else { + endDate = new Date(now); + endDate.setDate(endDate.getDate() + durationDays); + await this.prisma.subscription.create({ + data: { userId: order.userId, plan: order.planType as any, startDate: now, endDate, status: 'ACTIVE' }, + }); + } + await this.prisma.user.update({ + where: { id: order.userId }, + data: { memberPlan: order.planType as any, memberExpire: endDate }, + }); + } + + return { ok: true, message: '订单已标记为已支付' }; + } + + @Get('orders/:orderNo/query') + @UseGuards(AuthGuard('jwt'), AdminGuard) + @ApiBearerAuth() + async queryOrderPayment(@Param('orderNo') orderNo: string) { + const order = await this.prisma.order.findUnique({ where: { orderNo } }); + if (!order) throw new HttpException('订单不存在', HttpStatus.NOT_FOUND); + + if (order.gatewayOrderId && !order.gatewayOrderId.startsWith('mock_')) { + return this.gatewayPay.queryOrder(order.gatewayOrderId); + } + return { + outTradeNo: orderNo, + localStatus: order.status, + amount: order.amount, + planType: order.planType, + }; } @Put('courses/:id/chapters') diff --git a/backend/src/modules/admin/admin.guard.ts b/backend/src/modules/admin/admin.guard.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/admin/admin.module.ts b/backend/src/modules/admin/admin.module.ts old mode 100644 new mode 100755 index 5870885..91f5f68 --- a/backend/src/modules/admin/admin.module.ts +++ b/backend/src/modules/admin/admin.module.ts @@ -12,9 +12,10 @@ import { PublicController } from './public.controller'; import { CoursesModule } from '../courses/courses.module'; import { AuthModule } from '../auth/auth.module'; import { AIModule } from '../ai/ai.module'; +import { PaymentModule } from '../payment/payment.module'; @Module({ - imports: [CoursesModule, AuthModule, AIModule], + imports: [CoursesModule, AuthModule, AIModule, PaymentModule], controllers: [AdminController, AnalyticsController, SettingsController, OperationsController, UsersController, PublicController], providers: [AdminService, AdminGuard, AdminAiAssistantService], exports: [AdminService], diff --git a/backend/src/modules/admin/admin.service.ts b/backend/src/modules/admin/admin.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/admin/ai-assistant.service.ts b/backend/src/modules/admin/ai-assistant.service.ts old mode 100644 new mode 100755 index 9fe7a20..ac843c8 --- a/backend/src/modules/admin/ai-assistant.service.ts +++ b/backend/src/modules/admin/ai-assistant.service.ts @@ -208,6 +208,15 @@ export class AdminAiAssistantService { { name: 'delete-admin', description: '禁用一个管理员账号', parameters: { id: { type: 'number', description: '管理员ID' } }, }, + // ---- 全局搜索 ---- + { + name: 'search', description: '全局搜索用户、订单、课程、内容等', + parameters: { q: { type: 'string', description: '搜索关键词(必填)' }, type: { type: 'string', enum: ['all', 'users', 'orders', 'courses', 'contents'], description: '搜索范围(可选,默认全部)' } }, + }, + // ---- 通知批量操作 ---- + { + name: 'mark-all-notifications-read', description: '将所有系统通知标记为已读', parameters: {}, + }, // ---- 企业版 ---- { name: 'get-enterprise-orgs', description: '查看所有企业组织', parameters: {}, @@ -383,6 +392,32 @@ export class AdminAiAssistantService { return { success: true, data: { id: call.params.id, status: newPromptStatus }, summary: `提示词 ${call.params.id} 状态已切换为 ${newPromptStatus}` }; } + case 'search': { + const q = call.params.q; + if (!q) throw new Error('请输入搜索关键词'); + const results: any[] = []; + if (call.params.type === 'all' || call.params.type === 'users') { + const users = await this.prisma.user.findMany({ where: { deletedAt: null, OR: [{ nickname: { contains: q } }, { phone: { contains: q } }, { email: { contains: q } }] }, select: { id: true, nickname: true, phone: true, email: true, status: true }, take: 20 }); + results.push(...users.map(u => ({ ...u, _type: 'user' }))); + } + if (call.params.type === 'all' || call.params.type === 'orders') { + const orders = await this.prisma.order.findMany({ where: { OR: [{ orderNo: { contains: q } }] }, take: 20, orderBy: { createdAt: 'desc' } }); + results.push(...orders.map(o => ({ ...o, _type: 'order' }))); + } + if (call.params.type === 'all' || call.params.type === 'courses') { + const courses = await this.prisma.course.findMany({ where: { deletedAt: null, OR: [{ title: { contains: q } }, { description: { contains: q } }] }, select: { id: true, title: true, status: true }, take: 20 }); + results.push(...courses.map(c => ({ ...c, _type: 'course' }))); + } + if (call.params.type === 'all' || call.params.type === 'contents') { + const contents = await this.prisma.content.findMany({ where: { deletedAt: null, OR: [{ title: { contains: q } }, { summary: { contains: q } }] }, select: { id: true, title: true, status: true }, take: 20 }); + results.push(...contents.map(c => ({ ...c, _type: 'content' }))); + } + return { success: true, data: { results, total: results.length }, summary: `找到 ${results.length} 条结果,共 ${results.filter(r => r._type === 'user').length} 个用户、${results.filter(r => r._type === 'order').length} 个订单、${results.filter(r => r._type === 'course').length} 个课程、${results.filter(r => r._type === 'content').length} 个内容` }; + } + case 'mark-all-notifications-read': { + await this.prisma.notification.updateMany({ where: { isRead: false }, data: { isRead: true } }); + return { success: true, data: {}, summary: '所有通知已标记为已读' }; + } case 'get-enterprise-orgs': { const items = await this.prisma.organization.findMany({ take: 50, orderBy: { createdAt: 'desc' } }); return { success: true, data: { items, total: items.length }, summary: `共 ${items.length} 个企业组织` }; diff --git a/backend/src/modules/admin/analytics.controller.ts b/backend/src/modules/admin/analytics.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/admin/operations.controller.ts b/backend/src/modules/admin/operations.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/admin/public.controller.ts b/backend/src/modules/admin/public.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/admin/settings.controller.ts b/backend/src/modules/admin/settings.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/admin/tests/admin.service.spec.ts b/backend/src/modules/admin/tests/admin.service.spec.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/admin/users.controller.ts b/backend/src/modules/admin/users.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/ai-assistant/ai-assistant.controller.ts b/backend/src/modules/ai-assistant/ai-assistant.controller.ts new file mode 100644 index 0000000..400d0c0 --- /dev/null +++ b/backend/src/modules/ai-assistant/ai-assistant.controller.ts @@ -0,0 +1,73 @@ +import { Controller, Post, Body, Req, UseGuards, HttpException, HttpStatus } from '@nestjs/common'; +import { ApiTags, ApiBearerAuth } from '@nestjs/swagger'; +import { AuthGuard } from '@nestjs/passport'; +import { AIGatewayService } from '../ai/ai-gateway.service'; +import { UserAiAssistantService } from './ai-assistant.service'; + +@ApiTags('AI 助手') +@Controller('ai-assistant') +export class AiAssistantController { + constructor( + private aiGateway: AIGatewayService, + private aiAssistant: UserAiAssistantService, + ) {} + + @Post('chat') + @UseGuards(AuthGuard('jwt')) + @ApiBearerAuth() + async chat( + @Req() req: any, + @Body() body: { messages: { role: string; content: string }[]; pageContext?: string }, + ) { + try { + const { messages, pageContext } = body; + const toolsDesc = this.aiAssistant.getToolsDescription(); + + const systemContent = `你是宇之然 AI 学习与实践平台的智能助手,帮助用户了解和使用平台的所有功能。 +你可以回答用户的问题,也可以调用工具来执行操作(如搜索内容、查看学习分析、管理通知等)。 + +${pageContext ? `当前页面:${pageContext}\n\n` : ''}可用工具列表(需要执行操作时,返回 JSON:{"tool":"工具名","params":{...},"description":"简述"}): + +${toolsDesc} + +注意: +1. 当用户请求执行具体操作(如搜索、查看数据、管理通知)时,返回一个 JSON 工具调用。 +2. 普通对话问题直接文字回答,不需要返回 JSON。 +3. 每次只需要返回一个 JSON 工具调用,不要包含多余文字。 +4. 对于 navigate 工具,前端会自动跳转,你只需要返回 JSON 即可。`; + + const apiMessages = [ + { role: 'system' as const, content: systemContent }, + ...messages.map(m => ({ role: m.role as 'user' | 'assistant', content: m.content })), + ]; + + const reply = await this.aiGateway.chat('general', apiMessages, { temperature: 0.7, max_tokens: 2000 }); + return { reply }; + } catch (err: any) { + throw new HttpException(err.message || 'AI 助手请求失败', HttpStatus.INTERNAL_SERVER_ERROR); + } + } + + @Post('action') + @UseGuards(AuthGuard('jwt')) + @ApiBearerAuth() + async action( + @Req() req: any, + @Body() body: { tool: string; params: Record; messages: { role: string; content: string }[] }, + ) { + const userId = req.user.userId; + const result = await this.aiAssistant.execute({ tool: body.tool, params: body.params }, userId); + + try { + const apiMessages = [ + { role: 'system' as const, content: '你是一个AI助手,下面是用户请求的执行结果,请用自然语言简洁总结给用户。' }, + ...body.messages.map(m => ({ role: m.role as 'user' | 'assistant', content: m.content })), + { role: 'assistant' as const, content: `【工具执行结果】\n工具: ${body.tool}\n参数: ${JSON.stringify(body.params)}\n结果: ${result.summary}\n数据: ${JSON.stringify(result.data)}` }, + ]; + const reply = await this.aiGateway.chat('general', apiMessages, { temperature: 0.3, max_tokens: 1000 }); + return { reply, result }; + } catch { + return { reply: result.summary, result }; + } + } +} diff --git a/backend/src/modules/ai-assistant/ai-assistant.module.ts b/backend/src/modules/ai-assistant/ai-assistant.module.ts new file mode 100644 index 0000000..0019bf8 --- /dev/null +++ b/backend/src/modules/ai-assistant/ai-assistant.module.ts @@ -0,0 +1,13 @@ +import { Module } from '@nestjs/common'; +import { AiAssistantController } from './ai-assistant.controller'; +import { UserAiAssistantService } from './ai-assistant.service'; +import { SkillsModule } from '../skills/skills.module'; +import { AIModule } from '../ai/ai.module'; + +@Module({ + imports: [SkillsModule, AIModule], + controllers: [AiAssistantController], + providers: [UserAiAssistantService], + exports: [UserAiAssistantService], +}) +export class AiAssistantModule {} diff --git a/backend/src/modules/ai-assistant/ai-assistant.service.ts b/backend/src/modules/ai-assistant/ai-assistant.service.ts new file mode 100644 index 0000000..a447695 --- /dev/null +++ b/backend/src/modules/ai-assistant/ai-assistant.service.ts @@ -0,0 +1,431 @@ +import { Injectable } from '@nestjs/common'; +import { PrismaService } from '../../prisma/prisma.service'; +import { SkillsService } from '../skills/skills.service'; + +export interface ToolDefinition { + name: string; + description: string; + parameters: Record; +} + +export interface ToolCall { + tool: string; + params: Record; + description?: string; +} + +export interface ToolResult { + success: boolean; + data: any; + summary: string; +} + +const KNOWLEDGE_DOMAINS = [ + { id: 'ai-basics', name: 'AI 基础知识', keywords: ['AI', '人工智能', '大模型', 'chatgpt', 'gpt', '大语言模型', 'llm', '深度学习', '神经网络', 'machine learning', '机器学习'] }, + { id: 'prompt-engineering', name: '提示词工程', keywords: ['提示词', 'prompt', 'system prompt', 'role', 'few-shot', 'chain-of-thought', 'cot'] }, + { id: 'programming', name: '编程开发', keywords: ['python', 'javascript', 'typescript', 'java', '代码', '函数', '算法', 'debug', 'bug', '编程', '开发', 'react', 'vue', 'node'] }, + { id: 'writing', name: '写作创作', keywords: ['写作', '文章', '文案', '润色', '作文', '创作', '故事', '小说', '博客'] }, + { id: 'english', name: '英语学习', keywords: ['英语', 'english', '翻译', '语法', 'grammar', 'vocabulary', '口语', '写作', '阅读'] }, + { id: 'data-science', name: '数据分析', keywords: ['数据', '分析', '统计', '图表', '可视化', 'sql', 'excel', 'pandas', 'numpy', '数据分析'] }, + { id: 'office', name: '办公效率', keywords: ['ppt', 'excel', 'word', '办公', '邮件', '报告', '文档', '会议', '总结'] }, + { id: 'career', name: '职业发展', keywords: ['简历', '面试', '求职', '职业', '工作', '升职', '薪资'] }, +]; + +const LEARNING_PATH_STAGES = [ + { + id: 'basics', title: '认识大模型', + tasks: [ + { label: '了解 AI 基本概念', keyword: '人工智能' }, + { label: '认识大语言模型', keyword: '大模型' }, + { label: '体验 AI 对话', keyword: '' }, + ], + }, + { + id: 'prompt', title: '提示词工程', + tasks: [ + { label: '了解提示词基础', keyword: '提示词' }, + { label: '练习提示词编写', keyword: '' }, + { label: '保存优质提示词', keyword: '' }, + ], + }, + { + id: 'advanced', title: '模型微调与高级应用', + tasks: [ + { label: '了解模型微调', keyword: '微调' }, + { label: '了解 RAG', keyword: 'rag' }, + { label: '了解 Function Calling', keyword: 'function calling' }, + ], + }, + { + id: 'agent', title: 'Agent 开发', + tasks: [ + { label: '了解 AI Agent', keyword: 'agent' }, + { label: '学习工具调用', keyword: 'tool' }, + { label: '实践项目', keyword: '' }, + ], + }, +]; + +@Injectable() +export class UserAiAssistantService { + constructor( + private prisma: PrismaService, + private skillsService: SkillsService, + ) {} + + private userTools(): ToolDefinition[] { + return [ + { + name: 'navigate', + description: '跳转到网站的某个页面', + parameters: { path: { type: 'string', description: '页面路径,如 /sandbox、/skills、/my/member、/learning、/models、/prompts、/compare、/community、/courses、/my、/about' } }, + }, + { + name: 'search', + description: '搜索平台上的课程、提示词、工具、文章等内容', + parameters: { q: { type: 'string', description: '搜索关键词(必填)' }, type: { type: 'string', enum: ['all', 'courses', 'prompts', 'tools', 'contents'], description: '搜索类型(可选,默认全部)' } }, + }, + { + name: 'list-skills', + description: '浏览技能列表,可按分类、难度、关键词过滤', + parameters: { category: { type: 'string', description: '分类(可选,如 basic/technical/creative)' }, difficulty: { type: 'string', description: '难度(可选,如 beginner/intermediate/advanced)' }, search: { type: 'string', description: '搜索关键词(可选)' } }, + }, + { + name: 'get-skill', + description: '查看某个技能的详细信息', + parameters: { id: { type: 'string', description: '技能ID(必填),如 coding、writing、english、data-analysis' } }, + }, + { + name: 'get-skill-categories', + description: '查看所有技能分类', + parameters: {}, + }, + { + name: 'get-learning-analytics', + description: '查看学情分析(知识领域掌握度),需要登录', + parameters: {}, + }, + { + name: 'get-learning-path', + description: '查看学习路径进度,需要登录', + parameters: {}, + }, + { + name: 'list-notifications', + description: '查看我的通知列表,需要登录', + parameters: { page: { type: 'number', description: '页码(可选)' }, pageSize: { type: 'number', description: '每页数量(可选)' } }, + }, + { + name: 'get-unread-count', + description: '查看未读通知数量,需要登录', + parameters: {}, + }, + { + name: 'mark-notification-read', + description: '标记某条通知为已读,需要登录', + parameters: { id: { type: 'number', description: '通知ID(必填)' } }, + }, + { + name: 'mark-all-read', + description: '将所有通知标记为已读,需要登录', + parameters: {}, + }, + { + name: 'get-profile', + description: '查看我的个人信息(昵称、手机号、会员状态等),需要登录', + parameters: {}, + }, + { + name: 'list-models', + description: '查看平台支持的AI模型列表', + parameters: {}, + }, + { + name: 'list-prompts', + description: '浏览提示词列表', + parameters: {}, + }, + { + name: 'list-courses', + description: '浏览课程列表', + parameters: {}, + }, + { + name: 'list-user-orders', + description: '查看我的订单记录,需要登录', + parameters: {}, + }, + { + name: 'get-current-subscription', + description: '查看当前会员订阅信息,需要登录', + parameters: {}, + }, + ]; + } + + getAvailableTools(): ToolDefinition[] { + return this.userTools(); + } + + getToolsDescription(): string { + return this.getAvailableTools().map(t => { + const params = Object.entries(t.parameters) + .map(([k, v]: any) => ` - ${k}: ${v.type}${v.description ? ' (' + v.description + ')' : ''}${v.enum ? ' [' + v.enum.join('|') + ']' : ''}`) + .join('\n'); + return `- **${t.name}**: ${t.description}\n${params}`; + }).join('\n\n'); + } + + async execute(call: ToolCall, userId?: number): Promise { + try { + switch (call.tool) { + case 'navigate': + return { success: true, data: { path: call.params.path }, summary: `跳转到 ${call.params.path}` }; + + case 'search': { + const { q, type } = call.params; + if (!q) throw new Error('请输入搜索关键词'); + const results = await this.search(q, type || 'all'); + return { success: true, data: results, summary: `找到 ${results.total} 条结果:${results.results.slice(0, 5).map(r => r.title).join('、')}` }; + } + + case 'list-skills': { + const skills = await this.skillsService.findAll(call.params); + return { success: true, data: skills, summary: `共 ${skills.total} 个技能:${skills.items.map(s => s.name).join('、')}` }; + } + + case 'get-skill': { + const skill = await this.skillsService.findById(call.params.id); + if (!skill) throw new Error(`技能 ${call.params.id} 不存在`); + return { success: true, data: skill, summary: `技能「${skill.name}」(${skill.category} - ${skill.difficulty}):${skill.description}` }; + } + + case 'get-skill-categories': { + const cats = await this.skillsService.getCategories(); + return { success: true, data: { categories: cats }, summary: `共 ${cats.length} 个分类:${cats.map(c => c.name).join('、')}` }; + } + + case 'get-learning-analytics': { + if (!userId) throw new Error('需要登录'); + const analytics = await this.getLearningAnalytics(userId); + return { success: true, data: analytics, summary: `总对话 ${analytics.totalSessions} 次,${analytics.domains.filter(d => d.weak).length} 个薄弱领域,建议从 ${analytics.recommendations[0]?.title || '探索更多'} 开始` }; + } + + case 'get-learning-path': { + if (!userId) throw new Error('需要登录'); + const path = await this.getLearningPath(userId); + return { success: true, data: path, summary: `学习路径共 ${path.length} 个阶段:${path.map(s => `${s.title}(${s.progress}%)`).join('、')}` }; + } + + case 'list-notifications': { + if (!userId) throw new Error('需要登录'); + const page = call.params.page || 1; + const pageSize = call.params.pageSize || 20; + const [items, total] = await Promise.all([ + this.prisma.notification.findMany({ + where: { userId }, orderBy: { createdAt: 'desc' }, skip: (page - 1) * pageSize, take: pageSize, + }), + this.prisma.notification.count({ where: { userId } }), + ]); + return { success: true, data: { items, total, page, pageSize }, summary: `共 ${total} 条通知` }; + } + + case 'get-unread-count': { + if (!userId) throw new Error('需要登录'); + const count = await this.prisma.notification.count({ where: { userId, isRead: false } }); + return { success: true, data: { count }, summary: `有 ${count} 条未读通知` }; + } + + case 'mark-notification-read': { + if (!userId) throw new Error('需要登录'); + await this.prisma.notification.updateMany({ where: { id: call.params.id, userId }, data: { isRead: true } }); + return { success: true, data: {}, summary: `通知 ${call.params.id} 已标记为已读` }; + } + + case 'mark-all-read': { + if (!userId) throw new Error('需要登录'); + await this.prisma.notification.updateMany({ where: { userId, isRead: false }, data: { isRead: true } }); + return { success: true, data: {}, summary: '所有通知已标记为已读' }; + } + + case 'get-profile': { + if (!userId) throw new Error('需要登录'); + const profile = await this.prisma.user.findUnique({ + where: { id: userId }, + select: { id: true, phone: true, email: true, nickname: true, avatar: true, status: true, memberPlan: true, memberExpire: true, sandboxDaily: true, createdAt: true }, + }); + if (!profile) throw new Error('用户不存在'); + return { success: true, data: profile, summary: `用户 ${profile.nickname || profile.phone || profile.email}${profile.memberPlan !== 'FREE' ? ',会员: ' + profile.memberPlan : ',当前为免费用户'}${profile.memberExpire ? ',到期: ' + profile.memberExpire.toISOString().slice(0, 10) : ''}` }; + } + + case 'list-models': { + const models = await this.prisma.aiModel.findMany({ where: { status: 'ACTIVE' }, orderBy: { sortOrder: 'asc' } }); + if (models.length === 0) { + return { success: true, data: { models: [] }, summary: '目前没有可用的AI模型,请稍后再试' }; + } + return { success: true, data: { models }, summary: `共 ${models.length} 个模型:${models.map(m => m.name).join('、')}` }; + } + + case 'list-prompts': { + const items = await this.prisma.prompt.findMany({ + where: { deletedAt: null, status: 'PUBLISHED' }, + take: 50, orderBy: { createdAt: 'desc' }, + select: { id: true, title: true, description: true, tags: true }, + }); + return { success: true, data: { items, total: items.length }, summary: `共 ${items.length} 个提示词:${items.map(p => p.title).join('、')}` }; + } + + case 'list-courses': { + const items = await this.prisma.course.findMany({ + where: { deletedAt: null, status: 'PUBLISHED' }, + take: 50, orderBy: { createdAt: 'desc' }, + select: { id: true, title: true, description: true, price: true, isFree: true }, + }); + const freeCount = items.filter(c => c.isFree).length; + return { success: true, data: { items, total: items.length }, summary: `共 ${items.length} 个课程(${freeCount} 个免费):${items.map(c => c.title).join('、')}` }; + } + + case 'list-user-orders': { + if (!userId) throw new Error('需要登录'); + const items = await this.prisma.order.findMany({ + where: { userId }, + take: 50, orderBy: { createdAt: 'desc' }, + }); + const paidAmount = items.filter(o => o.status === 'PAID').reduce((s, o) => s + o.amount, 0); + return { success: true, data: { items, total: items.length, paidAmount }, summary: `共 ${items.length} 笔订单,已支付总额 ¥${paidAmount}` }; + } + + case 'get-current-subscription': { + if (!userId) throw new Error('需要登录'); + const now = new Date(); + const sub = await this.prisma.subscription.findFirst({ + where: { userId, status: 'ACTIVE', endDate: { gt: now } }, + orderBy: { endDate: 'desc' }, + }); + if (!sub) { + const user = await this.prisma.user.findUnique({ where: { id: userId }, select: { memberPlan: true, memberExpire: true } }); + if (!user) throw new Error('用户不存在'); + return { success: true, data: null, summary: user.memberPlan !== 'FREE' ? `会员状态: ${user.memberPlan},到期 ${user.memberExpire?.toISOString().slice(0, 10) || '未知'}` : '当前为免费用户,暂无有效订阅' }; + } + return { success: true, data: sub, summary: `当前订阅: ${sub.plan},到期 ${sub.endDate.toISOString().slice(0, 10)},剩余 ${Math.ceil((sub.endDate.getTime() - Date.now()) / 86400000)} 天` }; + } + + default: + throw new Error(`未知工具: ${call.tool}`); + } + } catch (err: any) { + return { success: false, data: null, summary: `执行失败: ${err.message}` }; + } + } + + private async getLearningAnalytics(userId: number) { + const sessions = await this.prisma.sandboxSession.findMany({ + where: { userId }, orderBy: { createdAt: 'desc' }, take: 100, + }); + + const domainCounts: Record = {}; + const domainDates: Record = {}; + const totalSessions = sessions.length; + + for (const d of KNOWLEDGE_DOMAINS) domainCounts[d.id] = 0; + + for (const session of sessions) { + const searchText = `${session.title} ${session.messages || ''}`.toLowerCase(); + for (const domain of KNOWLEDGE_DOMAINS) { + if (domain.keywords.some(kw => searchText.includes(kw))) { + domainCounts[domain.id] = (domainCounts[domain.id] || 0) + 1; + if (!domainDates[domain.id] || session.createdAt.toISOString() > domainDates[domain.id]) { + domainDates[domain.id] = session.createdAt.toISOString(); + } + } + } + } + + const domains = KNOWLEDGE_DOMAINS.map(d => { + const count = domainCounts[d.id] || 0; + const mastery = Math.min(Math.round((count / Math.max(totalSessions * 0.3, 1)) * 100), 100); + return { id: d.id, name: d.name, sessionCount: count, mastery, lastActive: domainDates[d.id] || null, weak: mastery < 30 }; + }); + + const weakDomains = domains.filter(d => d.weak); + const recommendations = weakDomains.length > 0 + ? weakDomains.slice(0, 3).flatMap(d => [ + { title: `了解 ${d.name}`, url: '/sandbox' }, + ]) + : [{ title: '探索更多知识领域', url: '/sandbox' }]; + + return { domains, totalSessions, weakDomains: weakDomains.map(d => d.name), recommendations }; + } + + private async getLearningPath(userId: number) { + const sessions = await this.prisma.sandboxSession.findMany({ + where: { userId }, select: { title: true, messages: true }, + }); + const allText = sessions.map(s => `${s.title} ${s.messages || ''}`.toLowerCase()).join(' '); + + return LEARNING_PATH_STAGES.map(stage => { + const completedCount = stage.tasks.filter(t => !t.keyword || allText.includes(t.keyword)).length; + const progress = stage.tasks.length > 0 ? Math.round((completedCount / stage.tasks.length) * 100) : 0; + return { ...stage, completedCount, totalTasks: stage.tasks.length, progress, unlocked: true }; + }); + } + + private async search(q: string, type: string) { + const results: any[] = []; + let total = 0; + + if (type === 'all' || type === 'courses') { + const [items, count] = await Promise.all([ + this.prisma.course.findMany({ + where: { deletedAt: null, status: 'PUBLISHED', OR: [{ title: { contains: q } }, { description: { contains: q } }] }, + select: { id: true, title: true, description: true, isFree: true }, + take: type === 'courses' ? 20 : 5, + }), + this.prisma.course.count({ where: { deletedAt: null, status: 'PUBLISHED', OR: [{ title: { contains: q } }, { description: { contains: q } }] } }), + ]); + results.push(...items.map(i => ({ ...i, _type: 'course' }))); + total += count; + } + + if (type === 'all' || type === 'prompts') { + const [items, count] = await Promise.all([ + this.prisma.prompt.findMany({ + where: { deletedAt: null, status: 'PUBLISHED', OR: [{ title: { contains: q } }, { description: { contains: q } }, { content: { contains: q } }] }, + select: { id: true, title: true, description: true }, + take: type === 'prompts' ? 20 : 5, + }), + this.prisma.prompt.count({ where: { deletedAt: null, status: 'PUBLISHED', OR: [{ title: { contains: q } }, { description: { contains: q } }, { content: { contains: q } }] } }), + ]); + results.push(...items.map(i => ({ ...i, _type: 'prompt' }))); + total += count; + } + + if (type === 'all' || type === 'tools') { + const [items, count] = await Promise.all([ + this.prisma.tool.findMany({ + where: { deletedAt: null, OR: [{ name: { contains: q } }, { description: { contains: q } }] }, + select: { id: true, name: true, description: true }, + take: type === 'tools' ? 20 : 5, + }), + this.prisma.tool.count({ where: { deletedAt: null, OR: [{ name: { contains: q } }, { description: { contains: q } }] } }), + ]); + results.push(...items.map(i => ({ ...i, _type: 'tool' }))); + total += count; + } + + if (type === 'all' || type === 'contents') { + const [items, count] = await Promise.all([ + this.prisma.content.findMany({ + where: { deletedAt: null, status: 'PUBLISHED', OR: [{ title: { contains: q } }, { summary: { contains: q } }] }, + select: { id: true, title: true, summary: true }, + take: type === 'contents' ? 20 : 5, + }), + this.prisma.content.count({ where: { deletedAt: null, status: 'PUBLISHED', OR: [{ title: { contains: q } }, { summary: { contains: q } }] } }), + ]); + results.push(...items.map(i => ({ ...i, _type: 'content' }))); + total += count; + } + + return { results, total }; + } +} diff --git a/backend/src/modules/ai/ai-gateway.service.ts b/backend/src/modules/ai/ai-gateway.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/ai/ai.module.ts b/backend/src/modules/ai/ai.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/ai/tests/ai-gateway.service.spec.ts b/backend/src/modules/ai/tests/ai-gateway.service.spec.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/auth/auth.controller.ts b/backend/src/modules/auth/auth.controller.ts old mode 100644 new mode 100755 index cc4c298..2e1d961 --- a/backend/src/modules/auth/auth.controller.ts +++ b/backend/src/modules/auth/auth.controller.ts @@ -3,6 +3,7 @@ import { ApiTags, ApiBearerAuth } from '@nestjs/swagger'; import { AuthGuard } from '@nestjs/passport'; import { AuthService } from './auth.service'; import { RegisterDto } from './dto/register.dto'; +import { LoginDto } from './dto/login.dto'; @ApiTags('认证') @Controller('auth') @@ -15,7 +16,7 @@ export class AuthController { } @Post('login') - async login(@Body() body: { account: string; password: string }) { + async login(@Body() body: LoginDto) { return this.authService.login(body.account, body.password); } diff --git a/backend/src/modules/auth/auth.module.ts b/backend/src/modules/auth/auth.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/auth/auth.service.ts b/backend/src/modules/auth/auth.service.ts old mode 100644 new mode 100755 index ece60be..19bf12e --- a/backend/src/modules/auth/auth.service.ts +++ b/backend/src/modules/auth/auth.service.ts @@ -1,4 +1,4 @@ -import { Injectable, UnauthorizedException } from '@nestjs/common'; +import { Injectable, UnauthorizedException, BadRequestException } from '@nestjs/common'; import { JwtService } from '@nestjs/jwt'; import * as bcrypt from 'bcryptjs'; import { PrismaService } from '../../prisma/prisma.service'; @@ -10,14 +10,32 @@ export class AuthService { private jwtService: JwtService, ) {} - async register(data: { phone?: string; email?: string; password: string; nickname?: string }) { + async register(data: { username?: string; phone?: string; email?: string; password: string; nickname?: string }) { + if (!data.username && !data.phone && !data.email) { + throw new BadRequestException('请填写用户名、手机号或邮箱'); + } + + if (data.username) { + const exists = await this.prisma.user.findUnique({ where: { username: data.username } }); + if (exists) throw new BadRequestException('用户名已被注册'); + } + if (data.phone) { + const exists = await this.prisma.user.findUnique({ where: { phone: data.phone } }); + if (exists) throw new BadRequestException('手机号已被注册'); + } + if (data.email) { + const exists = await this.prisma.user.findUnique({ where: { email: data.email } }); + if (exists) throw new BadRequestException('邮箱已被注册'); + } + const passwordHash = await bcrypt.hash(data.password, 10); const user = await this.prisma.user.create({ data: { - phone: data.phone, - email: data.email, + username: data.username || null, + phone: data.phone || null, + email: data.email || null, passwordHash, - nickname: data.nickname || data.phone || data.email?.split('@')[0], + nickname: data.nickname || data.username || data.phone || data.email?.split('@')[0], }, }); return this.generateTokens(user.id); @@ -26,7 +44,7 @@ export class AuthService { async login(account: string, password: string) { const user = await this.prisma.user.findFirst({ where: { - OR: [{ phone: account }, { email: account }], + OR: [{ username: account }, { phone: account }, { email: account }], deletedAt: null, }, }); @@ -68,6 +86,7 @@ export class AuthService { where: { id: userId }, select: { id: true, + username: true, phone: true, email: true, nickname: true, diff --git a/backend/src/modules/auth/dto/login.dto.ts b/backend/src/modules/auth/dto/login.dto.ts new file mode 100644 index 0000000..7547e36 --- /dev/null +++ b/backend/src/modules/auth/dto/login.dto.ts @@ -0,0 +1,11 @@ +import { IsNotEmpty, IsString } from 'class-validator'; + +export class LoginDto { + @IsNotEmpty({ message: '请输入账号' }) + @IsString() + account: string; + + @IsNotEmpty({ message: '请输入密码' }) + @IsString() + password: string; +} diff --git a/backend/src/modules/auth/dto/register.dto.ts b/backend/src/modules/auth/dto/register.dto.ts old mode 100644 new mode 100755 index d5231a7..73fcd28 --- a/backend/src/modules/auth/dto/register.dto.ts +++ b/backend/src/modules/auth/dto/register.dto.ts @@ -1,12 +1,16 @@ -import { IsNotEmpty, IsOptional, IsString, MinLength } from 'class-validator'; +import { IsNotEmpty, IsOptional, IsString, MinLength, Matches } from 'class-validator'; export class RegisterDto { @IsOptional() - @IsString() + @Matches(/^[a-zA-Z0-9_\u4e00-\u9fa5]{2,20}$/, { message: '用户名格式不正确(2-20位,支持中英文、数字、下划线)' }) + username?: string; + + @IsOptional() + @Matches(/^1[3-9]\d{9}$/, { message: '手机号格式不正确' }) phone?: string; @IsOptional() - @IsString() + @Matches(/^[^\s@]+@[^\s@]+\.[^\s@]+$/, { message: '邮箱格式不正确' }) email?: string; @IsNotEmpty({ message: '密码不能为空' }) diff --git a/backend/src/modules/auth/jwt.strategy.ts b/backend/src/modules/auth/jwt.strategy.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/auth/tests/auth.service.spec.ts b/backend/src/modules/auth/tests/auth.service.spec.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/categories/categories.controller.ts b/backend/src/modules/categories/categories.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/categories/categories.module.ts b/backend/src/modules/categories/categories.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/community/circles.controller.ts b/backend/src/modules/community/circles.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/community/community.controller.ts b/backend/src/modules/community/community.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/community/community.module.ts b/backend/src/modules/community/community.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/community/community.service.ts b/backend/src/modules/community/community.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/community/tests/community.service.spec.ts b/backend/src/modules/community/tests/community.service.spec.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/contents/contents.controller.ts b/backend/src/modules/contents/contents.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/contents/contents.module.ts b/backend/src/modules/contents/contents.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/contents/contents.service.ts b/backend/src/modules/contents/contents.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/courses/courses.controller.ts b/backend/src/modules/courses/courses.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/courses/courses.module.ts b/backend/src/modules/courses/courses.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/courses/courses.service.ts b/backend/src/modules/courses/courses.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/courses/tests/courses.service.spec.ts b/backend/src/modules/courses/tests/courses.service.spec.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/dashboard/dashboard.controller.ts b/backend/src/modules/dashboard/dashboard.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/dashboard/dashboard.module.ts b/backend/src/modules/dashboard/dashboard.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/dashboard/dashboard.service.ts b/backend/src/modules/dashboard/dashboard.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/enterprise/enterprise.controller.ts b/backend/src/modules/enterprise/enterprise.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/enterprise/enterprise.module.ts b/backend/src/modules/enterprise/enterprise.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/enterprise/enterprise.service.ts b/backend/src/modules/enterprise/enterprise.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/enterprise/tests/enterprise.service.spec.ts b/backend/src/modules/enterprise/tests/enterprise.service.spec.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/learning/learning.controller.ts b/backend/src/modules/learning/learning.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/learning/learning.module.ts b/backend/src/modules/learning/learning.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/learning/learning.service.ts b/backend/src/modules/learning/learning.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/models/models.controller.ts b/backend/src/modules/models/models.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/models/models.module.ts b/backend/src/modules/models/models.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/models/models.service.ts b/backend/src/modules/models/models.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/notifications/notification.controller.ts b/backend/src/modules/notifications/notification.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/notifications/notification.module.ts b/backend/src/modules/notifications/notification.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/notifications/notification.service.ts b/backend/src/modules/notifications/notification.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/orders/orders.controller.ts b/backend/src/modules/orders/orders.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/orders/orders.module.ts b/backend/src/modules/orders/orders.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/orders/orders.service.ts b/backend/src/modules/orders/orders.service.ts old mode 100644 new mode 100755 index 4aa94e8..f4e113b --- a/backend/src/modules/orders/orders.service.ts +++ b/backend/src/modules/orders/orders.service.ts @@ -1,15 +1,16 @@ import { Injectable } from '@nestjs/common'; import { PrismaService } from '../../prisma/prisma.service'; -import { PaymentService } from '../payment/payment.service'; +import { GatewayPayService } from '../payment/gateway-pay.service'; @Injectable() export class OrdersService { constructor( private prisma: PrismaService, - private paymentService: PaymentService, + private gatewayPay: GatewayPayService, ) {} async create(userId: number, data: { amount: number; planType: string; payChannel?: string; tradeType?: string; openid?: string }) { + const channel = data.payChannel || 'alipay'; const orderNo = `YZR${Date.now()}${Math.random().toString(36).slice(2, 8).toUpperCase()}`; const order = await this.prisma.order.create({ @@ -18,35 +19,92 @@ export class OrdersService { userId, amount: data.amount, planType: data.planType, - payChannel: data.payChannel || 'wxpay', + payChannel: channel, }, }); - // If paying via WeChat, create unified order - if (data.payChannel === 'wxpay' || !data.payChannel) { - try { - const planLabels: Record = { - MONTHLY: '宇之然AI月卡会员', - YEARLY: '宇之然AI年卡会员', - }; - const payResult = await this.paymentService.createUnifiedOrder({ - description: planLabels[data.planType] || '宇之然AI会员充值', - outTradeNo: orderNo, - amount: data.amount, - tradeType: (data.tradeType as 'JSAPI' | 'NATIVE' | 'MWEB') || 'NATIVE', - openid: data.openid, - }); - // Mock 模式下自动完成支付闭环(NATIVE mock 无需扫码) - if (payResult?.codeUrl === 'mock://pay') { - await this.paymentService.completeMockPayment(orderNo); - } - return { order, payResult }; - } catch { - return { order, payResult: null }; - } - } + const planLabels: Record = { + MONTHLY: '宇之然AI月卡会员', + YEARLY: '宇之然AI年卡会员', + }; + const subject = planLabels[data.planType] || '宇之然AI会员充值'; - return { order }; + try { + const result = await this.gatewayPay.createOrder({ + merchantOrderId: orderNo, + amount: data.amount, + paymentMethod: channel === 'wxpay' ? 'wechat' : 'alipay', + subject, + }); + + if (result.gatewayOrderId) { + await this.prisma.order.update({ + where: { id: order.id }, + data: { gatewayOrderId: result.gatewayOrderId }, + }); + } + + const payResult = { + gatewayOrderId: result.gatewayOrderId, + payUrl: result.payUrl, + qrcode: result.qrcode, + status: result.status, + }; + + if (result.payUrl === 'mock://pay' || result.qrcode === 'mock://pay') { + await this.completeMockPayment(order.id); + return { order, payResult: { ...payResult, redirectUrl: 'mock://pay' }, message: '模拟支付完成' }; + } + + return { order, payResult }; + } catch (err) { + return { order, payResult: null }; + } + } + + private async completeMockPayment(orderId: number) { + const order = await this.prisma.order.findUnique({ where: { id: orderId }, include: { user: true } }); + if (!order || order.status !== 'PENDING') return; + + await this.prisma.order.update({ + where: { id: orderId }, + data: { status: 'PAID', paidAt: new Date() }, + }); + + if (order.planType === 'MONTHLY' || order.planType === 'YEARLY') { + const durationDays = order.planType === 'MONTHLY' ? 30 : 365; + const now = new Date(); + let subscriptionEndDate: Date; + + const existingSub = await this.prisma.subscription.findFirst({ + where: { userId: order.userId, status: 'ACTIVE', endDate: { gt: now } }, + }); + + if (existingSub) { + subscriptionEndDate = new Date(existingSub.endDate.getTime() + durationDays * 24 * 60 * 60 * 1000); + await this.prisma.subscription.update({ + where: { id: existingSub.id }, + data: { endDate: subscriptionEndDate }, + }); + } else { + subscriptionEndDate = new Date(now); + subscriptionEndDate.setDate(subscriptionEndDate.getDate() + durationDays); + await this.prisma.subscription.create({ + data: { + userId: order.userId, + plan: order.planType as any, + startDate: now, + endDate: subscriptionEndDate, + status: 'ACTIVE', + }, + }); + } + + await this.prisma.user.update({ + where: { id: order.userId }, + data: { memberPlan: order.planType as any, memberExpire: subscriptionEndDate }, + }); + } } async findByUser(userId: number, params: { page?: number; pageSize?: number }) { diff --git a/backend/src/modules/orders/subscriptions.controller.ts b/backend/src/modules/orders/subscriptions.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/orders/tests/orders.service.spec.ts b/backend/src/modules/orders/tests/orders.service.spec.ts old mode 100644 new mode 100755 index 64532e4..3856380 --- a/backend/src/modules/orders/tests/orders.service.spec.ts +++ b/backend/src/modules/orders/tests/orders.service.spec.ts @@ -1,12 +1,12 @@ import { Test, TestingModule } from '@nestjs/testing'; import { OrdersService } from '../orders.service'; import { PrismaService } from '../../../prisma/prisma.service'; -import { PaymentService } from '../../payment/payment.service'; +import { GatewayPayService } from '../../payment/gateway-pay.service'; describe('OrdersService', () => { let service: OrdersService; let prisma: PrismaService; - let paymentService: PaymentService; + let gatewayPay: GatewayPayService; const mockPrisma = { order: { @@ -19,12 +19,18 @@ describe('OrdersService', () => { subscription: { findFirst: jest.fn(), findMany: jest.fn(), + create: jest.fn(), + }, + user: { + update: jest.fn(), }, }; - const mockPaymentService = { - createUnifiedOrder: jest.fn(), - completeMockPayment: jest.fn(), + const mockGatewayPay = { + createOrder: jest.fn(), + queryOrder: jest.fn(), + refund: jest.fn(), + handleWebhook: jest.fn(), }; beforeEach(async () => { @@ -32,74 +38,86 @@ describe('OrdersService', () => { providers: [ OrdersService, { provide: PrismaService, useValue: mockPrisma }, - { provide: PaymentService, useValue: mockPaymentService }, + { provide: GatewayPayService, useValue: mockGatewayPay }, ], }).compile(); service = module.get(OrdersService); prisma = module.get(PrismaService); - paymentService = module.get(PaymentService); + gatewayPay = module.get(GatewayPayService); jest.clearAllMocks(); }); describe('create', () => { - it('should create order and call payment service for wxpay', async () => { + it('should create order and call gateway for alipay', async () => { const mockOrder = { id: 1, orderNo: 'YZR123', - amount: 29.9, + amount: 49.9, planType: 'MONTHLY', - payChannel: 'wxpay', + payChannel: 'alipay', }; mockPrisma.order.create.mockResolvedValue(mockOrder); - mockPaymentService.createUnifiedOrder.mockResolvedValue({ - prepay_id: 'wx123', - nonceStr: 'abc', + mockPrisma.order.update.mockResolvedValue(mockOrder); + mockGatewayPay.createOrder.mockResolvedValue({ + gatewayOrderId: 'gateway_abc', + payUrl: 'https://pay.example.com', + status: 'pending', }); const result = await service.create(1, { - amount: 29.9, + amount: 49.9, planType: 'MONTHLY', + payChannel: 'alipay', + }); + + expect(result).toHaveProperty('order'); + expect(result).toHaveProperty('payResult'); + expect(mockGatewayPay.createOrder).toHaveBeenCalledWith( + expect.objectContaining({ + paymentMethod: 'alipay', + amount: 49.9, + }) + ); + }); + + it('should create order and call gateway for wechat', async () => { + const mockOrder = { + id: 2, + orderNo: 'YZR456', + amount: 299, + planType: 'YEARLY', + payChannel: 'wxpay', + }; + mockPrisma.order.create.mockResolvedValue(mockOrder); + mockPrisma.order.update.mockResolvedValue(mockOrder); + mockGatewayPay.createOrder.mockResolvedValue({ + gatewayOrderId: 'gateway_def', + qrcode: 'data:image/png;base64,...', + status: 'pending', + }); + + const result = await service.create(1, { + amount: 299, + planType: 'YEARLY', payChannel: 'wxpay', }); expect(result).toHaveProperty('order'); expect(result).toHaveProperty('payResult'); - expect(mockPrisma.order.create).toHaveBeenCalledWith({ - data: expect.objectContaining({ - userId: 1, - amount: 29.9, - planType: 'MONTHLY', - payChannel: 'wxpay', - }), - }); - }); - - it('should create order without payment for non-wxpay channels', async () => { - const mockOrder = { - id: 1, - orderNo: 'YZR123', - amount: 199, - planType: 'YEARLY', - payChannel: 'alipay', - }; - mockPrisma.order.create.mockResolvedValue(mockOrder); - - const result = await service.create(1, { - amount: 199, - planType: 'YEARLY', - payChannel: 'alipay', - }); - - expect(result).toEqual({ order: mockOrder }); - expect(mockPaymentService.createUnifiedOrder).not.toHaveBeenCalled(); + expect(mockGatewayPay.createOrder).toHaveBeenCalledWith( + expect.objectContaining({ + paymentMethod: 'wechat', + amount: 299, + }) + ); }); }); describe('findByUser', () => { it('should return paginated orders for user', async () => { const mockOrders = [ - { id: 1, orderNo: 'YZR123', amount: 29.9 } + { id: 1, orderNo: 'YZR123', amount: 49.9 } ]; mockPrisma.order.findMany.mockResolvedValue(mockOrders); mockPrisma.order.count.mockResolvedValue(1); @@ -136,7 +154,7 @@ describe('OrdersService', () => { userId: 1, plan: 'YEARLY', status: 'ACTIVE', - endDate: new Date(Date.now() + 86400000), // 明天到期 + endDate: new Date(Date.now() + 86400000), }; mockPrisma.subscription.findFirst.mockResolvedValue(mockSub); diff --git a/backend/src/modules/payment/alipay.service.ts b/backend/src/modules/payment/alipay.service.ts new file mode 100644 index 0000000..ee9406e --- /dev/null +++ b/backend/src/modules/payment/alipay.service.ts @@ -0,0 +1,300 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { PrismaService } from '../../prisma/prisma.service'; +import { PaymentConfigService } from './payment-config.service'; + +export interface AlipayPayResult { + redirectUrl?: string; + formHtml?: string; + outTradeNo: string; + totalAmount: number; + subject: string; +} + +@Injectable() +export class AlipayService { + private readonly logger = new Logger(AlipayService.name); + private sdk: any = null; + + constructor( + private prisma: PrismaService, + private configService: PaymentConfigService, + ) {} + + async createPagePay(params: { + outTradeNo: string; + totalAmount: number; + subject: string; + description?: string; + }): Promise { + const conf = await this.configService.load(); + + if (conf.alipay.mock) { + this.logger.log(`支付宝模拟支付: ${params.outTradeNo}`); + await this.completeMockPayment(params.outTradeNo); + return { + redirectUrl: 'mock://pay', + outTradeNo: params.outTradeNo, + totalAmount: params.totalAmount, + subject: params.subject, + }; + } + + try { + const AlipaySdk = require('alipay-sdk').default; + const AlipayFormData = require('alipay-sdk/lib/form').default; + + const alipaySdk = new AlipaySdk({ + appId: conf.alipay.appId, + privateKey: conf.alipay.privateKey, + alipayPublicKey: conf.alipay.alipayPublicKey, + gateway: conf.alipay.gateway, + }); + + const formData = new AlipayFormData(); + formData.setMethod('POST'); + formData.addField('notifyUrl', conf.alipay.notifyUrl); + formData.addField('returnUrl', conf.alipay.returnUrl); + formData.addField('bizContent', { + outTradeNo: params.outTradeNo, + productCode: 'FAST_INSTANT_TRADE_PAY', + totalAmount: params.totalAmount.toFixed(2), + subject: params.subject, + body: params.description || params.subject, + }); + + const result = await alipaySdk.exec( + 'alipay.trade.page.pay', + {}, + { formData }, + ); + + return { + redirectUrl: typeof result === 'string' ? result : result?.redirectUrl, + formHtml: result?.formHtml, + outTradeNo: params.outTradeNo, + totalAmount: params.totalAmount, + subject: params.subject, + }; + } catch (err: any) { + this.logger.error(`支付宝下单失败: ${err.message}`); + await this.completeMockPayment(params.outTradeNo); + return { + redirectUrl: 'mock://pay', + outTradeNo: params.outTradeNo, + totalAmount: params.totalAmount, + subject: params.subject, + }; + } + } + + async handleNotify(body: Record): Promise<{ code: string; message: string }> { + const conf = await this.configService.load(); + + if (conf.alipay.mock) { + const outTradeNo = body?.out_trade_no; + const tradeNo = body?.trade_no; + if (outTradeNo) { + const order = await this.prisma.order.findUnique({ where: { orderNo: outTradeNo } }); + if (order && order.status === 'PENDING') { + await this.updateOrderAndMembership(outTradeNo, tradeNo || outTradeNo); + } + } + return { code: 'SUCCESS', message: '模拟通知处理成功' }; + } + + try { + const AlipaySdk = require('alipay-sdk').default; + const alipaySdk = new AlipaySdk({ + appId: conf.alipay.appId, + privateKey: conf.alipay.privateKey, + alipayPublicKey: conf.alipay.alipayPublicKey, + gateway: conf.alipay.gateway, + }); + + const signVerified = alipaySdk.checkSign(body); + if (!signVerified) { + this.logger.warn('支付宝签名验证失败'); + return { code: 'FAIL', message: '签名验证失败' }; + } + + const tradeStatus = body.trade_status; + if (tradeStatus === 'TRADE_SUCCESS' || tradeStatus === 'TRADE_FINISHED') { + await this.updateOrderAndMembership(body.out_trade_no, body.trade_no); + } + + return { code: 'SUCCESS', message: '成功' }; + } catch (err: any) { + this.logger.error(`支付宝通知处理失败: ${err.message}`); + return { code: 'FAIL', message: err.message }; + } + } + + async refund(outTradeNo: string, amount: number, reason?: string) { + const conf = await this.configService.load(); + + if (conf.alipay.mock) { + this.logger.log(`支付宝模拟退款: ${outTradeNo}`); + await this.prisma.order.update({ + where: { orderNo: outTradeNo }, + data: { status: 'REFUNDED' }, + }).catch(err => this.logger.warn(`退款更新订单失败: ${err.message}`)); + return { code: 'SUCCESS', message: '模拟退款成功' }; + } + + try { + const AlipaySdk = require('alipay-sdk').default; + const alipaySdk = new AlipaySdk({ + appId: conf.alipay.appId, + privateKey: conf.alipay.privateKey, + alipayPublicKey: conf.alipay.alipayPublicKey, + gateway: conf.alipay.gateway, + }); + + const result = await alipaySdk.exec('alipay.trade.refund', { + bizContent: { + outTradeNo, + refundAmount: amount.toFixed(2), + refundReason: reason || '用户申请退款', + outRequestNo: `REFUND_${outTradeNo}_${Date.now()}`, + }, + }); + + await this.prisma.order.update({ + where: { orderNo: outTradeNo }, + data: { status: 'REFUNDED' }, + }).catch(err => this.logger.warn(`退款更新订单失败: ${err.message}`)); + + return result; + } catch (err: any) { + this.logger.error(`支付宝退款失败: ${err.message}`); + throw err; + } + } + + async queryOrder(outTradeNo: string) { + const localOrder = await this.prisma.order.findUnique({ + where: { orderNo: outTradeNo }, + include: { user: { select: { id: true, nickname: true, memberPlan: true, memberExpire: true } } }, + }); + + const conf = await this.configService.load(); + + if (conf.alipay.mock) { + return { + trade_status: localOrder?.status === 'PAID' ? 'TRADE_SUCCESS' : 'WAIT_BUYER_PAY', + outTradeNo, + localStatus: localOrder?.status, + amount: localOrder?.amount, + planType: localOrder?.planType, + user: localOrder?.user, + }; + } + + try { + const AlipaySdk = require('alipay-sdk').default; + const alipaySdk = new AlipaySdk({ + appId: conf.alipay.appId, + privateKey: conf.alipay.privateKey, + alipayPublicKey: conf.alipay.alipayPublicKey, + gateway: conf.alipay.gateway, + }); + + const result = await alipaySdk.exec('alipay.trade.query', { + bizContent: { outTradeNo }, + }); + + return { + ...result, + localStatus: localOrder?.status, + localAmount: localOrder?.amount, + user: localOrder?.user, + }; + } catch (err: any) { + this.logger.error(`支付宝查询失败: ${err.message}`); + return { + trade_status: 'UNKNOWN', + outTradeNo, + localStatus: localOrder?.status, + amount: localOrder?.amount, + user: localOrder?.user, + }; + } + } + + private async completeMockPayment(orderNo: string): Promise { + const order = await this.prisma.order.findUnique({ where: { orderNo } }); + if (!order || order.status !== 'PENDING') return; + await this.updateOrderAndMembership(orderNo, `MOCK_${Date.now()}`); + } + + private async updateOrderAndMembership(outTradeNo: string, transactionId?: string) { + const order = await this.prisma.order.findUnique({ + where: { orderNo: outTradeNo }, + include: { user: true }, + }); + + if (!order) { + this.logger.warn(`订单不存在: ${outTradeNo}`); + return; + } + + if (order.status === 'PAID') { + this.logger.log(`订单已支付,跳过重复处理: ${outTradeNo}`); + return; + } + + await this.prisma.order.update({ + where: { id: order.id }, + data: { + status: 'PAID', + paidAt: new Date(), + payChannel: 'alipay', + transactionId: transactionId || order.transactionId, + }, + }); + + if (order.planType === 'MONTHLY' || order.planType === 'YEARLY') { + const durationDays = order.planType === 'MONTHLY' ? 30 : 365; + const now = new Date(); + let subscriptionEndDate: Date; + + const existingSub = await this.prisma.subscription.findFirst({ + where: { + userId: order.userId, + status: 'ACTIVE', + endDate: { gt: now }, + }, + }); + + if (existingSub) { + subscriptionEndDate = new Date(existingSub.endDate.getTime() + durationDays * 24 * 60 * 60 * 1000); + await this.prisma.subscription.update({ + where: { id: existingSub.id }, + data: { endDate: subscriptionEndDate }, + }); + } else { + subscriptionEndDate = new Date(now); + subscriptionEndDate.setDate(subscriptionEndDate.getDate() + durationDays); + await this.prisma.subscription.create({ + data: { + userId: order.userId, + plan: order.planType as any, + startDate: now, + endDate: subscriptionEndDate, + status: 'ACTIVE', + }, + }); + } + + await this.prisma.user.update({ + where: { id: order.userId }, + data: { + memberPlan: order.planType as any, + memberExpire: subscriptionEndDate, + }, + }); + + this.logger.log(`支付宝会员订阅更新成功: 用户${order.userId}, 类型${order.planType}, 到期${subscriptionEndDate}`); + } + } +} diff --git a/backend/src/modules/payment/gateway-pay.service.ts b/backend/src/modules/payment/gateway-pay.service.ts new file mode 100644 index 0000000..3b0a18d --- /dev/null +++ b/backend/src/modules/payment/gateway-pay.service.ts @@ -0,0 +1,321 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { PrismaService } from '../../prisma/prisma.service'; +import * as crypto from 'crypto'; + +interface GatewayCreateOrderParams { + merchantOrderId: string; + amount: number; + paymentMethod: 'alipay' | 'wechat'; + subject?: string; + returnUrl?: string; +} + +interface GatewayCreateOrderResult { + gatewayOrderId: string; + merchantOrderId: string; + amount: number; + paymentMethod: string; + payUrl?: string; + qrcode?: string; + status: string; +} + +export interface GatewayQueryResult { + gatewayOrderId: string; + merchantOrderId: string; + amount: number; + paymentMethod: string; + status: string; + transactionId?: string; + paidAt?: string; +} + +@Injectable() +export class GatewayPayService { + private readonly logger = new Logger(GatewayPayService.name); + private readonly apiKey: string; + private readonly apiSecret: string; + private readonly baseUrl: string; + private readonly notifyUrl: string; + private readonly returnUrl: string; + private readonly mock: boolean; + + constructor(private prisma: PrismaService) { + this.apiKey = process.env.GATEWAY_PAY_API_KEY || ''; + this.apiSecret = process.env.GATEWAY_PAY_API_SECRET || ''; + this.baseUrl = (process.env.GATEWAY_PAY_BASE_URL || 'http://localhost:8100').replace(/\/+$/, ''); + this.notifyUrl = process.env.GATEWAY_PAY_NOTIFY_URL || 'https://yuzhiran.com/api/v1/payment/gateway/webhook'; + this.returnUrl = process.env.GATEWAY_PAY_RETURN_URL || 'https://yuzhiran.com/my/member'; + this.mock = process.env.GATEWAY_PAY_MOCK === 'true' || !this.apiKey; + if (this.mock) { + this.logger.warn('GATEWAY_PAY_MOCK=true,使用模拟支付模式'); + } + } + + private signRequest(method: string, path: string, body: Record): string { + const timestamp = String(Math.floor(Date.now() / 1000)); + const bodySha256 = crypto.createHash('sha256').update(JSON.stringify(body)).digest('hex'); + const signStr = `${method}\n${path}\n${timestamp}\n${bodySha256}`; + const signature = crypto.createHmac('sha256', this.apiSecret).update(signStr).digest('hex'); + return `PAY ${this.apiKey}:${timestamp}:${signature}`; + } + + private signGetRequest(method: string, path: string): string { + const timestamp = String(Math.floor(Date.now() / 1000)); + const emptyHash = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'; + const signStr = `${method}\n${path}\n${timestamp}\n${emptyHash}`; + const signature = crypto.createHmac('sha256', this.apiSecret).update(signStr).digest('hex'); + return `PAY ${this.apiKey}:${timestamp}:${signature}`; + } + + async createOrder(params: GatewayCreateOrderParams): Promise { + if (this.mock) { + this.logger.log(`模拟下单: ${params.merchantOrderId}, ${params.paymentMethod}`); + return { + gatewayOrderId: `mock_${Date.now()}`, + merchantOrderId: params.merchantOrderId, + amount: params.amount, + paymentMethod: params.paymentMethod, + payUrl: params.paymentMethod === 'alipay' ? 'mock://pay' : undefined, + qrcode: params.paymentMethod === 'wechat' ? 'mock://pay' : undefined, + status: 'pending', + }; + } + + const body: Record = { + merchant_order_id: params.merchantOrderId, + amount: params.amount, + payment_method: params.paymentMethod, + subject: params.subject || '宇之然AI会员充值', + notify_url: this.notifyUrl, + return_url: params.returnUrl || this.returnUrl, + }; + + const auth = this.signRequest('POST', '/v1/pay/orders', body); + + try { + const res = await fetch(`${this.baseUrl}/v1/pay/orders`, { + method: 'POST', + headers: { Authorization: auth, 'Content-Type': 'application/json' }, + body: JSON.stringify(body), + }); + const json = await res.json(); + if (json.code !== 0) throw new Error(json.message || '网关下单失败'); + this.logger.log(`网关下单成功: ${params.merchantOrderId}, gatewayId: ${json.data.gateway_order_id}`); + return { + gatewayOrderId: json.data.gateway_order_id, + merchantOrderId: json.data.merchant_order_id, + amount: json.data.amount, + paymentMethod: json.data.payment_method, + payUrl: json.data.pay_url, + qrcode: json.data.qrcode, + status: json.data.status, + }; + } catch (err: any) { + this.logger.error(`网关下单失败: ${err.message},使用模拟模式`); + return { + gatewayOrderId: `mock_${Date.now()}`, + merchantOrderId: params.merchantOrderId, + amount: params.amount, + paymentMethod: params.paymentMethod, + payUrl: params.paymentMethod === 'alipay' ? 'mock://pay' : undefined, + qrcode: params.paymentMethod === 'wechat' ? 'mock://pay' : undefined, + status: 'pending', + }; + } + } + + async queryOrder(gatewayOrderId: string): Promise { + if (this.mock || gatewayOrderId.startsWith('mock_')) { + const order = await this.prisma.order.findFirst({ where: { gatewayOrderId } }); + return { + gatewayOrderId, + merchantOrderId: order?.orderNo || '', + amount: order?.amount || 0, + paymentMethod: order?.payChannel || 'alipay', + status: order?.status === 'PAID' ? 'paid' : 'pending', + transactionId: order?.transactionId || undefined, + }; + } + + const path = `/v1/pay/orders/${gatewayOrderId}`; + const auth = this.signGetRequest('GET', path); + + try { + const res = await fetch(`${this.baseUrl}${path}`, { + headers: { Authorization: auth }, + }); + const json = await res.json(); + if (json.code !== 0) throw new Error(json.message || '查询失败'); + return { + gatewayOrderId: json.data.gateway_order_id, + merchantOrderId: json.data.merchant_order_id, + amount: json.data.amount, + paymentMethod: json.data.payment_method, + status: json.data.status, + transactionId: json.data.transaction_id, + paidAt: json.data.paid_at, + }; + } catch (err: any) { + this.logger.error(`网关查询失败: ${err.message}`); + return { + gatewayOrderId, + merchantOrderId: '', + amount: 0, + paymentMethod: 'alipay', + status: 'unknown', + }; + } + } + + async refund(merchantOrderId: string, amount?: number, reason?: string) { + if (this.mock) { + this.logger.log(`模拟网关退款: ${merchantOrderId}`); + await this.prisma.order.update({ + where: { orderNo: merchantOrderId }, + data: { status: 'REFUNDED' }, + }).catch(err => this.logger.warn(`退款更新订单失败: ${err.message}`)); + return { code: 0, message: '模拟退款成功' }; + } + + const body: Record = { + merchant_order_id: merchantOrderId, + reason: reason || '用户申请退款', + }; + if (amount) body.amount = amount; + + const auth = this.signRequest('POST', '/v1/pay/refunds', body); + + try { + const res = await fetch(`${this.baseUrl}/v1/pay/refunds`, { + method: 'POST', + headers: { Authorization: auth, 'Content-Type': 'application/json' }, + body: JSON.stringify(body), + }); + const json = await res.json(); + if (json.code === 0) { + await this.prisma.order.update({ + where: { orderNo: merchantOrderId }, + data: { status: 'REFUNDED' }, + }).catch(err => this.logger.warn(`退款更新订单失败: ${err.message}`)); + } + return json; + } catch (err: any) { + this.logger.error(`网关退款失败: ${err.message}`); + throw err; + } + } + + async handleWebhook(body: any): Promise<{ code: string; message: string }> { + const event = body?.event; + const data = body?.data; + + if (!event || !data) { + return { code: 'FAIL', message: '无效的webhook数据' }; + } + + this.logger.log(`网关webhook事件: ${event}`); + + if (event === 'recharge.completed') { + const merchantOrderId = data.merchant_order_id; + const gatewayOrderId = data.order_id; + const transactionId = data.transaction_id; + + if (!merchantOrderId) { + return { code: 'FAIL', message: '缺少商户订单号' }; + } + + const order = await this.prisma.order.findUnique({ + where: { orderNo: merchantOrderId }, + include: { user: true }, + }); + + if (!order) { + this.logger.warn(`webhook订单不存在: ${merchantOrderId}`); + return { code: 'FAIL', message: '订单不存在' }; + } + + if (order.status === 'PAID') { + this.logger.log(`webhook订单已支付,跳过: ${merchantOrderId}`); + return { code: 'SUCCESS', message: '订单已处理' }; + } + + await this.prisma.order.update({ + where: { id: order.id }, + data: { + status: 'PAID', + paidAt: new Date(), + transactionId: transactionId || order.transactionId, + gatewayOrderId: gatewayOrderId || order.gatewayOrderId, + payChannel: data.payment_method === 'alipay' ? 'alipay' : 'wxpay', + }, + }); + + await this.activateSubscription(order.id); + return { code: 'SUCCESS', message: '支付成功' }; + } + + if (event === 'order.refunded') { + const merchantOrderId = data.merchant_order_id; + if (merchantOrderId) { + await this.prisma.order.update({ + where: { orderNo: merchantOrderId }, + data: { status: 'REFUNDED' }, + }).catch(() => {}); + } + return { code: 'SUCCESS', message: '退款处理成功' }; + } + + return { code: 'SUCCESS', message: '事件已接收' }; + } + + private async activateSubscription(orderId: number) { + const order = await this.prisma.order.findUnique({ + where: { id: orderId }, + include: { user: true }, + }); + if (!order || (order.planType !== 'MONTHLY' && order.planType !== 'YEARLY')) return; + + const durationDays = order.planType === 'MONTHLY' ? 30 : 365; + const now = new Date(); + let subscriptionEndDate: Date; + + const existingSub = await this.prisma.subscription.findFirst({ + where: { + userId: order.userId, + status: 'ACTIVE', + endDate: { gt: now }, + }, + }); + + if (existingSub) { + subscriptionEndDate = new Date(existingSub.endDate.getTime() + durationDays * 24 * 60 * 60 * 1000); + await this.prisma.subscription.update({ + where: { id: existingSub.id }, + data: { endDate: subscriptionEndDate }, + }); + } else { + subscriptionEndDate = new Date(now); + subscriptionEndDate.setDate(subscriptionEndDate.getDate() + durationDays); + await this.prisma.subscription.create({ + data: { + userId: order.userId, + plan: order.planType as any, + startDate: now, + endDate: subscriptionEndDate, + status: 'ACTIVE', + }, + }); + } + + await this.prisma.user.update({ + where: { id: order.userId }, + data: { + memberPlan: order.planType as any, + memberExpire: subscriptionEndDate, + }, + }); + + this.logger.log(`网关支付激活订阅: 用户${order.userId}, 类型${order.planType}, 到期${subscriptionEndDate}`); + } +} diff --git a/backend/src/modules/payment/payment-config.service.ts b/backend/src/modules/payment/payment-config.service.ts new file mode 100644 index 0000000..884b0d1 --- /dev/null +++ b/backend/src/modules/payment/payment-config.service.ts @@ -0,0 +1,72 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { PrismaService } from '../../prisma/prisma.service'; + +export interface PaymentConfig { + wxpay: { + appId: string; + mchId: string; + apiKey: string; + certPath: string; + keyPath: string; + notifyUrl: string; + mock: boolean; + }; + alipay: { + appId: string; + privateKey: string; + alipayPublicKey: string; + notifyUrl: string; + returnUrl: string; + gateway: string; + mock: boolean; + }; +} + +@Injectable() +export class PaymentConfigService { + private readonly logger = new Logger(PaymentConfigService.name); + private cache: PaymentConfig | null = null; + + constructor(private prisma: PrismaService) {} + + async load(): Promise { + if (this.cache) return this.cache; + return this.refresh(); + } + + async refresh(): Promise { + const all = await this.prisma.systemConfig.findMany({ + where: { category: 'payment' }, + }); + const map = new Map(all.map(c => [c.key, c.value])); + + const conf: PaymentConfig = { + wxpay: { + appId: map.get('wx_appid') || process.env.WX_APPID || '', + mchId: map.get('wx_mchid') || process.env.WX_MCHID || process.env.WX_PAY_MCH_ID || '1108945993', + apiKey: map.get('wx_apikey') || process.env.WX_API_KEY || process.env.WX_PAY_API_KEY || '8Kj9mP2nQ5rT7vW1xY3zA4bC6dE8fG0h', + certPath: map.get('wx_cert_path') || process.env.WX_CERT_PATH || '', + keyPath: map.get('wx_key_path') || process.env.WX_KEY_PATH || '', + notifyUrl: map.get('wx_notify_url') || process.env.WX_NOTIFY_URL || 'https://yuzhiran.com/api/v1/payment/wxpay/notify', + mock: (map.get('wx_mock') || process.env.WX_PAY_MOCK || 'true') === 'true', + }, + alipay: { + appId: map.get('alipay_app_id') || process.env.ALIPAY_APP_ID || '', + privateKey: map.get('alipay_private_key') || process.env.ALIPAY_PRIVATE_KEY || '', + alipayPublicKey: map.get('alipay_public_key') || process.env.ALIPAY_PUBLIC_KEY || '', + notifyUrl: map.get('alipay_notify_url') || process.env.ALIPAY_NOTIFY_URL || 'https://yuzhiran.com/api/v1/payment/alipay/notify', + returnUrl: map.get('alipay_return_url') || process.env.ALIPAY_RETURN_URL || 'https://yuzhiran.com/my/member', + gateway: map.get('alipay_gateway') || process.env.ALIPAY_GATEWAY || 'https://openapi.alipay.com/gateway.do', + mock: (map.get('alipay_mock') || process.env.ALIPAY_MOCK || 'true') === 'true', + }, + }; + + this.cache = conf; + this.logger.log(`支付配置已加载 (微信mock:${conf.wxpay.mock}, 支付宝mock:${conf.alipay.mock})`); + return conf; + } + + invalidateCache() { + this.cache = null; + } +} diff --git a/backend/src/modules/payment/payment.controller.ts b/backend/src/modules/payment/payment.controller.ts old mode 100644 new mode 100755 index 50a36a9..ea0b907 --- a/backend/src/modules/payment/payment.controller.ts +++ b/backend/src/modules/payment/payment.controller.ts @@ -1,7 +1,9 @@ -import { Controller, Post, Get, Body, Req, Headers, HttpCode, Query } from '@nestjs/common'; +import { Controller, Post, Get, Body, Req, Headers, HttpCode, Query, HttpException, HttpStatus } from '@nestjs/common'; import { ApiTags, ApiOperation, ApiBody, ApiQuery } from '@nestjs/swagger'; import { IsString, IsNumber, IsOptional, IsIn } from 'class-validator'; import { PaymentService } from './payment.service'; +import { GatewayPayService } from './gateway-pay.service'; +import { PrismaService } from '../../prisma/prisma.service'; class UnifiedOrderDto { @IsString() @@ -37,33 +39,78 @@ class RefundDto { @ApiTags('支付') @Controller('payment') export class PaymentController { - constructor(private paymentService: PaymentService) {} + constructor( + private paymentService: PaymentService, + private gatewayPay: GatewayPayService, + private prisma: PrismaService, + ) {} @Post('wxpay/unified-order') - @ApiOperation({ summary: '微信支付统一下单' }) + @ApiOperation({ summary: '微信支付统一下单(旧接口,转网关)' }) @ApiBody({ type: UnifiedOrderDto }) async unifiedOrder(@Body() body: UnifiedOrderDto) { - return this.paymentService.createUnifiedOrder(body); + const result = await this.gatewayPay.createOrder({ + merchantOrderId: body.outTradeNo, + amount: body.amount, + paymentMethod: 'wechat', + subject: body.description, + }); + return { + prepay_id: result.gatewayOrderId, + codeUrl: result.qrcode === 'mock://pay' ? 'mock://pay' : result.qrcode, + gatewayOrderId: result.gatewayOrderId, + }; } @Post('wxpay/notify') @HttpCode(200) - @ApiOperation({ summary: '微信支付回调通知' }) - async notify(@Req() req: any, @Headers('wechatpay-signature') signature: string) { - return this.paymentService.handleNotify(req.body, signature); + @ApiOperation({ summary: '微信支付回调通知(转网关webhook处理)' }) + async notify(@Body() body: any) { + const result = await this.gatewayPay.handleWebhook(body); + if (result.code === 'SUCCESS') return { code: 'SUCCESS', message: 'OK' }; + return { code: 'FAIL', message: result.message }; } @Post('wxpay/refund') - @ApiOperation({ summary: '微信支付退款' }) + @ApiOperation({ summary: '微信支付退款(转网关)' }) @ApiBody({ type: RefundDto }) async refund(@Body() body: RefundDto) { - return this.paymentService.refund(body.outTradeNo, body.amount, body.reason); + return this.gatewayPay.refund(body.outTradeNo, body.amount, body.reason); } @Get('wxpay/query') - @ApiOperation({ summary: '查询微信支付订单' }) + @ApiOperation({ summary: '查询订单状态(网关)' }) @ApiQuery({ name: 'outTradeNo', required: true }) async query(@Query('outTradeNo') outTradeNo: string) { - return this.paymentService.queryOrder(outTradeNo); + const order = await this.prisma.order.findUnique({ where: { orderNo: outTradeNo } }); + if (!order) throw new HttpException('订单不存在', HttpStatus.NOT_FOUND); + + if (order.gatewayOrderId && !order.gatewayOrderId.startsWith('mock_')) { + const result = await this.gatewayPay.queryOrder(order.gatewayOrderId); + return { + trade_state: result.status === 'paid' ? 'SUCCESS' : 'NOTPAY', + outTradeNo, + localStatus: order.status, + amount: order.amount, + gatewayStatus: result.status, + }; + } + + return { + trade_state: order.status === 'PAID' ? 'SUCCESS' : 'NOTPAY', + outTradeNo, + localStatus: order.status, + amount: order.amount, + planType: order.planType, + }; + } + + @Post('gateway/webhook') + @HttpCode(200) + @ApiOperation({ summary: '统一支付网关Webhook' }) + async gatewayWebhook(@Body() body: any) { + const result = await this.gatewayPay.handleWebhook(body); + if (result.code === 'SUCCESS') return 'success'; + return 'fail'; } } diff --git a/backend/src/modules/payment/payment.module.ts b/backend/src/modules/payment/payment.module.ts old mode 100644 new mode 100755 index 495fb56..3f17621 --- a/backend/src/modules/payment/payment.module.ts +++ b/backend/src/modules/payment/payment.module.ts @@ -1,12 +1,15 @@ import { Module } from '@nestjs/common'; import { PaymentController } from './payment.controller'; import { PaymentService } from './payment.service'; +import { AlipayService } from './alipay.service'; +import { PaymentConfigService } from './payment-config.service'; +import { GatewayPayService } from './gateway-pay.service'; import { PrismaModule } from '../../prisma/prisma.module'; @Module({ imports: [PrismaModule], controllers: [PaymentController], - providers: [PaymentService], - exports: [PaymentService], + providers: [PaymentService, AlipayService, PaymentConfigService, GatewayPayService], + exports: [PaymentService, AlipayService, PaymentConfigService, GatewayPayService], }) -export class PaymentModule {} +export class PaymentModule {} \ No newline at end of file diff --git a/backend/src/modules/payment/payment.service.ts b/backend/src/modules/payment/payment.service.ts old mode 100644 new mode 100755 index 0c3c586..49c3230 --- a/backend/src/modules/payment/payment.service.ts +++ b/backend/src/modules/payment/payment.service.ts @@ -153,7 +153,7 @@ export class PaymentService { this.logger.log(`支付成功: ${payResult.out_trade_no}, 金额: ${payResult.amount.total}`); // 更新订单状态和会员订阅 - await this.updateOrderAndMembership(payResult.out_trade_no, payResult.amount.total); + await this.updateOrderAndMembership(payResult.out_trade_no, payResult.amount.total, payResult.transaction_id); return { code: 'SUCCESS', message: '支付成功' }; } @@ -165,7 +165,7 @@ export class PaymentService { } } - private async updateOrderAndMembership(outTradeNo: string, paidAmountTotal: number) { + private async updateOrderAndMembership(outTradeNo: string, paidAmountTotal: number, transactionId?: string) { const order = await this.prisma.order.findUnique({ where: { orderNo: outTradeNo }, include: { user: true }, @@ -190,7 +190,7 @@ export class PaymentService { // 更新订单状态为已支付 await this.prisma.order.update({ where: { id: order.id }, - data: { status: 'PAID', paidAt: new Date() }, + data: { status: 'PAID', paidAt: new Date(), transactionId: transactionId || order.transactionId }, }); // 处理会员订阅(仅限MONTHLY/YEARLY计划) diff --git a/backend/src/modules/payment/tests/payment.service.spec.ts b/backend/src/modules/payment/tests/payment.service.spec.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/prompts/prompts.controller.ts b/backend/src/modules/prompts/prompts.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/prompts/prompts.module.ts b/backend/src/modules/prompts/prompts.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/prompts/prompts.service.ts b/backend/src/modules/prompts/prompts.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/prompts/tests/prompts.service.spec.ts b/backend/src/modules/prompts/tests/prompts.service.spec.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/sandbox/sandbox-share.controller.ts b/backend/src/modules/sandbox/sandbox-share.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/sandbox/sandbox.controller.ts b/backend/src/modules/sandbox/sandbox.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/sandbox/sandbox.module.ts b/backend/src/modules/sandbox/sandbox.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/sandbox/sandbox.service.ts b/backend/src/modules/sandbox/sandbox.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/sandbox/tests/sandbox.service.spec.ts b/backend/src/modules/sandbox/tests/sandbox.service.spec.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/search/search.controller.ts b/backend/src/modules/search/search.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/search/search.module.ts b/backend/src/modules/search/search.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/search/search.service.ts b/backend/src/modules/search/search.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/search/tests/search.service.spec.ts b/backend/src/modules/search/tests/search.service.spec.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/skills/skills.controller.ts b/backend/src/modules/skills/skills.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/skills/skills.module.ts b/backend/src/modules/skills/skills.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/skills/skills.service.ts b/backend/src/modules/skills/skills.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/tools/tests/tools.service.spec.ts b/backend/src/modules/tools/tests/tools.service.spec.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/tools/tools.controller.ts b/backend/src/modules/tools/tools.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/tools/tools.module.ts b/backend/src/modules/tools/tools.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/tools/tools.service.ts b/backend/src/modules/tools/tools.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/upload/upload.controller.ts b/backend/src/modules/upload/upload.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/upload/upload.module.ts b/backend/src/modules/upload/upload.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/upload/upload.service.ts b/backend/src/modules/upload/upload.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/users/tests/users.service.spec.ts b/backend/src/modules/users/tests/users.service.spec.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/users/users.controller.ts b/backend/src/modules/users/users.controller.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/users/users.module.ts b/backend/src/modules/users/users.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/modules/users/users.service.ts b/backend/src/modules/users/users.service.ts old mode 100644 new mode 100755 diff --git a/backend/src/prisma/prisma.module.ts b/backend/src/prisma/prisma.module.ts old mode 100644 new mode 100755 diff --git a/backend/src/prisma/prisma.service.ts b/backend/src/prisma/prisma.service.ts old mode 100644 new mode 100755 diff --git a/backend/test/app.e2e-spec.ts b/backend/test/app.e2e-spec.ts old mode 100644 new mode 100755 diff --git a/backend/tsconfig.json b/backend/tsconfig.json old mode 100644 new mode 100755 index 0388ba9..91532ef --- a/backend/tsconfig.json +++ b/backend/tsconfig.json @@ -11,6 +11,7 @@ "outDir": "./dist", "rootDir": "./src", "incremental": true, + "tsBuildInfoFile": "./dist/.tsbuildinfo", "skipLibCheck": true, "strictNullChecks": true, "noImplicitAny": true, diff --git a/backend/tsconfig.tsbuildinfo b/backend/tsconfig.tsbuildinfo deleted file mode 100644 index b0e3f89..0000000 --- a/backend/tsconfig.tsbuildinfo +++ /dev/null @@ -1 +0,0 @@ -{"program":{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.webworker.importscripts.d.ts","./node_modules/typescript/lib/lib.scripthost.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/typescript/lib/lib.es2021.full.d.ts","./node_modules/reflect-metadata/index.d.ts","./node_modules/@nestjs/common/decorators/core/bind.decorator.d.ts","./node_modules/@nestjs/common/interfaces/abstract.interface.d.ts","./node_modules/@nestjs/common/interfaces/controllers/controller-metadata.interface.d.ts","./node_modules/@nestjs/common/interfaces/controllers/controller.interface.d.ts","./node_modules/@nestjs/common/interfaces/features/arguments-host.interface.d.ts","./node_modules/@nestjs/common/interfaces/exceptions/exception-filter.interface.d.ts","./node_modules/rxjs/dist/types/internal/Subscription.d.ts","./node_modules/rxjs/dist/types/internal/Subscriber.d.ts","./node_modules/rxjs/dist/types/internal/Operator.d.ts","./node_modules/rxjs/dist/types/internal/Observable.d.ts","./node_modules/rxjs/dist/types/internal/types.d.ts","./node_modules/rxjs/dist/types/internal/operators/audit.d.ts","./node_modules/rxjs/dist/types/internal/operators/auditTime.d.ts","./node_modules/rxjs/dist/types/internal/operators/buffer.d.ts","./node_modules/rxjs/dist/types/internal/operators/bufferCount.d.ts","./node_modules/rxjs/dist/types/internal/operators/bufferTime.d.ts","./node_modules/rxjs/dist/types/internal/operators/bufferToggle.d.ts","./node_modules/rxjs/dist/types/internal/operators/bufferWhen.d.ts","./node_modules/rxjs/dist/types/internal/operators/catchError.d.ts","./node_modules/rxjs/dist/types/internal/operators/combineLatestAll.d.ts","./node_modules/rxjs/dist/types/internal/operators/combineAll.d.ts","./node_modules/rxjs/dist/types/internal/operators/combineLatest.d.ts","./node_modules/rxjs/dist/types/internal/operators/combineLatestWith.d.ts","./node_modules/rxjs/dist/types/internal/operators/concat.d.ts","./node_modules/rxjs/dist/types/internal/operators/concatAll.d.ts","./node_modules/rxjs/dist/types/internal/operators/concatMap.d.ts","./node_modules/rxjs/dist/types/internal/operators/concatMapTo.d.ts","./node_modules/rxjs/dist/types/internal/operators/concatWith.d.ts","./node_modules/rxjs/dist/types/internal/operators/connect.d.ts","./node_modules/rxjs/dist/types/internal/operators/count.d.ts","./node_modules/rxjs/dist/types/internal/operators/debounce.d.ts","./node_modules/rxjs/dist/types/internal/operators/debounceTime.d.ts","./node_modules/rxjs/dist/types/internal/operators/defaultIfEmpty.d.ts","./node_modules/rxjs/dist/types/internal/operators/delay.d.ts","./node_modules/rxjs/dist/types/internal/operators/delayWhen.d.ts","./node_modules/rxjs/dist/types/internal/operators/dematerialize.d.ts","./node_modules/rxjs/dist/types/internal/operators/distinct.d.ts","./node_modules/rxjs/dist/types/internal/operators/distinctUntilChanged.d.ts","./node_modules/rxjs/dist/types/internal/operators/distinctUntilKeyChanged.d.ts","./node_modules/rxjs/dist/types/internal/operators/elementAt.d.ts","./node_modules/rxjs/dist/types/internal/operators/endWith.d.ts","./node_modules/rxjs/dist/types/internal/operators/every.d.ts","./node_modules/rxjs/dist/types/internal/operators/exhaustAll.d.ts","./node_modules/rxjs/dist/types/internal/operators/exhaust.d.ts","./node_modules/rxjs/dist/types/internal/operators/exhaustMap.d.ts","./node_modules/rxjs/dist/types/internal/operators/expand.d.ts","./node_modules/rxjs/dist/types/internal/operators/filter.d.ts","./node_modules/rxjs/dist/types/internal/operators/finalize.d.ts","./node_modules/rxjs/dist/types/internal/operators/find.d.ts","./node_modules/rxjs/dist/types/internal/operators/findIndex.d.ts","./node_modules/rxjs/dist/types/internal/operators/first.d.ts","./node_modules/rxjs/dist/types/internal/Subject.d.ts","./node_modules/rxjs/dist/types/internal/operators/groupBy.d.ts","./node_modules/rxjs/dist/types/internal/operators/ignoreElements.d.ts","./node_modules/rxjs/dist/types/internal/operators/isEmpty.d.ts","./node_modules/rxjs/dist/types/internal/operators/last.d.ts","./node_modules/rxjs/dist/types/internal/operators/map.d.ts","./node_modules/rxjs/dist/types/internal/operators/mapTo.d.ts","./node_modules/rxjs/dist/types/internal/Notification.d.ts","./node_modules/rxjs/dist/types/internal/operators/materialize.d.ts","./node_modules/rxjs/dist/types/internal/operators/max.d.ts","./node_modules/rxjs/dist/types/internal/operators/merge.d.ts","./node_modules/rxjs/dist/types/internal/operators/mergeAll.d.ts","./node_modules/rxjs/dist/types/internal/operators/mergeMap.d.ts","./node_modules/rxjs/dist/types/internal/operators/flatMap.d.ts","./node_modules/rxjs/dist/types/internal/operators/mergeMapTo.d.ts","./node_modules/rxjs/dist/types/internal/operators/mergeScan.d.ts","./node_modules/rxjs/dist/types/internal/operators/mergeWith.d.ts","./node_modules/rxjs/dist/types/internal/operators/min.d.ts","./node_modules/rxjs/dist/types/internal/observable/ConnectableObservable.d.ts","./node_modules/rxjs/dist/types/internal/operators/multicast.d.ts","./node_modules/rxjs/dist/types/internal/operators/observeOn.d.ts","./node_modules/rxjs/dist/types/internal/operators/onErrorResumeNextWith.d.ts","./node_modules/rxjs/dist/types/internal/operators/pairwise.d.ts","./node_modules/rxjs/dist/types/internal/operators/partition.d.ts","./node_modules/rxjs/dist/types/internal/operators/pluck.d.ts","./node_modules/rxjs/dist/types/internal/operators/publish.d.ts","./node_modules/rxjs/dist/types/internal/operators/publishBehavior.d.ts","./node_modules/rxjs/dist/types/internal/operators/publishLast.d.ts","./node_modules/rxjs/dist/types/internal/operators/publishReplay.d.ts","./node_modules/rxjs/dist/types/internal/operators/race.d.ts","./node_modules/rxjs/dist/types/internal/operators/raceWith.d.ts","./node_modules/rxjs/dist/types/internal/operators/reduce.d.ts","./node_modules/rxjs/dist/types/internal/operators/repeat.d.ts","./node_modules/rxjs/dist/types/internal/operators/repeatWhen.d.ts","./node_modules/rxjs/dist/types/internal/operators/retry.d.ts","./node_modules/rxjs/dist/types/internal/operators/retryWhen.d.ts","./node_modules/rxjs/dist/types/internal/operators/refCount.d.ts","./node_modules/rxjs/dist/types/internal/operators/sample.d.ts","./node_modules/rxjs/dist/types/internal/operators/sampleTime.d.ts","./node_modules/rxjs/dist/types/internal/operators/scan.d.ts","./node_modules/rxjs/dist/types/internal/operators/sequenceEqual.d.ts","./node_modules/rxjs/dist/types/internal/operators/share.d.ts","./node_modules/rxjs/dist/types/internal/operators/shareReplay.d.ts","./node_modules/rxjs/dist/types/internal/operators/single.d.ts","./node_modules/rxjs/dist/types/internal/operators/skip.d.ts","./node_modules/rxjs/dist/types/internal/operators/skipLast.d.ts","./node_modules/rxjs/dist/types/internal/operators/skipUntil.d.ts","./node_modules/rxjs/dist/types/internal/operators/skipWhile.d.ts","./node_modules/rxjs/dist/types/internal/operators/startWith.d.ts","./node_modules/rxjs/dist/types/internal/operators/subscribeOn.d.ts","./node_modules/rxjs/dist/types/internal/operators/switchAll.d.ts","./node_modules/rxjs/dist/types/internal/operators/switchMap.d.ts","./node_modules/rxjs/dist/types/internal/operators/switchMapTo.d.ts","./node_modules/rxjs/dist/types/internal/operators/switchScan.d.ts","./node_modules/rxjs/dist/types/internal/operators/take.d.ts","./node_modules/rxjs/dist/types/internal/operators/takeLast.d.ts","./node_modules/rxjs/dist/types/internal/operators/takeUntil.d.ts","./node_modules/rxjs/dist/types/internal/operators/takeWhile.d.ts","./node_modules/rxjs/dist/types/internal/operators/tap.d.ts","./node_modules/rxjs/dist/types/internal/operators/throttle.d.ts","./node_modules/rxjs/dist/types/internal/operators/throttleTime.d.ts","./node_modules/rxjs/dist/types/internal/operators/throwIfEmpty.d.ts","./node_modules/rxjs/dist/types/internal/operators/timeInterval.d.ts","./node_modules/rxjs/dist/types/internal/operators/timeout.d.ts","./node_modules/rxjs/dist/types/internal/operators/timeoutWith.d.ts","./node_modules/rxjs/dist/types/internal/operators/timestamp.d.ts","./node_modules/rxjs/dist/types/internal/operators/toArray.d.ts","./node_modules/rxjs/dist/types/internal/operators/window.d.ts","./node_modules/rxjs/dist/types/internal/operators/windowCount.d.ts","./node_modules/rxjs/dist/types/internal/operators/windowTime.d.ts","./node_modules/rxjs/dist/types/internal/operators/windowToggle.d.ts","./node_modules/rxjs/dist/types/internal/operators/windowWhen.d.ts","./node_modules/rxjs/dist/types/internal/operators/withLatestFrom.d.ts","./node_modules/rxjs/dist/types/internal/operators/zip.d.ts","./node_modules/rxjs/dist/types/internal/operators/zipAll.d.ts","./node_modules/rxjs/dist/types/internal/operators/zipWith.d.ts","./node_modules/rxjs/dist/types/operators/index.d.ts","./node_modules/rxjs/dist/types/internal/scheduler/Action.d.ts","./node_modules/rxjs/dist/types/internal/Scheduler.d.ts","./node_modules/rxjs/dist/types/internal/testing/TestMessage.d.ts","./node_modules/rxjs/dist/types/internal/testing/SubscriptionLog.d.ts","./node_modules/rxjs/dist/types/internal/testing/SubscriptionLoggable.d.ts","./node_modules/rxjs/dist/types/internal/testing/ColdObservable.d.ts","./node_modules/rxjs/dist/types/internal/testing/HotObservable.d.ts","./node_modules/rxjs/dist/types/internal/scheduler/AsyncScheduler.d.ts","./node_modules/rxjs/dist/types/internal/scheduler/timerHandle.d.ts","./node_modules/rxjs/dist/types/internal/scheduler/AsyncAction.d.ts","./node_modules/rxjs/dist/types/internal/scheduler/VirtualTimeScheduler.d.ts","./node_modules/rxjs/dist/types/internal/testing/TestScheduler.d.ts","./node_modules/rxjs/dist/types/testing/index.d.ts","./node_modules/rxjs/dist/types/internal/symbol/observable.d.ts","./node_modules/rxjs/dist/types/internal/observable/dom/animationFrames.d.ts","./node_modules/rxjs/dist/types/internal/BehaviorSubject.d.ts","./node_modules/rxjs/dist/types/internal/ReplaySubject.d.ts","./node_modules/rxjs/dist/types/internal/AsyncSubject.d.ts","./node_modules/rxjs/dist/types/internal/scheduler/AsapScheduler.d.ts","./node_modules/rxjs/dist/types/internal/scheduler/asap.d.ts","./node_modules/rxjs/dist/types/internal/scheduler/async.d.ts","./node_modules/rxjs/dist/types/internal/scheduler/QueueScheduler.d.ts","./node_modules/rxjs/dist/types/internal/scheduler/queue.d.ts","./node_modules/rxjs/dist/types/internal/scheduler/AnimationFrameScheduler.d.ts","./node_modules/rxjs/dist/types/internal/scheduler/animationFrame.d.ts","./node_modules/rxjs/dist/types/internal/util/identity.d.ts","./node_modules/rxjs/dist/types/internal/util/pipe.d.ts","./node_modules/rxjs/dist/types/internal/util/noop.d.ts","./node_modules/rxjs/dist/types/internal/util/isObservable.d.ts","./node_modules/rxjs/dist/types/internal/lastValueFrom.d.ts","./node_modules/rxjs/dist/types/internal/firstValueFrom.d.ts","./node_modules/rxjs/dist/types/internal/util/ArgumentOutOfRangeError.d.ts","./node_modules/rxjs/dist/types/internal/util/EmptyError.d.ts","./node_modules/rxjs/dist/types/internal/util/NotFoundError.d.ts","./node_modules/rxjs/dist/types/internal/util/ObjectUnsubscribedError.d.ts","./node_modules/rxjs/dist/types/internal/util/SequenceError.d.ts","./node_modules/rxjs/dist/types/internal/util/UnsubscriptionError.d.ts","./node_modules/rxjs/dist/types/internal/observable/bindCallback.d.ts","./node_modules/rxjs/dist/types/internal/observable/bindNodeCallback.d.ts","./node_modules/rxjs/dist/types/internal/AnyCatcher.d.ts","./node_modules/rxjs/dist/types/internal/observable/combineLatest.d.ts","./node_modules/rxjs/dist/types/internal/observable/concat.d.ts","./node_modules/rxjs/dist/types/internal/observable/connectable.d.ts","./node_modules/rxjs/dist/types/internal/observable/defer.d.ts","./node_modules/rxjs/dist/types/internal/observable/empty.d.ts","./node_modules/rxjs/dist/types/internal/observable/forkJoin.d.ts","./node_modules/rxjs/dist/types/internal/observable/from.d.ts","./node_modules/rxjs/dist/types/internal/observable/fromEvent.d.ts","./node_modules/rxjs/dist/types/internal/observable/fromEventPattern.d.ts","./node_modules/rxjs/dist/types/internal/observable/generate.d.ts","./node_modules/rxjs/dist/types/internal/observable/iif.d.ts","./node_modules/rxjs/dist/types/internal/observable/interval.d.ts","./node_modules/rxjs/dist/types/internal/observable/merge.d.ts","./node_modules/rxjs/dist/types/internal/observable/never.d.ts","./node_modules/rxjs/dist/types/internal/observable/of.d.ts","./node_modules/rxjs/dist/types/internal/observable/onErrorResumeNext.d.ts","./node_modules/rxjs/dist/types/internal/observable/pairs.d.ts","./node_modules/rxjs/dist/types/internal/observable/partition.d.ts","./node_modules/rxjs/dist/types/internal/observable/race.d.ts","./node_modules/rxjs/dist/types/internal/observable/range.d.ts","./node_modules/rxjs/dist/types/internal/observable/throwError.d.ts","./node_modules/rxjs/dist/types/internal/observable/timer.d.ts","./node_modules/rxjs/dist/types/internal/observable/using.d.ts","./node_modules/rxjs/dist/types/internal/observable/zip.d.ts","./node_modules/rxjs/dist/types/internal/scheduled/scheduled.d.ts","./node_modules/rxjs/dist/types/internal/config.d.ts","./node_modules/rxjs/dist/types/index.d.ts","./node_modules/@nestjs/common/interfaces/exceptions/rpc-exception-filter.interface.d.ts","./node_modules/@nestjs/common/interfaces/exceptions/ws-exception-filter.interface.d.ts","./node_modules/@nestjs/common/interfaces/external/validation-error.interface.d.ts","./node_modules/@nestjs/common/interfaces/features/execution-context.interface.d.ts","./node_modules/@nestjs/common/interfaces/features/can-activate.interface.d.ts","./node_modules/@nestjs/common/interfaces/features/custom-route-param-factory.interface.d.ts","./node_modules/@nestjs/common/interfaces/features/nest-interceptor.interface.d.ts","./node_modules/@nestjs/common/interfaces/features/paramtype.interface.d.ts","./node_modules/@nestjs/common/interfaces/type.interface.d.ts","./node_modules/@nestjs/common/interfaces/features/pipe-transform.interface.d.ts","./node_modules/@nestjs/common/enums/request-method.enum.d.ts","./node_modules/@nestjs/common/enums/http-status.enum.d.ts","./node_modules/@nestjs/common/enums/shutdown-signal.enum.d.ts","./node_modules/@nestjs/common/enums/version-type.enum.d.ts","./node_modules/@nestjs/common/enums/index.d.ts","./node_modules/@nestjs/common/interfaces/version-options.interface.d.ts","./node_modules/@nestjs/common/interfaces/middleware/middleware-configuration.interface.d.ts","./node_modules/@nestjs/common/interfaces/middleware/middleware-consumer.interface.d.ts","./node_modules/@nestjs/common/interfaces/middleware/middleware-config-proxy.interface.d.ts","./node_modules/@nestjs/common/interfaces/middleware/nest-middleware.interface.d.ts","./node_modules/@nestjs/common/interfaces/middleware/index.d.ts","./node_modules/@nestjs/common/interfaces/global-prefix-options.interface.d.ts","./node_modules/@nestjs/common/interfaces/hooks/before-application-shutdown.interface.d.ts","./node_modules/@nestjs/common/interfaces/hooks/on-application-bootstrap.interface.d.ts","./node_modules/@nestjs/common/interfaces/hooks/on-application-shutdown.interface.d.ts","./node_modules/@nestjs/common/interfaces/hooks/on-destroy.interface.d.ts","./node_modules/@nestjs/common/interfaces/hooks/on-init.interface.d.ts","./node_modules/@nestjs/common/interfaces/hooks/index.d.ts","./node_modules/@nestjs/common/interfaces/http/http-exception-body.interface.d.ts","./node_modules/@nestjs/common/interfaces/http/http-redirect-response.interface.d.ts","./node_modules/@nestjs/common/interfaces/external/cors-options.interface.d.ts","./node_modules/@nestjs/common/interfaces/external/https-options.interface.d.ts","./node_modules/@nestjs/common/services/logger.service.d.ts","./node_modules/@nestjs/common/interfaces/nest-application-context-options.interface.d.ts","./node_modules/@nestjs/common/interfaces/nest-application-options.interface.d.ts","./node_modules/@nestjs/common/interfaces/http/http-server.interface.d.ts","./node_modules/@nestjs/common/interfaces/http/message-event.interface.d.ts","./node_modules/@nestjs/common/interfaces/http/raw-body-request.interface.d.ts","./node_modules/@nestjs/common/interfaces/http/index.d.ts","./node_modules/@nestjs/common/interfaces/injectable.interface.d.ts","./node_modules/@nestjs/common/interfaces/microservices/nest-hybrid-application-options.interface.d.ts","./node_modules/@nestjs/common/interfaces/modules/forward-reference.interface.d.ts","./node_modules/@nestjs/common/interfaces/scope-options.interface.d.ts","./node_modules/@nestjs/common/interfaces/modules/injection-token.interface.d.ts","./node_modules/@nestjs/common/interfaces/modules/optional-factory-dependency.interface.d.ts","./node_modules/@nestjs/common/interfaces/modules/provider.interface.d.ts","./node_modules/@nestjs/common/interfaces/modules/module-metadata.interface.d.ts","./node_modules/@nestjs/common/interfaces/modules/dynamic-module.interface.d.ts","./node_modules/@nestjs/common/interfaces/modules/introspection-result.interface.d.ts","./node_modules/@nestjs/common/interfaces/modules/nest-module.interface.d.ts","./node_modules/@nestjs/common/interfaces/modules/index.d.ts","./node_modules/@nestjs/common/interfaces/shutdown-hooks-options.interface.d.ts","./node_modules/@nestjs/common/interfaces/nest-application-context.interface.d.ts","./node_modules/@nestjs/common/interfaces/websockets/web-socket-adapter.interface.d.ts","./node_modules/@nestjs/common/interfaces/nest-application.interface.d.ts","./node_modules/@nestjs/common/interfaces/nest-microservice.interface.d.ts","./node_modules/@nestjs/common/interfaces/index.d.ts","./node_modules/@nestjs/common/decorators/core/catch.decorator.d.ts","./node_modules/@nestjs/common/decorators/core/controller.decorator.d.ts","./node_modules/@nestjs/common/decorators/core/dependencies.decorator.d.ts","./node_modules/@nestjs/common/decorators/core/exception-filters.decorator.d.ts","./node_modules/@nestjs/common/decorators/core/inject.decorator.d.ts","./node_modules/@nestjs/common/decorators/core/injectable.decorator.d.ts","./node_modules/@nestjs/common/decorators/core/optional.decorator.d.ts","./node_modules/@nestjs/common/decorators/core/set-metadata.decorator.d.ts","./node_modules/@nestjs/common/decorators/core/use-guards.decorator.d.ts","./node_modules/@nestjs/common/decorators/core/use-interceptors.decorator.d.ts","./node_modules/@nestjs/common/decorators/core/use-pipes.decorator.d.ts","./node_modules/@nestjs/common/decorators/core/apply-decorators.d.ts","./node_modules/@nestjs/common/decorators/core/version.decorator.d.ts","./node_modules/@nestjs/common/decorators/core/index.d.ts","./node_modules/@nestjs/common/decorators/modules/global.decorator.d.ts","./node_modules/@nestjs/common/decorators/modules/module.decorator.d.ts","./node_modules/@nestjs/common/decorators/modules/index.d.ts","./node_modules/@nestjs/common/decorators/http/request-mapping.decorator.d.ts","./node_modules/@nestjs/common/decorators/http/route-params.decorator.d.ts","./node_modules/@nestjs/common/decorators/http/http-code.decorator.d.ts","./node_modules/@nestjs/common/decorators/http/create-route-param-metadata.decorator.d.ts","./node_modules/@nestjs/common/decorators/http/render.decorator.d.ts","./node_modules/@nestjs/common/decorators/http/header.decorator.d.ts","./node_modules/@nestjs/common/decorators/http/redirect.decorator.d.ts","./node_modules/@nestjs/common/constants.d.ts","./node_modules/@nestjs/common/decorators/http/sse.decorator.d.ts","./node_modules/@nestjs/common/decorators/http/index.d.ts","./node_modules/@nestjs/common/decorators/index.d.ts","./node_modules/@nestjs/common/exceptions/intrinsic.exception.d.ts","./node_modules/@nestjs/common/exceptions/http.exception.d.ts","./node_modules/@nestjs/common/exceptions/bad-gateway.exception.d.ts","./node_modules/@nestjs/common/exceptions/bad-request.exception.d.ts","./node_modules/@nestjs/common/exceptions/conflict.exception.d.ts","./node_modules/@nestjs/common/exceptions/forbidden.exception.d.ts","./node_modules/@nestjs/common/exceptions/gateway-timeout.exception.d.ts","./node_modules/@nestjs/common/exceptions/gone.exception.d.ts","./node_modules/@nestjs/common/exceptions/http-version-not-supported.exception.d.ts","./node_modules/@nestjs/common/exceptions/im-a-teapot.exception.d.ts","./node_modules/@nestjs/common/exceptions/internal-server-error.exception.d.ts","./node_modules/@nestjs/common/exceptions/method-not-allowed.exception.d.ts","./node_modules/@nestjs/common/exceptions/misdirected.exception.d.ts","./node_modules/@nestjs/common/exceptions/not-acceptable.exception.d.ts","./node_modules/@nestjs/common/exceptions/not-found.exception.d.ts","./node_modules/@nestjs/common/exceptions/not-implemented.exception.d.ts","./node_modules/@nestjs/common/exceptions/payload-too-large.exception.d.ts","./node_modules/@nestjs/common/exceptions/precondition-failed.exception.d.ts","./node_modules/@nestjs/common/exceptions/request-timeout.exception.d.ts","./node_modules/@nestjs/common/exceptions/service-unavailable.exception.d.ts","./node_modules/@nestjs/common/exceptions/unauthorized.exception.d.ts","./node_modules/@nestjs/common/exceptions/unprocessable-entity.exception.d.ts","./node_modules/@nestjs/common/exceptions/unsupported-media-type.exception.d.ts","./node_modules/@nestjs/common/exceptions/index.d.ts","./node_modules/@nestjs/common/services/console-logger.service.d.ts","./node_modules/@nestjs/common/services/utils/filter-log-levels.util.d.ts","./node_modules/@nestjs/common/services/index.d.ts","./node_modules/@nestjs/common/file-stream/interfaces/streamable-options.interface.d.ts","./node_modules/@nestjs/common/file-stream/interfaces/streamable-handler-response.interface.d.ts","./node_modules/@nestjs/common/file-stream/interfaces/index.d.ts","./node_modules/@nestjs/common/file-stream/streamable-file.d.ts","./node_modules/@nestjs/common/file-stream/index.d.ts","./node_modules/@nestjs/common/module-utils/constants.d.ts","./node_modules/@nestjs/common/module-utils/interfaces/configurable-module-async-options.interface.d.ts","./node_modules/@nestjs/common/module-utils/interfaces/configurable-module-cls.interface.d.ts","./node_modules/@nestjs/common/module-utils/interfaces/configurable-module-host.interface.d.ts","./node_modules/@nestjs/common/module-utils/interfaces/index.d.ts","./node_modules/@nestjs/common/module-utils/configurable-module.builder.d.ts","./node_modules/@nestjs/common/module-utils/index.d.ts","./node_modules/@nestjs/common/pipes/default-value.pipe.d.ts","./node_modules/@nestjs/common/pipes/file/interfaces/file.interface.d.ts","./node_modules/@nestjs/common/pipes/file/interfaces/index.d.ts","./node_modules/@nestjs/common/pipes/file/file-validator-context.interface.d.ts","./node_modules/@nestjs/common/pipes/file/file-validator.interface.d.ts","./node_modules/@nestjs/common/pipes/file/file-type.validator.d.ts","./node_modules/@nestjs/common/pipes/file/max-file-size.validator.d.ts","./node_modules/@nestjs/common/utils/http-error-by-code.util.d.ts","./node_modules/@nestjs/common/pipes/file/parse-file-options.interface.d.ts","./node_modules/@nestjs/common/pipes/file/parse-file.pipe.d.ts","./node_modules/@nestjs/common/pipes/file/parse-file-pipe.builder.d.ts","./node_modules/@nestjs/common/pipes/file/index.d.ts","./node_modules/@nestjs/common/interfaces/external/class-transform-options.interface.d.ts","./node_modules/@nestjs/common/interfaces/external/transformer-package.interface.d.ts","./node_modules/@nestjs/common/interfaces/external/validator-options.interface.d.ts","./node_modules/@nestjs/common/interfaces/external/validator-package.interface.d.ts","./node_modules/@nestjs/common/pipes/validation.pipe.d.ts","./node_modules/@nestjs/common/pipes/parse-array.pipe.d.ts","./node_modules/@nestjs/common/pipes/parse-bool.pipe.d.ts","./node_modules/@nestjs/common/pipes/parse-date.pipe.d.ts","./node_modules/@nestjs/common/pipes/parse-enum.pipe.d.ts","./node_modules/@nestjs/common/pipes/parse-float.pipe.d.ts","./node_modules/@nestjs/common/pipes/parse-int.pipe.d.ts","./node_modules/@nestjs/common/pipes/parse-uuid.pipe.d.ts","./node_modules/@nestjs/common/pipes/index.d.ts","./node_modules/@nestjs/common/serializer/class-serializer.interfaces.d.ts","./node_modules/@nestjs/common/serializer/class-serializer.interceptor.d.ts","./node_modules/@nestjs/common/serializer/decorators/serialize-options.decorator.d.ts","./node_modules/@nestjs/common/serializer/decorators/index.d.ts","./node_modules/@nestjs/common/serializer/index.d.ts","./node_modules/@nestjs/common/utils/forward-ref.util.d.ts","./node_modules/@nestjs/common/utils/index.d.ts","./node_modules/@nestjs/common/index.d.ts","./node_modules/@nestjs/config/dist/conditional.module.d.ts","./node_modules/@nestjs/config/dist/interfaces/config-change-event.interface.d.ts","./node_modules/@nestjs/config/dist/types/config-object.type.d.ts","./node_modules/@nestjs/config/dist/types/config.type.d.ts","./node_modules/@nestjs/config/dist/types/no-infer.type.d.ts","./node_modules/@nestjs/config/dist/types/path-value.type.d.ts","./node_modules/@nestjs/config/dist/types/index.d.ts","./node_modules/@nestjs/config/dist/interfaces/config-factory.interface.d.ts","./node_modules/@types/node/compatibility/disposable.d.ts","./node_modules/@types/node/compatibility/indexable.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/compatibility/index.d.ts","./node_modules/@types/node/ts5.6/globals.typedarray.d.ts","./node_modules/@types/node/ts5.6/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/buffer/index.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/file.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/filereader.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/ts5.6/index.d.ts","./node_modules/dotenv-expand/lib/main.d.ts","./node_modules/@nestjs/config/dist/interfaces/config-module-options.interface.d.ts","./node_modules/@nestjs/config/dist/interfaces/index.d.ts","./node_modules/@nestjs/config/dist/config.module.d.ts","./node_modules/@nestjs/config/dist/config.service.d.ts","./node_modules/@nestjs/config/dist/utils/register-as.util.d.ts","./node_modules/@nestjs/config/dist/utils/get-config-token.util.d.ts","./node_modules/@nestjs/config/dist/utils/index.d.ts","./node_modules/@nestjs/config/dist/index.d.ts","./node_modules/@nestjs/config/index.d.ts","./node_modules/@prisma/client/runtime/library.d.ts","./node_modules/.prisma/client/index.d.ts","./node_modules/.prisma/client/default.d.ts","./node_modules/@prisma/client/default.d.ts","./src/prisma/prisma.service.ts","./src/prisma/prisma.module.ts","./node_modules/@types/ms/index.d.ts","./node_modules/@types/jsonwebtoken/index.d.ts","./node_modules/@nestjs/jwt/dist/interfaces/jwt-module-options.interface.d.ts","./node_modules/@nestjs/jwt/dist/interfaces/index.d.ts","./node_modules/@nestjs/jwt/dist/jwt.errors.d.ts","./node_modules/@nestjs/jwt/dist/jwt.module.d.ts","./node_modules/@nestjs/jwt/dist/jwt.service.d.ts","./node_modules/@nestjs/jwt/dist/index.d.ts","./node_modules/@nestjs/jwt/index.d.ts","./node_modules/@nestjs/passport/dist/abstract.strategy.d.ts","./node_modules/@nestjs/passport/dist/interfaces/auth-module.options.d.ts","./node_modules/@nestjs/passport/dist/interfaces/type.interface.d.ts","./node_modules/@nestjs/passport/dist/interfaces/index.d.ts","./node_modules/@nestjs/passport/dist/auth.guard.d.ts","./node_modules/@nestjs/passport/dist/passport.module.d.ts","./node_modules/@types/send/index.d.ts","./node_modules/@types/qs/index.d.ts","./node_modules/@types/range-parser/index.d.ts","./node_modules/@types/express-serve-static-core/index.d.ts","./node_modules/@types/http-errors/index.d.ts","./node_modules/@types/serve-static/index.d.ts","./node_modules/@types/connect/index.d.ts","./node_modules/@types/body-parser/index.d.ts","./node_modules/@types/express/index.d.ts","./node_modules/@types/passport/index.d.ts","./node_modules/@nestjs/passport/dist/passport/passport.serializer.d.ts","./node_modules/@nestjs/passport/dist/passport/passport.strategy.d.ts","./node_modules/@nestjs/passport/dist/index.d.ts","./node_modules/@nestjs/passport/index.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-basic.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-bearer.decorator.d.ts","./node_modules/@nestjs/swagger/dist/interfaces/open-api-spec.interface.d.ts","./node_modules/@nestjs/swagger/dist/types/swagger-enum.type.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-body.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-consumes.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-cookie.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-default-getter.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-exclude-endpoint.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-exclude-controller.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-extra-models.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-header.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-hide-property.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-link.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-oauth2.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-operation.decorator.d.ts","./node_modules/@nestjs/swagger/dist/interfaces/enum-schema-attributes.interface.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-param.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-produces.decorator.d.ts","./node_modules/@nestjs/swagger/dist/interfaces/schema-object-metadata.interface.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-property.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-query.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-response.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-security.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-use-tags.decorator.d.ts","./node_modules/@nestjs/swagger/dist/interfaces/callback-object.interface.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-callbacks.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-extension.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/api-schema.decorator.d.ts","./node_modules/@nestjs/swagger/dist/decorators/index.d.ts","./node_modules/@nestjs/swagger/dist/interfaces/swagger-ui-options.interface.d.ts","./node_modules/@nestjs/swagger/dist/interfaces/swagger-custom-options.interface.d.ts","./node_modules/@nestjs/swagger/dist/interfaces/swagger-document-options.interface.d.ts","./node_modules/@nestjs/swagger/dist/interfaces/index.d.ts","./node_modules/@nestjs/swagger/dist/document-builder.d.ts","./node_modules/@nestjs/swagger/dist/swagger-module.d.ts","./node_modules/@nestjs/swagger/dist/type-helpers/deep-partial-type.helper.d.ts","./node_modules/@nestjs/swagger/dist/type-helpers/intersection-type.helper.d.ts","./node_modules/@nestjs/swagger/dist/type-helpers/omit-type.helper.d.ts","./node_modules/@nestjs/swagger/dist/type-helpers/partial-type.helper.d.ts","./node_modules/@nestjs/swagger/dist/type-helpers/pick-type.helper.d.ts","./node_modules/@nestjs/swagger/dist/type-helpers/index.d.ts","./node_modules/@nestjs/swagger/dist/utils/get-schema-path.util.d.ts","./node_modules/@nestjs/swagger/dist/utils/generate-schema.util.d.ts","./node_modules/@nestjs/swagger/dist/utils/index.d.ts","./node_modules/@nestjs/swagger/dist/index.d.ts","./node_modules/bcryptjs/umd/types.d.ts","./node_modules/bcryptjs/umd/index.d.ts","./src/modules/auth/auth.service.ts","./node_modules/class-validator/types/validation/ValidationError.d.ts","./node_modules/class-validator/types/validation/ValidatorOptions.d.ts","./node_modules/class-validator/types/validation-schema/ValidationSchema.d.ts","./node_modules/class-validator/types/container.d.ts","./node_modules/class-validator/types/validation/ValidationArguments.d.ts","./node_modules/class-validator/types/decorator/ValidationOptions.d.ts","./node_modules/class-validator/types/decorator/common/Allow.d.ts","./node_modules/class-validator/types/decorator/common/IsDefined.d.ts","./node_modules/class-validator/types/decorator/common/IsOptional.d.ts","./node_modules/class-validator/types/decorator/common/Validate.d.ts","./node_modules/class-validator/types/validation/ValidatorConstraintInterface.d.ts","./node_modules/class-validator/types/decorator/common/ValidateBy.d.ts","./node_modules/class-validator/types/decorator/common/ValidateIf.d.ts","./node_modules/class-validator/types/decorator/common/ValidateNested.d.ts","./node_modules/class-validator/types/decorator/common/ValidatePromise.d.ts","./node_modules/class-validator/types/decorator/common/IsLatLong.d.ts","./node_modules/class-validator/types/decorator/common/IsLatitude.d.ts","./node_modules/class-validator/types/decorator/common/IsLongitude.d.ts","./node_modules/class-validator/types/decorator/common/Equals.d.ts","./node_modules/class-validator/types/decorator/common/NotEquals.d.ts","./node_modules/class-validator/types/decorator/common/IsEmpty.d.ts","./node_modules/class-validator/types/decorator/common/IsNotEmpty.d.ts","./node_modules/class-validator/types/decorator/common/IsIn.d.ts","./node_modules/class-validator/types/decorator/common/IsNotIn.d.ts","./node_modules/class-validator/types/decorator/number/IsDivisibleBy.d.ts","./node_modules/class-validator/types/decorator/number/IsPositive.d.ts","./node_modules/class-validator/types/decorator/number/IsNegative.d.ts","./node_modules/class-validator/types/decorator/number/Max.d.ts","./node_modules/class-validator/types/decorator/number/Min.d.ts","./node_modules/class-validator/types/decorator/date/MinDate.d.ts","./node_modules/class-validator/types/decorator/date/MaxDate.d.ts","./node_modules/class-validator/types/decorator/string/Contains.d.ts","./node_modules/class-validator/types/decorator/string/NotContains.d.ts","./node_modules/@types/validator/lib/isBoolean.d.ts","./node_modules/@types/validator/lib/isEmail.d.ts","./node_modules/@types/validator/lib/isFQDN.d.ts","./node_modules/@types/validator/lib/isIBAN.d.ts","./node_modules/@types/validator/lib/isISO31661Alpha2.d.ts","./node_modules/@types/validator/lib/isISO4217.d.ts","./node_modules/@types/validator/lib/isISO6391.d.ts","./node_modules/@types/validator/lib/isTaxID.d.ts","./node_modules/@types/validator/lib/isURL.d.ts","./node_modules/@types/validator/index.d.ts","./node_modules/class-validator/types/decorator/string/IsAlpha.d.ts","./node_modules/class-validator/types/decorator/string/IsAlphanumeric.d.ts","./node_modules/class-validator/types/decorator/string/IsDecimal.d.ts","./node_modules/class-validator/types/decorator/string/IsAscii.d.ts","./node_modules/class-validator/types/decorator/string/IsBase64.d.ts","./node_modules/class-validator/types/decorator/string/IsByteLength.d.ts","./node_modules/class-validator/types/decorator/string/IsCreditCard.d.ts","./node_modules/class-validator/types/decorator/string/IsCurrency.d.ts","./node_modules/class-validator/types/decorator/string/IsEmail.d.ts","./node_modules/class-validator/types/decorator/string/IsFQDN.d.ts","./node_modules/class-validator/types/decorator/string/IsFullWidth.d.ts","./node_modules/class-validator/types/decorator/string/IsHalfWidth.d.ts","./node_modules/class-validator/types/decorator/string/IsVariableWidth.d.ts","./node_modules/class-validator/types/decorator/string/IsHexColor.d.ts","./node_modules/class-validator/types/decorator/string/IsHexadecimal.d.ts","./node_modules/class-validator/types/decorator/string/IsMacAddress.d.ts","./node_modules/class-validator/types/decorator/string/IsIP.d.ts","./node_modules/class-validator/types/decorator/string/IsPort.d.ts","./node_modules/class-validator/types/decorator/string/IsISBN.d.ts","./node_modules/class-validator/types/decorator/string/IsISIN.d.ts","./node_modules/class-validator/types/decorator/string/IsISO8601.d.ts","./node_modules/class-validator/types/decorator/string/IsJSON.d.ts","./node_modules/class-validator/types/decorator/string/IsJWT.d.ts","./node_modules/class-validator/types/decorator/string/IsLowercase.d.ts","./node_modules/class-validator/types/decorator/string/IsMobilePhone.d.ts","./node_modules/class-validator/types/decorator/string/IsISO31661Alpha2.d.ts","./node_modules/class-validator/types/decorator/string/IsISO31661Alpha3.d.ts","./node_modules/class-validator/types/decorator/string/IsISO31661Numeric.d.ts","./node_modules/class-validator/types/decorator/string/IsMongoId.d.ts","./node_modules/class-validator/types/decorator/string/IsMultibyte.d.ts","./node_modules/class-validator/types/decorator/string/IsSurrogatePair.d.ts","./node_modules/class-validator/types/decorator/string/IsUrl.d.ts","./node_modules/class-validator/types/decorator/string/IsUUID.d.ts","./node_modules/class-validator/types/decorator/string/IsFirebasePushId.d.ts","./node_modules/class-validator/types/decorator/string/IsUppercase.d.ts","./node_modules/class-validator/types/decorator/string/Length.d.ts","./node_modules/class-validator/types/decorator/string/MaxLength.d.ts","./node_modules/class-validator/types/decorator/string/MinLength.d.ts","./node_modules/class-validator/types/decorator/string/Matches.d.ts","./node_modules/libphonenumber-js/types.d.cts","./node_modules/libphonenumber-js/max/index.d.cts","./node_modules/class-validator/types/decorator/string/IsPhoneNumber.d.ts","./node_modules/class-validator/types/decorator/string/IsMilitaryTime.d.ts","./node_modules/class-validator/types/decorator/string/IsHash.d.ts","./node_modules/class-validator/types/decorator/string/IsISSN.d.ts","./node_modules/class-validator/types/decorator/string/IsDateString.d.ts","./node_modules/class-validator/types/decorator/string/IsBooleanString.d.ts","./node_modules/class-validator/types/decorator/string/IsNumberString.d.ts","./node_modules/class-validator/types/decorator/string/IsBase32.d.ts","./node_modules/class-validator/types/decorator/string/IsBIC.d.ts","./node_modules/class-validator/types/decorator/string/IsBtcAddress.d.ts","./node_modules/class-validator/types/decorator/string/IsDataURI.d.ts","./node_modules/class-validator/types/decorator/string/IsEAN.d.ts","./node_modules/class-validator/types/decorator/string/IsEthereumAddress.d.ts","./node_modules/class-validator/types/decorator/string/IsHSL.d.ts","./node_modules/class-validator/types/decorator/string/IsIBAN.d.ts","./node_modules/class-validator/types/decorator/string/IsIdentityCard.d.ts","./node_modules/class-validator/types/decorator/string/IsISRC.d.ts","./node_modules/class-validator/types/decorator/string/IsLocale.d.ts","./node_modules/class-validator/types/decorator/string/IsMagnetURI.d.ts","./node_modules/class-validator/types/decorator/string/IsMimeType.d.ts","./node_modules/class-validator/types/decorator/string/IsOctal.d.ts","./node_modules/class-validator/types/decorator/string/IsPassportNumber.d.ts","./node_modules/class-validator/types/decorator/string/IsPostalCode.d.ts","./node_modules/class-validator/types/decorator/string/IsRFC3339.d.ts","./node_modules/class-validator/types/decorator/string/IsRgbColor.d.ts","./node_modules/class-validator/types/decorator/string/IsSemVer.d.ts","./node_modules/class-validator/types/decorator/string/IsStrongPassword.d.ts","./node_modules/class-validator/types/decorator/string/IsTimeZone.d.ts","./node_modules/class-validator/types/decorator/string/IsBase58.d.ts","./node_modules/class-validator/types/decorator/string/is-tax-id.d.ts","./node_modules/class-validator/types/decorator/string/is-iso4217-currency-code.d.ts","./node_modules/class-validator/types/decorator/string/isISO6391.d.ts","./node_modules/class-validator/types/decorator/typechecker/IsBoolean.d.ts","./node_modules/class-validator/types/decorator/typechecker/IsDate.d.ts","./node_modules/class-validator/types/decorator/typechecker/IsNumber.d.ts","./node_modules/class-validator/types/decorator/typechecker/IsEnum.d.ts","./node_modules/class-validator/types/decorator/typechecker/IsInt.d.ts","./node_modules/class-validator/types/decorator/typechecker/IsString.d.ts","./node_modules/class-validator/types/decorator/typechecker/IsArray.d.ts","./node_modules/class-validator/types/decorator/typechecker/IsObject.d.ts","./node_modules/class-validator/types/decorator/array/ArrayContains.d.ts","./node_modules/class-validator/types/decorator/array/ArrayNotContains.d.ts","./node_modules/class-validator/types/decorator/array/ArrayNotEmpty.d.ts","./node_modules/class-validator/types/decorator/array/ArrayMinSize.d.ts","./node_modules/class-validator/types/decorator/array/ArrayMaxSize.d.ts","./node_modules/class-validator/types/decorator/array/ArrayUnique.d.ts","./node_modules/class-validator/types/decorator/object/IsNotEmptyObject.d.ts","./node_modules/class-validator/types/decorator/object/IsInstance.d.ts","./node_modules/class-validator/types/decorator/decorators.d.ts","./node_modules/class-validator/types/validation/ValidationTypes.d.ts","./node_modules/class-validator/types/validation/Validator.d.ts","./node_modules/class-validator/types/register-decorator.d.ts","./node_modules/class-validator/types/metadata/ValidationMetadataArgs.d.ts","./node_modules/class-validator/types/metadata/ValidationMetadata.d.ts","./node_modules/class-validator/types/metadata/ConstraintMetadata.d.ts","./node_modules/class-validator/types/metadata/MetadataStorage.d.ts","./node_modules/class-validator/types/index.d.ts","./src/modules/auth/dto/register.dto.ts","./src/modules/auth/auth.controller.ts","./node_modules/@types/passport-strategy/index.d.ts","./node_modules/@types/passport-jwt/index.d.ts","./src/modules/auth/jwt.strategy.ts","./src/modules/auth/auth.module.ts","./src/modules/users/users.service.ts","./src/modules/users/users.controller.ts","./src/modules/users/users.module.ts","./src/modules/courses/courses.service.ts","./src/modules/courses/courses.controller.ts","./src/modules/courses/courses.module.ts","./src/modules/contents/contents.service.ts","./src/modules/contents/contents.controller.ts","./src/modules/contents/contents.module.ts","./src/modules/prompts/prompts.service.ts","./src/modules/prompts/prompts.controller.ts","./src/modules/prompts/prompts.module.ts","./src/modules/tools/tools.service.ts","./src/modules/tools/tools.controller.ts","./src/modules/tools/tools.module.ts","./src/modules/ai/ai-gateway.service.ts","./src/modules/sandbox/sandbox.service.ts","./src/modules/sandbox/sandbox.controller.ts","./src/modules/sandbox/sandbox-share.controller.ts","./src/modules/ai/ai.module.ts","./src/modules/sandbox/sandbox.module.ts","./src/modules/payment/payment.service.ts","./src/modules/orders/orders.service.ts","./src/modules/orders/orders.controller.ts","./src/modules/payment/payment.controller.ts","./src/modules/payment/payment.module.ts","./src/modules/orders/orders.module.ts","./src/modules/admin/admin.service.ts","./src/modules/admin/admin.guard.ts","./src/modules/admin/ai-assistant.service.ts","./src/modules/admin/admin.controller.ts","./src/modules/admin/analytics.controller.ts","./src/modules/admin/settings.controller.ts","./src/modules/admin/operations.controller.ts","./src/modules/admin/users.controller.ts","./src/modules/admin/public.controller.ts","./src/modules/admin/admin.module.ts","./src/modules/categories/categories.controller.ts","./src/modules/categories/categories.module.ts","./src/modules/dashboard/dashboard.service.ts","./src/modules/dashboard/dashboard.controller.ts","./src/modules/dashboard/dashboard.module.ts","./src/modules/search/search.service.ts","./src/modules/search/search.controller.ts","./src/modules/search/search.module.ts","./src/modules/models/models.service.ts","./src/modules/models/models.controller.ts","./src/modules/models/models.module.ts","./node_modules/@nestjs/core/adapters/http-adapter.d.ts","./node_modules/@nestjs/platform-express/interfaces/nest-express-body-parser-options.interface.d.ts","./node_modules/@nestjs/platform-express/interfaces/nest-express-body-parser.interface.d.ts","./node_modules/@nestjs/platform-express/interfaces/serve-static-options.interface.d.ts","./node_modules/@nestjs/platform-express/adapters/express-adapter.d.ts","./node_modules/@nestjs/platform-express/adapters/index.d.ts","./node_modules/@nestjs/platform-express/interfaces/nest-express-application.interface.d.ts","./node_modules/@nestjs/platform-express/interfaces/index.d.ts","./node_modules/@nestjs/platform-express/multer/interfaces/multer-options.interface.d.ts","./node_modules/@nestjs/platform-express/multer/interceptors/any-files.interceptor.d.ts","./node_modules/@nestjs/platform-express/multer/interceptors/file-fields.interceptor.d.ts","./node_modules/@nestjs/platform-express/multer/interceptors/file.interceptor.d.ts","./node_modules/@nestjs/platform-express/multer/interceptors/files.interceptor.d.ts","./node_modules/@nestjs/platform-express/multer/interceptors/no-files.interceptor.d.ts","./node_modules/@nestjs/platform-express/multer/interceptors/index.d.ts","./node_modules/@nestjs/platform-express/multer/interfaces/files-upload-module.interface.d.ts","./node_modules/@nestjs/platform-express/multer/interfaces/index.d.ts","./node_modules/@nestjs/platform-express/multer/multer.module.d.ts","./node_modules/@nestjs/platform-express/multer/index.d.ts","./node_modules/@nestjs/platform-express/index.d.ts","./node_modules/@types/multer/index.d.ts","./src/modules/upload/upload.controller.ts","./src/modules/upload/upload.service.ts","./src/modules/upload/upload.module.ts","./src/modules/notifications/notification.service.ts","./src/modules/community/community.service.ts","./src/modules/community/community.controller.ts","./src/modules/community/circles.controller.ts","./src/modules/community/community.module.ts","./src/modules/enterprise/enterprise.service.ts","./src/modules/enterprise/enterprise.controller.ts","./src/modules/enterprise/enterprise.module.ts","./src/modules/notifications/notification.controller.ts","./src/modules/notifications/notification.module.ts","./src/modules/learning/learning.service.ts","./src/modules/learning/learning.controller.ts","./src/modules/learning/learning.module.ts","./src/modules/skills/skills.service.ts","./src/modules/skills/skills.controller.ts","./src/modules/skills/skills.module.ts","./src/app.module.ts","./node_modules/@nestjs/core/adapters/index.d.ts","./node_modules/@nestjs/core/inspector/interfaces/edge.interface.d.ts","./node_modules/@nestjs/core/inspector/interfaces/entrypoint.interface.d.ts","./node_modules/@nestjs/core/inspector/interfaces/extras.interface.d.ts","./node_modules/@nestjs/core/inspector/interfaces/node.interface.d.ts","./node_modules/@nestjs/core/injector/settlement-signal.d.ts","./node_modules/@nestjs/core/injector/injector.d.ts","./node_modules/@nestjs/core/inspector/interfaces/serialized-graph-metadata.interface.d.ts","./node_modules/@nestjs/core/inspector/interfaces/serialized-graph-json.interface.d.ts","./node_modules/@nestjs/core/inspector/serialized-graph.d.ts","./node_modules/@nestjs/core/injector/opaque-key-factory/interfaces/module-opaque-key-factory.interface.d.ts","./node_modules/@nestjs/core/injector/compiler.d.ts","./node_modules/@nestjs/core/injector/modules-container.d.ts","./node_modules/@nestjs/core/injector/container.d.ts","./node_modules/@nestjs/core/injector/instance-links-host.d.ts","./node_modules/@nestjs/core/injector/abstract-instance-resolver.d.ts","./node_modules/@nestjs/core/injector/module-ref.d.ts","./node_modules/@nestjs/core/injector/module.d.ts","./node_modules/@nestjs/core/injector/instance-wrapper.d.ts","./node_modules/@nestjs/core/router/interfaces/exclude-route-metadata.interface.d.ts","./node_modules/@nestjs/core/application-config.d.ts","./node_modules/@nestjs/core/constants.d.ts","./node_modules/@nestjs/core/discovery/discovery-module.d.ts","./node_modules/@nestjs/core/discovery/discovery-service.d.ts","./node_modules/@nestjs/core/discovery/index.d.ts","./node_modules/@nestjs/core/helpers/http-adapter-host.d.ts","./node_modules/@nestjs/core/exceptions/base-exception-filter.d.ts","./node_modules/@nestjs/core/exceptions/index.d.ts","./node_modules/@nestjs/core/helpers/context-id-factory.d.ts","./node_modules/@nestjs/common/interfaces/exceptions/exception-filter-metadata.interface.d.ts","./node_modules/@nestjs/core/exceptions/exceptions-handler.d.ts","./node_modules/@nestjs/core/router/router-proxy.d.ts","./node_modules/@nestjs/core/helpers/context-creator.d.ts","./node_modules/@nestjs/core/exceptions/base-exception-filter-context.d.ts","./node_modules/@nestjs/common/interfaces/exceptions/rpc-exception-filter-metadata.interface.d.ts","./node_modules/@nestjs/common/interfaces/exceptions/index.d.ts","./node_modules/@nestjs/core/exceptions/external-exception-filter.d.ts","./node_modules/@nestjs/core/exceptions/external-exceptions-handler.d.ts","./node_modules/@nestjs/core/exceptions/external-exception-filter-context.d.ts","./node_modules/@nestjs/core/guards/constants.d.ts","./node_modules/@nestjs/core/helpers/execution-context-host.d.ts","./node_modules/@nestjs/core/guards/guards-consumer.d.ts","./node_modules/@nestjs/core/guards/guards-context-creator.d.ts","./node_modules/@nestjs/core/guards/index.d.ts","./node_modules/@nestjs/core/interceptors/interceptors-consumer.d.ts","./node_modules/@nestjs/core/interceptors/interceptors-context-creator.d.ts","./node_modules/@nestjs/core/interceptors/index.d.ts","./node_modules/@nestjs/common/enums/route-paramtypes.enum.d.ts","./node_modules/@nestjs/core/pipes/params-token-factory.d.ts","./node_modules/@nestjs/core/pipes/pipes-consumer.d.ts","./node_modules/@nestjs/core/pipes/pipes-context-creator.d.ts","./node_modules/@nestjs/core/pipes/index.d.ts","./node_modules/@nestjs/core/helpers/context-utils.d.ts","./node_modules/@nestjs/core/injector/inquirer/inquirer-constants.d.ts","./node_modules/@nestjs/core/injector/inquirer/index.d.ts","./node_modules/@nestjs/core/interfaces/module-definition.interface.d.ts","./node_modules/@nestjs/core/interfaces/module-override.interface.d.ts","./node_modules/@nestjs/core/inspector/interfaces/enhancer-metadata-cache-entry.interface.d.ts","./node_modules/@nestjs/core/inspector/graph-inspector.d.ts","./node_modules/@nestjs/core/metadata-scanner.d.ts","./node_modules/@nestjs/core/scanner.d.ts","./node_modules/@nestjs/core/injector/instance-loader.d.ts","./node_modules/@nestjs/core/injector/lazy-module-loader/lazy-module-loader-options.interface.d.ts","./node_modules/@nestjs/core/injector/lazy-module-loader/lazy-module-loader.d.ts","./node_modules/@nestjs/core/injector/index.d.ts","./node_modules/@nestjs/core/helpers/interfaces/external-handler-metadata.interface.d.ts","./node_modules/@nestjs/core/helpers/interfaces/params-metadata.interface.d.ts","./node_modules/@nestjs/core/helpers/external-context-creator.d.ts","./node_modules/@nestjs/core/helpers/index.d.ts","./node_modules/@nestjs/core/inspector/initialize-on-preview.allowlist.d.ts","./node_modules/@nestjs/core/inspector/partial-graph.host.d.ts","./node_modules/@nestjs/core/inspector/index.d.ts","./node_modules/@nestjs/core/middleware/route-info-path-extractor.d.ts","./node_modules/@nestjs/core/middleware/routes-mapper.d.ts","./node_modules/@nestjs/core/middleware/builder.d.ts","./node_modules/@nestjs/core/middleware/index.d.ts","./node_modules/@nestjs/core/nest-application-context.d.ts","./node_modules/@nestjs/core/nest-application.d.ts","./node_modules/@nestjs/common/interfaces/microservices/nest-microservice-options.interface.d.ts","./node_modules/@nestjs/core/nest-factory.d.ts","./node_modules/@nestjs/core/repl/repl.d.ts","./node_modules/@nestjs/core/repl/index.d.ts","./node_modules/@nestjs/core/router/interfaces/routes.interface.d.ts","./node_modules/@nestjs/core/router/interfaces/index.d.ts","./node_modules/@nestjs/core/router/request/request-constants.d.ts","./node_modules/@nestjs/core/router/request/index.d.ts","./node_modules/@nestjs/core/router/router-module.d.ts","./node_modules/@nestjs/core/router/index.d.ts","./node_modules/@nestjs/core/services/reflector.service.d.ts","./node_modules/@nestjs/core/services/index.d.ts","./node_modules/@nestjs/core/index.d.ts","./node_modules/helmet/index.d.cts","./node_modules/@types/compression/index.d.ts","./src/common/filters/global-exception.filter.ts","./src/common/interceptors/logging.interceptor.ts","./src/common/index.ts","./src/main.ts","./node_modules/@nestjs/testing/interfaces/mock-factory.d.ts","./node_modules/@nestjs/testing/interfaces/override-by-factory-options.interface.d.ts","./node_modules/@nestjs/testing/interfaces/override-module.interface.d.ts","./node_modules/@nestjs/testing/testing-module.d.ts","./node_modules/@nestjs/testing/testing-module.builder.d.ts","./node_modules/@nestjs/testing/interfaces/override-by.interface.d.ts","./node_modules/@nestjs/testing/interfaces/index.d.ts","./node_modules/@nestjs/testing/test.d.ts","./node_modules/@nestjs/testing/index.d.ts","./src/modules/admin/tests/admin.service.spec.ts","./src/modules/ai/tests/ai-gateway.service.spec.ts","./src/modules/auth/tests/auth.service.spec.ts","./src/modules/community/tests/community.service.spec.ts","./src/modules/courses/tests/courses.service.spec.ts","./src/modules/enterprise/tests/enterprise.service.spec.ts","./src/modules/orders/subscriptions.controller.ts","./src/modules/orders/tests/orders.service.spec.ts","./src/modules/payment/tests/payment.service.spec.ts","./src/modules/prompts/tests/prompts.service.spec.ts","./src/modules/sandbox/tests/sandbox.service.spec.ts","./src/modules/search/tests/search.service.spec.ts","./src/modules/tools/tests/tools.service.spec.ts","./src/modules/users/tests/users.service.spec.ts","./node_modules/@babel/types/lib/index.d.ts","./node_modules/@types/babel__generator/index.d.ts","./node_modules/@babel/parser/typings/babel-parser.d.ts","./node_modules/@types/babel__template/index.d.ts","./node_modules/@types/babel__traverse/index.d.ts","./node_modules/@types/babel__core/index.d.ts","./node_modules/@types/bcryptjs/index.d.ts","./node_modules/@types/cookiejar/index.d.ts","./node_modules/@types/estree/index.d.ts","./node_modules/@types/json-schema/index.d.ts","./node_modules/@types/eslint/use-at-your-own-risk.d.ts","./node_modules/@types/eslint/index.d.ts","./node_modules/@types/eslint-scope/index.d.ts","./node_modules/@types/istanbul-lib-coverage/index.d.ts","./node_modules/@types/istanbul-lib-report/index.d.ts","./node_modules/@types/istanbul-reports/index.d.ts","./node_modules/@jest/expect-utils/build/index.d.ts","./node_modules/chalk/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/symbols/symbols.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/symbols/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/any/any.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/any/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/mapped/mapped-key.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/mapped/mapped-result.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/async-iterator/async-iterator.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/async-iterator/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/readonly/readonly.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/readonly/readonly-from-mapped-result.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/readonly/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/readonly-optional/readonly-optional.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/readonly-optional/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/constructor/constructor.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/constructor/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/literal/literal.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/literal/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/enum/enum.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/enum/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/function/function.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/function/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/computed/computed.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/computed/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/never/never.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/never/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/intersect/intersect-type.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/intersect/intersect-evaluated.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/intersect/intersect.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/intersect/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/union/union-type.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/union/union-evaluated.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/union/union.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/union/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/recursive/recursive.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/recursive/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/unsafe/unsafe.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/unsafe/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/ref/ref.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/ref/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/tuple/tuple.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/tuple/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/error/error.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/error/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/string/string.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/string/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/boolean/boolean.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/boolean/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/number/number.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/number/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/integer/integer.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/integer/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/bigint/bigint.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/bigint/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/template-literal/parse.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/template-literal/finite.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/template-literal/generate.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/template-literal/syntax.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/template-literal/pattern.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/template-literal/template-literal.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/template-literal/union.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/template-literal/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/indexed/indexed-property-keys.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/indexed/indexed-from-mapped-result.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/indexed/indexed.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/indexed/indexed-from-mapped-key.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/indexed/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/iterator/iterator.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/iterator/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/promise/promise.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/promise/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/sets/set.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/sets/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/mapped/mapped.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/mapped/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/optional/optional.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/optional/optional-from-mapped-result.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/optional/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/awaited/awaited.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/awaited/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/keyof/keyof-property-keys.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/keyof/keyof.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/keyof/keyof-from-mapped-result.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/keyof/keyof-property-entries.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/keyof/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/omit/omit-from-mapped-result.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/omit/omit.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/omit/omit-from-mapped-key.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/omit/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/pick/pick-from-mapped-result.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/pick/pick.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/pick/pick-from-mapped-key.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/pick/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/null/null.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/null/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/symbol/symbol.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/symbol/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/undefined/undefined.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/undefined/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/partial/partial.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/partial/partial-from-mapped-result.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/partial/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/regexp/regexp.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/regexp/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/record/record.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/record/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/required/required.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/required/required-from-mapped-result.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/required/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/transform/transform.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/transform/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/module/compute.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/module/infer.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/module/module.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/module/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/not/not.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/not/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/static/static.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/static/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/object/object.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/object/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/helpers/helpers.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/helpers/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/array/array.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/array/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/date/date.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/date/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/uint8array/uint8array.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/uint8array/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/unknown/unknown.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/unknown/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/void/void.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/void/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/schema/schema.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/schema/anyschema.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/schema/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/clone/type.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/clone/value.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/clone/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/create/type.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/create/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/argument/argument.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/argument/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/guard/kind.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/guard/type.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/guard/value.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/guard/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/patterns/patterns.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/patterns/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/registry/format.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/registry/type.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/registry/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/composite/composite.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/composite/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/const/const.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/const/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/constructor-parameters/constructor-parameters.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/constructor-parameters/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/exclude/exclude-from-template-literal.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/exclude/exclude.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/exclude/exclude-from-mapped-result.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/exclude/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/extends/extends-check.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/extends/extends-from-mapped-result.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/extends/extends.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/extends/extends-from-mapped-key.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/extends/extends-undefined.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/extends/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/extract/extract-from-template-literal.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/extract/extract.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/extract/extract-from-mapped-result.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/extract/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/instance-type/instance-type.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/instance-type/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/instantiate/instantiate.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/instantiate/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/intrinsic/intrinsic-from-mapped-key.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/intrinsic/intrinsic.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/intrinsic/capitalize.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/intrinsic/lowercase.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/intrinsic/uncapitalize.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/intrinsic/uppercase.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/intrinsic/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/parameters/parameters.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/parameters/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/rest/rest.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/rest/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/return-type/return-type.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/return-type/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/type/json.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/type/javascript.d.ts","./node_modules/@sinclair/typebox/build/cjs/type/type/index.d.ts","./node_modules/@sinclair/typebox/build/cjs/index.d.ts","./node_modules/@jest/schemas/build/index.d.ts","./node_modules/pretty-format/build/index.d.ts","./node_modules/jest-diff/build/index.d.ts","./node_modules/jest-matcher-utils/build/index.d.ts","./node_modules/jest-mock/build/index.d.ts","./node_modules/expect/build/index.d.ts","./node_modules/@types/jest/index.d.ts","./node_modules/@types/methods/index.d.ts","./node_modules/@types/stack-utils/index.d.ts","./node_modules/@types/superagent/lib/agent-base.d.ts","./node_modules/@types/superagent/lib/node/response.d.ts","./node_modules/@types/superagent/types.d.ts","./node_modules/@types/superagent/lib/node/agent.d.ts","./node_modules/@types/superagent/lib/request-base.d.ts","./node_modules/form-data/index.d.ts","./node_modules/@types/superagent/lib/node/http2wrapper.d.ts","./node_modules/@types/superagent/lib/node/index.d.ts","./node_modules/@types/superagent/index.d.ts","./node_modules/@types/supertest/types.d.ts","./node_modules/@types/supertest/lib/agent.d.ts","./node_modules/@types/supertest/lib/test.d.ts","./node_modules/@types/supertest/lib/cookies.d.ts","./node_modules/@types/supertest/index.d.ts","./node_modules/@types/yargs-parser/index.d.ts","./node_modules/@types/yargs/index.d.ts"],"fileInfos":[{"version":"f33e5332b24c3773e930e212cbb8b6867c8ba3ec4492064ea78e55a524d57450","affectsGlobalScope":true},"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","26f2f787e82c4222710f3b676b4d83eb5ad0a72fa7b746f03449e7a026ce5073","9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569",{"version":"21e41a76098aa7a191028256e52a726baafd45a925ea5cf0222eb430c96c1d83","affectsGlobalScope":true},{"version":"35299ae4a62086698444a5aaee27fc7aa377c68cbb90b441c9ace246ffd05c97","affectsGlobalScope":true},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true},{"version":"138fb588d26538783b78d1e3b2c2cc12d55840b97bf5e08bca7f7a174fbe2f17","affectsGlobalScope":true},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true},{"version":"e0275cd0e42990dc3a16f0b7c8bca3efe87f1c8ad404f80c6db1c7c0b828c59f","affectsGlobalScope":true},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true},{"version":"49ed889be54031e1044af0ad2c603d627b8bda8b50c1a68435fe85583901d072","affectsGlobalScope":true},{"version":"e93d098658ce4f0c8a0779e6cab91d0259efb88a318137f686ad76f8410ca270","affectsGlobalScope":true},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true},{"version":"ec0104fee478075cb5171e5f4e3f23add8e02d845ae0165bfa3f1099241fa2aa","affectsGlobalScope":true},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true},{"version":"acae90d417bee324b1372813b5a00829d31c7eb670d299cd7f8f9a648ac05688","affectsGlobalScope":true},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true},{"version":"51e547984877a62227042850456de71a5c45e7fe86b7c975c6e68896c86fa23b","affectsGlobalScope":true},{"version":"62a4966981264d1f04c44eb0f4b5bdc3d81c1a54725608861e44755aa24ad6a5","affectsGlobalScope":true},{"version":"4350e5922fecd4bedda2964d69c213a1436349d0b8d260dd902795f5b94dc74b","affectsGlobalScope":true},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true},"c1e8d979afc15d66e2bd5a58c732d5a2ba3ccaae41ac7d5a2c539e6de66a8e51",{"version":"8d6d51a5118d000ed3bfe6e1dd1335bebfff3fef23cd2af2f84a24d30f90cc90","affectsGlobalScope":true},"6d8dedbec739bc79642c1e96e9bfc0b83b25b104a0486aebf016fc7b85b39f48","e89535c3ec439608bcd0f68af555d0e5ddf121c54abe69343549718bd7506b9c","622a984b60c294ffb2f9152cf1d4d12e91d2b733d820eec949cf54d63a3c1025","81aae92abdeaccd9c1723cef39232c90c1aed9d9cf199e6e2a523b7d8e058a11","a63a6c6806a1e519688ef7bd8ca57be912fc0764485119dbd923021eb4e79665","75b57b109d774acca1e151df21cf5cb54c7a1df33a273f0457b9aee4ebd36fb9","073ca26c96184db9941b5ec0ddea6981c9b816156d9095747809e524fdd90e35","e41d17a2ec23306d953cda34e573ed62954ca6ea9b8c8b74e013d07a6886ce47","241bd4add06f06f0699dcd58f3b334718d85e3045d9e9d4fa556f11f4d1569c1","2ae3787e1498b20aad1b9c2ee9ea517ec30e89b70d242d8e3e52d1e091039695",{"version":"c7c72c4cffb1bc83617eefed71ed68cc89df73cab9e19507ccdecb3e72b4967e","affectsGlobalScope":true},"b8bff8a60af0173430b18d9c3e5c443eaa3c515617210c0c7b3d2e1743c19ecb","38b38db08e7121828294dec10957a7a9ff263e33e2a904b346516d4a4acca482","a76ebdf2579e68e4cfe618269c47e5a12a4e045c2805ed7f7ab37af8daa6b091","8a2aaea564939c22be05d665cc955996721bad6d43148f8fa21ae8f64afecd37","e59d36b7b6e8ba2dd36d032a5f5c279d2460968c8b4e691ca384f118fb09b52a","e96885c0684c9042ec72a9a43ef977f6b4b4a2728f4b9e737edcbaa0c74e5bf6","95950a187596e206d32d5d9c7b932901088c65ed8f9040e614aa8e321e0225ef","89e061244da3fc21b7330f4bd32f47c1813dd4d7f1dc3d0883d88943f035b993","e46558c2e04d06207b080138678020448e7fc201f3d69c2601b0d1456105f29a","71549375db52b1163411dba383b5f4618bdf35dc57fa327a1c7d135cf9bf67d1","7e6b2d61d6215a4e82ea75bc31a80ebb8ad0c2b37a60c10c70dd671e8d9d6d5d","78bea05df2896083cca28ed75784dde46d4b194984e8fc559123b56873580a23","5dd04ced37b7ea09f29d277db11f160df7fd73ba8b9dba86cb25552e0653a637","f74b81712e06605677ae1f061600201c425430151f95b5ef4d04387ad7617e6a","9a72847fcf4ac937e352d40810f7b7aec7422d9178451148296cf1aa19467620","3ae18f60e0b96fa1e025059b7d25b3247ba4dcb5f4372f6d6e67ce2adac74eac","2b9260f44a2e071450ae82c110f5dc8f330c9e5c3e85567ed97248330f2bf639","4f196e13684186bda6f5115fc4677a87cf84a0c9c4fc17b8f51e0984f3697b6d","61419f2c5822b28c1ea483258437c1faab87d00c6f84481aa22afb3380d8e9a4","64479aee03812264e421c0bf5104a953ca7b02740ba80090aead1330d0effe91","0521108c9f8ddb17654a0a54dae6ba9667c99eddccfd6af5748113e022d1c37a","c5570e504be103e255d80c60b56c367bf45d502ca52ee35c55dec882f6563b5c","ee764e6e9a7f2b987cc1a2c0a9afd7a8f4d5ebc4fdb66ad557a7f14a8c2bd320","0520b5093712c10c6ef23b5fea2f833bf5481771977112500045e5ea7e8e2b69","5c3cf26654cf762ac4d7fd7b83f09acfe08eef88d2d6983b9a5a423cb4004ca3","e60fa19cf7911c1623b891155d7eb6b7e844e9afdf5738e3b46f3b687730a2bd","b1fd72ff2bb0ba91bb588f3e5329f8fc884eb859794f1c4657a2bfa122ae54d0","6cf42a4f3cfec648545925d43afaa8bb364ac10a839ffed88249da109361b275","d7058e75920120b142a9d57be25562a3cd9a936269fd52908505f530105f2ec4","6df52b70d7f7702202f672541a5f4a424d478ee5be51a9d37b8ccbe1dbf3c0f2","0ca7f997e9a4d8985e842b7c882e521b6f63233c4086e9fe79dd7a9dc4742b5e","91046b5c6b55d3b194c81fd4df52f687736fad3095e9d103ead92bb64dc160ee","db5704fdad56c74dfc5941283c1182ed471bd17598209d3ac4a49faa72e43cfc","758e8e89559b02b81bc0f8fd395b17ad5aff75490c862cbe369bb1a3d1577c40","2ee64342c077b1868f1834c063f575063051edd6e2964257d34aad032d6b657c","6f6b4b3d670b6a5f0e24ea001c1b3d36453c539195e875687950a178f1730fa7","a472a1d3f25ce13a1d44911cd3983956ac040ce2018e155435ea34afb25f864c","b48b83a86dd9cfe36f8776b3ff52fcd45b0e043c0538dc4a4b149ba45fe367b9","792de5c062444bd2ee0413fb766e57e03cce7cdaebbfc52fc0c7c8e95069c96b","a79e3e81094c7a04a885bad9b049c519aace53300fb8a0fe4f26727cb5a746ce","93181bac0d90db185bb730c95214f6118ae997fe836a98a49664147fbcaf1988","8a4e89564d8ea66ad87ee3762e07540f9f0656a62043c910d819b4746fc429c5","b9011d99942889a0f95e120d06b698c628b0b6fdc3e6b7ecb459b97ed7d5bcc6","4d639cbbcc2f8f9ce6d55d5d503830d6c2556251df332dc5255d75af53c8a0e7","cdb48277f600ab5f429ecf1c5ea046683bc6b9f73f3deab9a100adac4b34969c","75be84956a29040a1afbe864c0a7a369dfdb739380072484eff153905ef867ee","b06b4adc2ae03331a92abd1b19af8eb91ec2bf8541747ee355887a167d53145e","c54166a85bd60f86d1ebb90ce0117c0ecb850b8a33b366691629fdf26f1bbbd8","0d417c15c5c635384d5f1819cc253a540fe786cc3fda32f6a2ae266671506a21","80f23f1d60fbed356f726b3b26f9d348dddbb34027926d10d59fad961e70a730","cb59317243a11379a101eb2f27b9df1022674c3df1df0727360a0a3f963f523b","cc20bb2227dd5de0aab0c8d697d1572f8000550e62c7bf5c92f212f657dd88c5","06b8a7d46195b6b3980e523ef59746702fd210b71681a83a5cf73799623621f9","860e4405959f646c101b8005a191298b2381af8f33716dc5f42097e4620608f8","f7e32adf714b8f25d3c1783473abec3f2e82d5724538d8dcf6f51baaaff1ca7a","d0da80c845999a16c24d0783033fb5366ada98df17867c98ad433ede05cd87fd","bfbf80f9cd4558af2d7b2006065340aaaced15947d590045253ded50aabb9bc5","fd9a991b51870325e46ebb0e6e18722d313f60cd8e596e645ec5ac15b96dbf4e","c3bd2b94e4298f81743d92945b80e9b56c1cdfb2bef43c149b7106a2491b1fc9","a246cce57f558f9ebaffd55c1e5673da44ea603b4da3b2b47eb88915d30a9181","d993eacc103c5a065227153c9aae8acea3a4322fe1a169ee7c70b77015bf0bb2","fc2b03d0c042aa1627406e753a26a1eaad01b3c496510a78016822ef8d456bb6","063c7ebbe756f0155a8b453f410ca6b76ffa1bbc1048735bcaf9c7c81a1ce35f","314e402cd481370d08f63051ae8b8c8e6370db5ee3b8820eeeaaf8d722a6dac6","9669075ac38ce36b638b290ba468233980d9f38bdc62f0519213b2fd3e2552ec","4d123de012c24e2f373925100be73d50517ac490f9ed3578ac82d0168bfbd303","656c9af789629aa36b39092bee3757034009620439d9a39912f587538033ce28","3ac3f4bdb8c0905d4c3035d6f7fb20118c21e8a17bee46d3735195b0c2a9f39f","1f453e6798ed29c86f703e9b41662640d4f2e61337007f27ac1c616f20093f69","af43b7871ff21c62bf1a54ec5c488e31a8d3408d5b51ff2e9f8581b6c55f2fc7","70550511d25cbb0b6a64dcac7fffc3c1397fd4cbeb6b23ccc7f9b794ab8a6954","af0fbf08386603a62f2a78c42d998c90353b1f1d22e05a384545f7accf881e0a","cefc20054d20b85b534206dbcedd509bb74f87f3d8bc45c58c7be3a76caa45e1","ad6eee4877d0f7e5244d34bc5026fd6e9cf8e66c5c79416b73f9f6ebf132f924","4888fd2bcfee9a0ce89d0df860d233e0cee8ee9c479b6bd5a5d5f9aae98342fe","f4749c102ced952aa6f40f0b579865429c4869f6d83df91000e98005476bee87","56654d2c5923598384e71cb808fac2818ca3f07dd23bb018988a39d5e64f268b","8b6719d3b9e65863da5390cb26994602c10a315aa16e7d70778a63fee6c4c079","05f56cd4b929977d18df8f3d08a4c929a2592ef5af083e79974b20a063f30940","547d3c406a21b30e2b78629ecc0b2ddaf652d9e0bdb2d59ceebce5612906df33","b3a4f9385279443c3a5568ec914a9492b59a723386161fd5ef0619d9f8982f97","3fe66aba4fbe0c3ba196a4f9ed2a776fe99dc4d1567a558fb11693e9fcc4e6ed","140eef237c7db06fc5adcb5df434ee21e81ee3a6fd57e1a75b8b3750aa2df2d8","0944ec553e4744efae790c68807a461720cff9f3977d4911ac0d918a17c9dd99","cb46b38d5e791acaa243bf342b8b5f8491639847463ac965b93896d4fb0af0d9","7c7d9e116fe51100ff766703e6b5e4424f51ad8977fe474ddd8d0959aa6de257","af70a2567e586be0083df3938b6a6792e6821363d8ef559ad8d721a33a5bcdaf","006cff3a8bcb92d77953f49a94cd7d5272fef4ab488b9052ef82b6a1260d870b","7d44bfdc8ee5e9af70738ff652c622ae3ad81815e63ab49bdc593d34cb3a68e5","339814517abd4dbc7b5f013dfd3b5e37ef0ea914a8bbe65413ecffd668792bc6","34d5bc0a6958967ec237c99f980155b5145b76e6eb927c9ffc57d8680326b5d8","9eae79b70c9d8288032cbe1b21d0941f6bd4f315e14786b2c1d10bccc634e897","18ce015ed308ea469b13b17f99ce53bbb97975855b2a09b86c052eefa4aa013a","5a931bc4106194e474be141e0bc1046629510dc95b9a0e4b02a3783847222965","5e5f371bf23d5ced2212a5ff56675aefbd0c9b3f4d4fdda1b6123ac6e28f058c","907c17ad5a05eecb29b42b36cc8fec6437be27cc4986bb3a218e4f74f606911c","ce60a562cd2a92f37a88f2ddd99a3abfbc5848d7baf38c48fb8d3243701fcb75","a726ad2d0a98bfffbe8bc1cd2d90b6d831638c0adc750ce73103a471eb9a891c","f44c0c8ce58d3dacac016607a1a90e5342d830ea84c48d2e571408087ae55894","75a315a098e630e734d9bc932d9841b64b30f7a349a20cf4717bf93044eff113","9131d95e32b3d4611d4046a613e022637348f6cebfe68230d4e81b691e4761a1","b03aa292cfdcd4edc3af00a7dbd71136dd067ec70a7536b655b82f4dd444e857","b6e2b0448ced813b8c207810d96551a26e7d7bb73255eea4b9701698f78846d6","8ae10cd85c1bd94d2f2d17c4cbd25c068a4b2471c70c2d96434239f97040747a","9ed5b799c50467b0c9f81ddf544b6bcda3e34d92076d6cab183c84511e45c39f","b4fa87cc1833839e51c49f20de71230e259c15b2c9c3e89e4814acc1d1ef10de","e90ac9e4ac0326faa1bc39f37af38ace0f9d4a655cd6d147713c653139cf4928","ea27110249d12e072956473a86fd1965df8e1be985f3b686b4e277afefdde584","8776a368617ce51129b74db7d55c3373dadcce5d0701e61d106e99998922a239","5666075052877fe2fdddd5b16de03168076cf0f03fbca5c1d4a3b8f43cba570c","9108ab5af05418f599ab48186193b1b07034c79a4a212a7f73535903ba4ca249","bb4e2cdcadf9c9e6ee2820af23cee6582d47c9c9c13b0dca1baaffe01fbbcb5f","6e30d0b5a1441d831d19fe02300ab3d83726abd5141cbcc0e2993fa0efd33db4","423f28126b2fc8d8d6fa558035309000a1297ed24473c595b7dec52e5c7ebae5","fb30734f82083d4790775dae393cd004924ebcbfde49849d9430bf0f0229dd16","2c92b04a7a4a1cd9501e1be338bf435738964130fb2ad5bd6c339ee41224ac4c","c5c5f0157b41833180419dacfbd2bcce78fb1a51c136bd4bcba5249864d8b9b5","02ae43d5bae42efcd5a00d3923e764895ce056bca005a9f4e623aa6b4797c8af","db6e01f17012a9d7b610ae764f94a1af850f5d98c9c826ad61747dca0fb800bd","8a44b424edee7bb17dc35a558cc15f92555f14a0441205613e0e50452ab3a602","24a00d0f98b799e6f628373249ece352b328089c3383b5606214357e9107e7d5","33637e3bc64edd2075d4071c55d60b32bdb0d243652977c66c964021b6fc8066","0f0ad9f14dedfdca37260931fac1edf0f6b951c629e84027255512f06a6ebc4c","16ad86c48bf950f5a480dc812b64225ca4a071827d3d18ffc5ec1ae176399e36","8cbf55a11ff59fd2b8e39a4aa08e25c5ddce46e3af0ed71fb51610607a13c505","d5bc4544938741f5daf8f3a339bfbf0d880da9e89e79f44a6383aaf056fe0159","97f9169882d393e6f303f570168ca86b5fe9aab556e9a43672dae7e6bb8e6495","7c9adb3fcd7851497818120b7e151465406e711d6a596a71b807f3a17853cb58","6752d402f9282dd6f6317c8c048aaaac27295739a166eed27e00391b358fed9a","9fd7466b77020847dbc9d2165829796bf7ea00895b2520ff3752ffdcff53564b","fbfc12d54a4488c2eb166ed63bab0fb34413e97069af273210cf39da5280c8d6","85a84240002b7cf577cec637167f0383409d086e3c4443852ca248fc6e16711e","84794e3abd045880e0fadcf062b648faf982aa80cfc56d28d80120e298178626","053d8b827286a16a669a36ffc8ccc8acdf8cc154c096610aa12348b8c493c7b8","3cce4ce031710970fe12d4f7834375f5fd455aa129af4c11eb787935923ff551","8f62cbd3afbd6a07bb8c934294b6bfbe437021b89e53a4da7de2648ecfc7af25","62c3621d34fb2567c17a2c4b89914ebefbfbd1b1b875b070391a7d4f722e55dc","c05ac811542e0b59cb9c2e8f60e983461f0b0e39cea93e320fad447ff8e474f3","8e7a5b8f867b99cc8763c0b024068fb58e09f7da2c4810c12833e1ca6eb11c4f","132351cbd8437a463757d3510258d0fa98fd3ebef336f56d6f359cf3e177a3ce","df877050b04c29b9f8409aa10278d586825f511f0841d1ec41b6554f8362092b","33d1888c3c27d3180b7fd20bac84e97ecad94b49830d5dd306f9e770213027d1","ee942c58036a0de88505ffd7c129f86125b783888288c2389330168677d6347f","a3f317d500c30ea56d41501632cdcc376dae6d24770563a5e59c039e1c2a08ec","eb21ddc3a8136a12e69176531197def71dc28ffaf357b74d4bf83407bd845991","0c1651a159995dfa784c57b4ea9944f16bdf8d924ed2d8b3db5c25d25749a343","aaa13958e03409d72e179b5d7f6ec5c6cc666b7be14773ae7b6b5ee4921e52db","0a86e049843ad02977a94bb9cdfec287a6c5a0a4b6b5391a6648b1a122072c5a","40f06693e2e3e58526b713c937895c02e113552dc8ba81ecd49cdd9596567ddb","4ed5e1992aedb174fb8f5aa8796aa6d4dcb8bd819b4af1b162a222b680a37fa0","d7f4bd46a8b97232ea6f8c28012b8d2b995e55e729d11405f159d3e00c51420a","d604d413aff031f4bfbdae1560e54ebf503d374464d76d50a2c6ded4df525712","e4f4f9cf1e3ac9fd91ada072e4d428ecbf0aa6dc57138fb797b8a0ca3a1d521c","12bfd290936824373edda13f48a4094adee93239b9a73432db603127881a300d","340ceb3ea308f8e98264988a663640e567c553b8d6dc7d5e43a8f3b64f780374","c5a769564e530fba3ec696d0a5cff1709b9095a0bdf5b0826d940d2fc9786413","7124ef724c3fc833a17896f2d994c368230a8d4b235baed39aa8037db31de54f","5de1c0759a76e7710f76899dcae601386424eab11fb2efaf190f2b0f09c3d3d3","9c5ee8f7e581f045b6be979f062a61bf076d362bf89c7f966b993a23424e8b0d","1a11df987948a86aa1ec4867907c59bdf431f13ed2270444bf47f788a5c7f92d","8018dd2e95e7ce6e613ddd81672a54532614dc745520a2f9e3860ff7fb1be0ca","b756781cd40d465da57d1fc6a442c34ae61fe8c802d752aace24f6a43fedacee","0fe76167c87289ea094e01616dcbab795c11b56bad23e1ef8aba9aa37e93432a","3a45029dba46b1f091e8dc4d784e7be970e209cd7d4ff02bd15270a98a9ba24b","032c1581f921f8874cf42966f27fd04afcabbb7878fa708a8251cac5415a2a06","69c68ed9652842ce4b8e495d63d2cd425862104c9fb7661f72e7aa8a9ef836f8","0e704ee6e9fd8b6a5a7167886f4d8915f4bc22ed79f19cb7b32bd28458f50643","06f62a14599a68bcde148d1efd60c2e52e8fa540cc7dcfa4477af132bb3de271","904a96f84b1bcee9a7f0f258d17f8692e6652a0390566515fe6741a5c6db8c1c","11f19ce32d21222419cecab448fa335017ebebf4f9e5457c4fa9df42fa2dcca7","2e8ee2cbb5e9159764e2189cf5547aebd0e6b0d9a64d479397bb051cd1991744","1b0471d75f5adb7f545c1a97c02a0f825851b95fe6e069ac6ecaa461b8bb321d","1d157c31a02b1e5cca9bc495b3d8d39f4b42b409da79f863fb953fbe3c7d4884","07baaceaec03d88a4b78cb0651b25f1ae0322ac1aa0b555ae3749a79a41cba86","619a132f634b4ebe5b4b4179ea5870f62f2cb09916a25957bff17b408de8b56d","f60fa446a397eb1aead9c4e568faf2df8068b4d0306ebc075fb4be16ed26b741","f3cb784be4d9e91f966a0b5052a098d9b53b0af0d341f690585b0cc05c6ca412","350f63439f8fe2e06c97368ddc7fb6d6c676d54f59520966f7dbbe6a4586014e","eba613b9b357ac8c50a925fa31dc7e65ff3b95a07efbaa684b624f143d8d34ba","45b74185005ed45bec3f07cac6e4d68eaf02ead9ff5a66721679fb28020e5e7c","0f6199602df09bdb12b95b5434f5d7474b1490d2cd8cc036364ab3ba6fd24263","c8ca7fd9ec7a3ec82185bfc8213e4a7f63ae748fd6fced931741d23ef4ea3c0f","5c6a8a3c2a8d059f0592d4eab59b062210a1c871117968b10797dee36d991ef7","ad77fd25ece8e09247040826a777dc181f974d28257c9cd5acb4921b51967bd8","795a08ae4e193f345073b49f68826ab6a9b280400b440906e4ec5c237ae777e6","8153df63cf65122809db17128e5918f59d6bb43a371b5218f4430c4585f64085","a8150bc382dd12ce58e00764d2366e1d59a590288ee3123af8a4a2cb4ef7f9df","5adfaf2f9f33957264ad199a186456a4676b2724ed700fc313ff945d03372169","d5c41a741cd408c34cb91f84468f70e9bda3dfeabf33251a61039b3cdb8b22d8","a20c3e0fe86a1d8fc500a0e9afec9a872ad3ab5b746ceb3dd7118c6d2bff4328","cbaf4a4aa8a8c02aa681c5870d5c69127974de29b7e01df570edec391a417959","c7135e329a18b0e712378d5c7bc2faec6f5ab0e955ea0002250f9e232af8b3e4","340a45cd77b41d8a6deda248167fa23d3dc67ec798d411bd282f7b3d555b1695","fae330f86bc10db6841b310f32367aaa6f553036a3afc426e0389ddc5566cd74","2bee1efe53481e93bb8b31736caba17353e7bb6fc04520bd312f4e344afd92f9","357b67529139e293a0814cb5b980c3487717c6fbf7c30934d67bc42dad316871","99d99a765426accf8133737843fb024a154dc6545fc0ffbba968a7c0b848959d","c782c5fd5fa5491c827ecade05c3af3351201dd1c7e77e06711c8029b7a9ee4d","883d2104e448bb351c49dd9689a7e8117b480b614b2622732655cef03021bf6d","d9b00ee2eca9b149663fdba1c1956331841ae296ee03eaaff6c5becbc0ff1ea8","09a7e04beb0547c43270b327c067c85a4e2154372417390731dfe092c4350998","eee530aaa93e9ec362e3941ee8355e2d073c7b21d88c2af4713e3d701dab8fef","28d47319b97dbeee9130b78eae03b2061d46dedbf92b0d9de13ed7ab8399ccd0","6559a36671052ca93cab9a289279a6cef6f9d1a72c34c34546a8848274a9c66c","7a0e4cd92545ad03910fd019ae9838718643bd4dde39881c745f236914901dfa","c99ebd20316217e349004ee1a0bc74d32d041fb6864093f10f31984c737b8cad","6f622e7f054f5ab86258362ac0a64a2d6a27f1e88732d6f5f052f422e08a70e7","d62d2ef93ceeb41cf9dfab25989a1e5f9ca5160741aac7f1453c69a6c14c69be","1491e80d72873fc586605283f2d9056ee59b166333a769e64378240df130d1c9","c32c073d389cfaa3b3e562423e16c2e6d26b8edebbb7d73ccffff4aa66f2171d","eca72bf229eecadb63e758613c62fab13815879053539a22477d83a48a21cd73","633db46fd1765736409a4767bfc670861468dde60dbb9a501fba4c1b72f8644d","f379412f2c0dddd193ff66dcdd9d9cc169162e441d86804c98c84423f993aa8a","f2ee748883723aa9325e5d7f30fce424f6a786706e1b91a5a55237c78ee89c4a","eda4760e5d7b171132265e970b67c322bcfffacb84248f44def26ed160eb722e","142f5190d730259339be1433931c0eb31ae7c7806f4e325f8a470bd9221b6533","cbd19f594f0ee7beffeb37dc0367af3908815acf4ce46d86b0515478718cfed8","3cdb96f128133efd129c798ac11f959e59d278ae439f69983224774d79ed11db","8776e64e6165838ac152fa949456732755b0976d1867ae5534ce248f0ccd7f41","896bbc7402b3a403cda96813c8ea595470ff76d31f32869d053317c00ca2589a","5c4c5b49bbb01828402bb04af1d71673b18852c11b7e95bfd5cf4c3d80d352c8","7030df3d920343df00324df59dc93a959a33e0f4940af3fefef8c07b7ee329bf","a96bc00e0c356e29e620eaec24a56d6dd7f4e304feefcc99066a1141c6fe05a7","d12cc0e5b09943c4cd0848f787eb9d07bf78b60798e4588c50582db9d4decc70","7333ee6354964fd396297958e52e5bf62179aa2c88ca0a35c6d3a668293b7e0e","19c3760af3cbc9da99d5b7763b9e33aaf8d018bc2ed843287b7ff4343adf4634","9d1e38aeb76084848d2fcd39b458ec88246de028c0f3f448b304b15d764b23d2","d406da1eccf18cec56fd29730c24af69758fe3ff49c4f94335e797119cbc0554","4898c93890a136da9156c75acd1a80a941a961b3032a0cf14e1fa09a764448b7","f5d7a845e3e1c6c27351ea5f358073d0b0681537a2da6201fab254aa434121d3","3a47d4582ef0697cccf1f3d03b620002f03fb0ff098f630e284433c417d6c61b","d7c30f0abfe9e197e376b016086cf66b2ffb84015139963f37301ed0da9d3d0d","ff75bba0148f07775bcb54bf4823421ed4ebdb751b3bf79cc003bd22e49d7d73","d40d20ac633703a7333770bfd60360126fc3302d5392d237bbb76e8c529a4f95","35a9867207c488061fb4f6fe4715802fbc164b4400018d2fa0149ad02db9a61c","b5fd805b7c578ca6a42c42bbfa6fda95a85d9e332106d810bb18116dc13a45f8","3abd9ab4fb3a035c865e6a68cb9f4260515354d5ebebacd5c681aee52c046d1f","13e82862532619a727cff9a9ba78df7ca66e8a9b69e4cbd18e9809257b6bf7ba","601fe4e366b99181cd0244d96418cffeaaa987a7e310c6f0ed0f06ce63dfe3e9","c66a4f2b1362abc4aeee0870c697691618b423c8c6e75624a40ef14a06f787b7","8808b1c4f84f2e43da98757a959fe7282cb1795737e16534a97b7d4d33e84dfc","cd0565ace87a2d7802bf4c20ea23a997c54e598b9eb89f9c75e69478c1f7a0b4","738020d2c8fc9df92d5dee4b682d35a776eaedfe2166d12bc8f186e1ea57cc52","86dd7c5657a0b0bc6bee8002edcfd544458d3d3c60974555746eb9b2583dc35e","d97b96b6ecd4ee03f9f1170722c825ef778430a6a0d7aab03b8929012bf773cd","e84e9b89251a57da26a339e75f4014f52e8ef59b77c2ee1e0171cde18d17b3b8","272dbfe04cfa965d6fff63fdaba415c1b5a515b1881ae265148f8a84ddeb318f","2035fb009b5fafa9a4f4e3b3fdb06d9225b89f2cbbf17a5b62413bf72cea721a","eefafec7c059f07b885b79b327d381c9a560e82b439793de597441a4e68d774a","72636f59b635c378dc9ea5246b9b3517b1214e340e468e54cb80126353053b2e","ebb79f267a3bf2de5f8edc1995c5d31777b539935fab8b7d863e8efb06c8e9ea","ada033e6a4c7f4e147e6d76bb881069dc66750619f8cc2472d65beeec1100145","0c04cc14a807a5dc0e3752d18a3b2655a135fefbf76ddcdabd0c5df037530d41","605d29d619180fbec287d1701e8b1f51f2d16747ec308d20aba3e9a0dac43a0f","67c19848b442d77c767414084fc571ce118b08301c4ddff904889d318f3a3363","c704ff0e0cb86d1b791767a88af21dadfee259180720a14c12baee668d0eb8fb","195c50e15d5b3ea034e01fbdca6f8ad4b35ad47463805bb0360bdffd6fce3009","da665f00b6877ae4adb39cd548257f487a76e3d99e006a702a4f38b4b39431cb","083aebdd7c96aee90b71ec970f81c48984d9c8ab863e7d30084f048ddcc9d6af","1c3bde1951add95d54a05e6628a814f2f43bf9d49902729eaf718dc9eb9f4e02","d7a4309673b06223537bc9544b1a5fe9425628e1c8ab5605f3c5ebc27ecb8074","0be3da88f06100e2291681bbda2592816dd804004f0972296b20725138ebcddf","3eadfd083d40777b403f4f4eecfa40f93876f2a01779157cc114b2565a7afb51","cb6789ce3eba018d5a7996ccbf50e27541d850e9b4ee97fdcb3cbd8c5093691f","a3684ea9719122f9477902acd08cd363a6f3cff6d493df89d4dc12fa58204e27","ff3c48a17bf10dfbb62448152042e4a48a56c9972059997ab9e7ed03b191809b","bc3561e460de5a2c19123f618fc1d5a96a484d168884d00666997d847f502bf9","c0c46113b4cd5ec9e7cf56e6dbfb3930ef6cbba914c0883eeced396988ae8320","118ea3f4e7b9c12e92551be0766706f57a411b4f18a1b4762cfde3cd6d4f0a96","01acd7f315e2493395292d9a02841f3b0300e77ccf42f84f4f11460e7623107d","656d1ce5b8fbed896bb803d849d6157242261030967b821d01e72264774cab55","da66c1b41d833858fe61947432130d39649f0b53d992dfd7d00f0bbe57191ef4","835739c6dcf0a9a1533d1e95b7d7cf8e44ca1341652856b897f4573078b23a31","774a3bcc0700036313c57a079e2e1161a506836d736203aa0463efa7b11a7e54","96577e3f8e0f9ea07ddf748d72dc1908581ef2aafd4ae7418a4574c26027cf02","f55971cb3ede99c17443b03788fe27b259dcd0f890ac31badcb74e3ffb4bb371","0ef0c246f8f255a5d798727c40d6d2231d2b0ebda5b1ec75e80eadb02022c548","ea127752a5ec75f2ac6ef7f1440634e6ae5bc8d09e6f98b61a8fb600def6a861","862320e775649dcca8915f8886865e9c6d8affc1e70ed4b97199f3b70a843b47","561764374e9f37cb895263d5c8380885972d75d09d0db64c12e0cb10ba90ae3e","ee889da857c29fa7375ad500926748ef2e029a6645d7c080e57769923d15dfef","56984ba2d781bd742b6bc0fa34c10df2eae59b42ec8b1b731d297f1590fa4071","7521de5e64e2dd022be87fce69d956a52d4425286fbc5697ecfec386da896d7e","f50b072ec1f4839b54fd1269a4fa7b03efbc9c59940224c7939632c0f70a39c3","a5b7ec6f1ff3f1d19a2547f7e1a50ab1284e6b4755d260a481ea01ed2c7cec60","1747f9eebf5beb8cfc46cf0303e300950b7bff20cff60b9c46818caced3226e3","9d969f36abb62139a90345ee5d03f1c2479831bd84c8f843d87ec304cad96ead","e972b52218fd5919aec6cd0e5e2a5fb75f5d2234cf05597a9441837a382b2b29","d1e292b0837d0ef5ede4f52363c9d8e93f5d5234086adc796e11eae390305b36","0a9e10028a96865d0f25aeca9e3b1ff0691b9b662aa186d9d490728434cf8261","1aed740b674839c89f427f48737bad435ee5a39d80b5929f9dc9cc9ac10a7700","6e9e3690dc3a6e99a845482e33ee78915893f2d0d579a55b6a0e9b4c44193371","4e7a76cce3b537b6cdb1c4b97e29cb4048ee8e7d829cf3a85f4527e92eb573f2","7e7e30f804f94b72d23a606f1d281de404a510984085fea8cbbefc7bdcaf1a37","46f1fe93f199a419172d7480407d9572064b54712b69406efa97e0244008b24e","044e6aaa3f612833fb80e323c65e9d816c3148b397e93630663cda5c2d8f4de1","deaf8eb392c46ea2c88553d3cc38d46cfd5ee498238dbc466e3f5be63ae0f651","6a79b61f57699de0a381c8a13f4c4bcd120556bfab0b4576994b6917cb62948b","c5133d7bdec65f465df12f0b507fbc0d96c78bfa5a012b0eb322cf1ff654e733","7905c052681cbe9286797ec036942618e1e8d698dcc2e60f4fb7a0013d470442","89049878a456b5e0870bb50289ea8ece28a2abd0255301a261fa8ab6a3e9a07d","d0da4f4fd66f37c13deabc1a641edd629141c333ccf862733788bd27e89436ac","d4a4f10062a6d82ba60d3ffde9154ef24b1baf2ce28c6439f5bdfb97aa0d18fc","f13310c360ecffddb3858dcb33a7619665369d465f55e7386c31d45dfc3847bf","e7bde95a05a0564ee1450bc9a53797b0ac7944bf24d87d6f645baca3aa60df48","62e68ce120914431a7d34232d3eca643a7ddd67584387936a5202ae1c4dd9a1b","91d695bba902cc2eda7edc076cd17c5c9340f7bb254597deb6679e343effadbb","e1cb8168c7e0bd4857a66558fe7fe6c66d08432a0a943c51bacdac83773d5745","a464510505f31a356e9833963d89ce39f37a098715fc2863e533255af4410525","0612b149cabbc136cb25de9daf062659f306b67793edc5e39755c51c724e2949","2579b150b86b5f644d86a6d58f17e3b801772c78866c34d41f86f3fc9eb523fe","e4b3a3e1b21a194b29d35488ec880948fc2ef8e937288463ea2981ad62a7b106","0353e05b0d8475c10ddd88056e0483b191aa5cdea00a25e0505b96e023f1a2d9","6a312caabb43c284a4b0da60d5c24f285338096eb9e977af1faca38d32a34685","b6eda93163beb978dd0d3042b11c60373506400c94613c0b40d1c0a9a9f1020e","a8af4739274959d70f7da4bfdd64f71cfc08d825c2d5d3561bc7baed760b33ef","99193bafaa9ce112889698de25c4b8c80b1209bb7402189aea1c7ada708a8a54","70473538c6eb9494d53bf1539fe69df68d87c348743d8f7244dcb02ca3619484","c48932ab06a4e7531bdca7b0f739ace5fa273f9a1b9009bcd26902f8c0b851f0","df6c83e574308f6540c19e3409370482a7d8f448d56c65790b4ac0ab6f6fedd8","ebbe6765a836bfa7f03181bc433c8984ca29626270ca1e240c009851222cb8a7","20f630766b73752f9d74aab6f4367dba9664e8122ea2edcb00168e4f8b667627","468df9d24a6e2bc6b4351417e3b5b4c2ca08264d6d5045fe18eb42e7996e58b4","954523d1f4856180cbf79b35bd754e14d3b2aea06c7efd71b254c745976086e9","31a030f1225ab463dd0189a11706f0eb413429510a7490192a170114b2af8697","6f48f244cd4b5b7e9a0326c74f480b179432397580504726de7c3c65d6304b36","5520e6defac8e6cdced6dd28808fafe795cb2cd87407bb1012e13a2b061f50b7","c3451661fb058f4e15971bbed29061dd960d02d9f8db1038e08b90d294a05c68","1f21aefa51f03629582568f97c20ef138febe32391012828e2a0149c2c393f62","b18141cda681d82b2693aef045107a910b90a7409ecff0830e1283f0bb2a53e6","18eb53924f27af2a5e9734dce28cf5985df7b2828dade1239241e95b639e9bf1","a9f1c52f4e7c2a2c4988b5638bd3dbfe38e408b358d02dd2fb8c8920e877f088","a7e10a8ad6536dd0225029e46108b18cee0d3c15c2f6e49bd62798ad85bc57b6","8db1ed144dd2304b9bd6e41211e22bad5f4ab1d8006e6ac127b29599f4b36083","843a5e3737f2abbbbd43bf2014b70f1c69a80530814a27ae1f8be213ae9ec222","6fc1be224ad6b3f3ec11535820def2d21636a47205c2c9de32238ba1ac8d82e6","5a44788293f9165116c9c183be66cefef0dc5d718782a04847de53bf664f3cc1","afd653ae63ce07075b018ba5ce8f4e977b6055c81cc65998410b904b94003c0a","9172155acfeb17b9d75f65b84f36cb3eb0ff3cd763db3f0d1ad5f6d10d55662f","71807b208e5f15feffb3ff530bec5b46b1217af0d8cc96dde00d549353bcb864","1a6eca5c2bc446481046c01a54553c3ffb856f81607a074f9f0256c59dd0ab13","dff93e0997c4e64ff29e9f70cad172c0b438c4f58c119f17a51c94d48164475a","fd1ddf926b323dfa439be49c1d41bbe233fe5656975a11183aeb3bf2addfa3bb","6dda11db28da6bcc7ff09242cd1866bdddd0ae91e2db3bea03ba66112399641a","ea4cd1e72af1aa49cf208b9cb4caf542437beb7a7a5b522f50a5f1b7480362ed","903a7d68a222d94da11a5a89449fdd5dd75d83cd95af34c0242e10b85ec33a93","e7fe2e7ed5c3a7beff60361632be19a8943e53466b7dd69c34f89faf473206d7","b4896cee83379e159f83021e262223354db79e439092e485611163e2082224ff","5243e79a643e41d9653011d6c66e95048fc0478eb8593dc079b70877a2e3990e",{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true},{"version":"ab41ef1f2cdafb8df48be20cd969d875602483859dc194e9c97c8a576892c052","affectsGlobalScope":true},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true},"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a",{"version":"1456e80bd8a3870034d89f91bd7df12ac29acfb083e31c0bb1fb38ca7bf5fbc2","affectsGlobalScope":true},{"version":"a98aedd64ad81793f146d36d1611ed9ba61b8b49ff040f0d13a103ed626595d9","affectsGlobalScope":true},{"version":"6d9ef24f9a22a88e3e9b3b3d8c40ab1ddb0853f1bfbd5c843c37800138437b61","affectsGlobalScope":true},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true},"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107",{"version":"b52476feb4a0cbcb25e5931b930fc73cb6643fb1a5060bf8a3dda0eeae5b4b68","affectsGlobalScope":true},"e2677634fe27e87348825bb041651e22d50a613e2fdf6a4a3ade971d71bac37e","7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","8c0bcd6c6b67b4b503c11e91a1fb91522ed585900eab2ab1f61bba7d7caa9d6f",{"version":"8cd19276b6590b3ebbeeb030ac271871b9ed0afc3074ac88a94ed2449174b776","affectsGlobalScope":true},"696eb8d28f5949b87d894b26dc97318ef944c794a9a4e4f62360cd1d1958014b","3f8fa3061bd7402970b399300880d55257953ee6d3cd408722cb9ac20126460c",{"version":"35ec8b6760fd7138bbf5809b84551e31028fb2ba7b6dc91d95d098bf212ca8b4","affectsGlobalScope":true},"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a",{"version":"68bd56c92c2bd7d2339457eb84d63e7de3bd56a69b25f3576e1568d21a162398","affectsGlobalScope":true},"3e93b123f7c2944969d291b35fed2af79a6e9e27fdd5faa99748a51c07c02d28","9d19808c8c291a9010a6c788e8532a2da70f811adb431c97520803e0ec649991","87aad3dd9752067dc875cfaa466fc44246451c0c560b820796bdd528e29bef40","4aacb0dd020eeaef65426153686cc639a78ec2885dc72ad220be1d25f1a439df","f0bd7e6d931657b59605c44112eaf8b980ba7f957a5051ed21cb93d978cf2f45",{"version":"8db0ae9cb14d9955b14c214f34dae1b9ef2baee2fe4ce794a4cd3ac2531e3255","affectsGlobalScope":true},"15fc6f7512c86810273af28f224251a5a879e4261b4d4c7e532abfbfc3983134","58adba1a8ab2d10b54dc1dced4e41f4e7c9772cbbac40939c0dc8ce2cdb1d442","641942a78f9063caa5d6b777c99304b7d1dc7328076038c6d94d8a0b81fc95c1","092c1137e31de289f3cc6a57fdccb3cca298d8a680d1e367d206d3318f1394a1","855cd5f7eb396f5f1ab1bc0f8580339bff77b68a770f84c6b254e319bbfd1ac7","5650cf3dace09e7c25d384e3e6b818b938f68f4e8de96f52d9c5a1b3db068e86",{"version":"1354ca5c38bd3fd3836a68e0f7c9f91f172582ba30ab15bb8c075891b91502b7","affectsGlobalScope":true},"7e20d899c28ca26a2a7afc98beaa69e63ff7fba0a8bc47b4e3bf3ede5e09e424","2d2fcaab481b31a5882065c7951255703ddbe1c0e507af56ea42d79ac3911201","a192fe8ec33f75edbc8d8f3ed79f768dfae11ff5735e7fe52bfa69956e46d78d",{"version":"ca867399f7db82df981d6915bcbb2d81131d7d1ef683bc782b59f71dda59bc85","affectsGlobalScope":true},{"version":"372413016d17d804e1d139418aca0c68e47a83fb6669490857f4b318de8cccb3","affectsGlobalScope":true},"9e043a1bc8fbf2a255bccf9bf27e0f1caf916c3b0518ea34aa72357c0afd42ec","b4f70ec656a11d570e1a9edce07d118cd58d9760239e2ece99306ee9dfe61d02","3bc2f1e2c95c04048212c569ed38e338873f6a8593930cf5a7ef24ffb38fc3b6","6e70e9570e98aae2b825b533aa6292b6abd542e8d9f6e9475e88e1d7ba17c866","f9d9d753d430ed050dc1bf2667a1bab711ccbb1c1507183d794cc195a5b085cc","9eece5e586312581ccd106d4853e861aaaa1a39f8e3ea672b8c3847eedd12f6e","085f552d005479e2e6a7311cdbbe5d8c55c497b4d19274285df161ee9684cd9c","37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","45650f47bfb376c8a8ed39d4bcda5902ab899a3150029684ee4c10676d9fbaee",{"version":"007faacc9268357caa21d24169f3f3f2497af3e9241308df2d89f6e6d9bb3f2e","affectsGlobalScope":true},"74cf591a0f63db318651e0e04cb55f8791385f86e987a67fd4d2eaab8191f730","5eab9b3dc9b34f185417342436ec3f106898da5f4801992d8ff38ab3aff346b5",{"version":"12ed4559eba17cd977aa0db658d25c4047067444b51acfdcbf38470630642b23","affectsGlobalScope":true},"f3ffabc95802521e1e4bcba4c88d8615176dc6e09111d920c7a213bdda6e1d65","809821b8a065e3234a55b3a9d7846231ed18d66dd749f2494c66288d890daf7f","ae56f65caf3be91108707bd8dfbccc2a57a91feb5daabf7165a06a945545ed26","a136d5de521da20f31631a0a96bf712370779d1c05b7015d7019a9b2a0446ca9",{"version":"c3b41e74b9a84b88b1dca61ec39eee25c0dbc8e7d519ba11bb070918cfacf656","affectsGlobalScope":true},{"version":"4737a9dc24d0e68b734e6cfbcea0c15a2cfafeb493485e27905f7856988c6b29","affectsGlobalScope":true},"36d8d3e7506b631c9582c251a2c0b8a28855af3f76719b12b534c6edf952748d","1ca69210cc42729e7ca97d3a9ad48f2e9cb0042bada4075b588ae5387debd318","f5ebe66baaf7c552cfa59d75f2bfba679f329204847db3cec385acda245e574e",{"version":"ed59add13139f84da271cafd32e2171876b0a0af2f798d0c663e8eeb867732cf","affectsGlobalScope":true},"b7c5e2ea4a9749097c347454805e933844ed207b6eefec6b7cfd418b5f5f7b28","0ea329e5eab6719ff83bcb97e8bd03f1faab4feb74704010783b881fc9d80f92","76e7352249c42b9d54fe1f9e1ebcef777da1cb2eb33038366af49469d433597b","88cb622dd0ec1ef860e5c27fa884e60d2eba5ae22c7907dff82c56a69bdd2c8a","eb234b3e285e8bc071bdddc1ec0460095e13ead6222d44b02c4e0869522f9ba3","c85114872760189e50fef131944427b0fb367f0cc0b6dce164bb427a6fd89381","5ad69b0d7e7bdbcd3adfdb6a3e306e935c9c2711b1c60493646504a2f991346e","a12a667efdeb03b529bd4ebb4032998ddd32743799f59f9f18b186f8e63a2cf1","cee7efa0ae4c58deab218d1df0d1bf84abfd5c356cff28bca1421489cba13a19","f9e034b1ae29825c00532e08ea852b0c72885c343ee48d2975db0a6481218ab3","1193f49cbb883f40326461fe379e58ffa4c18d15bf6d6a1974ad2894e4fb20f3","8f1241f5d9f0d3d72117768b3c974e462840fbd85026fb66685078945404cf2f","21247c958d397091ec30e63b27294baa1d1434c333da4fda697743190311dc62","fa380c9f488a5ca23fd80abc7049c47218bb9db53823d4a9d07d11afbda49d33","d5eb5865d4cbaa9985cc3cfb920b230cdcf3363f1e70903a08dc4baab80b0ce1","51ebca098538b252953b1ef83c165f25b52271bfb6049cd09d197dddd4cd43c5","092fb7b72bf76e2bd33dbe21228a3613df5c21383dfe961629672135c86c9508","9223a0889abb0669020e94a9b8c1e68274cdc05533c1f79d84fe516450e94ebd","fb893a0dfc3c9fb0f9ca93d0648694dd95f33cbad2c0f2c629f842981dfd4e2e","95da3c365e3d45709ad6e0b4daa5cdaf05e9076ba3c201e8f8081dd282c02f57","7245fa556a63e4c5997642422fe4250df16a56694cc1a1f50108dc80fe3018ba","7c14e702387296711c1a829bc95052ff02f533d4aa27d53cc0186c795094a3a9","4c72d080623b3dcd8ebd41f38f7ac7804475510449d074ca9044a1cbe95517ae","579f8828da42ae02db6915a0223d23b0da07157ff484fecdbf8a96fffa0fa4df","5f6beb8c43a52e9119cf31a7583ceca88dc910d7de29caad1f81e98497f808ba","3ae3b86c48ae3b092e5d5548acbf4416b427fed498730c227180b5b1a8aa86e3","8f1241f5d9f0d3d72117768b3c974e462840fbd85026fb66685078945404cf2f","ba63131c5e91f797736444933af16ffa42f9f8c150d859ec65f568f037a416ea","44372b8b42e8916b0ab379da38dcf4de11227bad4221aba3e2dbe718999bdfab","43ebfcc5a9e9a9306ea4de9fda3abdd9e018040e246434b48ad56d93b14d4a3d","0e9aa853b5eb2ca09e0e3e3eb94cbd1d5fb3d682ab69817d4d11fe225953fc57","179683df1e78572988152d598f44297da79ac302545770710bba87563ce53e06","793c353144f16601da994fa4e62c09b7525836ce999c44f69c28929072ca206a","d34aa8df2d0b18fb56b1d772ff9b3c7aea7256cf0d692f969be6e1d27b74d660","93a3b8e57c68e348fc4054b245bd7cf4893225f56c991028844b693c2fa8c03c","2f5747b1508ccf83fad0c251ba1e5da2f5a30b78b09ffa1cfaf633045160afed",{"version":"6823ccc7b5b77bbf898d878dbcad18aa45e0fa96bdd0abd0de98d514845d9ed9","affectsGlobalScope":true},"b71c603a539078a5e3a039b20f2b0a0d1708967530cf97dec8850a9ca45baa2b","168d88e14e0d81fe170e0dadd38ae9d217476c11435ea640ddb9b7382bdb6c1f","104c67f0da1bdf0d94865419247e20eded83ce7f9911a1aa75fc675c077ca66e","cc0d0b339f31ce0ab3b7a5b714d8e578ce698f1e13d7f8c60bfb766baeb1d35c","8e04cf0688e0d921111659c2b55851957017148fa7b977b02727477d155b3c47",{"version":"ff155930718467b27e379e4a195e4607ce277f805cad9d2fa5f4fd5dec224df6","affectsGlobalScope":true},"599ac4a84b7aa6a298731179ec1663a623ff8ac324cdc1dabb9c73c1259dc854","95c2ab3597d7d38e990bf212231a6def6f6af7e3d12b3bb1b67c15fc8bfd4f4a","585bc61f439c027640754dd26e480afa202f33e51db41ee283311a59c12c62e7","8f1241f5d9f0d3d72117768b3c974e462840fbd85026fb66685078945404cf2f","6ecc423e71318bafbd230e6059e082c377170dfc7e02fccfa600586f8604d452","772f9bdd2bf50c9c01b0506001545e9b878faa7394ad6e7d90b49b179a024584","90ba1a0bd84ecbe63ee17e31afe021e24bc7f002ee66eb69579819ddd0a6d1b0","df251aa7a87b6d003a45ad1f71b87ff4448e535db473cb3c897720012b5553d2","20ccce97c422c215a41f0aa8373eb2b6f4068633ceef401c5f743cecdf8119bf","cd1ccdd9fd7980d43dfede5d42ee3d18064baed98b136089cf7c8221d562f058","d60f9a4fd1e734e7b79517f02622426ea1000deb7d6549dfdece043353691a4e","ec05ccc3a2e35ef2800a5b5ed2eb2ad4cd004955447bebd86883ddf49625b400","403d28b5e5f8fcff795ac038902033ec5890143e950af45bd91a3ed231e8b59c","c73b59f91088c00886d44ca296d53a75c263c3bda31e3b2f37ceb137382282be","e7aa2c584edb0970cb4bb01eb10344200286055f9a22bc3dadcc5a1f9199af3e","bfeb476eb0049185cb94c2bfcadb3ce1190554bbcf170d2bf7c68ed9bb00458e","ae23a65a2b664ffe979b0a2a98842e10bdf3af67a356f14bbc9d77eb3ab13585","2db00053dff66774bc4216209acf094dd70d9dfd8211e409fc4bd8d10f7f66f6","eccf6ad2a8624329653896e8dbd03f30756cbd902a81b5d3942d6cf0e1a21575","1930c964051c04b4b5475702613cd5a27fcc2d33057aa946ff52bfca990dbc84","762992adfa3fbf42c0bce86caed3dc185786855b21a20265089770485e6aa9d3","8a440978a6b5c6e6ea76a2804a90c06cadbefb96f6680785d8d3bfab8c8875d8","62463aa3d299ae0cdc5473d2ac32213a05753c3adce87a8801c6d2b114a64116","05a0d93bb8653bb3833c1c22e3fa5432c38885b2e545e99524e67e25e5ce355c","bd3e38cbf8108b661c591dcd03290d5cf2f2a8a1c74b045ba6b6bf4118b0a967","40abfc1faa2971acedb69bde8d8c4bbd4edce4af12f786e747dfb8298e6a05a1","02153ce9d452d116e9b7bfe42058c02c4cac09f49c46450820b4b44c83306a3e","f689c0633e8c95f550d36af943d775f3fae3dac81a28714b45c7af0bbb76a980","34be0f820d16a54625b86ab6d7b7928dbb819b58ddac181aa3836390c8c3df24","0495afa06118083a11cd4da27acfd96a01b989aff0fc633823c5febe9668ef15","67feb4436be89f58ba899dec57f6e703bee1bb7205ba21ab50fca237f6753787","75849f5ead7684bf85ee9cce7e84683ed4332fa187f8ee0978ba9df96c5cee06","b5325ff5c9dc488bb9c87711faf2b73f639c45f190b81df88ed056807206958b","cc4f5179acd0a8efad722a44c4621d0da29169e03d78a452a27f73e1e7f27985","a743cf98667fdbb6989d9a7629d25a9824a484ce639bbf2740dc809341e6dbce","d73a2cbf1893668c1fc0b41878a9df37bbb128cb05e292b845f68b7b88ef9957","1f64f5cd141571d53606fc5a7f8bb2b869b4cd40c964188e856bcfe5000a9037","eb89de249984a951578b5fa472d0414cd10cd7d35777aa1c7c308dfe2b0b49d6","a7af5e8b12f757ae7b9e79c95e8494cc1d6ccdb7b298c6766bb1f9dd82fa21cf","7b36f5bce24167f089e4d3601e5fde14f0a233e1a0954df5ec56ae07f36e2219","5e168f60c9132665853ccba13a29e4d311ac174c0fd3eda5cee7a6c5071802d6","1c225a18846203fafc4334658715b0d3fd3ee842c4cfd42e628a535eda17730d","7ce93da38595d1caf57452d57e0733474564c2b290459d34f6e9dcf66e2d8beb","d7b672c1c583e9e34ff6df2549d6a55d7ca3adaf72e6a05081ea9ee625dac59f","f3a2902e84ebdef6525ed6bf116387a1256ea9ae8eeb36c22f070b7c9ea4cf09","788e6ec863183b001b1e96d54f876c9d5436fa3aa19397093912dcdae466caf7","ae3e98448468e46474d817b5ebe74db11ab22c2feb60e292d96ce1a4ee963623","f5c67304429e2e2554f63526e842f47bd9ee0cb0f18becc963b93b2d3fafe9c2","8903c1df475f531bf787bc795c718e415ce9974536d8429619fdc456f5329948","7beb7f04f6186bdac5e622d44e4cac38d9f2b9fcad984b10d3762e369524dd77","07fcc9be98e12bd2f0f71a501a9bfbe2e53d38c50e8a5e84223fdd05bd8749c5","8c724ec27deda8f7ecdca0f22d9bb8c97a4507500ec645f49dea9c73184c2512","9154e3f91f77ebb31dff1b545f5a638053b7c98b5d4820f47a94cb6af6f374cd","cb5eaaa2a079305b1c5344af739b29c479746f7a7aefffc7175d23d8b7c8dbb0","bd324dccada40f2c94aaa1ebc82b11ce3927b7a2fe74a5ab92b431d495a86e6f","56749bf8b557c4c76181b2fd87e41bde2b67843303ae2eabb299623897d704d6","5a6fbec8c8e62c37e9685a91a6ef0f6ecaddb1ee90f7b2c2b71b454b40a0d9a6","e7435f2f56c50688250f3b6ef99d8f3a1443f4e3d65b4526dfb31dfd4ba532f8","51a674644ed5a181ec1497c1b4aa6f8cfcbe3af5481bdb641c1b5a498bcb6f3c","33b7f4106cf45ae7ccbb95acd551e9a5cd3c27f598d48216bda84213b8ae0c7e","176d6f604b228f727afb8e96fd6ff78c7ca38102e07acfb86a0034d8f8a2064a","1b1a02c54361b8c222392054648a2137fc5983ad5680134a653b1d9f655fe43d","8bcb884d06860a129dbffa3500d51116d9d1040bb3bf1c9762eb2f1e7fd5c85c","e55c0f31407e1e4eee10994001a4f570e1817897a707655f0bbe4d4a66920e9e","a37c2194c586faa8979f50a5c5ca165b0903d31ee62a9fe65e4494aa099712c0","6602339ddc9cd7e54261bda0e70fb356d9cdc10e3ec7feb5fa28982f8a4d9e34","7ffaa736b8a04b0b8af66092da536f71ef13a5ef0428c7711f32b94b68f7c8c8","7b4930d666bbe5d10a19fcc8f60cfa392d3ad3383b7f61e979881d2c251bc895","46342f04405a2be3fbfb5e38fe3411325769f14482b8cd48077f2d14b64abcfb","8fa675c4f44e6020328cf85fdf25419300f35d591b4f56f56e00f9d52b6fbb3b","ba98f23160cfa6b47ee8072b8f54201f21a1ee9addc2ef461ebadf559fe5c43a","45a4591b53459e21217dc9803367a651e5a1c30358a015f27de0b3e719db816b","9ef22bee37885193b9fae7f4cad9502542c12c7fe16afe61e826cdd822643d84","b0451895b894c102eed19d50bd5fcb3afd116097f77a7d83625624fafcca8939","bce17120b679ff4f1be70f5fe5c56044e07ed45f1e555db6486c6ded8e1da1c8","7590477bfa2e309e677ff7f31cb466f377fcd0e10a72950439c3203175309958","3f9ebd554335d2c4c4e7dc67af342d37dc8f2938afa64605d8a93236022cc8a5","1c077c9f6c0bc02a36207994a6e92a8fbf72d017c4567f640b52bf32984d2392","600b42323925b32902b17563654405968aa12ee39e665f83987b7759224cc317","32c8f85f6b4e145537dfe61b94ddd98b47dbdd1d37dc4b7042a8d969cd63a1aa","2426ed0e9982c3d734a6896b697adf5ae93d634b73eb15b48da8106634f6d911","057431f69d565fb44c246f9f64eac09cf309a9af7afb97e588ebef19cc33c779","960d026ca8bf27a8f7a3920ee50438b50ec913d635aa92542ca07558f9c59eca","71f5d895cc1a8a935c40c070d3d0fade53ae7e303fd76f443b8b541dee19a90c","252eb4750d0439d1674ad0dc30d2a2a3e4655e08ad9e58a7e236b21e78d1d540","e344b4a389bb2dfa98f144f3f195387a02b6bdb69deed4a96d16cc283c567778","c6cdcd12d577032b84eed1de4d2de2ae343463701a25961b202cff93989439fb","3dc633586d48fcd04a4f8acdbf7631b8e4a334632f252d5707e04b299069721e","3322858f01c0349ee7968a5ce93a1ca0c154c4692aa8f1721dc5192a9191a168","6dde0a77adad4173a49e6de4edd6ef70f5598cbebb5c80d76c111943854636ca","09acacae732e3cc67a6415026cfae979ebe900905500147a629837b790a366b3","f7b622759e094a3c2e19640e0cb233b21810d2762b3e894ef7f415334125eb22","99236ea5c4c583082975823fd19bcce6a44963c5c894e20384bc72e7eccf9b03","f6688a02946a3f7490aa9e26d76d1c97a388e42e77388cbab010b69982c86e9e","9f642953aba68babd23de41de85d4e97f0c39ef074cb8ab8aa7d55237f62aff6","159d95163a0ed369175ae7838fa21a9e9e703de5fdb0f978721293dd403d9f4a","2d2ec3235e01474f45a68f28cf826c2f5228b79f7d474d12ca3604cdcfdac80c","6dd249868034c0434e170ba6e0451d67a0c98e5a74fd57a7999174ee22a0fa7b","9716553c72caf4ff992be810e650707924ec6962f6812bd3fbdb9ac3544fd38f","506bc8f4d2d639bebb120e18d3752ddeee11321fd1070ad2ce05612753c628d6","053c51bbc32db54be396654ab5ecd03a66118d64102ac9e22e950059bc862a5e","1977f62a560f3b0fc824281fd027a97ce06c4b2d47b408f3a439c29f1e9f7e10","627570f2487bd8d899dd4f36ecb20fe0eb2f8c379eff297e24caba0c985a6c43","0f6e0b1a1deb1ab297103955c8cd3797d18f0f7f7d30048ae73ba7c9fb5a1d89","0a051f254f9a16cdde942571baab358018386830fed9bdfff42478e38ba641ce","17269f8dfc30c4846ab7d8b5d3c97ac76f50f33de96f996b9bf974d817ed025b","9e82194af3a7d314ccbc64bb94bfb62f4bfea047db3422a7f6c5caf2d06540a9","083d6f3547ccbf25dfa37b950c50bee6691ed5c42107f038cc324dbca1e173ae","952a9eab21103b79b7a6cca8ad970c3872883aa71273f540285cad360c35da40","8ba48776335db39e0329018c04486907069f3d7ee06ce8b1a6134b7d745271cc","e6d5809e52ed7ef1860d1c483e005d1f71bab36772ef0fd80d5df6db1da0e815","893e5cfbae9ed690b75b8b2118b140665e08d182ed8531e1363ec050905e6cb2","6ae7c7ada66314a0c3acfbf6f6edf379a12106d8d6a1a15bd35bd803908f2c31","e4b1e912737472765e6d2264b8721995f86a463a1225f5e2a27f783ecc013a7b","97146bbe9e6b1aab070510a45976faaf37724c747a42d08563aeae7ba0334b4f","c40d552bd2a4644b0617ec2f0f1c58618a25d098d2d4aa7c65fb446f3c305b54","09e64dea2925f3a0ef972d7c11e7fa75fec4c0824e9383db23eacf17b368532f","424ddba00938bb9ae68138f1d03c669f43556fc3e9448ed676866c864ca3f1d6","a0fe12181346c8404aab9d9a938360133b770a0c08b75a2fce967d77ca4b543f","3cc6eb7935ff45d7628b93bb6aaf1a32e8cb3b24287f9e75694b607484b377b3","ced02e78a2e10f89f4d70440d0a8de952a5946623519c54747bc84214d644bac","efd463021ccc91579ed8ae62584176baab2cd407c555c69214152480531a2072","29647c3b79320cfeecb5862e1f79220e059b26db2be52ea256df9cf9203fb401","c87c29ad2df837f7bc528688d96793758e0c4b1965f5ca520a8c287999565f66","e8cdefd2dc293cb4866ee8f04368e7001884650bb0f43357c4fe044cc2e1674f","582a3578ebba9238eb0c5d30b4d231356d3e8116fea497119920208fb48ccf85","185eae4a1e8a54e38f36cd6681cfa54c975a2fc3bc2ba6a39bf8163fac85188d","0c0a02625cf59a0c7be595ccc270904042bea523518299b754c705f76d2a6919","f2c999522aa544d93920205e05e11a5d43332f95ec35bd8a17025a823035bc56","cee72255e129896f0240ceb58c22e207b83d2cc81d8446190d1b4ef9b507ccd6","3b54670e11a8d3512f87e46645aa9c83ae93afead4a302299a192ac5458aa586","c2fc4d3a130e9dc0e40f7e7d192ef2494a39c37da88b5454c8adf143623e5979","2e693158fc1eedba3a5766e032d3620c0e9c8ad0418e4769be8a0f103fdb52cd","516275ccf3e66dc391533afd4d326c44dd750345b68bb573fc592e4e4b74545f","07c342622568693847f6cb898679402dd19740f815fd43bec996daf24a1e2b85","fa40d705f9813843d47f19321591499f14d1a18fa5e8ca9beaee5aac633c3d0d","a7a6330fb015f72d821e23004e63a3827e0c632b614ef3a310b3c81b66de61fd","89968316b7069339433bd42d53fe56df98b6990783dfe00c9513fb4bd01c2a1c","a4096686f982f6977433ee9759ecbef49da29d7e6a5d8278f0fbc7b9f70fce12","62e62a477c56cda719013606616dd856cfdc37c60448d0feb53654860d3113bb","207c107dd2bd23fa9febac2fe05c7c72cdac02c3f57003ab2e1c6794a6db0c05","55133e906c4ddabecdfcbc6a2efd4536a3ac47a8fa0a3fe6d0b918cac882e0d4","2147f8d114cf58c05106c3dccea9924d069c69508b5980ed4011d2b648af2ffe","2eb4012a758b9a7ba9121951d7c4b9f103fe2fc626f13bec3e29037bb9420dc6","fe61f001bd4bd0a374daa75a2ba6d1bb12c849060a607593a3d9a44e6b1df590","cfe8221c909ad721b3da6080570553dea2f0e729afbdbcf2c141252cf22f39b5","34e89249b6d840032b9acdec61d136877f84f2cd3e3980355b8a18f119809956","6f36ff8f8a898184277e7c6e3bf6126f91c7a8b6a841f5b5e6cb415cfc34820e","4b6378c9b1b3a2521316c96f5c777e32a1b14d05b034ccd223499e26de8a379c","07be5ae9bf5a51f3d98ffcfacf7de2fe4842a7e5016f741e9fad165bb929be93","cb1b37eda1afc730d2909a0f62cac4a256276d5e62fea36db1473981a5a65ab1","c873a6d6019f0b93889e54bf3dfb133120d5adba79c0a31d2400d1b5d0f2a2a2","471386a0a7e4eb88c260bdde4c627e634a772bf22f830c4ec1dad823154fd6f5","108314a60f3cb2454f2d889c1fb8b3826795399e5d92e87b2918f14d70c01e69","d75cc838286d6b1260f0968557cd5f28495d7341c02ac93989fb5096deddfb47","d531dc11bb3a8a577bd9ff83e12638098bfc9e0856b25852b91aac70b0887f2a","19968b998a2ab7dfd39de0c942fc738b2b610895843fec25477bc393687babd8","c0e6319f0839d76beed6e37b45ec4bb80b394d836db308ae9db4dea0fe8a9297","1a7b11be5c442dab3f4af9faf20402798fddf1d3c904f7b310f05d91423ba870","079d3f1ddcaf6c0ff28cfc7851b0ce79fcd694b3590afa6b8efa6d1656216924","2c817fa37b3d2aa72f01ce4d3f93413a7fbdecafe1b9fb7bd7baaa1bbd46eb08","682203aed293a0986cc2fccc6321d862742b48d7359118ac8f36b290d28920d2","7406d75a4761b34ce126f099eafe6643b929522e9696e5db5043f4e5c74a9e40","7e9c4e62351e3af1e5e49e88ebb1384467c9cd7a03c132a3b96842ccdc8045c4","ea1f9c60a912065c08e0876bd9500e8fa194738855effb4c7962f1bfb9b1da86","903f34c920e699dacbc483780b45d1f1edcb1ebf4b585a999ece78e403bb2db3","100ebfd0470433805c43be5ae377b7a15f56b5d7181c314c21789c4fe9789595","12533f60d36d03d3cf48d91dc0b1d585f530e4c9818a4d695f672f2901a74a86","57b555a83466fb289968a1713f965f1a2bb3a91cc34d1fa21af8ebdef7fc872a","21d9968dad7a7f021080167d874b718197a60535418e240389d0b651dd8110e7","2ef7349b243bce723d67901991d5ad0dfc534da994af61c7c172a99ff599e135","fa103f65225a4b42576ae02d17604b02330aea35b8aaf889a8423d38c18fa253","1b9173f64a1eaee88fa0c66ab4af8474e3c9741e0b0bd1d83bfca6f0574b6025","1b212f0159d984162b3e567678e377f522d7bee4d02ada1cc770549c51087170","46bd71615bdf9bfa8499b9cfce52da03507f7140c93866805d04155fa19caa1b","86cb49eb242fe19c5572f58624354ffb8743ff0f4522428ebcabc9d54a837c73","fc2fb9f11e930479d03430ee5b6588c3788695372b0ab42599f3ec7e78c0f6d5","bb1e5cf70d99c277c9f1fe7a216b527dd6bd2f26b307a8ab65d24248fb3319f5","817547eacf93922e22570ba411f23e9164544dead83e379c7ae9c1cfc700c2cf","a728478cb11ab09a46e664c0782610d7dd5c9db3f9a249f002c92918ca0308f7","9e91ef9c3e057d6d9df8bcbfbba0207e83ef9ab98aa302cf9223e81e32fdfe8d","66d30ef7f307f95b3f9c4f97e6c1a5e4c462703de03f2f81aca8a1a2f8739dbd","293ca178fd6c23ed33050052c6544c9d630f9d3b11d42c36aa86218472129243","90a4be0e17ba5824558c38c93894e7f480b3adf5edd1fe04877ab56c56111595","fadd55cddab059940934df39ce2689d37110cfe37cc6775f06b0e8decf3092d7","adb906b7794a71185220332532dcbdd09527e0dd3ce9f0b9be0a88c56bbb7e9e","b4f3b4e20e2193179481ab325b8bd0871b986e1e8a8ed2961ce020c2dba7c02d","41744c67366a0482db029a21f0df4b52cd6f1c85cbc426b981b83b378ccb6e65","c3f3cf7561dd31867635c22f3c47c8491af4cfa3758c53e822a136828fc24e5d","a88ddea30fae38aa071a43b43205312dc5ff86f9e21d85ba26b14690dc19d95e","34fc71db924616ba097a0cb6cddc2ece273a27673dd3b206abf3f3b5d63bcace","5515f17f45c6aafe6459afa3318bba040cb466a8d91617041566808a5fd77a44","4df1f0c17953b0450aa988c9930061f8861b114e1649e1a16cfd70c5cbdf8d83","441104b363d80fe57eb79a50d495e0b7e3ebeb45a5f0d1a4067d71ef75e8fbfa","b71a8e7225095bf384e6fbdcf57e5f9b1cad422a1d9e9dcecb9d308843c25357","373a3894ce2f1dbd09d7e5ece04a0e42fadfca54bedf908425ef8c2ffa4a3879","03c92769f389dbd9e45232f7eb01c3e0f482b62555aaf2029dcbf380d5cee9e4","32d7f70fd3498bc76a46dab8b03af4215f445f490f8e213c80cf06b636a4e413","f068b6120f50c6fb9b1265aa7fcf7db42fd319d70ec74e817f43bbab6b26444b","716cac1898b2400e5c4e6ff72fbb229fb707156758341d67b9d91cdcf0d4cbce","a8faa8307c428acfd5eb03ef93a424deec77bb6f1f6655a8c555974681025790","598ba440ad17f226e2368eb6b3ee89a539584ffde388d747b36fb6896d403e18","19ff6e335cf5a64247219c3b159f634ee882823897844d348f02572bddca48f1","2ba544a839882f0e14565e04e1f04d73111f247e492e3634bb76fa2b583d9dec","0b42b0fb024d75aa454e152d95c371c671e7b647ef06e7d8066f7d3e3a0a8d84","cfcceb0cd08e40d81b9b6fa48f3b03485c52e64c0bca7563a1e2a141f3335680","2a586ceea6461e3fe579ace3c1198502dafa24b648db03583c23d75e331cd18e","93809637ebccee0d3f7ff9e0a8b4ad188cde2a47e0dadba3914a0cecef6205f8","01df56952126e6350c48e758b98a50d8ed7ae695dd943b61b9a90b83350f3cc5","876d7782df737132458e5f616eead4bc71c3edd28a7d00d87e41c4f17f55301a","0484338c1d8d0dc5c5f7fc63c27736e428f37fb0577e99a303d9a89796ba863a","36d554dd3e0a2517fee7830b1ce325ca8e39517613c2fddeed9be385c5931cb9","8a3cbba6da2a5d58d0ffd45e0f365fc9170e10ca039f811dea74906861a3e315","d8cbf4090abe6cdb87ea5c9d35323e07f5cefbe5e5fc7b3f5c2dd77889593926","7445f9b9501b68a85eee2042e52887bd0a7a06939ea3d7ce498faf431d12fd0a",{"version":"f0016f3b5ef9e7ea68fb0f4ade5d3cce6aafb7cad3f3ac193707884bd0582d59","signature":"55004a0335256d88a2fe8720282f9a8f39157839d5553804e11f868add44902a"},{"version":"174684157eb73e5e12f68736070cfc27e013d8b5841f0c008c74d15862d7a853","signature":"2f2da0e0baf217d324480bb7cd6bdefc449278e79cc51b3a8103d3df673f1ed8"},{"version":"62ea13a8daea2571d95986c4572b2fea9728bc4914faea0193d40d69e0d90255","signature":"45bda081794eb85998712ebbbdbb5ed73c700e12f306a751d40911fa1b745a4f"},{"version":"04d1ca7b98548e4b19d6fee8d1fcbd7ef91839d965d9fc8ce0a66b1c79960d00","signature":"8226f2a0394eb27fe9b925074d4a79023edb5562078ba87015a4ab104b7bc2cf"},{"version":"9e9a8d554d919f79003cbf25df6bd970009825dbd1db97aeb539619a0ad61c21","signature":"26523ec62adebb8062362c1797ba66b96838534454ee81e85ae80bfe77432ddd"},{"version":"741471570b9d8ccf181ac3f483b19bcc41276248d6ea60ae721820e0d5997834","signature":"e0a7b9d2324fac96bea82803d9597210417bbc7b9f36c88f1f81462fb49b556e"},{"version":"b89d70e65134623d60b8663e21865626a910c54cd6745d975662b92581bbc347","signature":"b1127a8a1c4e3c7ba65ea8c23b68ca3d8c5689e74718628da1683799d8aa9d8e"},{"version":"84a0f05f65979c72c576db6a88e0579a550536b28683e63958020c69cb57fe2c","signature":"850e8b256bc11d8892bdca031939ea3a4ce366e8e77c871c4dcd09df4ceff174"},{"version":"9a787908f18851dc6b0278d69852021a0c14231c7a342fc994790a1bd7217a79","signature":"e3549fedd3bd4a700c34070961a0c45dd17e17cd11a670d4574cf430acfa66bd"},{"version":"72597827bfa455013e3c1fdf70e15eee34c3606eab92384cc8c12d83ce77cc83","signature":"62e47d105ca68f33e01fec4c226f0b9843fdf57262c006cdc27dc64e4b72326b"},{"version":"220918aceed5898dce7128ca6d8c18d59c38bac51f39ebcf8a0dfa5252ac50c6","signature":"a3684909b502d2414d94ce06228f5d6dae72b658eac3f386843965e540b51834"},{"version":"6e20d61e8ecdcdadc4023f7bd49ad9a17de64fbb890c4ac4f8c3ced3726e98a3","signature":"43449e87f23dae0d9f076eaa078da7ede19b302890d26195c9105aa587aeb9cc"},"83eff0429e51968c6483b1002b723404a3a01a52714cb4c55f4ddc510ae65193","e974a0d721dcecde2b3f2efa8d668932617753174f2ed1527492c58a663989a4",{"version":"6a5ca12b8ec2b288b67f63024a97a2386fa115b621dbe00bb4596c2e05bd0ace","signature":"2daa7cb01a0ca60f4523f40064707ac4eb2a84c679c46a3cee556392e4284b58"},{"version":"8de8dfa96ee221640757fa8b42fe3509090c10cdba982c59647ddd3aae075c81","signature":"23813d1d009a104ef491115df320d9362101d9992fc8e7e4e945e77101a5327c"},"a2cf6bf3849dcadca8d828c5852dd502ecb7bda1f39f373d513fa7da4553c17f",{"version":"d0c769a07d8c043377e092621d36a1cae33a794c19f9c93fb786ff5677113cc7","signature":"2590cfaa0eb2e19e4c60f0026506fabc38bd50fbb4fb81d4a594b4df45627020"},{"version":"9a8ec8c1e667ecd497a9545b7d87a822b804de9d2d99c95c57aed71b8b908a0d","signature":"631b8f21adb1e305dbcfd404ab662b353f3af6594ddeed316a5106dbefefee21"},"37e968d1c2fc3234694c8e7f79eb69d7dd8ddda35a61d400475b06fad7f3b283",{"version":"96f0c8496d1a25075eedc1d1c037d2e188ba47bc4f6eb3ef19d38dffce3d7460","signature":"65b71509ffd05da807f6d144ce01ea408fc5cb68a082cec66ce1e58e456cdd4a"},{"version":"8695d951cdfe441b1c4bdeb784ebce7f1c70986a381a7982b0c3545e5181d531","signature":"4cb17d629e7bb0df751ae3e10d78a23d59ea51fc7c02044f9a003ba6f36fedf7"},"590278334523ef558e1256702b64ac5c5e0641d89181433e7dbf97991025056b","c96d0eb50e04702732ced0d112976a71d0874f710628b2ea0450fde0eaec416d","c37536154cf62004aab9a9a790bc4c2aa855932af0c175385c3010c777427318","e36258c0478620ffcd623950d4217e98c973364aeff7a63c7399c714153c3189","182f86e4530584050ce2c75c65dd78f29f2d5c4c3b25cd2a9be92747f56618ec","502c34e73941baffb2780d775d2d6b1bc4a0ff2617a1f1362fe4a458896464cb","d863b98f05ed108b1d586a4578eee308266bbf93bed28bbb2a0608f022bbac31","345a160f257cd8075b05122331802807894a214bf560e157f661aa8ee3294bca","b25872fcb184cc3466a30b08641b0e7b04987279258442e1325419dd8966a78e","59e9b56c3814da833c989a8d95f508956b11e8bf57b2c077c3de73df5d000feb","5217205a344d52eb8a5f5c322d9d732a00de7303d4c1ad48ab1568813279b333","04de5584b953b03611eeef01ba9948607def8f64f1e7fbc840752b13b4521b52","25e5c8b73c6ad21f39e8e72f954090f30b431a993252bccea5bdad4a3d93c760","5bf595f68b7c1d46ae8385e3363c6e0d4695b6da58a84c6340489fc07ffc73f8","b87682ddc9e2c3714ca66991cdd86ff7e18cae6fd010742a93bd612a07d19697","6fd2c680287dd441936fbf38e1b191e126492589b701ea01066a70c434b9ff88","86bf2bfe29d0bc3fbc68e64c25ea6eab9bcb3c518ae941012ed75b1e87d391ae","3c74d80d1dd95437cc9bbf22d88199e7410fd85af06171327125bcf4025deae8","00b4f8b82e78f658b7e269c95d07e55d391235ce34d432764687441177ae7f64","57880096566780d72e02a5b34d8577e78cdf072bfd624452a95d65bd8f07cbe0","10ac50eaf9eb62c048efe576592b14830a757f7ea7ed28ee8deafc19c9845297","e75af112e5487476f7c427945fbd76ca46b28285586ad349a25731d196222d56","e91adad3da69c366d57067fcf234030b8a05bcf98c25a759a7a5cd22398ac201","d7d6e1974124a2dad1a1b816ba2436a95f44feeda0573d6c9fb355f590cf9086","464413fcd7e7a3e1d3f2676dc5ef4ebe211c10e3107e126d4516d79439e4e808","18f912e4672327b3dd17d70e91da6fcd79d497ba01dde9053a23e7691f56908c","2974e2f06de97e1d6e61d1462b54d7da2c03b3e8458ee4b3dc36273bc6dda990","d8c1697db4bb3234ff3f8481545284992f1516bc712421b81ee3ef3f226ae112","59b6cce93747f7eb2c0405d9f32b77874e059d9881ec8f1b65ff6c068fcce6f2","e2c3c3ca3818d610599392a9431e60ec021c5d59262ecd616538484990f6e331","e3cd60be3c4f95c43420be67eaa21637585b7c1a8129f9b39983bbd294f9513c",{"version":"95f26e134cf46f4c2aec8c70a79dcbc00c5811bdc9734bd3f3535fa63f8448c3","affectsGlobalScope":true},"b5cecde79abfbc12a401f52dc970534379853c6143b0185732bf2afabc953226","3e4562626dc4a4e09d0b5fbdd16083f89e88bd8a7a4b9e9cb964dc8231c33746","bdc82c029046f9bdf950eb160a7eb7c6cca5544acb10e31483bceb9a0de09e68","a1a16d15c55a27fe042b61b42ae2d7c4dd036540e4f84d939d21c1053ddeaea4","06156ce3bf5dff17db589dd05ceeb20efa44f44706c93155589519efdf164c67","39f467a122ae4aae0448ccee0cb92ba5b8666ec153e89cefc340ca8a5868a8e8","8237014552816cab5bba9c9748ca6121cde336be5c163a7fce9ac024f3a60658","ff3950ee52fc51775ca9fd8f758ed67d1d527f067b801fe9f53089b075b555a4","bff8fa1b781caa592b3ced4365b47be1fe7ca870525f41a6587a5c4b133bed34","c38c3ddbf9e00e2ed424a5d1672d640ba399c5ab0693ad461291db8b19c61e00","fadfd5b74a2426655ce637d122b447c996f0855534eb3fa6b5ea6f49175e86d9","561a2ef6a9a91d9ccc4e33cb3a0fc7791be650886294e919c68dbafa37da37f2","b0a6bd387dac3ff1d394916696fbb80a875abfd2017d102a8f6aa3e836687b44","096584ee9cb27de81a93c104539890a97f6840a5445e14a391d0aff65a5f09a7","f44a399fbd677f4362e25e5f100d21d1af024dffd6e8c8e682a86fd5fb087c34","51e13f0d52ce09190f29f1e2632e217764df74a0122385cf4afc47018d9c6bbe","44ba669ff1636cdce44cb3af4905fc199da74ae82a758e7591f8099c0c72f073","1662b3fe927cffed10797b7b3ec993f20d38715ec0f43409e3700087df7808b9","31be0928db408483b3347e30857ba42ac8572982df10466b6ebc67cfadaaef50","4c646cc91a5748de3907114edd83c59477063e46eac5a041c4c296896ca83c3e","8b0b6a4c032a56d5651f7dd02ba3f05fbfe4131c4095093633cda3cae0991972","192a0c215bffe5e4ac7b9ff1e90e94bf4dfdad4f0f69a5ae07fccc36435ebb87","3ef8565e3d254583cced37534f161c31e3a8f341ff005c98b582c6d8c9274538","d7e42a3800e287d2a1af8479c7dd58c8663e80a01686cb89e0068be6c777d687","1098034333d3eb3c1d974435cacba9bd5a625711453412b3a514774fec7ca748","f2388b97b898a93d5a864e85627e3af8638695ebfa6d732ecd39d382824f0e63","73a3180fe69bf6e8d61f8fbbf969a3e4c9d19e1b3570768a281d371f85aa2dec","f477375e6f0bf2a638a71d4e7a3da8885e3a03f3e5350688541d136b10b762a6","a44d6ea4dc70c3d789e9cef3cc42b79c78d17d3ce07f5fd278a7e1cbe824da56","55cd8cbc22fe648429a787e16a9cd2dc501a2aafd28c00254ad120ef68a581c0","ba4900e9d6f9795a72e8f5ca13c18861821a3fc3ae7858acb0a3366091a47afb","7778e2cc5f74ef263a880159aa7fa67254d6232e94dd03429a75597a622537a7","8e06a1ef49502a62039eeb927a1bd7561b0bce48bd423a929e2e478fd827c273","7ec3d0b061da85d6ff50c337e3248a02a72088462739d88f33b9337dba488c4f","2f554c6798b731fc39ff4e3d86aadc932fdeaa063e3cbab025623ff5653c0031","fe4613c6c0d23edc04cd8585bdd86bc7337dc6265fb52037d11ca19eeb5e5aaf","53b26fbee1a21a6403cf4625d0e501a966b9ccf735754b854366cee8984b711c","9ff247206ec5dffdfadddfded2c9d9ad5f714821bb56760be40ed89121f192f4","98c6ddd06251098b3302e7094cbc9ab54a2ea88069f5416b7d0b8daee2ff8aa2","8c59d8256086ed17676139ee43c1155673e357ab956fb9d00711a7cac73e059d","cfe88132f67aa055a3f49d59b01585fa8d890f5a66a0a13bb71973d57573eee7","53ce488a97f0b50686ade64252f60a1e491591dd7324f017b86d78239bd232ca","50fd11b764194f06977c162c37e5a70bcf0d3579bf82dd4de4eee3ac68d0f82f","e0ceb647dcdf6b27fd37e8b0406c7eafb8adfc99414837f3c9bfd28ffed6150a","99579aa074ed298e7a3d6a47e68f0cd099e92411212d5081ce88344a5b1b528d","096e4ddaa8f0aa8b0ceadd6ab13c3fab53e8a0280678c405160341332eca3cd7","415b55892d813a74be51742edd777bbced1f1417848627bf71725171b5325133","942ab34f62ac3f3d20014615b6442b6dc51815e30a878ebc390dd70e0dec63bf","7a671bf8b4ad81b8b8aea76213ca31b8a5de4ba39490fbdee249fc5ba974a622","8e07f13fb0f67e12863b096734f004e14c5ebfd34a524ed4c863c80354c25a44","9faa56e38ed5637228530065a9bab19a4dc5a326fbdd1c99e73a310cfed4fcde","7d4ad85174f559d8e6ed28a5459aebfc0a7b0872f7775ca147c551e7765e3285","d422f0c340060a53cb56d0db24dd170e31e236a808130ab106f7ab2c846f1cdb","424403ef35c4c97a7f00ea85f4a5e2f088659c731e75dbe0c546137cb64ef8d8","16900e9a60518461d7889be8efeca3fe2cbcd3f6ce6dee70fea81dfbf8990a76","6daf17b3bd9499bd0cc1733ab227267d48cd0145ed9967c983ccb8f52eb72d6e","e4177e6220d0fef2500432c723dbd2eb9a27dcb491344e6b342be58cc1379ec0","ddc62031f48165334486ad1943a1e4ed40c15c94335697cb1e1fd19a182e3102","b3f4224eb155d7d13eb377ef40baa1f158f4637aa6de6297dfeeacefd6247476","4a168e11fe0f46918721d2f6fcdb676333395736371db1c113ae30b6fde9ccd2","5b0a75a5cced0bed0d733bde2da0bbb5d8c8c83d3073444ae52df5f16aefb6ab","ef2c1585cad462bdf65f2640e7bcd75cd0dbc45bae297e75072e11fe3db017fa","ef809928a4085de826f5b0c84175a56d32dd353856f5b9866d78b8419f8ea9bc","6f6eadb32844b0ec7b322293b011316486894f110443197c4c9fbcba01b3b2fa","a51e08f41e3e948c287268a275bfe652856a10f68ddd2bf3e3aaf5b8cdb9ef85","862f7d760ef37f0ae2c17de82e5fbf336b37d5c1b0dcf39dcd5468f90a7fdd54","af48a76b75041e2b3e7bd8eed786c07f39ea896bb2ff165e27e18208d09b8bee","cb524ec077f3963e13e85747c6b53fbdf6bf407c84ca1873c6e43da1e96bee6d","deb092bc337b2cb0a1b14f3d43f56bc663e1447694e6d479d6df8296bdd452d6","041bc1c3620322cb6152183857601707ef6626e9d99f736e8780533689fb1bf9","22bd7c75de7d68e075975bf1123de5bccecfd06688afff2e2022b4c70bfc91c3","128e7c2ffd37aa29e05367400d718b0e4770cefb1e658d8783ec80a16bc0643a","076ac4f2d642c473fa7f01c8c1b7b4ef58f921130174d9cf78430651f44c43ec","396c1e5a39706999ec8cc582916e05fcb4f901631d2c192c1292e95089a494d9","89df75d28f34fc698fe261f9489125b4e5828fbd62d863bbe93373d3ed995056","8ccf5843249a042f4553a308816fe8a03aa423e55544637757d0cfa338bb5186","93b44aa4a7b27ba57d9e2bad6fb7943956de85c5cc330d2c3e30cd25b4583d44","a0c6216075f54cafdfa90412596b165ff85e2cadd319c49557cc8410f487b77c","3c359d811ec0097cba00fb2afd844b125a2ddf4cad88afaf864e88c8d3d358bd","3c0b38e8bf11bf3ab87b5116ae8e7b2cad0147b1c80f2b77989dea6f0b93e024","8df06e1cd5bb3bf31529cc0db74fa2e57f7de1f6042726679eb8bc1f57083a99","d62f09256941e92a95b78ae2267e4cf5ff2ca8915d62b9561b1bc85af1baf428","e6223b7263dd7a49f4691bf8df2b1e69f764fb46972937e6f9b28538d050b1ba","d9b59eb4e79a0f7a144ee837afb3f1afbc4dab031e49666067a2b5be94b36bd4","1db014db736a09668e0c0576585174dbcfd6471bb5e2d79f151a241e0d18d66b","8a153d30edde9cefd102e5523b5a9673c298fc7cf7af5173ae946cbb8dd48f11","abaaf8d606990f505ee5f76d0b45a44df60886a7d470820fcfb2c06eafa99659","51a66bfa412057e786a712733107547ceb6f539061f5bf1c6e5a96e4ccf4f83c","d92a80c2c05cf974704088f9da904fe5eadc0b3ad49ddd1ef70ca8028b5adda1","fbd7450f20b4486c54f8a90486c395b14f76da66ba30a7d83590e199848f0660","ece5b0e45c865645ab65880854899a5422a0b76ada7baa49300c76d38a530ee1","62d89ac385aeab821e2d55b4f9a23a277d44f33c67fefe4859c17b80fdb397ea","f4dee11887c5564886026263c6ee65c0babc971b2b8848d85c35927af25da827","fb8dd49a4cd6d802be4554fbab193bb06e2035905779777f32326cb57cf6a2c2","e403ecdfba83013b5eb0e648a92ce182bff2a45ccb81db3035a69081563c2830","82d3e00d56a71fc169f3cf9ec5f5ffcc92f6c0e67d4dfc130dafe9f1886d5515","b8d57effce2d49a5493debbd8c644e8d52fbe66e2c6d451371375ef5f7bccb8e","9963d9857df2df335d1232a12eccbe5c777537a244f4b39406b27bf4736202f6","1b33478647aa1b771314745807397002a410c746480e9447db959110999873ce","a14e7c48debe27b25ddf7932e6976c4f58123e32be8384c3f91b0a4d9f67c2f0","7e6a96b383da9f5acb848bb9dedb9ac8489df7cec46bbf26aeaed2610f709078","9fac6ebf3c60ced53dd21def30a679ec225fc3ff4b8d66b86326c285a4eebb5a","8cb83cb98c460cd716d2a98b64eb1a07a3a65c7362436550e02f5c2d212871d1","07bc8a3551e39e70c38e7293b1a09916867d728043e352b119f951742cb91624","e47adc2176f43c617c0ab47f2d9b2bb1706d9e0669bf349a30c3fe09ddd63261","7fec79dfd7319fec7456b1b53134edb54c411ba493a0aef350eee75a4f223eeb","189c489705bb96a308dcde9b3336011d08bfbca568bcaf5d5d55c05468e9de7a","98f4b1074567341764b580bf14c5aabe82a4390d11553780814f7e932970a6f7","1dd24cbf39199100fbe2f3dbd1c7203c240c41d95f66301ecc7650ae77875be1","2e252235037a2cd8feebfbf74aa460f783e5d423895d13f29a934d7655a1f8be","3bd10a31e9066676e0af937c2ef2507451281861ae294d04c7c46e46706140d9","53477a1815e915b8c20222a2ac8f9e3de880a1e8c8dbf9dae529b3d2e2b4a53b",{"version":"dbd0794f86b0f3e7c2c28bbe6cbf91adc6ef2203c6a832548ef199816d47039c","affectsGlobalScope":true},"16a216abd2e98172a804e7b124e88e23c63fe12896ff6f72af752d44d11266b5","bcb2fb2a8e8f3ee0ae80924969a947d07b0af89e16a12ef47c10df0e0e33aaf8","8243c4c93b6c4d64f086fa2a8fa180cd592380178dda3296274753ad26218d60","2b0cc039816ca5dc54f124333a4645857cecede6b9d8312e5dcd9f3ff74991ee","6990f2fb809692c89ecee29660a7680543246d0aee7bfc6756a1047a9918cc29","b84b0deafa5845fd2f21e49945eec5642fc74616f4b324e32e1f5bdf84a0eb54","884cd5093164bd0d95afa8854b426df08997a085668f123992ec1bb8eb2accc1","fc892a9c766a171ee80ae5f90cdb1276a509a10bb8a9cc4ade22a637cd849eab","e2f0a4be4ff986b254035536cd7a0326c3998807c107314c484461d286be116c","052bfda778ba1d93404739c42f8c8be8c8f35bb4df1f05740542de9c8786000e","db114ef2aba1c12605774caca9a12f389e23a084f007662129450c669da9e981","6061e156608df22580cdfe4a7a5458d94c459fb813f432fc39aaf1d4a33a9888","0a33b8bff876368beef794f5f08e8221103efa394f9e0e27e19f557a8cdaa0a0","00ff0ab9ef8e80fa5f661376178da927120f98974ae453f1878fda1662a3c24a",{"version":"230f951114cbbe103632617f6b9591bfcaac2fbe4fc27158d528984ada8bd3eb","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"dc32a7ce3f941cd47b298e971118b1abaa18f1c72e16d803d2a9518b94c628b2","b5a58595a790a580bc82de0e44898dc8802a7b8db9e62fb1b5afe4e8bc6a9b09","fc909066a936771070f4e142f262faed6e886c883537f03e8ce99a41f6a4be0e","54fae3169ef40000b63b1ceb89a27782217364ba3cb0990fa0a9d22c9343b887",{"version":"d9fe94961a12a090b9f42a740d0acd29fd41a98373da82a5735bcfb07496db0c","signature":"9c3ec00d7312bdbf929c985aafcfb44312a3d0bf5c18aab380790f309576b09f"},{"version":"5126acfa9a43c6020b8b0f1c55a78e9fe0f60adfbf5fae59ab370399505b6f7e","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"77f2bd2c3b41aec171e16dc315f6840e67551fd92e77417b8193c716ace11e39","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"b648f0bb4f358e44c69649d448a95e5ee76f7a28bff8b4c069926f92547b5ea6",{"version":"f77792bc02b2dfc8c9645696a9c2e6acfe071599ddd7c12771b49444bec72495","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"6b8ba82472956e3c2012793ea52804218145cb53e2be86e2cb3aa3de4eb6b25b","1c5b3fca96bf8a12c234a3466821ecd5c8c3ae0bfc12b58d72b403447e75ae44","c64123347ea308d462eb2fe5f17db98486bb7b1fb1bb7e70389fc5da5bc2d98d","556ccd493ec36c7d7cb130d51be66e147b91cc1415be383d71da0f1e49f742a9","b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","95aba78013d782537cc5e23868e736bec5d377b918990e28ed56110e3ae8b958","670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","13b77ab19ef7aadd86a1e54f2f08ea23a6d74e102909e3c00d31f231ed040f62","069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","a3d3f704c5339a36da3ca8c62b29072f87e86c783b8452d235992142ec71aa2d","0dc6940ff35d845686a118ee7384713a84024d60ef26f25a2f87992ec7ddbd64","751764bb94219b4ce8f5475dc35d3de2e432fea01a0c9610cd7f69ad05e398c6","f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","a4a39b5714adfcadd3bbea6698ca2e942606d833bde62ad5fb6ec55f5e438ff8","bbc1d029093135d7d9bfa4b38cbf8761db505026cc458b5e9c8b74f4000e5e75","1f68ab0e055994eb337b67aa87d2a15e0200951e9664959b3866ee6f6b11a0fe","035a5df183489c2e22f3cf59fc1ed2b043d27f357eecc0eb8d8e840059d44245","a4809f4d92317535e6b22b01019437030077a76fec1d93b9881c9ed4738fcc54","5f53fa0bd22096d2a78533f94e02c899143b8f0f9891a46965294ee8b91a9434","efd20a1e335999efb44d19f01f9a74b2c40491c0539d9f14ed2bbded3f573654","0d14fa22c41fdc7277e6f71473b20ebc07f40f00e38875142335d5b63cdfc9d2","b104e2da53231a529373174880dc0abfbc80184bb473b6bf2a9a0746bebb663d","ee91a5fbbd1627c632df89cce5a4054f9cc6e7413ebdccc82b27c7ffeedf982d","85c8731ca285809fc248abf21b921fe00a67b6121d27060d6194eddc0e042b1a","6bac0cbdf1bc85ae707f91fdf037e1b600e39fb05df18915d4ecab04a1e59d3c","5688b21a05a2a11c25f56e53359e2dcda0a34cb1a582dbeb1eaacdeca55cb699","35558bf15f773acbe3ed5ac07dd27c278476630d85245f176e85f9a95128b6e0","951f54e4a63e82b310439993170e866dba0f28bb829cbc14d2f2103935cea381","4454a999dc1676b866450e8cddd9490be87b391b5526a33f88c7e45129d30c5d","99013139312db746c142f27515a14cdebb61ff37f20ee1de6a58ce30d36a4f0d","71da852f38ac50d2ae43a7b7f2899b10a2000727fee293b0b72123ed2e7e2ad6","74dd1096fca1fec76b951cf5eacf609feaf919e67e13af02fed49ec3b77ea797","a0691153ccf5aa1b687b1500239722fff4d755481c20e16d9fcd7fb2d659c7c7","fe2201d73ae56b1b4946c10e18549a93bf4c390308af9d422f1ffd3c7989ffc8","cad63667f992149cee390c3e98f38c00eee56a2dae3541c6d9929641b835f987","f497cad2b33824d8b566fa276cfe3561553f905fdc6b40406c92bcfcaec96552","eb58c4dbc6fec60617d80f8ccf23900a64d3190fda7cfb2558b389506ec69be0","578929b1c1e3adaed503c0a0f9bda8ba3fea598cc41ad5c38932f765684d9888","7cc9d600b2070b1e5c220044a8d5a58b40da1c11399b6c8968711de9663dc6b2","45f36cf09d3067cd98b39a7d430e0e531f02911dd6d63b6d784b1955eef86435","80419a23b4182c256fa51d71cb9c4d872256ca6873701ceabbd65f8426591e49","5aa046aaab44da1a63d229bd67a7a1344afbd6f64db20c2bbe3981ceb2db3b07","ed9ad5b51c6faf9d6f597aa0ab11cb1d3a361c51ba59d1220557ef21ad5b0146","73db7984e8a35e6b48e3879a6d024803dd990022def2750b3c23c01eb58bc30f","c9ecb910b3b4c0cf67bc74833fc41585141c196b5660d2eb3a74cfffbf5aa266","33dcfba8a7e4acbe23974d342c44c36d7382c3d1d261f8aef28261a7a5df2969","de26700eb7277e8cfdde32ebb21b3d9ad1d713b64fdc2019068b857611e8f0c4","e481bd2c07c8e93eb58a857a9e66f22cb0b5ddfd86bbf273816fd31ef3a80613","ef156ba4043f6228d37645d6d9c6230a311e1c7a86669518d5f2ebc26e6559bf","457fd1e6d6f359d7fa2ca453353f4317efccae5c902b13f15c587597015212bc","473b2b42af720ebdb539988c06e040fd9600facdeb23cb297d72ee0098d8598f","22bc373ca556de33255faaddb373fec49e08336638958ad17fbd6361c7461eed","b3d58358675095fef03ec71bddc61f743128682625f1336df2fc31e29499ab25","5b1ef94b03042629c76350fe18be52e17ab70f1c3be8f606102b30a5cd86c1b3","a7b6046c44d5fda21d39b3266805d37a2811c2f639bf6b40a633b9a5fb4f5d88","80b036a132f3def4623aad73d526c6261dcae3c5f7013857f9ecf6589b72951f","0a347c2088c3b1726b95ccde77953bede00dd9dd2fda84585fa6f9f6e9573c18","8cc3abb4586d574a3faeea6747111b291e0c9981003a0d72711351a6bcc01421","0a516adfde610035e31008b170da29166233678216ef3646822c1b9af98879da","70d48a1faa86f67c9cb8a39babc5049246d7c67b6617cd08f64e29c055897ca9","df10dc6fe1c49e2f94be9d7d1e625aeb66e5eb90b2e0af1f378bfdfa5313155b","082b818038423de54be877cebdb344a2e3cf3f6abcfc48218d8acf95c030426a","813514ef625cb8fc3befeec97afddfb3b80b80ced859959339d99f3ad538d8fe","039cd54028eb988297e189275764df06c18f9299b14c063e93bd3f30c046fee6","e91cfd040e6da28427c5c4396912874902c26605240bdc3457cc75b6235a80f2","b4347f0b45e4788c18241ac4dee20ceab96d172847f1c11d42439d3de3c09a3e","16fe6721dc0b4144a0cdcef98857ee19025bf3c2a3cc210bcd0b9d0e25f7cec8","346d903799e8ea99e9674ba5745642d47c0d77b003cc7bb93e1d4c21c9e37101","3997421bb1889118b1bbfc53dd198c3f653bf566fd13c663e02eb08649b985c4","2d1ac54184d897cb5b2e732d501fa4591f751678717fd0c1fd4a368236b75cba","bade30041d41945c54d16a6ec7046fba6d1a279aade69dfdef9e70f71f2b7226","56fbea100bd7dd903dc49a1001995d3c6eee10a419c66a79cdb194bff7250eb7","fe8d26b2b3e519e37ceea31b1790b17d7c5ab30334ca2b56d376501388ba80d6","37ad0a0c2b296442072cd928d55ef6a156d50793c46c2e2497da1c2750d27c1e","be93d07586d09e1b6625e51a1591d6119c9f1cbd95718497636a406ec42babee","a062b507ed5fc23fbc5850fd101bc9a39e9a0940bb52a45cd4624176337ad6b8","cf01f601ef1e10b90cad69312081ce0350f26a18330913487a26d6d4f7ce5a73","a9de7b9a5deaed116c9c89ad76fdcc469226a22b79c80736de585af4f97b17cd","5bde81e8b0efb2d977c6795f9425f890770d54610764b1d8df340ce35778c4f8","20fd0402351907669405355eeae8db00b3cf0331a3a86d8142f7b33805174f57","da6949af729eca1ec1fe867f93a601988b5b206b6049c027d0c849301d20af6f","7008f240ea3a5a344be4e5f9b5dbf26721aad3c5cfef5ff79d133fa7450e48fa","eb13c8624f5747a845aea0df1dfde0f2b8f5ed90ca3bc550b12777797cb1b1e3","2452fc0f47d3b5b466bda412397831dd5138e62f77aa5e11270e6ca3ecb8328d","33c2ebbdd9a62776ca0091a8d1f445fa2ea4b4f378bc92f524031a70dfbeec86","3ac3a5b34331a56a3f76de9baf619def3f3073961ce0a012b6ffa72cf8a91f1f","d5e9d32cc9813a5290a17492f554999e33f1aa083a128d3e857779548537a778","776f49489fa2e461b40370e501d8e775ddb32433c2d1b973f79d9717e1d79be5","be94ea1bfaa2eeef1e821a024914ef94cf0cba05be8f2e7df7e9556231870a1d","40cd13782413c7195ad8f189f81174850cc083967d056b23d529199d64f02c79","05e041810faf710c1dcd03f3ffde100c4a744672d93512314b1f3cfffccdaf20","15a8f79b1557978d752c0be488ee5a70daa389638d79570507a3d4cfc620d49d","968ee57037c469cffb3b0e268ab824a9c31e4205475b230011895466a1e72da4","77debd777927059acbaf1029dfc95900b3ab8ed0434ce3914775efb0574e747b","921e3bd6325acb712cd319eaec9392c9ad81f893dead509ab2f4e688f265e536","60f6768c96f54b870966957fb9a1b176336cd82895ded088980fb506c032be1c","755d9b267084db4ea40fa29653ea5fc43e125792b1940f2909ec70a4c7f712d8","7e3056d5333f2d8a9e54324c2e2293027e4cd9874615692a53ad69090894d116","1e25b848c58ad80be5c31b794d49092d94df2b7e492683974c436bcdbefb983c","3df6fc700b8d787974651680ae6e37b6b50726cf5401b7887f669ab195c2f2ef","145df08c171ec616645a353d5eaa5d5f57a5fbce960a47d847548abd9215a99e","dcfd2ca9e033077f9125eeca6890bb152c6c0bc715d0482595abc93c05d02d92","8056fa6beb8297f160e13c9b677ba2be92ab23adfb6940e5a974b05acd33163b","86dda1e79020fad844010b39abb68fafed2f3b2156e3302820c4d0a161f88b03","dea0dcec8d5e0153d6f0eacebb163d7c3a4b322a9304048adffc6d26084054bd","2afd081a65d595d806b0ff434d2a96dc3d6dcd8f0d1351c0a0968568c6944e0b","b86259ab4b95ebe1aedb03d3eebea647f0bd9a706981220f00210487d70e77a0","2f1f7c65e8ee58e3e7358f9b8b3c37d8447549ecc85046f9405a0fc67fbdf54b","e3f3964ff78dee11a07ae589f1319ff682f62f3c6c8afa935e3d8616cf21b431","2762c2dbee294ffb8fdbcae6db32c3dae09e477d6a348b48578b4145b15d1818","78a1eace936ad32ca1c228814f3333cb2e826e1447e60fee181b3c53d43a8d07","24bd135b687da453ea7bd98f7ece72e610a3ff8ca6ec23d321c0e32f19d32db6","64d45d55ba6e42734ac326d2ea1f674c72837443eb7ff66c82f95e4544980713","f9b0dc747f13dcc09e40c26ddcc118b1bafc3152f771fdc32757a7f8916a11fc","7035fc608c297fd38dfe757d44d3483a570e2d6c8824b2d6b20294d617da64c6","22160a296186123d2df75280a1fab70d2105ce1677af1ebb344ffcb88eef6e42","9067b3fd7d71165d4c34fcbbf29f883860fd722b7e8f92e87da036b355a6c625","e01ab4b99cc4a775d06155e9cadd2ebd93e4af46e2723cb9361f24a4e1f178ef","9a13410635d5cc9c2882e67921c59fb26e77b9d99efa1a80b5a46fdc2954afce","b04862a4f44f78fd12ad8ed34ab81f9f254a87398568173694a78dc0bdebcd23","fa894bdddb2ba0e6c65ad0d88942cf15328941246410c502576124ef044746f9","59c5a06fa4bf2fa320a3c5289b6f199a3e4f9562480f59c0987c91dc135a1adf","456a9a12ad5d57af0094edf99ceab1804449f6e7bc773d85d09c56a18978a177","a8e2a77f445a8a1ce61bfd4b7b22664d98cf19b84ec6a966544d0decec18e143","6f6b0b477db6c4039410c7a13fe1ebed4910dedf644330269816df419cdb1c65","960b6e1edfb9aafbd560eceaae0093b31a9232ab273f4ed776c647b2fb9771da","530f4bee13cc07fd4e8bac69eeb728a6270ebafeab886c98624c699725b29755","a0db48d42371b223cea8fd7a41763d48f9166ecd4baecc9d29d9bb44cc3c2d83","aaf3c2e268f27514eb28255835f38445a200cd8bcfdff2c07c6227f67aaaf657","6ade56d2afdf75a9bd55cd9c8593ed1d78674804d9f6d9aba04f807f3179979e","b67acb619b761e91e3a11dddb98c51ee140361bc361eb17538f1c3617e3ec157","81b097e0f9f8d8c3d5fe6ba9dc86139e2d95d1e24c5ce7396a276dfbb2713371","692d56fff4fb60948fe16e9fed6c4c4eac9b263c06a8c6e63726e28ed4844fd4","f13228f2c0e145fc6dc64917eeef690fb2883a0ac3fa9ebfbd99616fd12f5629","d89b2b41a42c04853037408080a2740f8cd18beee1c422638d54f8aefe95c5b8","be5d39e513e3e0135068e4ebed5473ab465ae441405dce90ab95055a14403f64","97e320c56905d9fa6ac8bd652cea750265384f048505870831e273050e2878cc","9932f390435192eb93597f89997500626fb31005416ce08a614f66ec475c5c42","5d89ca552233ac2d61aee34b0587f49111a54a02492e7a1098e0701dedca60c9","1ee47a39f996d76442fe9777bb4446bd110f6828488db0e65cba817b4ffc5807","fdc4fd2c610b368104746960b45216bc32685927529dd871a5330f4871d14906","7b5d77c769a6f54ea64b22f1877d64436f038d9c81f1552ad11ed63f394bd351","4f7d54c603949113f45505330caae6f41e8dbb59841d4ae20b42307dc4579835","a71fd01a802624c3fce6b09c14b461cc7c7758aa199c202d423a7c89ad89943c","1ed0dc05908eb15f46379bc1cb64423760e59d6c3de826a970b2e2f6da290bf5","db89ef053f209839606e770244031688c47624b771ff5c65f0fa1ec10a6919f1","4d45b88987f32b2ac744f633ff5ddb95cd10f64459703f91f1633ff457d6c30d","8512fd4a480cd8ef8bf923a85ff5e97216fa93fb763ec871144a9026e1c9dade","2aa58b491183eedf2c8ae6ef9a610cd43433fcd854f4cc3e2492027fbe63f5ca","ce1f3439cb1c5a207f47938e68752730892fc3e66222227effc6a8b693450b82","295ce2cf585c26a9b71ba34fbb026d2b5a5f0d738b06a356e514f39c20bf38ba","342f10cf9ba3fbf52d54253db5c0ac3de50360b0a3c28e648a449e28a4ac8a8c","c485987c684a51c30e375d70f70942576fa86e9d30ee8d5849b6017931fccc6f","320bd1aa480e22cdd7cd3d385157258cc252577f4948cbf7cfdf78ded9d6d0a8","4ee053dfa1fce5266ecfae2bf8b6b0cb78a6a76060a1dcf66fb7215b9ff46b0b","1f84d8b133284b596328df47453d3b3f3817ad206cf3facf5eb64b0a2c14f6d7","5c75e05bc62bffe196a9b2e9adfa824ffa7b90d62345a766c21585f2ce775001","cc2eb5b23140bbceadf000ef2b71d27ac011d1c325b0fc5ecd42a3221db5fb2e","fd75cc24ea5ec28a44c0afc2f8f33da5736be58737ba772318ae3bdc1c079dc3","5ae43407346e6f7d5408292a7d957a663cc7b6d858a14526714a23466ac83ef9","c72001118edc35bbe4fff17674dc5f2032ccdbcc5bec4bd7894a6ed55739d31b","353196fd0dd1d05e933703d8dad664651ed172b8dfb3beaef38e66522b1e0219","670aef817baea9332d7974295938cf0201a2d533c5721fccf4801ba9a4571c75","3f5736e735ee01c6ecc6d4ab35b2d905418bb0d2128de098b73e11dd5decc34f","b64e159c49afc6499005756f5a7c2397c917525ceab513995f047cdd80b04bdf","f72b400dbf8f27adbda4c39a673884cb05daf8e0a1d8152eec2480f5700db36c","24509d0601fc00c4d77c20cacddbca6b878025f4e0712bddd171c7917f8cdcde","5f5baa59149d3d6d6cef2c09d46bb4d19beb10d6bee8c05b7850c33535b3c438","f17a51aae728f9f1a2290919cf29a927621b27f6ae91697aee78f41d48851690","be02e3c3cb4e187fd252e7ae12f6383f274e82288c8772bb0daf1a4e4af571ad","82ca40fb541799273571b011cd9de6ee9b577ef68acc8408135504ae69365b74","8fb6646db72914d6ef0692ea88b25670bbf5e504891613a1f46b42783ec18cce","b61efdebae3d131b6ad71bd2aa7cc4284e351481339bf66d84ee5ed86465bcc8","213aa21650a910d95c4d0bee4bb936ecd51e230c1a9e5361e008830dcc73bc86","874a8c5125ad187e47e4a8eacc809c866c0e71b619a863cc14794dd3ccf23940","c31db8e51e85ee67018ac2a40006910efbb58e46baea774cf1f245d99bf178b5","31fac222250b18ebac0158938ede4b5d245e67d29cd2ef1e6c8a5859d137d803","a9dfb793a7e10949f4f3ea9f282b53d3bd8bf59f5459bc6e618e3457ed2529f5","2a77167687b0ec0c36ef581925103f1dc0c69993f61a9dbd299dcd30601af487","0f23b5ce60c754c2816c2542b9b164d6cb15243f4cbcd11cfafcab14b60e04d0","813ce40a8c02b172fdbeb8a07fdd427ac68e821f0e20e3dc699fb5f5bdf1ef0a","5ce6b24d5fd5ebb1e38fe817b8775e2e00c94145ad6eedaf26e3adf8bb3903d0","6babca69d3ae17be168cfceb91011eed881d41ce973302ee4e97d68a81c514b4","3e0832bc2533c0ec6ffcd61b7c055adedcca1a45364b3275c03343b83c71f5b3","342418c52b55f721b043183975052fb3956dae3c1f55f965fedfbbf4ad540501","6a6ab1edb5440ee695818d76f66d1a282a31207707e0d835828341e88e0c1160","7e9b4669774e97f5dc435ddb679aa9e7d77a1e5a480072c1d1291892d54bf45c","de439ddbed60296fbd1e5b4d242ce12aad718dffe6432efcae1ad6cd996defd3","ce5fb71799f4dbb0a9622bf976a192664e6c574d125d3773d0fa57926387b8b2","b9c0de070a5876c81540b1340baac0d7098ea9657c6653731a3199fcb2917cef","cbc91ecd74d8f9ddcbcbdc2d9245f14eff5b2f6ae38371283c97ca7dc3c4a45f","3ca1d6f016f36c61a59483c80d8b9f9d50301fbe52a0dde288c1381862b13636","ecfef0c0ff0c80ac9a6c2fab904a06b680fb5dfe8d9654bb789e49c6973cb781","0ee2eb3f7c0106ccf6e388bc0a16e1b3d346e88ac31b6a5bbc15766e43992167","7a80da7b14bc7902b1da607c8b3734ad5740f8f5fade9a7bfbf753b9bba22652","7e46dd61422e5afe88c34e5f1894ae89a37b7a07393440c092e9dc4399820172","9df4f57d7279173b0810154c174aa03fd60f5a1f0c3acfe8805e55e935bdecd4","a02a51b68a60a06d4bd0c747d6fbade0cb87eefda5f985fb4650e343da424f12","0cf851e2f0ecf61cabe64efd72de360246bcb8c19c6ef7b5cbb702293e1ff755","0c0e0aaf37ab0552dffc13eb584d8c56423b597c1c49f7974695cb45e2973de6","e2e0cd8f6470bc69bbfbc5e758e917a4e0f9259da7ffc93c0930516b0aa99520","180de8975eff720420697e7b5d95c0ecaf80f25d0cea4f8df7fe9cf817d44884","424a7394f9704d45596dce70bd015c5afec74a1cc5760781dfda31bc300df88f","044a62b9c967ee8c56dcb7b2090cf07ef2ac15c07e0e9c53d99fab7219ee3d67","3903b01a9ba327aae8c7ea884cdabc115d27446fba889afc95fddca8a9b4f6e2","78fd8f2504fbfb0070569729bf2fe41417fdf59f8c3e975ab3143a96f03e0a4a","8afd4f91e3a060a886a249f22b23da880ec12d4a20b6404acc5e283ef01bdd46","72e72e3dea4081877925442f67b23be151484ef0a1565323c9af7f1c5a0820f0","fa8c21bafd5d8991019d58887add8971ccbe88243c79bbcaec2e2417a40af4e8","ab35597fd103b902484b75a583606f606ab2cef7c069fae6c8aca0f058cee77d","ca54ec33929149dded2199dca95fd8ad7d48a04f6e8500f3f84a050fa77fee45","cac7dcf6f66d12979cc6095f33edc7fbb4266a44c8554cd44cd04572a4623fd0","98af566e6d420e54e4d8d942973e7fbe794e5168133ad6658b589d9dfb4409d8","fd80af69ef04ab9cb2404aca13e8a620f0cf29c0814c69b663a467def21de35e","d421c4e4d70b03d8d05f993dd13a2c473c967b863438b167a8b3c01d4685a692","3bf23090b94bda18a619623d2652b48ea904e26304267b10fcbdb85e032b7351","d4d6aab35ead2fbdafc31c9b0cb8a5b5939c7d24c63356c979757194eaa282cf","f80aedd7cc51ccb70537fc79f07b44512e0ce43e2bf3dd350743bfb968cf26ce","b3202cfb0370950f175b9d1c1bebda95f0c62fee5fc2853f474aace51be42860",{"version":"3e2f739bdfb6b194ae2af13316b4c5bb18b3fe81ac340288675f92ba2061b370","affectsGlobalScope":true},"b0f9ef6423d6b29dde29fd60d83d215796b2c1b76bfca28ac374ae18702cfb8e","ab82804a14454734010dcdcd43f564ff7b0389bee4c5692eec76ff5b30d4cf66","e7bb49fac2aa46a13011b5eb5e4a8648f70a28aea1853fab2444dd4fcb4d4ec7","464e45d1a56dae066d7e1a2f32e55b8de4bfb072610c3483a4091d73c9924908","da318e126ac39362c899829547cc8ee24fa3e8328b52cdd27e34173cf19c7941","24bd01a91f187b22456c7171c07dbf44f3ad57ebd50735aab5c13fa23d7114b4","4738eefeaaba4d4288a08c1c226a76086095a4d5bcc7826d2564e7c29da47671","736097ddbb2903bef918bb3b5811ef1c9c5656f2a73bd39b22a91b9cc2525e50","dbec715e9e82df297e49e3ed0029f6151aa40517ebfd6fcdba277a8a2e1d3a1b","097f1f8ca02e8940cfdcca553279e281f726485fa6fb214b3c9f7084476f6bcc","8f75e211a2e83ff216eb66330790fb6412dcda2feb60c4f165c903cf375633ee","c3fb0d969970b37d91f0dbf493c014497fe457a2280ac42ae24567015963dbf7","a9155c6deffc2f6a69e69dc12f0950ba1b4db03b3d26ab7a523efc89149ce979","c99faf0d7cb755b0424a743ea0cbf195606bf6cd023b5d10082dba8d3714673c","8e770f88d5f5b92aa94251b2d223d18e85dc0ff8ffba5b0d82164a78e8ac5663","3134a6c11d0beb89fcb57ee0720c68fbd47d6c796e219ec188c459553e46505b","bae8d023ef6b23df7da26f51cea44321f95817c190342a36882e93b80d07a960","26a770cec4bd2e7dbba95c6e536390fffe83c6268b78974a93727903b515c4e7"],"root":[531,532,610,752,753,[756,805],[827,846],[940,943],[953,966]],"options":{"allowSyntheticDefaultImports":true,"declaration":true,"emitDecoratorMetadata":true,"experimentalDecorators":true,"module":1,"noFallthroughCasesInSwitch":true,"noImplicitAny":true,"outDir":"./dist","removeComments":true,"rootDir":"./src","skipLibCheck":true,"sourceMap":true,"strictBindCallApply":true,"strictNullChecks":true,"target":8},"fileIdsList":[[421,468,528],[421,468,527],[421,468,967],[421,468],[421,468,1176],[307,421,468],[407,421,468],[56,308,309,310,311,312,313,314,315,316,317,318,319,320,421,468],[259,293,421,468],[266,421,468],[256,307,407,421,468],[325,326,327,328,329,330,331,333,421,468],[261,421,468],[307,407,421,468],[261,332,421,468],[321,324,334,421,468],[322,323,421,468],[297,421,468],[261,262,263,264,421,468],[337,421,468],[279,336,421,468],[336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,421,468],[366,421,468],[363,364,421,468],[362,365,421,468,498],[55,265,307,335,359,362,367,374,399,404,406,421,468],[61,259,421,468],[60,421,468],[61,251,252,421,468,876,881],[251,259,421,468],[60,250,421,468],[259,387,421,468],[253,389,421,468],[250,254,421,468],[254,421,468],[60,307,421,468],[258,259,421,468],[271,421,468],[273,274,275,276,277,421,468],[265,421,468],[265,266,285,421,468],[279,280,286,287,288,421,468],[57,58,59,60,61,251,252,253,254,255,256,257,258,259,260,266,271,272,278,285,289,290,291,293,301,302,303,304,305,306,421,468],[284,421,468],[267,268,269,270,421,468],[259,267,268,421,468],[259,265,266,421,468],[259,269,421,468],[259,297,421,468],[292,294,295,296,297,298,299,300,421,468],[57,259,421,468],[293,421,468],[57,259,292,296,298,421,468],[268,421,468],[294,421,468],[259,293,294,295,421,468],[283,421,468],[259,263,283,284,301,302,421,468],[281,282,284,421,468],[255,257,266,272,286,303,304,307,421,468],[61,250,255,257,260,303,304,421,468],[264,421,468],[250,421,468],[283,307,368,372,421,468],[372,373,421,468],[307,368,421,468],[307,368,369,421,468],[369,370,421,468],[369,370,371,421,468],[260,421,468],[377,378,379,421,468],[377,421,468],[379,380,381,383,384,385,421,468],[376,421,468],[379,382,421,468],[379,380,381,383,384,421,468],[260,377,379,383,421,468],[375,386,391,392,393,394,395,396,397,398,421,468],[260,307,391,421,468],[260,382,421,468],[260,382,407,421,468],[253,259,260,382,387,388,389,390,421,468],[250,307,387,388,400,421,468],[307,387,421,468],[402,421,468],[335,400,421,468],[400,401,403,421,468],[283,421,468,510],[283,360,361,421,468],[292,421,468],[265,307,421,468],[405,421,468],[407,421,468,519],[250,409,414,421,468],[408,414,421,468,519,520,521,524],[414,421,468],[415,421,468,517],[409,415,421,468,518],[410,411,412,413,421,468],[421,468,522,523],[414,421,468,519,525],[421,468,525],[285,307,407,421,468],[421,468,806],[307,407,421,468,865,866],[332,421,468],[407,421,468,859,864,865],[421,468,869,870],[61,307,421,468,860,865,879],[407,421,468,847,872],[60,407,421,468,873,876],[307,421,468,860,865,867,878,880,884],[60,421,468,882,883],[421,468,873],[250,307,407,421,468,887],[307,407,421,468,860,865,867,879],[421,468,886,888,889],[307,421,468,865],[421,468,865],[307,407,421,468,887],[60,307,407,421,468],[307,407,421,468,859,860,865,885,887,890,893,898,899,912,913],[250,421,468,806],[421,468,872,875,914],[421,468,899,911],[55,421,468,847,867,868,871,874,906,911,915,918,922,923,924,926,928,934,936],[307,407,421,468,853,861,864,865],[307,421,468,857],[284,307,332,407,421,468,856,857,858,859,864,865,867,937],[421,468,859,860,863,865,901,910],[307,407,421,468,852,864,865],[421,468,900],[407,421,468,860,865],[407,421,468,853,860,864,905],[307,332,407,421,468,852,864],[407,421,468,858,859,863,903,907,908,909],[407,421,468,853,860,861,862,864,865],[307,332,421,468,860,863,865],[250,421,468,864],[259,292,298,421,468],[421,468,849,850,851,860,864,865,904],[421,468,856,905,916,917],[332,407,421,468,865],[332,407,421,468],[421,468,848,849,850,851,854,856],[421,468,853],[421,468,855,856],[407,421,468,848,849,850,851,854,855],[421,468,891,892],[307,421,468,860,865,867,879],[421,468,902],[290,421,468],[271,307,421,468,919,920],[421,468,921],[307,421,468,867],[307,421,468,860,867],[284,307,407,421,468,853,860,861,862,864,865],[283,307,407,421,468,847,860,867,905,923],[284,285,407,421,468,806,925],[421,468,895,896,897],[407,421,468,894],[421,468,927],[407,421,468,496],[421,468,930,932,933],[421,468,929],[421,468,931],[407,421,468,859,864,930],[421,468,877],[307,332,407,421,468,860,864,865,867,902,903,905,906],[421,468,935],[421,468,534,536,537,538,539],[421,468,535],[407,421,468,534],[407,421,468,535],[421,468,534,536],[421,468,540],[407,421,468,543,545],[421,468,542,545,546,547,558,559],[421,468,543,544],[407,421,468,543],[421,468,557],[421,468,545],[421,468,560],[281,285,307,407,421,468,482,484,556,806,807,808,809],[421,468,810],[421,468,811,813,824],[421,468,807,808,812],[281,407,421,468,482,484,556,807,808,809],[421,468,482],[421,468,820,822,823],[407,421,468,814],[421,468,815,816,817,818,819],[307,421,468,814],[421,468,821],[407,421,468,821],[407,421,468,564,565],[421,468,587],[421,468,564,565],[421,468,564],[407,421,468,564,565,578],[407,421,468,578,581],[407,421,468,564],[421,468,581],[421,468,562,563,566,567,568,569,570,571,572,573,574,575,576,577,579,580,582,583,584,585,586,588,589,590],[421,468,564,584,595],[55,421,468,591,595,596,597,603,606],[421,468,564,593,594],[407,421,468,564,578],[421,468,564,592],[286,407,421,468,595],[421,468,598,599,600,601,602],[421,468,604,605],[421,468,947,948,950,951],[421,468,944,945,949],[421,468,945,948],[421,468,902,948],[297,421,468,948],[284,407,421,468,902,906,946,947,950],[407,421,468,860,864,867,905,925,937],[421,468,529],[421,468,986,988,992,995,997,999,1001,1003,1005,1009,1013,1017,1019,1021,1023,1025,1027,1029,1031,1033,1035,1037,1045,1050,1052,1054,1056,1058,1061,1063,1068,1072,1076,1078,1080,1082,1085,1087,1089,1092,1094,1098,1100,1102,1104,1106,1108,1110,1112,1114,1116,1119,1122,1124,1126,1130,1132,1135,1137,1139,1141,1145,1151,1155,1157,1159,1166,1168,1170,1172,1175],[421,468,986,1119],[421,468,987],[421,468,1125],[421,468,986,1102,1106,1119],[421,468,1107],[421,468,986,1102,1119],[421,468,991],[421,468,1007,1013,1017,1023,1054,1106,1119],[421,468,1062],[421,468,1036],[421,468,1030],[421,468,1120,1121],[421,468,1119],[421,468,1009,1013,1050,1056,1068,1104,1106,1119],[421,468,1136],[421,468,985,1119],[421,468,1006],[421,468,988,995,1001,1005,1009,1025,1037,1078,1080,1082,1104,1106,1110,1112,1114,1119],[421,468,1138],[421,468,999,1009,1025,1119],[421,468,1140],[421,468,986,995,997,1061,1102,1106,1119],[421,468,998],[421,468,1123],[421,468,1117],[421,468,1109],[421,468,986,1001,1119],[421,468,1002],[421,468,1026],[421,468,1058,1104,1119,1143],[421,468,1045,1119,1143],[421,468,1009,1017,1045,1058,1102,1106,1119,1142,1144],[421,468,1142,1143,1144],[421,468,1027,1119],[421,468,1001,1058,1104,1106,1119,1148],[421,468,1058,1104,1119,1148],[421,468,1017,1058,1102,1106,1119,1147,1149],[421,468,1146,1147,1148,1149,1150],[421,468,1058,1104,1119,1153],[421,468,1045,1119,1153],[421,468,1009,1017,1045,1058,1102,1106,1119,1152,1154],[421,468,1152,1153,1154],[421,468,1004],[421,468,1127,1128,1129],[421,468,986,988,992,995,999,1001,1005,1007,1009,1013,1017,1019,1021,1023,1025,1029,1031,1033,1035,1037,1045,1052,1054,1058,1061,1078,1080,1082,1087,1089,1094,1098,1100,1104,1108,1110,1112,1114,1116,1119,1126],[421,468,986,988,992,995,999,1001,1005,1007,1009,1013,1017,1019,1021,1023,1025,1027,1029,1031,1033,1035,1037,1045,1052,1054,1058,1061,1078,1080,1082,1087,1089,1094,1098,1100,1104,1108,1110,1112,1114,1116,1119,1126],[421,468,1009,1104,1119],[421,468,1105],[421,468,1046,1047,1048,1049],[421,468,1048,1058,1104,1106,1119],[421,468,1046,1050,1058,1104,1119],[421,468,1001,1017,1033,1035,1045,1119],[421,468,1007,1009,1013,1017,1019,1023,1025,1046,1047,1049,1058,1104,1106,1108,1119],[421,468,1156],[421,468,999,1009,1119],[421,468,1158],[421,468,992,995,997,999,1005,1013,1017,1025,1052,1054,1061,1089,1104,1108,1114,1119,1126],[421,468,1034],[421,468,1010,1011,1012],[421,468,995,1009,1010,1061,1119],[421,468,1009,1010,1119],[421,468,1119,1161],[421,468,1160,1161,1162,1163,1164,1165],[421,468,1001,1058,1104,1106,1119,1161],[421,468,1001,1017,1045,1058,1119,1160],[421,468,1051],[421,468,1064,1065,1066,1067],[421,468,1058,1065,1104,1106,1119],[421,468,1013,1017,1019,1025,1056,1104,1106,1108,1119],[421,468,1001,1007,1017,1023,1033,1058,1064,1066,1106,1119],[421,468,1000],[421,468,989,990,1057],[421,468,986,1104,1119],[421,468,989,990,992,995,999,1001,1003,1005,1013,1017,1025,1050,1052,1054,1056,1061,1104,1106,1108,1119],[421,468,992,995,999,1003,1005,1007,1009,1013,1017,1023,1025,1050,1052,1061,1063,1068,1072,1076,1085,1089,1092,1094,1104,1106,1108,1119],[421,468,1097],[421,468,992,995,999,1003,1005,1013,1017,1019,1023,1025,1052,1061,1089,1102,1104,1106,1108,1119],[421,468,986,1095,1096,1102,1104,1119],[421,468,1008],[421,468,1099],[421,468,1077],[421,468,1032],[421,468,1103],[421,468,986,995,1061,1102,1106,1119],[421,468,1069,1070,1071],[421,468,1058,1070,1104,1119],[421,468,1058,1070,1104,1106,1119],[421,468,1001,1007,1013,1017,1019,1023,1050,1058,1069,1071,1104,1106,1119],[421,468,1059,1060],[421,468,1058,1059,1104],[421,468,986,1058,1060,1106,1119],[421,468,1167],[421,468,1005,1009,1025,1119],[421,468,1083,1084],[421,468,1058,1083,1104,1106,1119],[421,468,995,997,1001,1007,1013,1017,1019,1023,1029,1031,1033,1035,1037,1058,1061,1078,1080,1082,1084,1104,1106,1119],[421,468,1131],[421,468,1073,1074,1075],[421,468,1058,1074,1104,1119],[421,468,1058,1074,1104,1106,1119],[421,468,1001,1007,1013,1017,1019,1023,1050,1058,1073,1075,1104,1106,1119],[421,468,1053],[421,468,996],[421,468,995,1061,1119],[421,468,993,994],[421,468,993,1058,1104],[421,468,986,994,1058,1106,1119],[421,468,1088],[421,468,986,988,1001,1003,1009,1017,1029,1031,1033,1035,1045,1087,1102,1104,1106,1119],[421,468,1018],[421,468,1022],[421,468,986,1021,1102,1119],[421,468,1086],[421,468,1133,1134],[421,468,1090,1091],[421,468,1058,1090,1104,1106,1119],[421,468,995,997,1001,1007,1013,1017,1019,1023,1029,1031,1033,1035,1037,1058,1061,1078,1080,1082,1091,1104,1106,1119],[421,468,1169],[421,468,1013,1017,1025,1119],[421,468,1171],[421,468,1005,1009,1119],[421,468,988,992,999,1001,1003,1005,1013,1017,1019,1023,1025,1029,1031,1033,1035,1037,1045,1052,1054,1078,1080,1082,1087,1089,1100,1104,1108,1110,1112,1114,1116,1117],[421,468,1117,1118],[421,468,986],[421,468,1055],[421,468,1101],[421,468,992,995,999,1003,1005,1009,1013,1017,1019,1021,1023,1025,1052,1054,1061,1089,1094,1098,1100,1104,1106,1108,1119],[421,468,1028],[421,468,1079],[421,468,985],[421,468,1001,1017,1027,1029,1031,1033,1035,1037,1038,1045],[421,468,1001,1017,1027,1031,1038,1039,1045,1106],[421,468,1038,1039,1040,1041,1042,1043,1044],[421,468,1027],[421,468,1027,1045],[421,468,1001,1017,1029,1031,1033,1037,1045,1106],[421,468,986,1001,1009,1017,1029,1031,1033,1035,1037,1041,1102,1106,1119],[421,468,1001,1017,1043,1102,1106],[421,468,1093],[421,468,1024],[421,468,1173,1174],[421,468,992,999,1005,1037,1052,1054,1063,1080,1082,1087,1110,1112,1116,1119,1126,1141,1157,1159,1168,1172,1173],[421,468,988,995,997,1001,1003,1009,1013,1017,1019,1021,1023,1025,1029,1031,1033,1035,1045,1050,1058,1061,1068,1072,1076,1078,1085,1089,1092,1094,1098,1100,1104,1108,1114,1119,1137,1139,1145,1151,1155,1166,1170],[421,468,1111],[421,468,1081],[421,468,1014,1015,1016],[421,468,995,1009,1014,1061,1119],[421,468,1009,1014,1119],[421,468,1113],[421,468,1020],[421,468,1115],[421,468,967,968,969,970,971],[421,468,967,969],[421,468,482,516,554],[421,468,515,556],[421,468,482,516],[421,468,975,978],[421,468,975,976,977],[421,468,978],[421,468,479,482,516,548,549,550],[421,468,551,553,555],[421,468,980],[421,468,981],[421,468,1178,1182],[421,468,473,516,533],[421,468,498,556],[421,465,468],[421,467,468],[421,468,473,501],[421,468,469,474,479,487,498,509],[421,468,469,470,479,487],[416,417,418,421,468],[421,468,471,510],[421,468,472,473,480,488],[421,468,473,498,506],[421,468,474,476,479,487],[421,467,468,475],[421,468,476,477],[421,468,478,479],[421,467,468,479],[421,468,479,480,481,498,509],[421,468,479,480,481,494,498,501],[421,468,476,479,482,487,498,509],[421,468,479,480,482,483,487,498,506,509],[421,468,482,484,498,506,509],[421,468,479,485],[421,468,486,509,514],[421,468,476,479,487,498],[421,468,488],[421,468,489],[421,467,468,490],[421,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515],[421,468,492],[421,468,493],[421,468,479,494,495],[421,468,494,496,510,512],[421,468,479,498,499,501],[421,468,500,501],[421,468,498,499],[421,468,501],[421,468,502],[421,465,468,498,503],[421,468,479,504,505],[421,468,504,505],[421,468,473,487,498,506],[421,468,507],[468],[419,420,421,422,423,424,425,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515],[421,468,487,508],[421,468,482,493,509],[421,468,473,510],[421,468,498,511],[421,468,486,512],[421,468,513],[421,463,468],[421,463,468,479,481,490,498,501,509,512,514],[421,468,498,515],[421,468,534,754],[421,468,556,557],[421,468,482,556],[421,468,480,498,516],[421,468,482,516,552],[421,468,1193],[421,468,974,1184,1186,1188,1194],[421,468,483,487,498,506,516],[421,468,480,482,483,484,487,498,1184,1187,1188,1189,1190,1191,1192],[421,468,482,498,1193],[421,468,480,1187,1188],[421,468,509,1187],[421,468,1194,1195,1196,1197,1198],[421,468,1194,1195,1199],[421,468,1194,1195],[421,468,482,483,487,1184,1194],[421,468,644,645,646,647,648,649,650,651,652],[421,468,1200],[421,468,608],[421,468,615],[421,468,616],[421,468,615,616,621],[421,468,617,618,619,620,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742],[421,468,616,653],[421,468,616,647],[421,468,616,694],[421,468,611,612,613,614,615,616,621,743,744,745,746,750],[421,468,621],[421,468,613,748,749],[421,468,615,747],[421,468,616,621],[421,468,611,612],[421,468,516],[421,468,983,1180,1181],[421,468,482,498,516],[421,468,1178],[421,468,984,1179],[421,468,693],[421,468,1177],[62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,78,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,118,119,120,121,122,123,124,125,126,127,128,129,131,132,133,134,135,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,181,182,183,185,194,196,197,198,199,200,201,203,204,206,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,421,468],[107,421,468],[65,66,421,468],[62,63,64,66,421,468],[63,66,421,468],[66,107,421,468],[62,66,184,421,468],[64,65,66,421,468],[62,66,421,468],[66,421,468],[65,421,468],[62,65,107,421,468],[63,65,66,223,421,468],[65,66,223,421,468],[65,231,421,468],[63,65,66,421,468],[75,421,468],[98,421,468],[119,421,468],[65,66,107,421,468],[66,114,421,468],[65,66,107,125,421,468],[65,66,125,421,468],[66,166,421,468],[62,66,185,421,468],[191,193,421,468],[62,66,184,191,192,421,468],[184,185,193,421,468],[191,421,468],[62,66,191,192,193,421,468],[207,421,468],[202,421,468],[205,421,468],[63,65,185,186,187,188,421,468],[107,185,186,187,188,421,468],[185,187,421,468],[65,186,187,189,190,194,421,468],[62,65,421,468],[66,209,421,468],[67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,108,109,110,111,112,113,115,116,117,118,119,120,121,122,123,124,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,421,468],[195,421,468],[421,435,439,468,509],[421,435,468,498,509],[421,430,468],[421,432,435,468,506,509],[421,468,487,506],[421,430,468,516],[421,432,435,468,487,509],[421,427,428,431,434,468,479,498,509],[421,435,442,468],[421,427,433,468],[421,435,456,457,468],[421,431,435,468,501,509,516],[421,456,468,516],[421,429,430,468,516],[421,435,468],[421,429,430,431,432,433,434,435,436,437,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,457,458,459,460,461,462,468],[421,435,450,468],[421,435,442,443,468],[421,433,435,443,444,468],[421,434,468],[421,427,430,435,468],[421,435,439,443,444,468],[421,439,468],[421,433,435,438,468,509],[421,427,432,435,442,468],[421,468,498],[421,430,435,456,468,514,516],[407,421,468,526,532,757,760,763,766,769,772,778,783,784,794,796,799,802,805,829,834,837,839,842,845],[407,421,468,556],[421,468,940,941],[183,250,407,421,468],[407,421,468,489,607,825,846,937,938,939,942],[407,421,468,531,561,607,761,773,785,786,787],[407,421,468,541,757,763,777,785,786,787,788,789,790,791,792,793],[407,421,468,531,541,609],[407,421,468,531,609],[407,421,468,531,561,607,786],[407,421,468,531,607],[407,421,468,531,541,609,785,952],[407,421,468,773],[421,468,773,952],[407,421,468,561,607,610,752],[407,421,468,526,541,561,610,753,756],[421,468,751],[407,421,468,526,531,561,755],[421,468,531,541,610,952],[407,421,468,795],[407,421,468,561,607,831],[407,421,468,830,831,832,833],[407,421,468,531,830],[407,421,468,531,830,831,952],[407,421,468,607,764],[407,421,468,764,765],[407,421,468,531],[407,421,468,561,607,761],[407,421,468,761,762],[421,468,531,761,952],[407,421,468,561,607,797],[407,421,468,797,798],[407,421,468,561,607,835],[407,421,468,835,836],[407,421,468,531,835,952],[407,421,468,561,607,840],[407,421,468,840,841],[407,421,468,607,803],[407,421,468,803,804],[407,421,468,561,607,830],[407,421,468,830,838],[407,421,468,561,607,751,780],[407,421,468,780,781,783],[407,421,468,531,779],[407,421,468,561,607,780],[421,468,531,779,780,952],[407,421,468,607,751,779],[407,421,468,532,779,782],[407,421,468,489,531],[421,468,531,779,952],[407,421,468,561,607,767],[407,421,468,767,768],[421,468,531,767,952],[407,421,468,774],[407,421,468,561,607,773,774],[407,421,468,774,775,776,777],[407,421,468,473,531,773],[407,421,468,531,773,774,952],[407,421,468,607,800],[407,421,468,800,801],[421,468,531,800,952],[407,421,468,607,843],[407,421,468,843,844],[421,468,531,770,952],[407,421,468,607,770],[407,421,468,770,771],[407,421,468,473,489,607,825,826],[407,421,468,827,828],[407,421,468,480,489],[421,468,531,758,952],[407,421,468,561,607,758],[407,421,468,758,759],[407,421,468,530],[528,531,761,773,785,787],[531],[528,531],[527,531],[528,779,780],[528,531,779],[528,780],[779],[774],[773,774],[531,773]],"referencedMap":[[529,1],[528,2],[969,3],[967,4],[983,4],[1177,5],[332,4],[319,4],[56,4],[308,6],[309,6],[310,4],[311,7],[321,8],[312,6],[313,9],[314,4],[315,4],[316,6],[317,6],[318,6],[320,10],[328,11],[330,4],[327,4],[334,12],[331,4],[329,4],[325,13],[326,14],[333,15],[335,16],[322,4],[324,17],[323,18],[262,4],[265,19],[261,4],[894,4],[263,4],[264,4],[338,20],[339,20],[340,20],[341,20],[342,20],[343,20],[344,20],[337,21],[345,20],[359,22],[346,20],[336,4],[347,20],[348,20],[349,20],[350,20],[351,20],[352,20],[353,20],[354,20],[355,20],[356,20],[357,20],[358,20],[367,23],[365,24],[364,4],[363,4],[366,25],[407,26],[57,4],[58,4],[59,4],[876,27],[61,28],[882,29],[881,30],[251,31],[252,28],[387,4],[281,4],[282,4],[388,32],[253,4],[389,4],[390,33],[60,4],[255,34],[256,35],[254,36],[257,34],[258,4],[260,37],[272,38],[273,4],[278,39],[274,4],[275,4],[276,4],[277,4],[279,4],[280,40],[286,41],[289,42],[287,4],[288,4],[307,43],[290,4],[291,4],[925,44],[271,45],[269,46],[267,47],[268,48],[270,4],[298,49],[292,4],[301,50],[294,51],[299,52],[297,53],[300,54],[295,55],[296,56],[284,57],[303,58],[285,59],[305,60],[306,61],[293,4],[302,4],[259,4],[266,62],[304,63],[373,64],[368,4],[374,65],[369,66],[370,67],[371,68],[372,69],[375,70],[380,71],[378,72],[379,72],[386,73],[376,4],[377,74],[381,71],[383,75],[385,76],[384,77],[399,78],[392,79],[393,80],[394,80],[395,81],[396,81],[397,80],[398,80],[391,82],[401,83],[400,84],[403,85],[402,86],[404,87],[360,88],[362,89],[283,4],[361,57],[405,90],[382,91],[406,92],[408,7],[520,93],[521,94],[525,95],[409,4],[415,96],[518,97],[519,98],[410,4],[411,4],[414,99],[412,4],[413,4],[523,4],[524,100],[522,101],[526,102],[806,103],[847,104],[867,105],[868,106],[869,4],[870,107],[871,108],[880,109],[873,110],[877,111],[885,112],[883,7],[884,113],[874,114],[886,4],[888,115],[889,116],[890,117],[879,118],[875,119],[899,120],[887,121],[914,122],[872,123],[915,124],[912,125],[913,7],[937,126],[862,127],[858,128],[860,129],[911,130],[853,131],[901,132],[900,4],[861,133],[908,134],[865,135],[909,4],[910,136],[863,137],[864,138],[859,139],[857,140],[852,4],[905,141],[918,142],[916,7],[848,7],[904,143],[849,14],[850,106],[851,144],[855,145],[854,146],[917,147],[856,148],[893,149],[891,115],[892,150],[902,14],[903,151],[906,152],[921,153],[922,154],[919,155],[920,156],[923,157],[924,158],[926,159],[898,160],[895,161],[896,6],[897,150],[928,162],[927,163],[934,164],[866,7],[930,165],[929,7],[932,166],[931,4],[933,167],[878,168],[907,169],[936,170],[935,7],[540,171],[536,172],[535,173],[537,4],[538,174],[539,175],[541,176],[542,4],[546,177],[560,178],[543,7],[545,179],[544,4],[547,180],[558,181],[559,182],[561,183],[810,184],[811,185],[825,186],[813,187],[812,188],[807,189],[808,4],[809,4],[824,190],[815,191],[816,191],[817,191],[818,191],[820,192],[819,191],[821,193],[822,194],[814,4],[823,195],[562,4],[563,4],[566,196],[588,197],[567,4],[568,4],[569,7],[571,4],[570,4],[589,4],[572,4],[573,198],[574,4],[575,7],[576,4],[577,199],[579,200],[580,4],[582,201],[583,200],[584,202],[590,203],[585,199],[586,199],[591,204],[596,205],[607,206],[587,4],[578,199],[595,207],[564,4],[581,208],[593,209],[594,4],[592,4],[597,210],[598,7],[603,211],[599,7],[600,7],[601,7],[602,7],[565,4],[605,202],[604,4],[606,212],[952,213],[950,214],[944,7],[945,4],[949,215],[946,216],[951,217],[948,218],[947,219],[530,220],[527,4],[1176,221],[987,222],[988,223],[1125,222],[1126,224],[1107,225],[1108,226],[991,227],[992,228],[1062,229],[1063,230],[1036,222],[1037,231],[1030,222],[1031,232],[1122,233],[1120,234],[1121,4],[1136,235],[1137,236],[1006,237],[1007,238],[1138,239],[1139,240],[1140,241],[1141,242],[998,243],[999,244],[1124,245],[1123,246],[1109,222],[1110,247],[1002,248],[1003,249],[1026,4],[1027,250],[1144,251],[1142,252],[1143,253],[1145,254],[1146,255],[1149,256],[1147,257],[1150,234],[1148,258],[1151,259],[1154,260],[1152,261],[1153,262],[1155,263],[1004,243],[1005,264],[1130,265],[1127,266],[1128,267],[1129,4],[1105,268],[1106,269],[1050,270],[1049,271],[1047,272],[1046,273],[1048,274],[1157,275],[1156,276],[1159,277],[1158,278],[1035,279],[1034,222],[1013,280],[1011,281],[1010,227],[1012,282],[1162,283],[1166,284],[1160,285],[1161,286],[1163,283],[1164,283],[1165,283],[1052,287],[1051,227],[1068,288],[1066,289],[1067,234],[1064,290],[1065,291],[1001,292],[1000,222],[1058,293],[989,222],[990,294],[1057,295],[1095,296],[1098,297],[1096,298],[1097,299],[1009,300],[1008,222],[1100,301],[1099,227],[1078,302],[1077,222],[1033,303],[1032,222],[1104,304],[1103,305],[1072,306],[1071,307],[1069,308],[1070,309],[1061,310],[1060,311],[1059,312],[1168,313],[1167,314],[1085,315],[1084,316],[1083,317],[1132,318],[1131,4],[1076,319],[1075,320],[1073,321],[1074,322],[1054,323],[1053,227],[997,324],[996,325],[995,326],[994,327],[993,328],[1089,329],[1088,330],[1019,331],[1018,227],[1023,332],[1022,333],[1087,334],[1086,222],[1133,4],[1135,335],[1134,4],[1092,336],[1091,337],[1090,338],[1170,339],[1169,340],[1172,341],[1171,342],[1118,343],[1119,344],[1117,345],[1056,346],[1055,4],[1102,347],[1101,348],[1029,349],[1028,222],[1080,350],[1079,222],[986,351],[985,4],[1039,352],[1040,353],[1045,354],[1038,355],[1042,356],[1041,357],[1043,358],[1044,359],[1094,360],[1093,227],[1025,361],[1024,227],[1175,362],[1174,363],[1173,364],[1112,365],[1111,222],[1082,366],[1081,222],[1017,367],[1015,368],[1014,227],[1016,369],[1114,370],[1113,222],[1021,371],[1020,222],[1116,372],[1115,222],[972,373],[968,3],[970,374],[971,3],[973,4],[555,375],[939,376],[554,377],[974,4],[979,378],[978,379],[977,380],[975,4],[551,381],[556,382],[552,4],[980,4],[981,383],[982,384],[1183,385],[976,4],[534,386],[1184,4],[533,4],[826,387],[465,388],[466,388],[467,389],[468,390],[469,391],[470,392],[416,4],[419,393],[417,4],[418,4],[471,394],[472,395],[473,396],[474,397],[475,398],[476,399],[477,399],[478,400],[479,401],[480,402],[481,403],[422,4],[482,404],[483,405],[484,406],[485,407],[486,408],[487,409],[488,410],[489,411],[490,412],[491,413],[492,414],[493,415],[494,416],[495,416],[496,417],[497,4],[498,418],[500,419],[499,420],[501,421],[502,422],[503,423],[504,424],[505,425],[506,426],[507,427],[421,428],[420,4],[516,429],[508,430],[509,431],[510,432],[511,433],[512,434],[513,435],[423,4],[424,4],[425,4],[464,436],[514,437],[515,438],[755,439],[754,440],[557,441],[549,4],[550,4],[548,442],[553,443],[1185,4],[1194,444],[1186,4],[1189,445],[1192,446],[1193,447],[1187,448],[1190,449],[1188,450],[1199,451],[1196,452],[1198,4],[1197,453],[1195,454],[653,455],[644,4],[645,4],[646,4],[647,4],[648,4],[649,4],[650,4],[651,4],[652,4],[1200,4],[1201,456],[609,457],[608,4],[426,4],[984,4],[614,4],[616,458],[735,459],[739,459],[738,459],[736,459],[737,459],[740,459],[617,459],[629,459],[618,459],[631,459],[633,459],[626,459],[627,459],[628,459],[632,459],[634,459],[619,459],[630,459],[620,459],[622,460],[623,459],[624,459],[625,459],[641,459],[640,459],[743,461],[635,459],[637,459],[636,459],[638,459],[639,459],[742,459],[741,459],[642,459],[654,462],[655,462],[657,459],[703,459],[702,459],[723,459],[658,462],[700,459],[704,459],[659,459],[660,459],[661,462],[705,459],[699,462],[656,462],[706,459],[662,462],[707,459],[663,462],[687,459],[664,459],[708,459],[665,459],[697,462],[667,459],[668,459],[709,463],[670,459],[672,459],[673,459],[679,459],[680,459],[681,459],[674,462],[711,459],[698,462],[710,462],[675,459],[676,459],[712,459],[677,459],[669,462],[713,459],[696,459],[714,459],[678,462],[682,459],[683,459],[701,462],[715,459],[716,459],[695,464],[671,459],[717,462],[718,459],[719,459],[720,459],[721,462],[684,459],[722,459],[686,462],[688,459],[685,462],[666,459],[689,459],[692,459],[690,459],[691,459],[643,459],[725,459],[724,459],[726,459],[733,459],[727,459],[728,459],[730,459],[731,459],[729,459],[734,459],[732,459],[751,465],[749,466],[750,467],[748,468],[747,459],[746,469],[613,4],[615,4],[611,4],[744,4],[745,470],[621,458],[612,4],[517,471],[1182,472],[1191,473],[938,189],[1179,474],[1180,475],[1181,4],[694,476],[693,4],[1178,477],[55,4],[250,478],[223,4],[201,479],[199,479],[114,480],[65,481],[64,482],[200,483],[185,484],[107,485],[63,486],[62,487],[249,482],[214,488],[213,488],[125,489],[221,480],[222,480],[224,490],[225,480],[226,487],[227,480],[198,480],[228,480],[229,491],[230,480],[231,488],[232,492],[233,480],[234,480],[235,480],[236,480],[237,488],[238,480],[239,480],[240,480],[241,480],[242,493],[243,480],[244,480],[245,480],[246,480],[247,480],[67,487],[68,487],[69,487],[70,487],[71,487],[72,487],[73,487],[74,480],[76,494],[77,487],[75,487],[78,487],[79,487],[80,487],[81,487],[82,487],[83,487],[84,480],[85,487],[86,487],[87,487],[88,487],[89,487],[90,480],[91,487],[92,487],[93,487],[94,487],[95,487],[96,487],[97,480],[99,495],[98,487],[100,487],[101,487],[102,487],[103,487],[104,493],[105,480],[106,480],[120,496],[108,497],[109,487],[110,487],[111,480],[112,487],[113,487],[115,498],[116,487],[117,487],[118,487],[119,487],[121,487],[122,487],[123,487],[124,487],[126,499],[127,487],[128,487],[129,487],[130,480],[131,487],[132,500],[133,500],[134,500],[135,480],[136,487],[137,487],[138,487],[143,487],[139,487],[140,480],[141,487],[142,480],[144,487],[145,487],[146,487],[147,487],[148,487],[149,487],[150,480],[151,487],[152,487],[153,487],[154,487],[155,487],[156,487],[157,487],[158,487],[159,487],[160,487],[161,487],[162,487],[163,487],[164,487],[165,487],[166,487],[167,501],[168,487],[169,487],[170,487],[171,487],[172,487],[173,487],[174,480],[175,480],[176,480],[177,480],[178,480],[179,487],[180,487],[181,487],[182,487],[248,480],[184,502],[207,503],[202,503],[193,504],[191,505],[205,506],[194,507],[208,508],[203,509],[204,506],[206,510],[192,4],[197,4],[189,511],[190,512],[187,4],[188,513],[186,487],[195,514],[66,515],[215,4],[216,4],[217,4],[218,4],[219,4],[220,4],[209,4],[212,488],[211,4],[210,516],[183,517],[196,518],[52,4],[53,4],[9,4],[10,4],[14,4],[13,4],[2,4],[15,4],[16,4],[17,4],[18,4],[19,4],[20,4],[21,4],[22,4],[3,4],[4,4],[23,4],[27,4],[24,4],[25,4],[26,4],[28,4],[29,4],[30,4],[5,4],[31,4],[32,4],[33,4],[34,4],[6,4],[38,4],[35,4],[36,4],[37,4],[39,4],[7,4],[40,4],[45,4],[46,4],[41,4],[42,4],[43,4],[44,4],[8,4],[54,4],[50,4],[47,4],[48,4],[49,4],[1,4],[51,4],[12,4],[11,4],[442,519],[452,520],[441,519],[462,521],[433,522],[432,523],[461,471],[455,524],[460,525],[435,526],[449,527],[434,528],[458,529],[430,530],[429,471],[459,531],[431,532],[436,533],[437,4],[440,533],[427,4],[463,534],[453,535],[444,536],[445,537],[447,538],[443,539],[446,540],[456,471],[438,541],[439,542],[448,543],[428,544],[451,535],[450,533],[454,4],[457,545],[846,546],[940,547],[942,548],[941,549],[943,550],[788,551],[786,7],[794,552],[785,553],[787,554],[789,555],[791,555],[793,556],[790,555],[953,557],[792,555],[773,7],[777,558],[954,559],[753,560],[757,561],[610,553],[752,562],[756,563],[955,564],[795,556],[796,565],[833,566],[832,566],[834,567],[831,568],[956,569],[765,570],[766,571],[764,572],[762,573],[763,574],[761,572],[957,575],[798,576],[799,577],[797,572],[836,578],[837,579],[835,572],[958,580],[841,581],[842,582],[840,572],[804,583],[805,584],[803,572],[838,585],[839,586],[830,572],[781,587],[784,588],[780,589],[959,590],[960,591],[782,592],[783,593],[779,594],[961,595],[768,596],[769,597],[767,572],[962,598],[776,599],[775,600],[778,601],[774,602],[963,603],[801,604],[802,605],[800,572],[964,606],[844,607],[845,608],[843,572],[965,609],[771,610],[772,611],[770,572],[827,612],[829,613],[828,614],[966,615],[759,616],[760,617],[758,572],[532,572],[531,618]],"exportedModulesMap":[[529,1],[528,2],[969,3],[967,4],[983,4],[1177,5],[332,4],[319,4],[56,4],[308,6],[309,6],[310,4],[311,7],[321,8],[312,6],[313,9],[314,4],[315,4],[316,6],[317,6],[318,6],[320,10],[328,11],[330,4],[327,4],[334,12],[331,4],[329,4],[325,13],[326,14],[333,15],[335,16],[322,4],[324,17],[323,18],[262,4],[265,19],[261,4],[894,4],[263,4],[264,4],[338,20],[339,20],[340,20],[341,20],[342,20],[343,20],[344,20],[337,21],[345,20],[359,22],[346,20],[336,4],[347,20],[348,20],[349,20],[350,20],[351,20],[352,20],[353,20],[354,20],[355,20],[356,20],[357,20],[358,20],[367,23],[365,24],[364,4],[363,4],[366,25],[407,26],[57,4],[58,4],[59,4],[876,27],[61,28],[882,29],[881,30],[251,31],[252,28],[387,4],[281,4],[282,4],[388,32],[253,4],[389,4],[390,33],[60,4],[255,34],[256,35],[254,36],[257,34],[258,4],[260,37],[272,38],[273,4],[278,39],[274,4],[275,4],[276,4],[277,4],[279,4],[280,40],[286,41],[289,42],[287,4],[288,4],[307,43],[290,4],[291,4],[925,44],[271,45],[269,46],[267,47],[268,48],[270,4],[298,49],[292,4],[301,50],[294,51],[299,52],[297,53],[300,54],[295,55],[296,56],[284,57],[303,58],[285,59],[305,60],[306,61],[293,4],[302,4],[259,4],[266,62],[304,63],[373,64],[368,4],[374,65],[369,66],[370,67],[371,68],[372,69],[375,70],[380,71],[378,72],[379,72],[386,73],[376,4],[377,74],[381,71],[383,75],[385,76],[384,77],[399,78],[392,79],[393,80],[394,80],[395,81],[396,81],[397,80],[398,80],[391,82],[401,83],[400,84],[403,85],[402,86],[404,87],[360,88],[362,89],[283,4],[361,57],[405,90],[382,91],[406,92],[408,7],[520,93],[521,94],[525,95],[409,4],[415,96],[518,97],[519,98],[410,4],[411,4],[414,99],[412,4],[413,4],[523,4],[524,100],[522,101],[526,102],[806,103],[847,104],[867,105],[868,106],[869,4],[870,107],[871,108],[880,109],[873,110],[877,111],[885,112],[883,7],[884,113],[874,114],[886,4],[888,115],[889,116],[890,117],[879,118],[875,119],[899,120],[887,121],[914,122],[872,123],[915,124],[912,125],[913,7],[937,126],[862,127],[858,128],[860,129],[911,130],[853,131],[901,132],[900,4],[861,133],[908,134],[865,135],[909,4],[910,136],[863,137],[864,138],[859,139],[857,140],[852,4],[905,141],[918,142],[916,7],[848,7],[904,143],[849,14],[850,106],[851,144],[855,145],[854,146],[917,147],[856,148],[893,149],[891,115],[892,150],[902,14],[903,151],[906,152],[921,153],[922,154],[919,155],[920,156],[923,157],[924,158],[926,159],[898,160],[895,161],[896,6],[897,150],[928,162],[927,163],[934,164],[866,7],[930,165],[929,7],[932,166],[931,4],[933,167],[878,168],[907,169],[936,170],[935,7],[540,171],[536,172],[535,173],[537,4],[538,174],[539,175],[541,176],[542,4],[546,177],[560,178],[543,7],[545,179],[544,4],[547,180],[558,181],[559,182],[561,183],[810,184],[811,185],[825,186],[813,187],[812,188],[807,189],[808,4],[809,4],[824,190],[815,191],[816,191],[817,191],[818,191],[820,192],[819,191],[821,193],[822,194],[814,4],[823,195],[562,4],[563,4],[566,196],[588,197],[567,4],[568,4],[569,7],[571,4],[570,4],[589,4],[572,4],[573,198],[574,4],[575,7],[576,4],[577,199],[579,200],[580,4],[582,201],[583,200],[584,202],[590,203],[585,199],[586,199],[591,204],[596,205],[607,206],[587,4],[578,199],[595,207],[564,4],[581,208],[593,209],[594,4],[592,4],[597,210],[598,7],[603,211],[599,7],[600,7],[601,7],[602,7],[565,4],[605,202],[604,4],[606,212],[952,213],[950,214],[944,7],[945,4],[949,215],[946,216],[951,217],[948,218],[947,219],[530,220],[527,4],[1176,221],[987,222],[988,223],[1125,222],[1126,224],[1107,225],[1108,226],[991,227],[992,228],[1062,229],[1063,230],[1036,222],[1037,231],[1030,222],[1031,232],[1122,233],[1120,234],[1121,4],[1136,235],[1137,236],[1006,237],[1007,238],[1138,239],[1139,240],[1140,241],[1141,242],[998,243],[999,244],[1124,245],[1123,246],[1109,222],[1110,247],[1002,248],[1003,249],[1026,4],[1027,250],[1144,251],[1142,252],[1143,253],[1145,254],[1146,255],[1149,256],[1147,257],[1150,234],[1148,258],[1151,259],[1154,260],[1152,261],[1153,262],[1155,263],[1004,243],[1005,264],[1130,265],[1127,266],[1128,267],[1129,4],[1105,268],[1106,269],[1050,270],[1049,271],[1047,272],[1046,273],[1048,274],[1157,275],[1156,276],[1159,277],[1158,278],[1035,279],[1034,222],[1013,280],[1011,281],[1010,227],[1012,282],[1162,283],[1166,284],[1160,285],[1161,286],[1163,283],[1164,283],[1165,283],[1052,287],[1051,227],[1068,288],[1066,289],[1067,234],[1064,290],[1065,291],[1001,292],[1000,222],[1058,293],[989,222],[990,294],[1057,295],[1095,296],[1098,297],[1096,298],[1097,299],[1009,300],[1008,222],[1100,301],[1099,227],[1078,302],[1077,222],[1033,303],[1032,222],[1104,304],[1103,305],[1072,306],[1071,307],[1069,308],[1070,309],[1061,310],[1060,311],[1059,312],[1168,313],[1167,314],[1085,315],[1084,316],[1083,317],[1132,318],[1131,4],[1076,319],[1075,320],[1073,321],[1074,322],[1054,323],[1053,227],[997,324],[996,325],[995,326],[994,327],[993,328],[1089,329],[1088,330],[1019,331],[1018,227],[1023,332],[1022,333],[1087,334],[1086,222],[1133,4],[1135,335],[1134,4],[1092,336],[1091,337],[1090,338],[1170,339],[1169,340],[1172,341],[1171,342],[1118,343],[1119,344],[1117,345],[1056,346],[1055,4],[1102,347],[1101,348],[1029,349],[1028,222],[1080,350],[1079,222],[986,351],[985,4],[1039,352],[1040,353],[1045,354],[1038,355],[1042,356],[1041,357],[1043,358],[1044,359],[1094,360],[1093,227],[1025,361],[1024,227],[1175,362],[1174,363],[1173,364],[1112,365],[1111,222],[1082,366],[1081,222],[1017,367],[1015,368],[1014,227],[1016,369],[1114,370],[1113,222],[1021,371],[1020,222],[1116,372],[1115,222],[972,373],[968,3],[970,374],[971,3],[973,4],[555,375],[939,376],[554,377],[974,4],[979,378],[978,379],[977,380],[975,4],[551,381],[556,382],[552,4],[980,4],[981,383],[982,384],[1183,385],[976,4],[534,386],[1184,4],[533,4],[826,387],[465,388],[466,388],[467,389],[468,390],[469,391],[470,392],[416,4],[419,393],[417,4],[418,4],[471,394],[472,395],[473,396],[474,397],[475,398],[476,399],[477,399],[478,400],[479,401],[480,402],[481,403],[422,4],[482,404],[483,405],[484,406],[485,407],[486,408],[487,409],[488,410],[489,411],[490,412],[491,413],[492,414],[493,415],[494,416],[495,416],[496,417],[497,4],[498,418],[500,419],[499,420],[501,421],[502,422],[503,423],[504,424],[505,425],[506,426],[507,427],[421,428],[420,4],[516,429],[508,430],[509,431],[510,432],[511,433],[512,434],[513,435],[423,4],[424,4],[425,4],[464,436],[514,437],[515,438],[755,439],[754,440],[557,441],[549,4],[550,4],[548,442],[553,443],[1185,4],[1194,444],[1186,4],[1189,445],[1192,446],[1193,447],[1187,448],[1190,449],[1188,450],[1199,451],[1196,452],[1198,4],[1197,453],[1195,454],[653,455],[644,4],[645,4],[646,4],[647,4],[648,4],[649,4],[650,4],[651,4],[652,4],[1200,4],[1201,456],[609,457],[608,4],[426,4],[984,4],[614,4],[616,458],[735,459],[739,459],[738,459],[736,459],[737,459],[740,459],[617,459],[629,459],[618,459],[631,459],[633,459],[626,459],[627,459],[628,459],[632,459],[634,459],[619,459],[630,459],[620,459],[622,460],[623,459],[624,459],[625,459],[641,459],[640,459],[743,461],[635,459],[637,459],[636,459],[638,459],[639,459],[742,459],[741,459],[642,459],[654,462],[655,462],[657,459],[703,459],[702,459],[723,459],[658,462],[700,459],[704,459],[659,459],[660,459],[661,462],[705,459],[699,462],[656,462],[706,459],[662,462],[707,459],[663,462],[687,459],[664,459],[708,459],[665,459],[697,462],[667,459],[668,459],[709,463],[670,459],[672,459],[673,459],[679,459],[680,459],[681,459],[674,462],[711,459],[698,462],[710,462],[675,459],[676,459],[712,459],[677,459],[669,462],[713,459],[696,459],[714,459],[678,462],[682,459],[683,459],[701,462],[715,459],[716,459],[695,464],[671,459],[717,462],[718,459],[719,459],[720,459],[721,462],[684,459],[722,459],[686,462],[688,459],[685,462],[666,459],[689,459],[692,459],[690,459],[691,459],[643,459],[725,459],[724,459],[726,459],[733,459],[727,459],[728,459],[730,459],[731,459],[729,459],[734,459],[732,459],[751,465],[749,466],[750,467],[748,468],[747,459],[746,469],[613,4],[615,4],[611,4],[744,4],[745,470],[621,458],[612,4],[517,471],[1182,472],[1191,473],[938,189],[1179,474],[1180,475],[1181,4],[694,476],[693,4],[1178,477],[55,4],[250,478],[223,4],[201,479],[199,479],[114,480],[65,481],[64,482],[200,483],[185,484],[107,485],[63,486],[62,487],[249,482],[214,488],[213,488],[125,489],[221,480],[222,480],[224,490],[225,480],[226,487],[227,480],[198,480],[228,480],[229,491],[230,480],[231,488],[232,492],[233,480],[234,480],[235,480],[236,480],[237,488],[238,480],[239,480],[240,480],[241,480],[242,493],[243,480],[244,480],[245,480],[246,480],[247,480],[67,487],[68,487],[69,487],[70,487],[71,487],[72,487],[73,487],[74,480],[76,494],[77,487],[75,487],[78,487],[79,487],[80,487],[81,487],[82,487],[83,487],[84,480],[85,487],[86,487],[87,487],[88,487],[89,487],[90,480],[91,487],[92,487],[93,487],[94,487],[95,487],[96,487],[97,480],[99,495],[98,487],[100,487],[101,487],[102,487],[103,487],[104,493],[105,480],[106,480],[120,496],[108,497],[109,487],[110,487],[111,480],[112,487],[113,487],[115,498],[116,487],[117,487],[118,487],[119,487],[121,487],[122,487],[123,487],[124,487],[126,499],[127,487],[128,487],[129,487],[130,480],[131,487],[132,500],[133,500],[134,500],[135,480],[136,487],[137,487],[138,487],[143,487],[139,487],[140,480],[141,487],[142,480],[144,487],[145,487],[146,487],[147,487],[148,487],[149,487],[150,480],[151,487],[152,487],[153,487],[154,487],[155,487],[156,487],[157,487],[158,487],[159,487],[160,487],[161,487],[162,487],[163,487],[164,487],[165,487],[166,487],[167,501],[168,487],[169,487],[170,487],[171,487],[172,487],[173,487],[174,480],[175,480],[176,480],[177,480],[178,480],[179,487],[180,487],[181,487],[182,487],[248,480],[184,502],[207,503],[202,503],[193,504],[191,505],[205,506],[194,507],[208,508],[203,509],[204,506],[206,510],[192,4],[197,4],[189,511],[190,512],[187,4],[188,513],[186,487],[195,514],[66,515],[215,4],[216,4],[217,4],[218,4],[219,4],[220,4],[209,4],[212,488],[211,4],[210,516],[183,517],[196,518],[52,4],[53,4],[9,4],[10,4],[14,4],[13,4],[2,4],[15,4],[16,4],[17,4],[18,4],[19,4],[20,4],[21,4],[22,4],[3,4],[4,4],[23,4],[27,4],[24,4],[25,4],[26,4],[28,4],[29,4],[30,4],[5,4],[31,4],[32,4],[33,4],[34,4],[6,4],[38,4],[35,4],[36,4],[37,4],[39,4],[7,4],[40,4],[45,4],[46,4],[41,4],[42,4],[43,4],[44,4],[8,4],[54,4],[50,4],[47,4],[48,4],[49,4],[1,4],[51,4],[12,4],[11,4],[442,519],[452,520],[441,519],[462,521],[433,522],[432,523],[461,471],[455,524],[460,525],[435,526],[449,527],[434,528],[458,529],[430,530],[429,471],[459,531],[431,532],[436,533],[437,4],[440,533],[427,4],[463,534],[453,535],[444,536],[445,537],[447,538],[443,539],[446,540],[456,471],[438,541],[439,542],[448,543],[428,544],[451,535],[450,533],[454,4],[457,545],[846,546],[940,547],[942,548],[941,549],[943,550],[788,619],[786,7],[785,553],[787,620],[789,555],[791,621],[793,620],[790,622],[953,557],[792,555],[753,560],[757,561],[610,553],[752,562],[756,563],[955,564],[795,556],[796,565],[833,566],[832,566],[834,567],[831,568],[956,569],[765,570],[766,571],[764,572],[762,573],[763,574],[761,572],[957,575],[798,576],[799,577],[797,572],[836,578],[837,579],[835,572],[958,580],[841,581],[842,582],[840,572],[804,583],[805,584],[803,572],[838,585],[839,586],[830,572],[781,623],[780,624],[959,625],[782,626],[779,620],[768,596],[769,597],[767,572],[962,598],[776,627],[775,628],[774,629],[801,604],[802,605],[800,572],[964,606],[844,607],[845,608],[843,572],[965,609],[771,610],[772,611],[770,572],[827,612],[829,613],[828,614],[966,615],[759,616],[760,617],[758,572],[532,572],[531,618]],"semanticDiagnosticsPerFile":[529,528,969,967,983,1177,332,319,56,308,309,310,311,321,312,313,314,315,316,317,318,320,328,330,327,334,331,329,325,326,333,335,322,324,323,262,265,261,894,263,264,338,339,340,341,342,343,344,337,345,359,346,336,347,348,349,350,351,352,353,354,355,356,357,358,367,365,364,363,366,407,57,58,59,876,61,882,881,251,252,387,281,282,388,253,389,390,60,255,256,254,257,258,260,272,273,278,274,275,276,277,279,280,286,289,287,288,307,290,291,925,271,269,267,268,270,298,292,301,294,299,297,300,295,296,284,303,285,305,306,293,302,259,266,304,373,368,374,369,370,371,372,375,380,378,379,386,376,377,381,383,385,384,399,392,393,394,395,396,397,398,391,401,400,403,402,404,360,362,283,361,405,382,406,408,520,521,525,409,415,518,519,410,411,414,412,413,523,524,522,526,806,847,867,868,869,870,871,880,873,877,885,883,884,874,886,888,889,890,879,875,899,887,914,872,915,912,913,937,862,858,860,911,853,901,900,861,908,865,909,910,863,864,859,857,852,905,918,916,848,904,849,850,851,855,854,917,856,893,891,892,902,903,906,921,922,919,920,923,924,926,898,895,896,897,928,927,934,866,930,929,932,931,933,878,907,936,935,540,536,535,537,538,539,541,542,546,560,543,545,544,547,558,559,561,810,811,825,813,812,807,808,809,824,815,816,817,818,820,819,821,822,814,823,562,563,566,588,567,568,569,571,570,589,572,573,574,575,576,577,579,580,582,583,584,590,585,586,591,596,607,587,578,595,564,581,593,594,592,597,598,603,599,600,601,602,565,605,604,606,952,950,944,945,949,946,951,948,947,530,527,1176,987,988,1125,1126,1107,1108,991,992,1062,1063,1036,1037,1030,1031,1122,1120,1121,1136,1137,1006,1007,1138,1139,1140,1141,998,999,1124,1123,1109,1110,1002,1003,1026,1027,1144,1142,1143,1145,1146,1149,1147,1150,1148,1151,1154,1152,1153,1155,1004,1005,1130,1127,1128,1129,1105,1106,1050,1049,1047,1046,1048,1157,1156,1159,1158,1035,1034,1013,1011,1010,1012,1162,1166,1160,1161,1163,1164,1165,1052,1051,1068,1066,1067,1064,1065,1001,1000,1058,989,990,1057,1095,1098,1096,1097,1009,1008,1100,1099,1078,1077,1033,1032,1104,1103,1072,1071,1069,1070,1061,1060,1059,1168,1167,1085,1084,1083,1132,1131,1076,1075,1073,1074,1054,1053,997,996,995,994,993,1089,1088,1019,1018,1023,1022,1087,1086,1133,1135,1134,1092,1091,1090,1170,1169,1172,1171,1118,1119,1117,1056,1055,1102,1101,1029,1028,1080,1079,986,985,1039,1040,1045,1038,1042,1041,1043,1044,1094,1093,1025,1024,1175,1174,1173,1112,1111,1082,1081,1017,1015,1014,1016,1114,1113,1021,1020,1116,1115,972,968,970,971,973,555,939,554,974,979,978,977,975,551,556,552,980,981,982,1183,976,534,1184,533,826,465,466,467,468,469,470,416,419,417,418,471,472,473,474,475,476,477,478,479,480,481,422,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,500,499,501,502,503,504,505,506,507,421,420,516,508,509,510,511,512,513,423,424,425,464,514,515,755,754,557,549,550,548,553,1185,1194,1186,1189,1192,1193,1187,1190,1188,1199,1196,1198,1197,1195,653,644,645,646,647,648,649,650,651,652,1200,1201,609,608,426,984,614,616,735,739,738,736,737,740,617,629,618,631,633,626,627,628,632,634,619,630,620,622,623,624,625,641,640,743,635,637,636,638,639,742,741,642,654,655,657,703,702,723,658,700,704,659,660,661,705,699,656,706,662,707,663,687,664,708,665,697,667,668,709,670,672,673,679,680,681,674,711,698,710,675,676,712,677,669,713,696,714,678,682,683,701,715,716,695,671,717,718,719,720,721,684,722,686,688,685,666,689,692,690,691,643,725,724,726,733,727,728,730,731,729,734,732,751,749,750,748,747,746,613,615,611,744,745,621,612,517,1182,1191,938,1179,1180,1181,694,693,1178,55,250,223,201,199,114,65,64,200,185,107,63,62,249,214,213,125,221,222,224,225,226,227,198,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,67,68,69,70,71,72,73,74,76,77,75,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,99,98,100,101,102,103,104,105,106,120,108,109,110,111,112,113,115,116,117,118,119,121,122,123,124,126,127,128,129,130,131,132,133,134,135,136,137,138,143,139,140,141,142,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,248,184,207,202,193,191,205,194,208,203,204,206,192,197,189,190,187,188,186,195,66,215,216,217,218,219,220,209,212,211,210,183,196,52,53,9,10,14,13,2,15,16,17,18,19,20,21,22,3,4,23,27,24,25,26,28,29,30,5,31,32,33,34,6,38,35,36,37,39,7,40,45,46,41,42,43,44,8,54,50,47,48,49,1,51,12,11,442,452,441,462,433,432,461,455,460,435,449,434,458,430,429,459,431,436,437,440,427,463,453,444,445,447,443,446,456,438,439,448,428,451,450,454,457,846,940,942,941,943,788,786,794,785,787,789,791,793,790,953,792,773,777,954,753,757,610,752,756,955,795,796,833,832,834,831,956,765,766,764,762,763,761,957,798,799,797,836,837,835,958,841,842,840,804,805,803,838,839,830,781,784,780,959,960,782,783,779,961,768,769,767,962,776,775,778,774,963,801,802,800,964,844,845,843,965,771,772,770,827,829,828,966,759,760,758,532,531]},"version":"5.3.3"} \ No newline at end of file diff --git a/backend/uploads/843b1def-80bc-4339-9795-5a792512b1f4.png b/backend/uploads/843b1def-80bc-4339-9795-5a792512b1f4.png old mode 100644 new mode 100755 diff --git a/backend/uploads/bba131c5-d294-46ae-a944-f07d0efe24fa.png b/backend/uploads/bba131c5-d294-46ae-a944-f07d0efe24fa.png old mode 100644 new mode 100755 diff --git a/backend/uploads/d45cadcc-795c-4a2c-99c6-d08119c8ce7b.png b/backend/uploads/d45cadcc-795c-4a2c-99c6-d08119c8ce7b.png old mode 100644 new mode 100755 diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index d17f21f..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,74 +0,0 @@ -version: '3.8' - -services: - mysql: - image: mysql:8.0 - container_name: yuzhiran-mysql - restart: unless-stopped - environment: - MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root123} - MYSQL_DATABASE: yuzhiran - MYSQL_USER: yuzhiran - MYSQL_PASSWORD: ${MYSQL_PASSWORD:-yuzhiran123} - ports: - - "3306:3306" - volumes: - - mysql_data:/var/lib/mysql - - ./scripts/init.sql:/docker-entrypoint-initdb.d/init.sql - healthcheck: - test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] - interval: 10s - timeout: 5s - retries: 5 - - backend: - build: - context: ./backend - dockerfile: Dockerfile - container_name: yuzhiran-backend - restart: unless-stopped - ports: - - "4000:4000" - environment: - NODE_ENV: production - PORT: 4000 - DATABASE_URL: mysql://yuzhiran:${MYSQL_PASSWORD:-yuzhiran123}@mysql:3306/yuzhiran - JWT_SECRET: ${JWT_SECRET:-yuzhiran-jwt-secret-2024} - volumes: - - ./backend/uploads:/app/uploads - depends_on: - mysql: - condition: service_healthy - healthcheck: - test: ["CMD", "wget", "--spider", "http://localhost:4000/api/docs"] - interval: 30s - timeout: 10s - retries: 3 - - frontend: - build: - context: ./frontend - dockerfile: Dockerfile - container_name: yuzhiran-frontend - restart: unless-stopped - ports: - - "3000:3000" - environment: - NODE_ENV: production - NEXT_PUBLIC_API_URL: http://localhost:4000 - depends_on: - - backend - - # Uncomment when Redis is available: - # redis: - # image: redis:7-alpine - # container_name: yuzhiran-redis - # restart: unless-stopped - # ports: - # - "6379:6379" - # volumes: - # - redis_data:/data - -volumes: - mysql_data: - # redis_data: diff --git a/docs/admin-system-plan.md b/docs/admin-system-plan.md old mode 100644 new mode 100755 diff --git a/docs/archive/progress-2026-05-12-before-notifications.md b/docs/archive/progress-2026-05-12-before-notifications.md old mode 100644 new mode 100755 diff --git a/docs/design-tokens.md b/docs/design-tokens.md old mode 100644 new mode 100755 diff --git a/docs/progress.md b/docs/progress.md old mode 100644 new mode 100755 index f21920e..b351e18 --- a/docs/progress.md +++ b/docs/progress.md @@ -1,8 +1,8 @@ # 项目进度追踪 -## 当前阶段:P3 — 体验增强 +## 当前阶段:P4 — 支付闭环 + 部署 -### Phase 1-3 — 全部完成 ✅ +### Phase 1-4 — 全部完成 ✅ ### P0 — 全局优化(全部完成 ✅) | 子项 | 说明 | 状态 | @@ -36,74 +36,203 @@ | **P3c** | 会话重命名 | PATCH endpoint + 双击编辑 | ✅ | | — | SDK / 共享 UI 包 | 远期规划 | 📋 | -### 参考来源 -- opencode 源码克隆到 `/tmp/opencode-source/`(21 packages, 147MB) - -### P4 — 支付闭环(进行中 🔄) +### P4 — 支付闭环 + 统一网关(已完成 ✅) | 子项 | 说明 | 状态 | |------|------|------| -| **P4a** | Mock 支付自动完成 — `PaymentService.completeMockPayment()` + `OrdersService` 检测 mock 结果后自动调用 | ✅ | -| **P4b** | 会员页面 mock 提示优化 — 显示"订阅成功"而非"请扫码支付" | ✅ | -| **P4c** | 真实微信支付证书部署 — 商户证书/密钥已安装到 `backend/cert/key/`,参数与 `.env` 一致 | ✅ | -| **P4d** | 下单切 NATIVE 扫码支付 — 默认 `tradeType: 'NATIVE'`,前端展示二维码 Modal + 轮询支付状态 | ✅ | -| **P4e** | JSAPI 支付集成 — 检测微信环境 + openid,在 Mini Program web-view 内自动调起 `WeixinJSBridge`;其他场景 NATIVE 兜底 | ✅ | +| **P4a** | 统一支付网关集成 — `GatewayPayService` HMAC-SHA256 对接 yzrcloud.cn 网关,支持支付宝/微信 | ✅ | +| **P4b** | 会员页双支付按钮 — 支付宝/微信可选,统一走网关 | ✅ | +| **P4c** | 网关 Webhook 接收 — `POST /api/v1/payment/gateway/webhook`,处理 `recharge.completed` / `order.refunded` | ✅ | +| **P4d** | 管理后台订单增强 — 搜索/分页/渠道筛选/退款弹窗/标记已付 | ✅ | +| **P4e** | Mock 降级 — 网关不可达时自动 mock 完成支付,不影响开发 | ✅ | | — | 订阅到期提醒 / 自动续费 | 📋 远期 | -| — | 获取公众号 appid 后补充 Web OAuth 流程 | 📋 待定 | ### P5 — 运营助手(已完成 ✅) | 子项 | 说明 | 状态 | |------|------|------| -| **P5a** | 新增 `POST /admin/ai-assistant/chat` 端点 — 管理员专用 AI 聊天,使用 AdminGuard | ✅ | -| **P5b** | 新增 `AdminAiAssistantService` — 19 个可执行工具定义(查看数据/用户管理/评论审核/状态切换等) | ✅ | -| **P5c** | 新增 `POST /admin/ai-assistant/action` 端点 — 工具执行 + AI 自然语言总结 | ✅ | -| **P5d** | 前端运营助手改造 — Tool Calling 架构,AI 自动识别用户意图→调用工具→解释结果→展示 | ✅ | -| **P5e** | system prompt 动态注入可用工具列表,覆盖仪表盘/用户/订单/评论/Banner/通知/配置/角色/企业版等 | ✅ | +| **P5a** | 新增 `POST /admin/ai-assistant/chat` 端点 — 管理员专用 AI 聊天 | ✅ | +| **P5b** | `AdminAiAssistantService` — 19 个可执行工具定义 | ✅ | +| **P5c** | `POST /admin/ai-assistant/action` — 工具执行 + AI 总结 | ✅ | +| **P5d** | 前端 Tool Calling 架构 — AI 自动识别意图→调用→解释→展示 | ✅ | +| **P5e** | system prompt 动态注入工具列表 | ✅ | -### 关键决策 -- `frontend/src/lib/models.ts` 作为模型列表单数据源 -- 所有颜色使用 CSS 变量(`text-foreground`/`text-muted-foreground`/`bg-card`/`bg-muted`/`border-border`) -- `nest build` 正常产出(`--tsc` 遗漏 prisma 模块) -- 沙盒 JWT 认证保留 -- Mock 支付自动完成闭环,无需手动触发回调;真实微信支付上线后自动切换 -- 运营助手采用 Tool Calling 架构:system prompt 描述工具 → AI 返回 JSON 工具调用 → 后端执行 → 结果喂回 AI 总结 → 展示给用户 +--- -## 2026-05-27 Session +## 部署架构 + +### 域名概况 + +| 域名 | 类型 | 说明 | 状态 | +|------|------|------|------| +| **www.yuzhiran.com** | AI 学习平台 | 前端静态导出 + NestJS 后端 | 🟢 线上 | +| **trade.yuzhiran.com** | 另一项目(非 AI 平台) | SPA 应用,独立后端 8002 端口 | 🟢 线上 | +| **alvnc.yuzhiran.com** | 其他服务 | — | 🟢 线上 | + +### www.yuzhiran.com 部署详情 + +``` +用户 → Nginx (443/80) → /api/* → backend (127.0.0.1:4000) + → /* → static files (/www/wwwroot/www.yuzhiran.com/) +``` + +| 组件 | 技术栈 | 运行方式 | 端口 | +|------|--------|---------|------| +| **前端** | Next.js 14 App Router → `output: 'export'` 静态 HTML | Nginx 直接提供 `/www/wwwroot/www.yuzhiran.com/` | 443/80 | +| **后端** | NestJS + Prisma + MySQL | PM2 (`yuzhiran-api`) | 4000 | +| **数据库** | MySQL 8.0 | systemd (`ai_leaning`) | 3306 | +| **Web 服务器** | Nginx (宝塔面板) | systemd | 443/80 | +| **支付网关** | yzrcloud.cn 统一网关 | 外部服务 | 8100(内网) | + +**Nginx 配置** (`/www/server/panel/vhost/nginx/www.yuzhiran.com.conf`): +- 静态资源 `/` → `try_files $uri $uri.html $uri/index.html =404` +- API 代理 `/api/` → `proxy_pass http://127.0.0.1:4000` +- 静态资源缓存: `_next/static/` 365 天, 图片 30 天, JS/CSS 12 小时 + +**部署流程**: +```bash +# 前端 +cd frontend && npm run build # 生成 out/ +cp -r out/* /www/wwwroot/www.yuzhiran.com/ + +# 后端 +cd backend && npm run build # 生成 dist/ +pm2 restart yuzhiran-api +``` + +### trade.yuzhiran.com(独立项目) + +非 AI 学习平台项目,独立部署: +- 前端 SPA (React),root at `/www/wwwroot/trade.yuzhiran.com/` +- 后端 API at `127.0.0.1:8002` +- 路由: `/admin/` → SPA fallback, `/workspace/` → SPA fallback + +--- + +## 支付对接 + +### 架构总览 + +``` +前端 (会员页) → POST /orders/create → GatewayPayService → HMAC-SHA256 → yzrcloud.cn 网关 + ├── 支付宝 PC 网站 + └── 微信 Native 扫码 +网关回调 → POST /api/v1/payment/gateway/webhook → 更新订单 + 激活订阅 +``` + +### 统一支付网关对接参数 + +| 参数 | 值 | 来源 | +|------|-----|------| +| 网关地址(内网) | `http://localhost:8100` | `.env` | +| 网关地址(外网) | `https://www.yzrcloud.cn/api/gateway` | 未启用 | +| API Key | `pay_2ac89d9831244c2ebdbb2a24` | AI学习平台.key | +| API Secret | `6a2e6c6801384bd0800849ef42ad5e8ef51898819895478a` | AI学习平台.key | +| 签名算法 | HMAC-SHA256 | `sign_str = "{method}\n{path}\n{timestamp}\n{body_sha256}"` | +| Webhook | `POST /api/v1/payment/gateway/webhook` | 后端接收 | +| 支付方式 | `alipay` / `wechat` | 网关统一处理 | +| Mock 模式 | `GATEWAY_PAY_MOCK=true` | 开发环境启用 | + +### 后端对接文件 + +| 文件 | 说明 | +|------|------| +| `backend/src/modules/payment/gateway-pay.service.ts` | 核心网关服务,HMAC 签名 + 下单/查询/退款/Webhook | +| `backend/src/modules/payment/payment.controller.ts` | `/api/v1/payment/gateway/webhook` 等端点 | +| `backend/src/modules/orders/orders.service.ts` | 下单路由,统一走网关 | +| `backend/.env` | `GATEWAY_PAY_*` 配置项 | + +### API 端点一览 + +| 方法 | 路径 | 说明 | 认证 | +|------|------|------|------| +| POST | `/api/v1/payment/gateway/webhook` | 网关支付成功/退款回调 | 无(网关签名在 body 中) | +| GET | `/api/v1/payment/wxpay/query?outTradeNo=xxx` | 订单状态查询(转网关) | JWT | +| POST | `/api/v1/payment/wxpay/refund` | 退款(转网关) | JWT | +| POST | `/api/v1/orders/create` | 创建订单+发起支付 | JWT | +| GET | `/api/v1/admin/orders?page=&search=&status=&payChannel=` | 管理员订单搜索 | Admin JWT | +| POST | `/api/v1/admin/orders/:orderNo/refund` | 管理员退款 | Admin JWT | +| POST | `/api/v1/admin/orders/:orderNo/mark-paid` | 标记人工已付 | Admin JWT | + +### 商户密钥文件 + +备份位置: `/root/hermes-workspace/backup/网关支付/pay-api/merchants/AI学习平台.key` + +--- + +## 2026-05-31 Session (下午) ### Changes Made -- **Fixed OpenAI default model**: Changed `OPENAI_MODEL` in `.env` from `meituan/longcat-flash-lite` (invalid, returned 400) to `deepseek/deepseek-v4-flash` (confirmed working on qnaigc API). The "通用模式" (general model) now returns real AI responses instead of mock fallback. -- **Fixed empty content handling**: Updated `OpenAICompatibleProvider.chat()` to fall back to `reasoning_content` when `content` is empty (SenseNova models return content in `reasoning_content`). Same fix applied in `chatStream()` for delta content. +- **AI 助手架构升级**: 用户端 + 管理后台双 AI 助手均采用完整 Tool Calling 架构 +- **新增 `UserAiAssistantService`**: 后台工具执行服务,18 个工具(搜索/技能/学情/通知/个人信息/模型/提示词/课程/订单) +- **新增 `AiAssistantController`**: `POST /api/v1/ai-assistant/chat` + `/action` 端点 +- **新增 `AiAssistantModule`**: 注册 SkillsModule + AIModule 依赖 +- **重写前端 `ai-assistant.tsx`**: Tool Calling 架构 + 页面感知上下文 + 登录控制 +- **更新前端 `admin-ai-assistant.tsx`**: 新增 search/mark-all-notifications-read 工具描述 + 更多 starter +- **新增后台 `search`/`mark-all-notifications-read` 工具**: 全局搜索用户/订单/课程/内容 + 通知批量已读 +- **重构 `assistant-actions.ts`**: 统一 `executeClientAction()` API,支持所有客户端操作 +- **清理 `assistant-context.ts`**: 精简为纯上下文数据源,移除旧 action 格式 + +### 用户端 AI 助手可用操作 +| 分类 | 工具 | +|------|------| +| 🧭 导航 | `navigate` — 跳转到任意页面 | +| 🔍 搜索 | `search` — 全局搜索课程/提示词/工具/文章 | +| 🎯 技能 | `list-skills` / `get-skill` / `get-skill-categories` | +| 📊 学情 | `get-learning-analytics` / `get-learning-path` | +| 🔔 通知 | `list-notifications` / `get-unread-count` / `mark-notification-read` / `mark-all-read` | +| 👤 个人 | `get-profile` / `list-user-orders` / `get-current-subscription` | +| 📚 内容 | `list-models` / `list-prompts` / `list-courses` | +| ⚡ 客户端 | `setModel` / `startChat` / `openSkill` / `setParameter` | + +### 管理后台新增工具 +| 工具 | 说明 | +|------|------| +| `search` | 全局搜索用户/订单/课程/内容 | +| `mark-all-notifications-read` | 批量标记所有通知已读 | ### Verification -- Backend successfully registers: `OpenAI 兼容接口已注册: deepseek/deepseek-v4-flash` -- 5 test chat requests to `POST /api/v1/sandbox/chat` with `model:"general"` all returned 201 in 1.3-12.7s (vs. previous mock/fallback) -- No more `AIGatewayService` "调用失败" errors in logs for OpenAI provider -- Backend runs under PM2 (v7.0.1), managed via `pm2 restart backend --update-env` +- ✅ 后端 92 项测试全部通过 +- ✅ 后端 TypeScript 编译无错误 +- ✅ 前端 75 静态页面全部生成成功 +- ✅ 所有文件创建/修改完成 -### Known Issues -- SenseNova API (`token.sensenova.cn`) still returns 404 "model is not found" for `deepseek-v4-flash` et al — models might need different naming on that endpoint -- Server: backend `node dist/main.js` on port 4000, frontend Next.js on port 3000, both managed by PM2 +--- +- `frontend/src/lib/models.ts` 作为模型列表单数据源 +- 所有颜色使用 CSS 变量(`text-foreground`/`text-muted-foreground`/`bg-card`/`bg-muted`/`border-border`) +- 沙盒 JWT 认证保留 +- 支付全部通过 yzrcloud.cn 统一网关处理,支持支付宝/微信 +- 运营助手采用 Tool Calling 架构 +- 前端静态导出 (`output: 'export'`) + Nginx 直接提供 +- 注册支持用户名、手机号、邮箱三选一,登录支持用户名/手机号/邮箱 +- 注册时校验重复用户名/手机号/邮箱并返回友好提示 +- 镜像站点 `www.yuzhiran.com.cn` 与主站配置同步 -### 2026-05-27 后续优化 +--- -**彻底修复 CSS 丢失问题** +## 2026-06-01 Session — 注册优化 + 镜像站部署 -根本原因:PM2 用 `npm run dev`(`next dev`)运行前端,每次重启都会重新编译,`.next` 缓存被销毁导致 CSS 丢失。 +### Changes Made +- **Prisma User 模型**: 新增 `username` 字段 (`String? @unique`) +- **注册 DTO**: 新增 `username` 字段验证(2-20位,支持中英文/数字/下划线) +- **注册逻辑重构** (`auth.service.ts`): + - 注册前分别检查 username/phone/email 是否已存在 → 友好提示 + - 三字段至少需提供一个 + - 注册成功用 username 做默认 nickname +- **登录逻辑** (`auth.service.ts`): `OR` 查询增加 `{ username: account }` +- **前端 i18n**: 新增 `username`/`usernameOptional`/`usernameConflict`/`phoneConflict`/`emailConflict` 翻译 key +- **前端 auth 页**: + - 注册表单增加用户名输入框 + - 前端预校验用户名格式(2-20位,中英文/数字/下划线) + - 友好错误映射:覆盖用户名/手机号/邮箱冲突提示 + - 登录框提示改为 "用户名 / 手机号 / 邮箱" +- **镜像站部署**: + - 前端静态文件部署至 `/www/wwwroot/www.yuzhiran.com.cn/` + - Nginx vhost 配置同步主站:Next.js clean URL + API proxy + 静态缓存 + - Nginx reload + PM2 restart -解决方案:改用 `output: 'export'` 静态导出 + 独立 HTTP 服务器。 - -| 文件 | 变更 | -|------|------| -| `frontend/server.js` | **新增** — Node.js 静态文件服务器,支持 Next.js 静态导出 URL 模式(`/about` → `about.html`),CSS/JS 缓存一年,HTML 不缓存 | -| `ecosystem.config.js` | 前端从 `npm run dev` 改为 `node server.js`,NODE_ENV=production | -| `frontend/package.json` | `predev` 改为仅删 `out/`,不再删 `.next/` | - -部署流程: -1. `npm run build` → 生成 `out/` 静态目录 -2. PM2 运行 `node server.js` → 直接提供静态文件 -3. 重启后 CSS 不变,无需重新编译 - -当前状态: -- 前端 `localhost:3000` (static server, 无编译延迟) -- 后端 `localhost:4000` (NestJS) -- 所有路由正常 (/, /about, /sandbox 均为 200) -- CSS 持久化,重启后不丢失 +### Verification +- ✅ Prisma db push 成功(`username` 列 + 唯一索引) +- ✅ 后端 92 项测试全部通过 +- ✅ 后端 TypeScript 编译无错误 +- ✅ 前端 75 静态页面全部生成成功 +- ✅ Nginx 配置语法验证通过 +- ✅ 主站 + 镜像站均已部署 diff --git a/docs/产品优化方向.md b/docs/产品优化方向.md old mode 100644 new mode 100755 diff --git a/docs/产品规划书.md b/docs/产品规划书.md old mode 100644 new mode 100755 diff --git a/docs/合规与运营方案.md b/docs/合规与运营方案.md old mode 100644 new mode 100755 diff --git a/docs/技术架构设计.md b/docs/技术架构设计.md old mode 100644 new mode 100755 diff --git a/ecosystem.config.js b/ecosystem.config.js old mode 100644 new mode 100755 index 3b4f141..7c80eea --- a/ecosystem.config.js +++ b/ecosystem.config.js @@ -1,8 +1,10 @@ +const path = require('path'); + module.exports = { apps: [ { name: 'backend', - cwd: '/home/wlt/ai-learning-platform/backend', + cwd: path.resolve(__dirname, 'backend'), script: 'node', args: 'dist/main.js', instances: 1, @@ -10,22 +12,8 @@ module.exports = { watch: false, max_restarts: 10, env: { - NODE_ENV: 'development' - } - }, - { - name: 'frontend', - cwd: '/home/wlt/ai-learning-platform/frontend', - script: 'node', - args: 'server.js', - instances: 1, - autorestart: true, - watch: false, - max_restarts: 3, - env: { - NODE_ENV: 'production', - PORT: 3000 + NODE_ENV: 'production' } } ] -} \ No newline at end of file +}; diff --git a/frontend/.dockerignore b/frontend/.dockerignore old mode 100644 new mode 100755 diff --git a/frontend/.env.example b/frontend/.env.example old mode 100644 new mode 100755 diff --git a/frontend/.eslintrc.json b/frontend/.eslintrc.json new file mode 100644 index 0000000..d2b3044 --- /dev/null +++ b/frontend/.eslintrc.json @@ -0,0 +1,4 @@ +{ + "extends": "next", + "rules": {} +} diff --git a/frontend/.gitignore b/frontend/.gitignore old mode 100644 new mode 100755 diff --git a/frontend/Dockerfile b/frontend/Dockerfile old mode 100644 new mode 100755 index 5448c9e..40e3d08 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -16,18 +16,16 @@ WORKDIR /app RUN apk add --no-cache tini -COPY --from=builder /app/.next ./.next +COPY --from=builder /app/out ./out COPY --from=builder /app/public ./public -COPY --from=builder /app/package*.json ./ -COPY --from=builder /app/node_modules ./node_modules -COPY --from=builder /app/next.config*.js ./ +COPY --from=builder /app/server.js ./server.js ENV NODE_ENV=production -ENV NEXT_TELEMETRY_DISABLED=1 +ENV PORT=3000 EXPOSE 3000 USER node ENTRYPOINT ["/sbin/tini", "--"] -CMD ["npm", "run", "start"] +CMD ["node", "server.js"] diff --git a/frontend/e2e/admin-pages.spec.ts b/frontend/e2e/admin-pages.spec.ts old mode 100644 new mode 100755 diff --git a/frontend/e2e/dark-mode.spec.ts b/frontend/e2e/dark-mode.spec.ts old mode 100644 new mode 100755 diff --git a/frontend/e2e/functional-pages.spec.ts b/frontend/e2e/functional-pages.spec.ts old mode 100644 new mode 100755 diff --git a/frontend/e2e/homepage.spec.ts b/frontend/e2e/homepage.spec.ts old mode 100644 new mode 100755 diff --git a/frontend/e2e/listing-pages.spec.ts b/frontend/e2e/listing-pages.spec.ts old mode 100644 new mode 100755 diff --git a/frontend/e2e/navigation.spec.ts b/frontend/e2e/navigation.spec.ts old mode 100644 new mode 100755 diff --git a/frontend/e2e/not-found.spec.ts b/frontend/e2e/not-found.spec.ts old mode 100644 new mode 100755 diff --git a/frontend/e2e/static-pages.spec.ts b/frontend/e2e/static-pages.spec.ts old mode 100644 new mode 100755 diff --git a/frontend/e2e/user-pages.spec.ts b/frontend/e2e/user-pages.spec.ts old mode 100644 new mode 100755 diff --git a/frontend/next-env.d.ts b/frontend/next-env.d.ts old mode 100644 new mode 100755 diff --git a/frontend/next.config.js b/frontend/next.config.js old mode 100644 new mode 100755 index bb2ec14..5bf8cc8 --- a/frontend/next.config.js +++ b/frontend/next.config.js @@ -4,7 +4,7 @@ const nextConfig = { images: { unoptimized: true }, typescript: { ignoreBuildErrors: true }, env: { - NEXT_PUBLIC_API_URL: process.env.NEXT_PUBLIC_API_URL || 'https://api.yuzhiran.com', + NEXT_PUBLIC_API_URL: process.env.NEXT_PUBLIC_API_URL || '/api/v1', NEXT_PUBLIC_SITE_URL: 'https://yuzhiran.com', NEXT_PUBLIC_SITE_NAME: '宇之然 AI', }, diff --git a/frontend/package-lock.json b/frontend/package-lock.json old mode 100644 new mode 100755 index 99caaa1..a0a3dc9 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -48,7 +48,11 @@ "@types/qrcode": "^1.5.6", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", + "@typescript-eslint/eslint-plugin": "^8.60.0", + "@typescript-eslint/parser": "^8.60.0", "@vitejs/plugin-react": "^6.0.1", + "eslint": "^8.57.1", + "eslint-config-next": "^16.2.6", "jsdom": "^29.1.1", "vitest": "^4.1.5" } @@ -124,14 +128,13 @@ "license": "MIT" }, "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", + "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -139,17 +142,213 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/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/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/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/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/runtime": { "version": "7.29.2", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", @@ -160,6 +359,54 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@bramus/specificity": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", @@ -347,6 +594,126 @@ "tslib": "^2.4.0" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/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/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/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/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@exodus/bytes": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.0.tgz", @@ -403,6 +770,75 @@ "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", "license": "MIT" }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/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/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -413,6 +849,17 @@ "@jridgewell/trace-mapping": "^0.3.24" } }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -463,6 +910,46 @@ "integrity": "sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==", "license": "MIT" }, + "node_modules/@next/eslint-plugin-next": { + "version": "16.2.6", + "resolved": "https://registry.npmmirror.com/@next/eslint-plugin-next/-/eslint-plugin-next-16.2.6.tgz", + "integrity": "sha512-Z8l6o4JWKUl755x4R+wogD86KPeU+Ckw4K+SYG4kHeOJtRenDeK+OSbGcqZpDtbwn9DsJVdir2UxmwXuinUbUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "3.3.1" + } + }, + "node_modules/@next/eslint-plugin-next/node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "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.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@next/eslint-plugin-next/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/@next/swc-darwin-arm64": { "version": "14.2.33", "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.33.tgz", @@ -642,6 +1129,16 @@ "node": ">= 8" } }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmmirror.com/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, "node_modules/@oxc-project/types": { "version": "0.128.0", "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.128.0.tgz", @@ -2841,6 +3338,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, "node_modules/@standard-schema/spec": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", @@ -3042,6 +3546,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmmirror.com/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { "version": "25.6.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.2.tgz", @@ -3085,6 +3596,589 @@ "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==" }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.60.0.tgz", + "integrity": "sha512-QYb/sa74/s7OKMbACMjrYnGspj9Hs5YI5aaffSL65UfeBUzVzBJfVo3oWSpbzPurvm7yaCCo2Lk7lVj610HqKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/type-utils": "8.60.0", + "@typescript-eslint/utils": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.60.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-8.60.0.tgz", + "integrity": "sha512-fcqpj/MyK4sxDPcbe7STNPbpQL4RLZOPWuaTmwZYuc+hJKzRf58yRxfhqGpc6PIq9ZyfSBpfHgmUHmHs0KwHwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/project-service/-/project-service-8.60.0.tgz", + "integrity": "sha512-aZu74NNKJeUWqCjDddzdiKaS82dgYgV/vmf+Ui3ZdZejmgfXR/q+pRumgobnQ2cCJTgGTWp4ypiwsuofFubavg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.60.0", + "@typescript-eslint/types": "^8.60.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-8.60.0.tgz", + "integrity": "sha512-pFzqhllJMs+jghLQWzV00ds39xLzuyqPSev5pd8f4Ir0rtKR3ZLUB4/4dhjOFighWb9larvtfJvqL+4yKDI3Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.0.tgz", + "integrity": "sha512-BZPR3RGYlAXnly6ymAxfkVn5rCbZzQNou0rxv3GfWZ8cTQp+hhVd73khbGLAd8k1TlAPLISH337M+tAgAnaJDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-8.60.0.tgz", + "integrity": "sha512-SX46wEUtitCpq7AN38HkUU/+zvUpdKf7ephtWAFgckH8O7PQIyL5gvrhQgBLuEYgLfuKWOVvWVskMbuFHAz5xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0", + "@typescript-eslint/utils": "8.60.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-8.60.0.tgz", + "integrity": "sha512-AsE7x2XaAK+CVbeih0Fvbn+r1qHxtpLDJ3XUuFcIinT318T90yHMJC+Zgv+jUuDjQQd06HKwxnDu6sz1IcTilA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.60.0.tgz", + "integrity": "sha512-3AcZNBGMClm6CXDyo8kYvVGT/sx29sS0oBsIb9oZI2gunA4Vm2M3YHzRLPvsUBBsl+yB5FPtltq7gGH0iTlp9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.60.0", + "@typescript-eslint/tsconfig-utils": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-8.60.0.tgz", + "integrity": "sha512-HtXuPfrHTyBDkameWpl+vJb1Uevu2tznAyahM1Oc4AENidCLTPiZDWIo4GfcxNdC/RcfGcadzzkqbRG87dUrQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.60.0.tgz", + "integrity": "sha512-9WI52t8ZGLVGrPMBet25yAftqY/n95+zmoUUtJBBQTKDSKUu7OsPTroT2op7U9JatkoRccL0YkWDNMFfC4Sjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.60.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.3.1.tgz", + "integrity": "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.12.2.tgz", + "integrity": "sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.12.2.tgz", + "integrity": "sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.12.2.tgz", + "integrity": "sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.12.2.tgz", + "integrity": "sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.12.2.tgz", + "integrity": "sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.12.2.tgz", + "integrity": "sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.12.2.tgz", + "integrity": "sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.12.2.tgz", + "integrity": "sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.12.2.tgz", + "integrity": "sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-loong64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-linux-loong64-gnu/-/resolver-binding-linux-loong64-gnu-1.12.2.tgz", + "integrity": "sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-loong64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-linux-loong64-musl/-/resolver-binding-linux-loong64-musl-1.12.2.tgz", + "integrity": "sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.12.2.tgz", + "integrity": "sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.12.2.tgz", + "integrity": "sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.12.2.tgz", + "integrity": "sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.12.2.tgz", + "integrity": "sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.12.2.tgz", + "integrity": "sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.12.2.tgz", + "integrity": "sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-openharmony-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-openharmony-arm64/-/resolver-binding-openharmony-arm64-1.12.2.tgz", + "integrity": "sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.12.2.tgz", + "integrity": "sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.12.2.tgz", + "integrity": "sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.12.2.tgz", + "integrity": "sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.12.2.tgz", + "integrity": "sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@vitejs/plugin-react": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.1.tgz", @@ -3231,6 +4325,46 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -3279,6 +4413,13 @@ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", "license": "MIT" }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, "node_modules/aria-hidden": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.6.tgz", @@ -3301,6 +4442,166 @@ "dequal": "^2.0.3" } }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmmirror.com/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmmirror.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", @@ -3311,6 +4612,23 @@ "node": ">=12" } }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmmirror.com/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/autoprefixer": { "version": "10.5.0", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz", @@ -3347,6 +4665,52 @@ "postcss": "^8.1.0" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.11.4", + "resolved": "https://registry.npmmirror.com/axe-core/-/axe-core-4.11.4.tgz", + "integrity": "sha512-KunSNx+TVpkAw/6ULfhnx+HWRecjqZGTOyquAoWHYLRSdK1tB5Ihce1ZW+UY3fj33bYAFWPu7W/GRSmmrCGuxA==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/baseline-browser-mapping": { "version": "2.10.27", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.27.tgz", @@ -3381,6 +4745,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", @@ -3437,6 +4814,66 @@ "node": ">=10.16.0" } }, + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "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/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -3484,6 +4921,39 @@ "node": ">=18" } }, + "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/chalk/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/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -3582,6 +5052,13 @@ "node": ">= 6" } }, + "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/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -3589,6 +5066,21 @@ "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-tree": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", @@ -3739,6 +5231,13 @@ "node": ">=12" } }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, "node_modules/data-urls": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", @@ -3753,6 +5252,78 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -3773,6 +5344,49 @@ "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==" }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -3816,6 +5430,19 @@ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", "license": "MIT" }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/dom-accessibility-api": { "version": "0.5.16", "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", @@ -3824,6 +5451,21 @@ "license": "MIT", "peer": true }, + "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/electron-to-chromium": { "version": "1.5.352", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.352.tgz", @@ -3848,6 +5490,85 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/es-abstract": { + "version": "1.24.2", + "resolved": "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-errors": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", @@ -3857,6 +5578,34 @@ "node": ">= 0.4" } }, + "node_modules/es-iterator-helpers": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/es-iterator-helpers/-/es-iterator-helpers-1.3.2.tgz", + "integrity": "sha512-HVLACW1TppGYjJ8H6/jqH/pqOtKRw6wMlrB23xfExmFWxFquAIWCmwoLsOyN96K4a5KbmOf5At9ZUO3GZbetAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.2", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.1.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.3.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.5", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", @@ -3864,6 +5613,66 @@ "dev": true, "license": "MIT" }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es-toolkit": { "version": "1.46.1", "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.46.1.tgz", @@ -3878,6 +5687,712 @@ "node": ">=6" } }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next": { + "version": "16.2.6", + "resolved": "https://registry.npmmirror.com/eslint-config-next/-/eslint-config-next-16.2.6.tgz", + "integrity": "sha512-z2ELYSkyrrJ6cuunTU8vhsT/RpouPkjaSah06nVW6Rg2Hpg0Vs8s497/e5s8G8qtdp4ccsiovz5P1rv+5VSW2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "16.2.6", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jsx-a11y": "^6.10.0", + "eslint-plugin-react": "^7.37.0", + "eslint-plugin-react-hooks": "^7.0.0", + "globals": "16.4.0", + "typescript-eslint": "^8.46.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.10", + "resolved": "https://registry.npmmirror.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.16.1", + "resolve": "^2.0.0-next.6" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/resolve": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "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/eslint-import-resolver-typescript": { + "version": "3.10.1", + "resolved": "https://registry.npmmirror.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.13.0", + "resolved": "https://registry.npmmirror.com/eslint-module-utils/-/eslint-module-utils-2.13.0.tgz", + "integrity": "sha512-bLohSkT6469rRs8czj0tLTD8vaeIS/whvPRJVjDr7IuoTT1k5DYDERlNycjDj/HkOlvQdYurmfZ/g3fG5bgeLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmmirror.com/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/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/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-import/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/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmmirror.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eslint-plugin-jsx-a11y/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/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmmirror.com/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz", + "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/eslint-plugin-react/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/eslint-plugin-react/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.7", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", + "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/eslint-plugin-react/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/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/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/eslint/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, "node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", @@ -3888,6 +6403,16 @@ "@types/estree": "^1.0.0" } }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/eventemitter3": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", @@ -3903,6 +6428,13 @@ "node": ">=12.0.0" } }, + "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.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", @@ -3931,6 +6463,20 @@ "node": ">= 6" } }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, "node_modules/fastq": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", @@ -3940,6 +6486,19 @@ "reusify": "^1.0.4" } }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -3964,6 +6523,44 @@ "node": ">=8" } }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/fraction.js": { "version": "5.3.4", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", @@ -4004,6 +6601,13 @@ } } }, + "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.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -4027,6 +6631,57 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -4035,6 +6690,31 @@ "node": "6.* || 8.* || >= 10.*" } }, + "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-nonce": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", @@ -4044,6 +6724,73 @@ "node": ">=6" } }, + "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-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.14.0", + "resolved": "https://registry.npmmirror.com/get-tsconfig/-/get-tsconfig-4.14.0.tgz", + "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "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": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -4056,12 +6803,174 @@ "node": ">=10.13.0" } }, + "node_modules/glob/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/glob/node_modules/brace-expansion": { + "version": "1.1.15", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "16.4.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/hasown": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", @@ -4074,6 +6983,23 @@ "node": ">= 0.4" } }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmmirror.com/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmmirror.com/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, "node_modules/highlight.js": { "version": "11.11.1", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.11.1.tgz", @@ -4095,6 +7021,16 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/immer": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz", @@ -4104,6 +7040,33 @@ "url": "https://opencollective.com/immer" } }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, "node_modules/indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", @@ -4114,6 +7077,40 @@ "node": ">=8" } }, + "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/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/internmap": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", @@ -4122,6 +7119,60 @@ "node": ">=12" } }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -4134,6 +7185,46 @@ "node": ">=8" } }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-core-module": { "version": "2.16.2", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", @@ -4149,6 +7240,41 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -4158,6 +7284,22 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -4166,6 +7308,26 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -4178,6 +7340,32 @@ "node": ">=0.10.0" } }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -4187,6 +7375,33 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", @@ -4194,6 +7409,183 @@ "dev": true, "license": "MIT" }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "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/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/jiti": { "version": "1.21.7", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", @@ -4209,6 +7601,19 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "license": "MIT" }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/jsdom": { "version": "29.1.1", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.1.1.tgz", @@ -4250,6 +7655,113 @@ } } }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmmirror.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmmirror.com/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/lightningcss": { "version": "1.32.0", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", @@ -4540,6 +8052,13 @@ "node": ">=8" } }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -4592,6 +8111,16 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "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/mdn-data": { "version": "2.27.1", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", @@ -4631,6 +8160,32 @@ "node": ">=4" } }, + "node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/motion-dom": { "version": "12.38.0", "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.38.0.tgz", @@ -4646,6 +8201,13 @@ "integrity": "sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg==", "license": "MIT" }, + "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/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -4675,6 +8237,29 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmmirror.com/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, "node_modules/next": { "version": "14.2.35", "resolved": "https://registry.npmjs.org/next/-/next-14.2.35.tgz", @@ -4763,6 +8348,35 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/node-exports-info": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/node-exports-info/-/node-exports-info-1.6.0.tgz", + "integrity": "sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-exports-info/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/node-releases": { "version": "2.0.38", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", @@ -4796,6 +8410,119 @@ "node": ">= 6" } }, + "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/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmmirror.com/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmmirror.com/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/obug": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", @@ -4807,6 +8534,52 @@ ], "license": "MIT" }, + "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/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -4840,6 +8613,19 @@ "node": ">=6" } }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/parse5": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", @@ -4861,6 +8647,26 @@ "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.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -4944,7 +8750,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -4962,6 +8767,16 @@ "node": ">=10.13.0" } }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.5.14", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", @@ -5118,6 +8933,16 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "license": "MIT" }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/pretty-format": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", @@ -5134,6 +8959,25 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmmirror.com/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmmirror.com/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -5377,6 +9221,50 @@ "redux": "^5.0.0" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmmirror.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -5426,6 +9314,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -5436,6 +9344,23 @@ "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/rolldown": { "version": "1.0.0-rc.18", "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.18.tgz", @@ -5493,6 +9418,61 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-array-concat": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", @@ -5515,11 +9495,172 @@ "loose-envify": "^1.1.0" } }, + "node_modules/semver": { + "version": "7.8.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.1.tgz", + "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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/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.1", + "resolved": "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "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/siginfo": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", @@ -5546,6 +9687,13 @@ "node": ">=0.10.0" } }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmmirror.com/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -5560,6 +9708,20 @@ "dev": true, "license": "MIT" }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/streamsearch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", @@ -5581,6 +9743,119 @@ "node": ">=8" } }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmmirror.com/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmmirror.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -5592,6 +9867,16 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/strip-indent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", @@ -5605,6 +9890,19 @@ "node": ">=8" } }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/styled-jsx": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", @@ -5650,6 +9948,19 @@ "node": ">=16 || 14 >=14.17" } }, + "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.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -5716,6 +10027,13 @@ "node": ">=14.0.0" } }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, "node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", @@ -5872,18 +10190,161 @@ "node": ">=20" } }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", "license": "Apache-2.0" }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmmirror.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/typed-array-length/-/typed-array-length-1.0.8.tgz", + "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.9", + "for-each": "^0.3.5", + "gopd": "^1.2.0", + "is-typed-array": "^1.1.15", + "possible-typed-array-names": "^1.1.0", + "reflect.getprototypeof": "^1.0.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typescript": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", @@ -5897,6 +10358,49 @@ "node": ">=14.17" } }, + "node_modules/typescript-eslint": { + "version": "8.60.0", + "resolved": "https://registry.npmmirror.com/typescript-eslint/-/typescript-eslint-8.60.0.tgz", + "integrity": "sha512-9f65qWLZdAW9m1JaxBDUHcqRUfL8bkxxXL7XxEfI+F09q56PkBvIfCjLF3yInsDM/BBmwkqmCQdCZe/RYlIWEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.60.0", + "@typescript-eslint/parser": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0", + "@typescript-eslint/utils": "8.60.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/undici": { "version": "7.25.0", "resolved": "https://registry.npmjs.org/undici/-/undici-7.25.0.tgz", @@ -5913,6 +10417,44 @@ "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", "license": "MIT" }, + "node_modules/unrs-resolver": { + "version": "1.12.2", + "resolved": "https://registry.npmmirror.com/unrs-resolver/-/unrs-resolver-1.12.2.tgz", + "integrity": "sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.4" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.12.2", + "@unrs/resolver-binding-android-arm64": "1.12.2", + "@unrs/resolver-binding-darwin-arm64": "1.12.2", + "@unrs/resolver-binding-darwin-x64": "1.12.2", + "@unrs/resolver-binding-freebsd-x64": "1.12.2", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.12.2", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.12.2", + "@unrs/resolver-binding-linux-arm64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-arm64-musl": "1.12.2", + "@unrs/resolver-binding-linux-loong64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-loong64-musl": "1.12.2", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-riscv64-musl": "1.12.2", + "@unrs/resolver-binding-linux-s390x-gnu": "1.12.2", + "@unrs/resolver-binding-linux-x64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-x64-musl": "1.12.2", + "@unrs/resolver-binding-openharmony-arm64": "1.12.2", + "@unrs/resolver-binding-wasm32-wasi": "1.12.2", + "@unrs/resolver-binding-win32-arm64-msvc": "1.12.2", + "@unrs/resolver-binding-win32-ia32-msvc": "1.12.2", + "@unrs/resolver-binding-win32-x64-msvc": "1.12.2" + } + }, "node_modules/update-browserslist-db": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", @@ -5943,6 +10485,16 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, "node_modules/use-callback-ref": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", @@ -6264,11 +10816,116 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.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/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-module": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" }, + "node_modules/which-typed-array": { + "version": "1.1.21", + "resolved": "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.21.tgz", + "integrity": "sha512-zbRA8cVm6io/d5W8uIe2hblzN76/Wm3v/yiythQvr+dpBWeqhPSWIDNj4zOyHi4zKbMK6DN34Xsr9jPHJERAEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/why-is-node-running": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", @@ -6286,6 +10943,16 @@ "node": ">=8" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -6313,6 +10980,13 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "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/xml-name-validator": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", @@ -6335,6 +11009,13 @@ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, "node_modules/yargs": { "version": "15.4.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", @@ -6367,6 +11048,42 @@ "engines": { "node": ">=6" } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/zod/-/zod-4.4.3.tgz", + "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } } } } diff --git a/frontend/package.json b/frontend/package.json old mode 100644 new mode 100755 index fc0194a..f68f78c --- a/frontend/package.json +++ b/frontend/package.json @@ -65,7 +65,11 @@ "@types/qrcode": "^1.5.6", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", + "@typescript-eslint/eslint-plugin": "^8.60.0", + "@typescript-eslint/parser": "^8.60.0", "@vitejs/plugin-react": "^6.0.1", + "eslint": "^8.57.1", + "eslint-config-next": "^16.2.6", "jsdom": "^29.1.1", "vitest": "^4.1.5" } diff --git a/frontend/playwright.config.ts b/frontend/playwright.config.ts old mode 100644 new mode 100755 diff --git a/frontend/postcss.config.js b/frontend/postcss.config.js old mode 100644 new mode 100755 diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico old mode 100644 new mode 100755 diff --git a/frontend/public/favicon.png b/frontend/public/favicon.png old mode 100644 new mode 100755 diff --git a/frontend/public/icon.svg b/frontend/public/icon.svg old mode 100644 new mode 100755 diff --git a/frontend/public/images/beian/gongan-beian.png b/frontend/public/images/beian/gongan-beian.png new file mode 100755 index 0000000000000000000000000000000000000000..2a13ba2f4b92c4b531945a66e3e35e3ead3739f9 GIT binary patch literal 1403 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%0D?1YK3( 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 literal 0 HcmV?d00001 diff --git a/frontend/public/images/yzr/yuzhiran-tech.jpg b/frontend/public/images/yzr/yuzhiran-tech.jpg new file mode 100755 index 0000000000000000000000000000000000000000..404bb483b0a2cd3bbe25587e686d097d371bbe45 GIT binary patch literal 27512 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%0DUZOPOOjmqL1x$o@A|z zyI+?mh(<~j5KXS7?&f^-4GMXL15usGRzzm*)DzX4L9K>}>dL7=bEY3_H4bv#?5zO0 zS>R|)2kC?>ExK9yZ@by@OxaVUmF>x(oR;xGtH_UQ;^|eKRg_a9EdoXOWpRS6FC)ZA z`iBtsaj3Yrz=wi1yN5a5MR*(FS}pd(UP^dTZbd{zW)^6;kBc?yWeKj!yf^O(;7Aji zSJqM@__DGd%`3ZnR_m2D{I`9DUK;neeFe12-+7FI24$p9E!Z$jeO(hwfC_vIt4Yi< zf$mCzYRpb1-Uv^Kze`*?wxMrBNwKvCI*ZPuMe0{NZDJAzMA|$xjNMGr36r`$zZt+n zA%!^(jKrn|EX03Dr*MFTfc*cH+)1ZgfCJ$Uy?PCdK0y8_Kq+=?*!k3Hd-hpnux(&$ zt6H;n?kuW3|K-e|O<%or>MMR*!|AuU&}~HJjstONXKxPMHrnn(O~H&=00YGJv^MuX z&!YTxHuz18j*XLVe<(RS@a2?)-R*}T|523Fd)%XUAv-n3!K+J#o%|SLZ`t#)PxVgL z6#kP^mi*k+KUG(9J)(2_O2*jTJ5idE%XT@`nfPPUKPhLca3c`Fs&s8gZ<8Qxm znRVk#;k)~*L!EPv4;(WpfIZ%+FlRJn<3p4av*VbxMYfv_q4@PA-){<;WmO;9-OW+Udgg4fsup8@AR7( zsXYA0)C#wR=W64d{`mBl>uUEd*|#To;pi*ZN! z<(KzMKFu#a^xK8ICchu+vgn>T{@Bn_HAjB3yuZ@Yv37!g?tS0ApeFy8oV^6-C2?#$>VExO^byM21ur-G#2_dI9D zy`!|4(XFJ&IlVg7-haJkVd9KSe)D1pKSu}<`d;2a+3!|vHM9LyU65;Bs3YUn~!)h2< zItgHDb6hpu6=3OCQJ`d!3IUcDC;G;_cp6p_pmFOsOQ+#xRAfwJj8xnlU1N+y+#n<) zH$gn|3(P%xx5AlqnPpC{6a{g5@qGSblxpK)KCOR`Ci?yEaWv=Fq{g=ir6zD!SGis-f*Wag~W(?kipWU3Fr{}gz z5icWDF9J-DNOc6U-(E6>j* zVR*b9KM8SNh$CSmt}CROBZ-Fj8wMIjB*_glOwocQsU;B`yCYN2#{PHa-N_qcVStpN z-uP>zWHrq&WTb;;3S7j^#IIH*8C!iQcewcoYckh^MB|s|KmG$2@|juVKvI5_{OGK? zsQFWi?JD(vxgTYH0GSpqAW=UYM9QBE+9W#2D?rbKB&~q*XG;a^>JmR(^#nHi0pKyk z^+$J9A1=cJIA1IB;gE0&56fK#odHFzA#7dcrUnn%8jz}mFbZ5#P7+b{AU{TZj08!+wNV&sT{YU>!Di*>r##CFd)1)$ls@cqr}#$CgK+?^6fJk& z{^HM$!^c*B{y95inf>|o-Vb(qQ;-_^9q*ZvATI?b*4f zFFR5V-lGG`lavZSDM8t)T@-!Z1eMzt8P0nV7cu8t;Mw$f`$M)FEi3Q){yov_Ln54* zwz(>!GJDffuhM}kQn+#a#494#+VY`;rx)ecy$i{^Wk=i3`h~w{ zVsgLG1?vSijXOQwxuuaRTe0-1V(WXB{5PJ@D@VYu0*FnN%{-Rflad(cz1s`4Sbf$F z+=_mPM|abWQ;YC++|Ud7A2)UxCxt4@_e8LD!)?cR=&FZ8pJ7 zjSkFXW@;FMV$k%~gVJw=vgcZ?_h468vHz&-9oSOY>suv=>!G&vqI8#;<;e8bx67?V6_X zw@ng4pSTolIIx~Dxze?Hgup{ROE*GrA1INQBLwB7x?3fYv0d#T(g3OWsnBl{YXO~F zP4|IZ(J@MMkti<-=@q!2GNM-tHdD4muDLK%;7WwY$aZM44`V-yYpcE1y#E`iJQo^J zlaS&`{x-TUvBOq5Vk=uQ!+cTA*^(#`G^=iM2ihv8LI{gaY!P(*55*p4*r+q+VEFRM zFLrgm2dZylmrD$p#wHTJ)t(AgqK9P2d z02q8Q(ZE5a4OD}h_(uF}V0hPyWij$f_FNcp4|7^%mU&zr1zpR=#4 z4Oyqj_()l`BEL+CH1_RP4w-mCY42P6#pl~<9`M0s0gc~R2%3~#r$EuWLURs@F=-_G zU!>PAAD!f=@Q~WWl^F!-t(flRM31yp_vfslQ$P&SLe<8MT9HkvHq9{AWd%Ep)h@9k zns5PM3tT_p!WbolwPp=hv?0p=62uJlfg){q^%eX!3Kop91ribK*hig+m|-6o5%D0z zK8^qt^r9vyO_>2Fj$=%&BpIDGs(X`+7@alLy<|~6(pjUzHwSdql8` zB@ED;_L9ohx}wr3H9%~xAW$f}%InFwxs$THz=KyX`yef#%B zao^rd1`x+&!~HHmVojTCFw=XtYMRfnl=i#E17ouL0zcRL2mYYlxYXb>=%^gsBj`>Z zl-sgyYgNG^=k7flBZ43dwdZ%L%RSx*lf{MHazZvp1C&Q6bnc<=0tK)ZW9w#vAR)D! z4cfJh)s1hXI#gbB#L=v~f3$kjY5LD9%@yg=OpF-msGH&L>ZY^t&8Zsl^XyY8M&MFt+*I$A2KVU*$f$ZWTNMrKc9!BVv+*K+sa zF*V8*d5?WLd$$v|vIOBr??ka35l-KC`!Xc0h8A-7xutGvC?ECA-Ij&Di1lSVJ!i+^ zuO4{Oo!}#b;lL#TIbn4A-hTy?1-oEUxL#SS+0AdKw$Pk#@vVRvt3k0L-8Pb|s1cI9 znkMY{Br?j#>{sF36MQdrPxNXW3X=&td7V_xVKN~Fh}e`@(0T=sO_KxVEyrC=j<@3h zLIFzj@T9@?i#-w_l@B5Uf)6@Q=JUmj2hUpYnRxugXQChLkfp{|{XN4NZ{o|tQ^n@$ z?ut@Ga%>b7=>0MR6p-1FT}BH&(ypHU)qM1Mvjxmx+9*u~iSSJ{nAWvMCPag2_W?u| zGN@S#o!>Sw8m|M;!Ud)+vNKi~A<)8}8Lz9C0|qezAhVx36113; z$ozjbCxM+g4fEH1d>LaT2QWs`QMjKu(vi5N*eD~7skCQ%-7^z?b#a8<_ z&?`i7(3agOP9U<+-rQw&jr=O$)C!A284rRU>W&Jh4E7#AV8nYTl)D8dWoyEa2LT7> zO?%8^x|((S>L-Ig&|9B`fhGp5P0(aVGIKTv83(!o&DkJioQXS+znVhZ_5Fh?4{-!m z_%be1zo2;Z%g)$Ui^2k%o~-Fj(;&JM5DQ#88snd zgzVL`fqwx+H4do>#b4Y+z$fXFNT1asf^3k+H%-?u;^8AVY7Wc)nZ%dW~kx7B~>~F1XQv zXCh2_ihr>yEcRYKL1WuQ(8Mkss}YDNB&-o!Yc)sx@{Zqwpgh}~P8 zqEV4ZNdnre5YRm7lq4X|V(XM7bM>EW%C%-YlMROQ7zoSIhoSQVeOS(KJQ(^y%CtbC zG|BI**KpQ{9RN)wB)!Xd?Qg-OFd1$eP%|i{QABIwC^XEM=3D zd=A*|nL{Gkqj87I)GN=mJ)O+~239NsAlenB0AOGd5Y6c08_?Vqr+MsarJ;gDcRGw$ zjHd^$q5ovGV|i@w8o_Tz>bypBUfd@S;)pjr(if&S*HzdXo^A5xk^QRDoAX4%P~Wqy z7sq8~+2of)5nG&FAb_)L; z;R@I5-w>{5c2I>`oe>G3@MIad_11Ps@NhQkIAH@7v%>& z9)NGg1`6nihcVnj4Kwh8fQgm~VpNKoio#s$-*WTA_Zj z5j&6D!X76KAqw5Xp}9qf!a&9Wac>CK1MCon!w(baIBd6Iec-=@0REARoZyqO%_Z`i zS?9d>Vx%mD1N%%RYxcA27?MUXF?}l4?k18-d5w69C&e8c8oK$F0)JF7Ve7U_yA9+W zA1N3n(FlcWu+PT zM}jZI6_&coCV~10CybCU@W#E#0|LgU4JOGL1{E-)LM?VOQj6_)W(2-H0A+{J2UkJ< zZx2k`BWC2g)hr$|hOEFFZ<36u6iZ%V-()a_p;!FsZC6}n0y85w-4den&x8GANE_t* z6M#sY(B>IO&)WE}=x1Mr&Z()HUHChzrq4LgQ7v50YU5Eo(86Vn_@}Bum}hH!$}iF# zAgYZ`px zqN<2ETj@RB@hayY7PMzfk(lEZPT4J?0(HkrH=vG=S8ZetDDg&LGKVRMWjVNHMg@J5 zpjL5U%~M7OfE^TsAx4Pj_ltpoE$soJeY?sI1`C+b?xaLc81dlv0uF>tj*5|A^u?S> zi1=je1R@db>CqQOH8gsQtSjFsnb})pU3nE|Zv}qiiov%KO-R55CgOpt^ge9*Ss7%* z#;`y!$c7CGdG)>zpHXzEf-D7EVu%hyKzv9@Y$&e!VG`r>CZPXl@_7T7AI>+RfLHQ& ziFU~gM4@j*xO$8LMUQ4@6o?*rXO#Eg*4Dxq1wSa3&k{7alEEB?PgqxiF}D~BCI&bX z$YagYxd=EK-x@d)wE~Xbw(EzPfPZbn(yux$;X^J=j)U<^(R43Q2{Sj|%l?=WU_c6) z(A6Qa;}vPc{J_^0+;NXYH8lX!IW=LUDA6N_G-RF<7%E%A4&816MMXUPz*4?ELt1y3 zH5ADw1gg~vFwg_KaTF|aD8u(M#0l`dO~eV-$Md^^(Wkm8(z8?#^^Pz8YZD}7a1!!g z3ru>2M!@4vzGA&D${sGd?*$X&Fakbq?sT{x7j)FCqxu_rIK;jFjXj*vH8|JcR`Sqw z@EReAkUmv!oMfyEFCvya`kzbQ-Z!!0ZnXJkRWaSALh`l3L|?!RgT|yi)V_L8JIM9= z&cxh4y6Gb?s)x>mTk2eV&S95<#sY@1p~u@@3SJ6L=Ay`Z0eU=;a?L~{qb3(BdBm8a~~K=>74t% zHPhligJn!2R|V+vuYgN((m1Bicaq)#R|VAPv%#|=xk(y-e3CE|q=>_u)B;Yrn9^CN zfu1ZJdA`Y?q7qrbLZ*v0L;<-GieyjqK&YRAT3rnBaVd<;H??-Z8&q+is*ONZEmOwJ z_H7q@uV_z{^`6~vb|~;4kK*3 zC%g568vpkD^} z<{E*E#zgQkwl+I(hA8-Z*B85alUStqE5}e~8g+CFJ36>JUrVbR+*|t5O=5j(NEZeQ zcbH%_R$0n9nM;ruw9NOSe<-5`)d&f_7_`}s0-<8N;8I@%6-^6WW*)JQM6(@Ikh7-Y zR<5H#(yf!Tf|FOAlG4dpbyKQH&N_g7th3Wv$&dZO+@S2|sGDN~c6INZIA z0CQ7#w7UZO?8vt|+RHNpgxt6igIU#HWWVp7pu@Hk@>wC^=Bf|z%S-q#8JPj-b=~v> z8Q@LGtGT_JMjHA=q%uHBPj5J(x(T|od&rvS6tuv^EZEr7&{Bf}i1Bea4LBN_i^-J3 z&@6O?g{TN%Ga9tG2J-zNC{))_1vwub_Utl?gIqS8A=r@fv(Dkr2{}I(Aq;*H;E7?U za#pyxL}hFphj~amzw%gd`>MtvUt;^igpbUMbCGAY+yj*Dj4z)+3KrT3+(f-WljTZs z3qdI-E7|6gW!ZPK9cJj(?{q@GCQ}`>*pObJP8m2C_y#go(i1ly-2|2Y3TE8jTZ~-h zSd*LB!K@fhuw@&LRK}3^s+*7}9`XQTHw!d47=O+5Hlh@ z8&~y1$1d@@5+D@1Ctbv917s?b4I^VJ(P938tc4I;0&woreaP7rb&oAgL&AXYL6W0hJU>0-qX%7+ zra&jmV6H7>ikhLCeVOVBYay`#qcoyW@eP-ZoFTq&$@ok-guwDbBf0S$W6>T3jU*gG zoz$cXiKrLqjjG4>duAj7^~={r&bWL5r)cY8)`3$jCH4YMwIHPum$R=_r&Ov2v^*DQ zgi8CRCpjA!p;CNnRS|C?ICEs&aXUgv5CaM~=o@gh^eb@oDe*m$UZGfwC@Fx+XfV!c z#>oVXs-_%`QOR06F959dPb>6K;5kMGfQb=8Rz9R8ndrCz$PxMsx?BV9rP*yj4Oe~A zD#OU86Q+U=^bqya8kRg}+`AAdC%Nze_@Niq2RnJ5SxMV{oBmD+ zTFdGXs?^eS4R84mfHU;{>OXPt%@oxxd?5s$*L14D9A}($Cd_P|@Hm#=IS=v@p&e?m zJi#}Ih=TAI`pEz_mAwUD%q2K+tT3Zfg@btWii?dxmPUK~Tmp!ZIMv+0CMk zCiR+rJ5Y`FGqW9Ei=&&mL|b-$FVX;f!VVTvj4FhBy;FZ!36}p>0jreu#18> z)q7wEu%!-^FOk*?jt|`55{_Tp496RPmoG6Gu&KL<-oOZ4@i|c62`FMxUobOZJWwvX zGR~e&9w^x$5)%I#4-}XZ|Nj3r$S1?^oI!bJL{@hF0M-IXK1*Rb9^xBPJelqyP+fo#L+A~?KvZW5T3|+sy5@@%b;%Gz zc(&zm1?EHhGn3azE=utD|i=JCJNAP7@kr;Pz%AH!yS?hV*vr&>{KUu~mQosgTK_eIE^KOa!~Rzhy}Q4Wwk zHASvvsH|@@>vW!x$|(`eCpMfR{Wq&(wgzL77TA(%seb8575Mx_pg> zflR)u4W)BEYk=LS(1?^afJ!7>< ze2xICMW1`o2A{#pubQ6iE;+XoZnOv{JN>pp=o^cd}`k>{?R`lC;RVJEDw`?nEIvp|no)HIEJ=#7Hyn*2)> zTltrUs69F9Pl%Tglfl1qKivtkX4gFmhk;=Di7HT!T|lA#k842;Z0?(k#r{9}JE1N7 EKSdAv+W-In literal 0 HcmV?d00001 diff --git a/frontend/public/images/yzr/yuzhiran-yhl.jpg b/frontend/public/images/yzr/yuzhiran-yhl.jpg new file mode 100755 index 0000000000000000000000000000000000000000..f7130d2f5343a18e91a0b7a86ad61aab0fa46df0 GIT binary patch literal 48674 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,HlV9z(JhtkbL&7gnj%U`EI0+F& z@7Ncf$#r_;`D=TxE@Sg17ZCRN>7{}s(Eb~#AaRsA=ME`cdqrMm1DhD@&dOXxpAZL&6P8~UGfL-ysgeVc4n)9+Kb6? zpO9~&&+qXot?x3VD_xV?&kZv3PYLauD@cFcp9sNJeOTqu+$$6qTrW<2Y^GH_1OL;7 z(DC$oG<4|P7pphcJm=4aNC!7x;oa#DAZ;M8%Wr3WMtF<0$@~$U>Ps~(n!RQT(KS5k z{qO?p$&Ekb&WrEuj-_a;7Ry|pv6-{_+=?L#wanK0{%YWcB;}bjtK@5Z`|`&UIqDcV zW1|`<-zo#nbnCO_R0s1xg1_|fbp|2R%YQrfUm?I9j_}s6i^z0a4}@l?rf8FeqJ
    v4rip<{^69bmdb`AT-RO4-EJk&R7u=L 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 YNy${7yngI|#j^i#5&6IU`p?Aw13?RNbN~PV literal 0 HcmV?d00001 diff --git a/frontend/public/images/yzr/yuzhiran.jpg b/frontend/public/images/yzr/yuzhiran.jpg new file mode 100755 index 0000000000000000000000000000000000000000..cc61e6f36e81ee908a2d3964d9e70614afe8070b GIT binary patch literal 27802 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 literal 0 HcmV?d00001 diff --git a/frontend/server.js b/frontend/server.js old mode 100644 new mode 100755 diff --git a/frontend/src/app/__tests__/home.test.tsx b/frontend/src/app/__tests__/home.test.tsx old mode 100644 new mode 100755 index 44b3e64..150e78e --- a/frontend/src/app/__tests__/home.test.tsx +++ b/frontend/src/app/__tests__/home.test.tsx @@ -43,8 +43,8 @@ describe('HomePage', () => { it('should render sandbox preview section', () => { render(); - expect(screen.getByText('AI 沙盒')).toBeInTheDocument(); - expect(screen.getByText('在线体验 AI 对话,边学边练')).toBeInTheDocument(); + expect(screen.getByText('AI 沙盒实战')).toBeInTheDocument(); + expect(screen.getByText('内置 AI 对话沙盒,边学边练')).toBeInTheDocument(); }); it('should render CTA section', () => { @@ -64,14 +64,12 @@ describe('HomePage', () => { it('should render course descriptions', () => { render(); - expect(screen.getByText(/面向零基础用户/)).toBeInTheDocument(); - expect(screen.getByText(/系统学习提示词编写技巧/)).toBeInTheDocument(); - expect(screen.getByText(/学习使用 AI 工具/)).toBeInTheDocument(); + expect(screen.getAllByText('探索 AI 世界').length).toBe(3); }); it('should render sandbox with mock chat interface', () => { render(); - expect(screen.getByText(/你好!我是宇之然 AI 助手/)).toBeInTheDocument(); - expect(screen.getByText(/正在输入/)).toBeInTheDocument(); + expect(screen.getByText('AI 沙盒实战')).toBeInTheDocument(); + expect(screen.getByText('内置 AI 对话沙盒,边学边练')).toBeInTheDocument(); }); }); diff --git a/frontend/src/app/about/page.tsx b/frontend/src/app/about/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/analytics/page.tsx b/frontend/src/app/admin/analytics/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/comments/page.tsx b/frontend/src/app/admin/comments/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/contents/[id]/edit-content.tsx b/frontend/src/app/admin/contents/[id]/edit-content.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/contents/[id]/page.tsx b/frontend/src/app/admin/contents/[id]/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/contents/new/page.tsx b/frontend/src/app/admin/contents/new/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/contents/page.tsx b/frontend/src/app/admin/contents/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/courses/[id]/edit-course.tsx b/frontend/src/app/admin/courses/[id]/edit-course.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/courses/[id]/page.tsx b/frontend/src/app/admin/courses/[id]/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/courses/new/page.tsx b/frontend/src/app/admin/courses/new/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/courses/page.tsx b/frontend/src/app/admin/courses/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/enterprise/[id]/org-detail.tsx b/frontend/src/app/admin/enterprise/[id]/org-detail.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/enterprise/[id]/page.tsx b/frontend/src/app/admin/enterprise/[id]/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/enterprise/[id]/report/page.tsx b/frontend/src/app/admin/enterprise/[id]/report/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/enterprise/[id]/report/report-page.tsx b/frontend/src/app/admin/enterprise/[id]/report/report-page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/enterprise/page.tsx b/frontend/src/app/admin/enterprise/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/layout.tsx b/frontend/src/app/admin/layout.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/login/page.tsx b/frontend/src/app/admin/login/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/operations/banners/page.tsx b/frontend/src/app/admin/operations/banners/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/operations/notifications/page.tsx b/frontend/src/app/admin/operations/notifications/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/orders/page.tsx b/frontend/src/app/admin/orders/page.tsx old mode 100644 new mode 100755 index d564955..595912c --- a/frontend/src/app/admin/orders/page.tsx +++ b/frontend/src/app/admin/orders/page.tsx @@ -1,7 +1,6 @@ 'use client'; -import { useEffect, useState } from 'react'; - +import { useEffect, useState, useCallback } from 'react'; import { Skeleton } from '@/components/ui/skeleton'; import { API_BASE } from '@/lib/config'; @@ -11,48 +10,109 @@ interface Order { amount: number; planType: string; status: string; + payChannel: string | null; + transactionId: string | null; + paidAt: string | null; createdAt: string; - user?: { nickname: string }; + user?: { id: number; nickname: string; phone?: string; email?: string }; } export default function AdminOrders() { const [orders, setOrders] = useState([]); const [loading, setLoading] = useState(true); + const [total, setTotal] = useState(0); + const [page, setPage] = useState(1); + const [pageSize] = useState(20); + const [search, setSearch] = useState(''); + const [searchInput, setSearchInput] = useState(''); + const [statusFilter, setStatusFilter] = useState(''); + const [channelFilter, setChannelFilter] = useState(''); + const [refundModal, setRefundModal] = useState<{ open: boolean; order: Order | null; reason: string; loading: boolean }>({ + open: false, order: null, reason: '', loading: false, + }); - useEffect(() => { loadOrders(); }, []); + const token = typeof window !== 'undefined' ? localStorage.getItem('adminToken') : null; - async function loadOrders() { + const loadOrders = useCallback(async () => { + setLoading(true); try { - const token = localStorage.getItem('adminToken'); - const res = await fetch(`${API_BASE}/orders`, { + const params = new URLSearchParams(); + params.set('page', String(page)); + params.set('pageSize', String(pageSize)); + if (search) params.set('search', search); + if (statusFilter) params.set('status', statusFilter); + if (channelFilter) params.set('payChannel', channelFilter); + + const res = await fetch(`${API_BASE}/admin/orders?${params}`, { headers: { Authorization: `Bearer ${token}` }, }); - if (res.ok) { const data = await res.json(); setOrders(data.items || []); + setTotal(data.total || 0); } } catch {} setLoading(false); + }, [page, pageSize, search, statusFilter, channelFilter, token]); + + useEffect(() => { loadOrders(); }, [loadOrders]); + + function handleSearch() { + setSearch(searchInput); + setPage(1); } - async function refund(orderNo: string) { - if (!confirm('确认要退款吗?')) return; + function handleRefund(order: Order) { + setRefundModal({ open: true, order, reason: '用户申请退款', loading: false }); + } + + async function confirmRefund() { + const order = refundModal.order; + if (!order) return; + setRefundModal(prev => ({ ...prev, loading: true })); try { - const token = localStorage.getItem('adminToken'); - await fetch(`${API_BASE}/payment/wxpay/refund`, { + const res = await fetch(`${API_BASE}/admin/orders/${order.orderNo}/refund`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}`, }, - body: JSON.stringify({ outTradeNo: orderNo, amount: 0, reason: '管理员退款' }), + body: JSON.stringify({ amount: order.amount, reason: refundModal.reason }), }); - alert('退款成功'); - loadOrders(); - } catch {} + if (res.ok) { + alert('退款成功'); + setRefundModal({ open: false, order: null, reason: '', loading: false }); + loadOrders(); + } else { + const err = await res.json(); + alert(err.message || '退款失败'); + } + } catch { + alert('退款失败,请重试'); + } } + async function handleMarkPaid(orderNo: string) { + if (!confirm('确认要将此订单标记为已支付吗?')) return; + try { + const res = await fetch(`${API_BASE}/admin/orders/${orderNo}/mark-paid`, { + method: 'POST', + headers: { Authorization: `Bearer ${token}` }, + }); + if (res.ok) { + alert('已标记为已支付'); + loadOrders(); + } else { + const err = await res.json(); + alert(err.message || '操作失败'); + } + } catch { + alert('操作失败'); + } + } + + const totalPages = Math.ceil(total / pageSize); + if (loading) return (
    @@ -69,6 +129,46 @@ export default function AdminOrders() {
    +
    +
    + setSearchInput(e.target.value)} + onKeyDown={e => e.key === 'Enter' && handleSearch()} + placeholder="搜索订单号/用户/手机号..." + className="px-3 py-2 text-sm bg-background border border-border rounded-lg focus:outline-none focus:ring-2 focus:ring-brand-600" + /> + +
    + + + 共 {total} 条 +
    +
    @@ -77,6 +177,7 @@ export default function AdminOrders() { + @@ -85,8 +186,12 @@ export default function AdminOrders() { {orders.map(order => ( - - + + + ))} @@ -126,12 +246,69 @@ export default function AdminOrders() {
    用户 金额 类型渠道 状态 时间 操作
    {order.orderNo}{order.user?.nickname || '-'} + {order.orderNo} + {order.user?.nickname || '-'} + {order.user?.phone && ({order.user.phone})} + ¥{order.amount} + + {order.payChannel === 'alipay' ? '支付宝' : order.payChannel === 'wxpay' ? '微信' : '-'} + + - {order.status} + {order.status === 'PAID' ? '已支付' : order.status === 'PENDING' ? '待支付' : order.status === 'REFUNDED' ? '已退款' : '已取消'} {new Date(order.createdAt).toLocaleDateString()} - {order.status === 'PAID' && ( - - )} +
    + {order.status === 'PAID' && ( + + )} + {order.status === 'PENDING' && ( + + )} +
    {orders.length === 0 && ( -
    - 暂无订单数据 +
    暂无订单数据
    + )} + + {totalPages > 1 && ( +
    + 第 {page}/{totalPages} 页 +
    + + +
    )}
    + + {refundModal.open && refundModal.order && ( +
    setRefundModal({ ...refundModal, open: false })}> +
    e.stopPropagation()}> +

    确认退款

    +

    + 订单号: {refundModal.order.orderNo}
    + 金额: ¥{refundModal.order.amount} +

    +
    + + setRefundModal(prev => ({ ...prev, reason: e.target.value }))} + className="w-full px-3 py-2 text-sm bg-background border border-border rounded-lg" + placeholder="请输入退款原因" + /> +
    +
    + + +
    +
    +
    + )} ); } diff --git a/frontend/src/app/admin/page.tsx b/frontend/src/app/admin/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/prompts/[id]/client.tsx b/frontend/src/app/admin/prompts/[id]/client.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/prompts/[id]/page.tsx b/frontend/src/app/admin/prompts/[id]/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/prompts/new/page.tsx b/frontend/src/app/admin/prompts/new/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/prompts/page.tsx b/frontend/src/app/admin/prompts/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/settings/config/page.tsx b/frontend/src/app/admin/settings/config/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/settings/roles/page.tsx b/frontend/src/app/admin/settings/roles/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/tools/[id]/client.tsx b/frontend/src/app/admin/tools/[id]/client.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/tools/[id]/page.tsx b/frontend/src/app/admin/tools/[id]/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/tools/new/page.tsx b/frontend/src/app/admin/tools/new/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/tools/page.tsx b/frontend/src/app/admin/tools/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/admin/users/page.tsx b/frontend/src/app/admin/users/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/ai-agreement/page.tsx b/frontend/src/app/ai-agreement/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/auth/page.tsx b/frontend/src/app/auth/page.tsx old mode 100644 new mode 100755 index 60ec8c6..c70a464 --- a/frontend/src/app/auth/page.tsx +++ b/frontend/src/app/auth/page.tsx @@ -25,7 +25,20 @@ function AuthForm() { const [error, setError] = useState(''); const [loginForm, setLoginForm] = useState({ account: '', password: '' }); - const [registerForm, setRegisterForm] = useState({ phone: '', email: '', password: '', confirmPassword: '', nickname: '' }); + const [registerForm, setRegisterForm] = useState({ username: '', phone: '', email: '', password: '', confirmPassword: '', nickname: '' }); + + function getFriendlyError(msg: string): string { + const map: Record = { + '手机号格式不正确': '手机号格式不正确(11位手机号)', + '邮箱格式不正确': '邮箱格式不正确', + '用户名格式不正确(2-20位,支持中英文、数字、下划线)': '用户名格式不正确(2-20位,支持中英文、数字、下划线)', + '用户名已被注册': t.auth.usernameConflict, + '手机号已被注册': t.auth.phoneConflict, + '邮箱已被注册': t.auth.emailConflict, + '请填写用户名、手机号或邮箱': '请填写用户名、手机号或邮箱', + }; + return map[msg] || msg || t.auth.loginFailed; + } async function handleLogin(e: FormEvent) { e.preventDefault(); @@ -37,38 +50,50 @@ function AuthForm() { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ account: loginForm.account, password: loginForm.password }), }); + if (!res.ok) { + let msg = t.auth.loginFailed; + try { const d = await res.json(); msg = d.message || msg; } catch {} + throw new Error(msg); + } const data = await res.json(); - if (!res.ok) throw new Error(data.message || t.auth.loginFailed); login(data.accessToken, data.refreshToken); toast.success(t.auth.loginSuccess); router.push('/'); - } catch (err: any) { setError(err.message); } + } catch (err: any) { setError(getFriendlyError(err.message)); } finally { setLoading(false); } } async function handleRegister(e: FormEvent) { e.preventDefault(); setError(''); - const { phone, email, password, confirmPassword, nickname } = registerForm; - if (!phone && !email) { setError(t.auth.fillPhoneOrEmail); return; } + const { username, phone, email, password, confirmPassword, nickname } = registerForm; + if (!username && !phone && !email) { setError(t.auth.fillPhoneOrEmail); return; } + if (username && !/^[a-zA-Z0-9_\u4e00-\u9fa5]{2,20}$/.test(username)) { setError('用户名格式不正确(2-20位,支持中英文、数字、下划线)'); return; } + if (phone && !/^1[3-9]\d{9}$/.test(phone)) { setError('手机号格式不正确(11位手机号)'); return; } + if (email && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) { setError('邮箱格式不正确'); return; } if (!password) { setError(t.auth.fillPassword); return; } if (password.length < 6) { setError(t.auth.passwordMinLength); return; } if (password !== confirmPassword) { setError(t.auth.passwordsNotMatch); return; } setLoading(true); try { const body: Record = { password }; + if (username) body.username = username; if (phone) body.phone = phone; if (email) body.email = email; if (nickname) body.nickname = nickname; const res = await fetch(`${API_BASE}/auth/register`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body), }); + if (!res.ok) { + let msg = t.auth.registerFailed; + try { const d = await res.json(); msg = d.message || msg; } catch {} + throw new Error(msg); + } const data = await res.json(); - if (!res.ok) throw new Error(data.message || t.auth.registerFailed); login(data.accessToken, data.refreshToken); toast.success(t.auth.registerSuccess); router.push('/'); - } catch (err: any) { setError(err.message); } + } catch (err: any) { setError(getFriendlyError(err.message)); } finally { setLoading(false); } } @@ -99,7 +124,7 @@ function AuthForm() {
    - setLoginForm({ ...loginForm, account: e.target.value })} /> setLoginForm({ ...loginForm, password: e.target.value })} /> @@ -115,6 +140,8 @@ function AuthForm() { onChange={(e) => setRegisterForm({ ...registerForm, phone: e.target.value })} /> setRegisterForm({ ...registerForm, email: e.target.value })} /> + setRegisterForm({ ...registerForm, username: e.target.value })} /> setRegisterForm({ ...registerForm, nickname: e.target.value })} /> {children} + ); diff --git a/frontend/src/app/learning/analytics/page.tsx b/frontend/src/app/learning/analytics/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/learning/path/page.tsx b/frontend/src/app/learning/path/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/models/page.tsx b/frontend/src/app/models/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/my/dashboard/page.tsx b/frontend/src/app/my/dashboard/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/my/favorites/page.tsx b/frontend/src/app/my/favorites/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/my/learning/page.tsx b/frontend/src/app/my/learning/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/my/member/page.tsx b/frontend/src/app/my/member/page.tsx old mode 100644 new mode 100755 index 8c6f5e8..f612dfa --- a/frontend/src/app/my/member/page.tsx +++ b/frontend/src/app/my/member/page.tsx @@ -6,16 +6,15 @@ import { apiFetch } from '../../../lib/auth'; import { Skeleton } from '@/components/ui/skeleton'; import PaymentModal from '@/components/ui/payment-modal'; import { useT } from '@/i18n'; -import { isWeChatBrowser, getOpenidFromUrl, isMiniProgram } from '@/lib/wechat'; +import { isWeChatBrowser } from '@/lib/wechat'; interface PayResult { - prepay_id?: string; - nonceStr?: string; - timeStamp?: string; - package?: string; - paySign?: string; - signType?: string; + gatewayOrderId?: string; + payUrl?: string; + qrcode?: string; codeUrl?: string; + redirectUrl?: string; + status?: string; } interface Subscription { @@ -23,7 +22,7 @@ interface Subscription { } interface Order { - id: number; orderNo: string; amount: number; planType: string; status: string; createdAt: string; + id: number; orderNo: string; amount: number; planType: string; status: string; payChannel?: string; createdAt: string; } const PLANS = [ @@ -41,9 +40,10 @@ export default function MemberPage() { const [quota, setQuota] = useState<{ used: number; remaining: number; dailyLimit: number } | null>(null); const [loading, setLoading] = useState(true); const [payLoading, setPayLoading] = useState(null); + const [payChannel, setPayChannel] = useState<'wxpay' | 'alipay'>('alipay'); const [paymentModal, setPaymentModal] = useState<{ - open: boolean; orderNo: string; payResult: PayResult; tradeType: 'JSAPI' | 'NATIVE'; - }>({ open: false, orderNo: '', payResult: {}, tradeType: 'NATIVE' }); + open: boolean; orderNo: string; payResult: PayResult; payChannel: 'wxpay' | 'alipay'; + }>({ open: false, orderNo: '', payResult: {}, payChannel: 'alipay' }); useEffect(() => { loadData(); }, []); @@ -66,16 +66,11 @@ export default function MemberPage() { async function handleSubscribe(planType: string) { setPayLoading(planType); try { - const inWeChat = isWeChatBrowser(); - const openid = getOpenidFromUrl(); - const useJsapi = inWeChat && openid && isMiniProgram(); - const tradeType = useJsapi ? 'JSAPI' : 'NATIVE'; - const body: Record = { amount: planType === 'MONTHLY' ? 49.9 : 299, - planType, payChannel: 'wxpay', tradeType, + planType, + payChannel, }; - if (useJsapi && openid) body.openid = openid; const res = await apiFetch('/orders/create', { method: 'POST', @@ -84,13 +79,17 @@ export default function MemberPage() { const data = await res.json(); if (data.order && data.payResult) { - // Mock mode → auto-completed by backend - if (data.payResult.codeUrl === 'mock://pay') { + const payUrl = data.payResult.payUrl || data.payResult.redirectUrl; + const qrCode = data.payResult.qrcode || data.payResult.codeUrl; + + if ((payUrl === 'mock://pay' || qrCode === 'mock://pay') || data.message === '模拟支付完成') { loadData(); - } else { + } else if (payUrl || qrCode) { setPaymentModal({ - open: true, orderNo: data.order.orderNo, - payResult: data.payResult, tradeType, + open: true, + orderNo: data.order.orderNo, + payResult: data.payResult, + payChannel, }); } } @@ -164,10 +163,40 @@ export default function MemberPage() { ))}
    {plan.id !== 'FREE' && ( - +
    + {!isCurrent && ( +
    + + +
    + )} + {isCurrent && ( + + )} +
    )} ); @@ -188,9 +217,14 @@ export default function MemberPage() {
    ¥{order.amount}
    - - {order.status} - +
    + {order.payChannel && ( + {order.payChannel === 'alipay' ? '支付宝' : '微信'} + )} + + {order.status} + +
    ))} @@ -201,7 +235,7 @@ export default function MemberPage() { open={paymentModal.open} orderNo={paymentModal.orderNo} payResult={paymentModal.payResult} - tradeType={paymentModal.tradeType} + payChannel={paymentModal.payChannel} onPaid={handlePaymentPaid} onClose={() => setPaymentModal(prev => ({ ...prev, open: false }))} /> diff --git a/frontend/src/app/my/page.tsx b/frontend/src/app/my/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/my/settings/page.tsx b/frontend/src/app/my/settings/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/not-found.tsx b/frontend/src/app/not-found.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/notifications/page.tsx b/frontend/src/app/notifications/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/page.tsx b/frontend/src/app/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/privacy/page.tsx b/frontend/src/app/privacy/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/prompts/__tests__/prompts.vitest.tsx b/frontend/src/app/prompts/__tests__/prompts.vitest.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/prompts/page.tsx b/frontend/src/app/prompts/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/prompts/workshop/page.tsx b/frontend/src/app/prompts/workshop/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/sandbox/code/page.tsx b/frontend/src/app/sandbox/code/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/sandbox/compare/page.tsx b/frontend/src/app/sandbox/compare/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/sandbox/page.tsx b/frontend/src/app/sandbox/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/sandbox/share/page.tsx b/frontend/src/app/sandbox/share/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/search/page.tsx b/frontend/src/app/search/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/skills/[id]/client.tsx b/frontend/src/app/skills/[id]/client.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/skills/[id]/page.tsx b/frontend/src/app/skills/[id]/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/skills/page.tsx b/frontend/src/app/skills/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/terms/page.tsx b/frontend/src/app/terms/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/tools/page.tsx b/frontend/src/app/tools/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/users/[id]/page.tsx b/frontend/src/app/users/[id]/page.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/app/users/[id]/user-profile.tsx b/frontend/src/app/users/[id]/user-profile.tsx old mode 100644 new mode 100755 diff --git a/frontend/src/components/admin-ai-assistant.tsx b/frontend/src/components/admin-ai-assistant.tsx old mode 100644 new mode 100755 index 9562f41..46c7a31 --- a/frontend/src/components/admin-ai-assistant.tsx +++ b/frontend/src/components/admin-ai-assistant.tsx @@ -30,6 +30,7 @@ const AVAILABLE_TOOLS_DESC = `可用工具列表(需要执行操作时,返 - **list-roles**: 角色列表 - **list-admins**: 管理员列表 - **get-enterprise-orgs**: 企业组织列表 +- **search**: 全局搜索(q必填, type? 可选 all|users|orders|courses|contents) === 创建 === - **create-course**: 创建课程(title必填, description?, price?, isFree?, status?) @@ -72,6 +73,9 @@ const AVAILABLE_TOOLS_DESC = `可用工具列表(需要执行操作时,返 === 导航 === - **navigate**: 跳转到页面(path: /admin/users等) +=== 通知管理 === +- **mark-all-notifications-read**: 将所有通知标记为已读 + 当用户请求执行操作时,先调用对应工具。工具执行完毕后会用自然语言总结结果。`; const SYSTEM_PROMPT = `你是宇之然AI管理后台的智能助手,帮助管理员完成日常运营工作。 @@ -210,7 +214,7 @@ export function AdminAIAssistant() { ); } - const starters = ['查看仪表盘数据', '列出最近用户', '查看待审核评论', '查看企业版组织']; + const starters = ['查看仪表盘数据', '列出最近用户', '搜索订单', '查看待审核评论', '查看企业版组织', '列出所有角色', '帮我查一下最近的课程']; return (
    diff --git a/frontend/src/components/ai-assistant.tsx b/frontend/src/components/ai-assistant.tsx old mode 100644 new mode 100755 index c8b4b3d..c32b16a --- a/frontend/src/components/ai-assistant.tsx +++ b/frontend/src/components/ai-assistant.tsx @@ -2,19 +2,83 @@ import { useState, useRef, useEffect, FormEvent } from 'react'; import { usePathname, useRouter } from 'next/navigation'; -import { MessageCircle, X, Send, Minus, Sparkles } from 'lucide-react'; -import { getAssistantContext, parseActionCommand, type AssistantContext, type AssistantAction } from '@/lib/assistant-context'; -import { executeAction, setRouter } from '@/lib/assistant-actions'; +import { X, Send, Minus, Sparkles } from 'lucide-react'; +import { executeClientAction } from '@/lib/assistant-actions'; import { useT } from '@/i18n'; import { getToken, apiFetch } from '@/lib/auth'; -import { DEFAULT_MODEL } from '@/lib/models'; import { toast } from 'sonner'; interface Message { role: 'user' | 'assistant'; content: string; - hasAction?: boolean; - actionExecuted?: boolean; +} + +const PAGE_CONTEXTS: Record = { + '/': { + greeting: '你好!我是宇之然 AI 助手,可以帮你了解平台功能、搜索内容、查看学习进度等。试试下面的问题:', + starters: ['宇之然 AI 能做什么?', '如何开始学习 AI?', '搜索一些课程', '推荐一个学习路线', '查看有哪些技能'], + }, + '/sandbox': { + greeting: '我在 AI 沙盒页面,可以帮你了解沙盒功能、切换模型、开始对话等。', + starters: ['如何切换模型?', '高级参数怎么调?', '如何查看历史记录?', '对话次数限制是多少'], + }, + '/skills': { + greeting: '我在技能库页面,可以帮你了解各种技能、推荐适合你的技能。', + starters: ['有哪些技能可以学习?', '如何选择适合我的技能?', '有哪些入门技能?', '如何开始练习一个技能?'], + }, + '/learning': { + greeting: '我在学习路径页面,可以帮你分析学习情况、推荐学习内容。', + starters: ['查看我的学情分析', '学习路径有哪些阶段?', '我有哪些薄弱环节', '推荐学习内容'], + }, + '/my': { + greeting: '我在个人中心页面,可以帮你管理账户、查看会员信息等。', + starters: ['查看个人信息', '我的会员状态', '查看订单记录', '查看通知'], + }, + '/models': { + greeting: '我在模型百科页面,可以帮你了解各种 AI 模型的特点和用途。', + starters: ['有哪些模型可以参考?', '如何选择合适的模型?', '模型能力怎么对比?', '查看所有模型'], + }, + '/prompts': { + greeting: '我在提示词工坊页面,可以帮你了解提示词编写技巧。', + starters: ['如何编写一个好的提示词?', '查看有哪些提示词', '如何测试提示词效果?'], + }, + '/courses': { + greeting: '我在课程专题页面,可以帮你选择课程、规划学习。', + starters: ['有哪些课程可以学习?', '如何选择适合我的课程?', '有免费的课程吗?', '搜索课程'], + }, + '/compare': { + greeting: '我在对比实验室页面,可以帮你了解如何使用对比功能。', + starters: ['对比实验室怎么用?', '如何添加对比模型?', '对比结果怎么看?'], + }, +}; + +function getPageContext(pathname: string) { + const sorted = Object.keys(PAGE_CONTEXTS).sort((a, b) => b.length - a.length); + for (const key of sorted) { + if (pathname.startsWith(key)) return PAGE_CONTEXTS[key]; + } + return PAGE_CONTEXTS['/']; +} + +function parseToolCall(text: string): { tool: string; params: Record; description?: string } | null { + let braceDepth = 0; + let start = -1; + for (let i = 0; i < text.length; i++) { + if (text[i] === '{') { + if (start === -1) start = i; + braceDepth++; + } else if (text[i] === '}') { + braceDepth--; + if (braceDepth === 0 && start !== -1) { + try { + const parsed = JSON.parse(text.slice(start, i + 1)); + if (parsed.tool) return parsed; + } catch {} + start = -1; + } + } + } + return null; } export function AIAssistant() { @@ -26,23 +90,18 @@ export function AIAssistant() { const [messages, setMessages] = useState([]); const [input, setInput] = useState(''); const [sending, setSending] = useState(false); - const [context, setContext] = useState(getAssistantContext(pathname)); + const [pageCtx, setPageCtx] = useState(getPageContext(pathname)); const [started, setStarted] = useState(false); const messagesEndRef = useRef(null); const inputRef = useRef(null); useEffect(() => { - setRouter(router); - }, [router]); - - useEffect(() => { - setContext(getAssistantContext(pathname)); + setPageCtx(getPageContext(pathname)); }, [pathname]); useEffect(() => { if (open && !started) { - const ctx = getAssistantContext(pathname); - setMessages([{ role: 'assistant', content: ctx.systemPrompt }]); + setPageCtx(getPageContext(pathname)); setStarted(true); } }, [open, pathname, started]); @@ -55,6 +114,29 @@ export function AIAssistant() { if (open) inputRef.current?.focus(); }, [open]); + async function postChat(messages: { role: string; content: string }[], pageContext?: string): Promise { + const tk = getToken(); + if (!tk) throw new Error('请先登录'); + const res = await apiFetch('/ai-assistant/chat', { + method: 'POST', + body: JSON.stringify({ messages, pageContext }), + }); + const data = await res.json(); + if (!res.ok) throw new Error(data.message || '请求失败'); + return data.reply; + } + + async function executeTool(tool: string, params: Record, messages: { role: string; content: string }[]): Promise<{ reply: string }> { + const tk = getToken(); + const res = await apiFetch('/ai-assistant/action', { + method: 'POST', + body: JSON.stringify({ tool, params, messages }), + }); + const data = await res.json(); + if (!res.ok) throw new Error(data.message || '工具执行失败'); + return data; + } + async function handleSend(e: FormEvent) { e.preventDefault(); const text = input.trim(); @@ -67,47 +149,34 @@ export function AIAssistant() { try { const tk = getToken(); - let reply = ''; - if (tk) { - const ctx = getAssistantContext(pathname); - const apiMessages = [ - { role: 'system', content: ctx.systemPrompt }, - ...messages.filter(m => m.role === 'user' || m.role === 'assistant').map(m => ({ role: m.role, content: m.content })), - { role: 'user', content: text }, - ]; - const res = await apiFetch('/sandbox/chat', { - method: 'POST', - body: JSON.stringify({ - conversationId: crypto.randomUUID(), - model: DEFAULT_MODEL, - messages: apiMessages, - }), - }); - const data = await res.json(); - if (!res.ok) throw new Error(data.message || '请求失败'); - reply = data.reply; - } else { - await new Promise(r => setTimeout(r, 400)); - reply = '📝 登录后可体验完整 AI 对话功能。\n\n点击右上角「登录」或「注册」即可开始使用,解锁 AI 助手的全部能力。'; + if (!tk) { + const reply = '📝 登录后可体验完整 AI 对话功能。\n\n点击右上角「登录」或「注册」即可开始使用,解锁 AI 助手的全部能力。'; + setMessages(prev => [...prev, { role: 'assistant', content: reply }]); + return; } - const action = parseActionCommand(reply); - const hasAction = !!action; - - if (hasAction) { - const cleanReply = reply.replace(/\{[\s\S]*?"action"\s*:\s*?"[^"]+"[\s\S]*?\}/, '').trim(); - const finalReply = cleanReply || '收到你的请求,正在处理...'; - - setMessages(prev => [...prev, { role: 'assistant', content: finalReply, hasAction: true }]); - - const result = await executeAction(action); - if (result.success) { - toast.success(result.message, { icon: }); - setMessages(prev => prev.map((m, i) => - i === prev.length - 1 ? { ...m, actionExecuted: true } : m - )); + const apiMessages = [ + ...messages.filter(m => m.role === 'user' || m.role === 'assistant').map(m => ({ role: m.role, content: m.content })), + { role: 'user', content: text }, + ]; + + const currentPage = pathname.split('/').filter(Boolean)[0] || '首页'; + let reply = await postChat(apiMessages, currentPage); + const toolCall = parseToolCall(reply); + + if (toolCall) { + const clientActions = ['navigate', 'setModel', 'startChat', 'openSkill', 'setParameter']; + if (clientActions.includes(toolCall.tool)) { + setMessages(prev => [...prev, { role: 'assistant', content: `正在${toolCall.description || '执行操作'}...` }]); + const result = await executeClientAction(toolCall.tool, toolCall.params, router); + if (result.success) { + toast.success(result.message, { icon: }); + } else { + toast.error(result.message); + } } else { - toast.error(result.message); + const result = await executeTool(toolCall.tool, toolCall.params, apiMessages); + setMessages(prev => [...prev, { role: 'assistant', content: result.reply }]); } } else { setMessages(prev => [...prev, { role: 'assistant', content: reply }]); @@ -121,9 +190,7 @@ export function AIAssistant() { function handleStarter(starter: string) { setInput(starter); - setTimeout(() => { - inputRef.current?.focus(); - }, 0); + setTimeout(() => inputRef.current?.focus(), 0); } if (!open) { @@ -149,8 +216,6 @@ export function AIAssistant() { ); } - const ctx = getAssistantContext(pathname); - return (
    setMinimized(!minimized)} className="p-1.5 text-muted-foreground hover:text-foreground hover:bg-accent rounded-lg transition-colors"> -
    @@ -177,13 +242,13 @@ export function AIAssistant() { {!minimized && ( <>
    - {messages.length === 1 && messages[0].role === 'assistant' && ( + {messages.length === 0 && (

    - {t.assistant?.greeting || '你好!我是宇之然 AI 助手,可以帮你了解和使用本站功能。试试下面的问题:'} + {pageCtx.greeting}

    - {ctx.starters.map((q, i) => ( + {pageCtx.starters.map((q, i) => (
    )} - {messages.map((msg, i) => { - const showActionIndicator = msg.hasAction && msg.actionExecuted && i === messages.length - 1; - return ( -
    - {msg.role === 'assistant' && ( -
    Y
    - )} -
    - {i === messages.length - 1 && msg.role === 'assistant' && started && messages.length > 1 - ? msg.content - : msg.role === 'assistant' && i === 0 - ? null - : msg.content} - {showActionIndicator && ( - - - - )} -
    - {msg.role === 'user' && ( -
    - )} + {messages.map((msg, i) => ( +
    + {msg.role === 'assistant' && ( +
    Y
    + )} +
    + {msg.content}
    - ); - })} + {msg.role === 'user' && ( +
    + )} +
    + ))} {sending && (
    Y
    @@ -266,4 +319,4 @@ export function AIAssistant() {
    ); -} \ No newline at end of file +} diff --git a/frontend/src/components/layout/__tests__/footer.test.tsx b/frontend/src/components/layout/__tests__/footer.test.tsx old mode 100644 new mode 100755 index e9dc9b0..f741ec5 --- a/frontend/src/components/layout/__tests__/footer.test.tsx +++ b/frontend/src/components/layout/__tests__/footer.test.tsx @@ -15,7 +15,7 @@ describe('Footer', () => { it('should render navigation links', () => { render(