From 8f286de71873717c202169d6c062ba0ac3ae099b Mon Sep 17 00:00:00 2001 From: Khairul Hidayat Date: Thu, 8 Aug 2024 06:07:30 +0700 Subject: [PATCH] feat: initial commit --- .env.example | 16 + .eslintrc.cjs | 18 + .gitignore | 28 + README.md | 30 + index.html | 13 + package.json | 62 + pnpm-lock.yaml | 4183 ++++++++++++++++++ postcss.config.js | 6 + public/vite.svg | 1 + server/db/index.ts | 10 + server/db/migrations/0000_low_catseye.sql | 38 + server/db/migrations/meta/0000_snapshot.json | 276 ++ server/db/migrations/meta/_journal.json | 13 + server/db/seed.ts | 39 + server/drizzle.config.ts | 11 + server/jobs/calculate-user-points.ts | 84 + server/jobs/fetch-repo-contributors.ts | 46 + server/jobs/fetch-repo-data.ts | 26 + server/jobs/fetch-user-profile.ts | 30 + server/jobs/fetch-user-repos.ts | 69 + server/jobs/index.ts | 15 + server/lib/consts.ts | 12 + server/lib/github.ts | 283 ++ server/lib/logger.ts | 17 + server/lib/queue.ts | 19 + server/lib/utils.ts | 10 + server/main.ts | 40 + server/middlewares/auth.ts | 34 + server/models/index.ts | 2 + server/models/repositories.ts | 38 + server/models/users.ts | 31 + server/queue-worker.ts | 42 + server/router.ts | 17 + server/routes/auth.ts | 115 + server/routes/leaderboard.ts | 80 + src/app/app.tsx | 15 + src/app/styles.css | 13 + src/assets/react.svg | 1 + src/assets/stars-animation.json | 1 + src/components/containers/appbar.tsx | 72 + src/components/containers/rank-board.tsx | 57 + src/components/containers/rank-list-item.tsx | 58 + src/components/context/auth-context.tsx | 28 + src/components/layouts/main-layout.tsx | 23 + src/hooks/useAuth.ts | 20 + src/hooks/useFetch.ts | 62 + src/lib/api.ts | 8 + src/lib/utils.ts | 10 + src/main.tsx | 10 + src/pages/home/hooks.ts | 22 + src/pages/home/page.tsx | 103 + src/vite-env.d.ts | 1 + tailwind.config.js | 16 + tsconfig.json | 33 + tsconfig.node.json | 13 + vite.config.ts | 23 + 56 files changed, 6343 insertions(+) create mode 100644 .env.example create mode 100644 .eslintrc.cjs create mode 100644 .gitignore create mode 100644 README.md create mode 100644 index.html create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 postcss.config.js create mode 100644 public/vite.svg create mode 100644 server/db/index.ts create mode 100644 server/db/migrations/0000_low_catseye.sql create mode 100644 server/db/migrations/meta/0000_snapshot.json create mode 100644 server/db/migrations/meta/_journal.json create mode 100644 server/db/seed.ts create mode 100644 server/drizzle.config.ts create mode 100644 server/jobs/calculate-user-points.ts create mode 100644 server/jobs/fetch-repo-contributors.ts create mode 100644 server/jobs/fetch-repo-data.ts create mode 100644 server/jobs/fetch-user-profile.ts create mode 100644 server/jobs/fetch-user-repos.ts create mode 100644 server/jobs/index.ts create mode 100644 server/lib/consts.ts create mode 100644 server/lib/github.ts create mode 100644 server/lib/logger.ts create mode 100644 server/lib/queue.ts create mode 100644 server/lib/utils.ts create mode 100644 server/main.ts create mode 100644 server/middlewares/auth.ts create mode 100644 server/models/index.ts create mode 100644 server/models/repositories.ts create mode 100644 server/models/users.ts create mode 100644 server/queue-worker.ts create mode 100644 server/router.ts create mode 100644 server/routes/auth.ts create mode 100644 server/routes/leaderboard.ts create mode 100644 src/app/app.tsx create mode 100644 src/app/styles.css create mode 100644 src/assets/react.svg create mode 100755 src/assets/stars-animation.json create mode 100644 src/components/containers/appbar.tsx create mode 100644 src/components/containers/rank-board.tsx create mode 100644 src/components/containers/rank-list-item.tsx create mode 100644 src/components/context/auth-context.tsx create mode 100644 src/components/layouts/main-layout.tsx create mode 100644 src/hooks/useAuth.ts create mode 100644 src/hooks/useFetch.ts create mode 100644 src/lib/api.ts create mode 100644 src/lib/utils.ts create mode 100644 src/main.tsx create mode 100644 src/pages/home/hooks.ts create mode 100644 src/pages/home/page.tsx create mode 100644 src/vite-env.d.ts create mode 100644 tailwind.config.js create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..5fa2ae8 --- /dev/null +++ b/.env.example @@ -0,0 +1,16 @@ +# App +HOST= +PORT= + +# Database +DATABASE_PATH= + +# Auth +GITHUB_CLIENT_ID= +GITHUB_SECRET_KEY= +JWT_SECRET=supersecretkey + +# Queue Worker +QUEUE_CONCURRENCY=1 +REDIS_HOST= +REDIS_PORT= diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..d6c9537 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,18 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + ignorePatterns: ['dist', '.eslintrc.cjs'], + parser: '@typescript-eslint/parser', + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ee86419 --- /dev/null +++ b/.gitignore @@ -0,0 +1,28 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +*.db +.env* +!.env.example diff --git a/README.md b/README.md new file mode 100644 index 0000000..e1cdc89 --- /dev/null +++ b/README.md @@ -0,0 +1,30 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: + +- Configure the top-level `parserOptions` property like this: + +```js +export default { + // other rules... + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + project: ['./tsconfig.json', './tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: __dirname, + }, +} +``` + +- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked` +- Optionally add `plugin:@typescript-eslint/stylistic-type-checked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list diff --git a/index.html b/index.html new file mode 100644 index 0000000..3713ef6 --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Antrian Kick IMPHNEN + + +
+ + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..7c1bce4 --- /dev/null +++ b/package.json @@ -0,0 +1,62 @@ +{ + "name": "github-contrib-rank", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "client:dev": "vite", + "client:build": "tsc -b && vite build", + "client:preview": "vite preview", + "server:dev": "bun --watch server/main.ts", + "db:drop": "drizzle-kit drop --config server/drizzle.config.ts", + "db:generate": "drizzle-kit generate --config server/drizzle.config.ts", + "db:migrate": "drizzle-kit migrate --config server/drizzle.config.ts", + "db:push": "drizzle-kit push --config server/drizzle.config.ts", + "db:seed": "bun run server/db/seed.ts", + "dev": "concurrently \"npm run client:dev\" \"npm run server:dev\"", + "build": "npm run client:build && npm run server:build", + "start": "NODE_ENV=production bun run server/main.ts", + "start:worker": "NODE_ENV=production bun run server/queue-worker.ts" + }, + "dependencies": { + "bullmq": "^5.12.1", + "cheerio": "1.0.0-rc.12", + "clsx": "^2.1.1", + "daisyui": "^4.12.10", + "dayjs": "^1.11.12", + "drizzle-orm": "^0.32.2", + "hono": "^4.5.4", + "pino": "^9.3.2", + "react": "^18.3.1", + "react-daisyui": "^5.0.3", + "react-dom": "^18.3.1", + "react-icons": "^5.2.1", + "react-lottie": "^1.2.4", + "tailwind-merge": "^2.4.0", + "zustand": "^4.5.4" + }, + "devDependencies": { + "@faker-js/faker": "^8.4.1", + "@types/bun": "^1.1.6", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@types/react-lottie": "^1.2.10", + "@typescript-eslint/eslint-plugin": "^7.15.0", + "@typescript-eslint/parser": "^7.15.0", + "@vitejs/plugin-react-swc": "^3.5.0", + "autoprefixer": "^10.4.20", + "better-sqlite3": "^11.1.2", + "concurrently": "^8.2.2", + "drizzle-kit": "^0.23.2", + "eslint": "^8.57.0", + "eslint-plugin-react-hooks": "^4.6.2", + "eslint-plugin-react-refresh": "^0.4.7", + "pino-pretty": "^11.2.2", + "postcss": "^8.4.41", + "prop-types": "^15.8.1", + "tailwindcss": "^3.4.7", + "typescript": "^5.2.2", + "vite": "^5.3.4" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..2465a29 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,4183 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + bullmq: + specifier: ^5.12.1 + version: 5.12.1 + cheerio: + specifier: 1.0.0-rc.12 + version: 1.0.0-rc.12 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + daisyui: + specifier: ^4.12.10 + version: 4.12.10(postcss@8.4.41) + dayjs: + specifier: ^1.11.12 + version: 1.11.12 + drizzle-orm: + specifier: ^0.32.2 + version: 0.32.2(@types/react@18.3.3)(better-sqlite3@11.1.2)(bun-types@1.1.17)(react@18.3.1) + hono: + specifier: ^4.5.4 + version: 4.5.4 + pino: + specifier: ^9.3.2 + version: 9.3.2 + react: + specifier: ^18.3.1 + version: 18.3.1 + react-daisyui: + specifier: ^5.0.3 + version: 5.0.3(daisyui@4.12.10(postcss@8.4.41))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.7) + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + react-icons: + specifier: ^5.2.1 + version: 5.2.1(react@18.3.1) + react-lottie: + specifier: ^1.2.4 + version: 1.2.4(react@18.3.1) + tailwind-merge: + specifier: ^2.4.0 + version: 2.4.0 + zustand: + specifier: ^4.5.4 + version: 4.5.4(@types/react@18.3.3)(react@18.3.1) + devDependencies: + '@faker-js/faker': + specifier: ^8.4.1 + version: 8.4.1 + '@types/bun': + specifier: ^1.1.6 + version: 1.1.6 + '@types/react': + specifier: ^18.3.3 + version: 18.3.3 + '@types/react-dom': + specifier: ^18.3.0 + version: 18.3.0 + '@types/react-lottie': + specifier: ^1.2.10 + version: 1.2.10 + '@typescript-eslint/eslint-plugin': + specifier: ^7.15.0 + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/parser': + specifier: ^7.15.0 + version: 7.18.0(eslint@8.57.0)(typescript@5.5.4) + '@vitejs/plugin-react-swc': + specifier: ^3.5.0 + version: 3.7.0(vite@5.3.5(@types/node@20.12.14)) + autoprefixer: + specifier: ^10.4.20 + version: 10.4.20(postcss@8.4.41) + better-sqlite3: + specifier: ^11.1.2 + version: 11.1.2 + concurrently: + specifier: ^8.2.2 + version: 8.2.2 + drizzle-kit: + specifier: ^0.23.2 + version: 0.23.2 + eslint: + specifier: ^8.57.0 + version: 8.57.0 + eslint-plugin-react-hooks: + specifier: ^4.6.2 + version: 4.6.2(eslint@8.57.0) + eslint-plugin-react-refresh: + specifier: ^0.4.7 + version: 0.4.9(eslint@8.57.0) + pino-pretty: + specifier: ^11.2.2 + version: 11.2.2 + postcss: + specifier: ^8.4.41 + version: 8.4.41 + prop-types: + specifier: ^15.8.1 + version: 15.8.1 + tailwindcss: + specifier: ^3.4.7 + version: 3.4.7 + typescript: + specifier: ^5.2.2 + version: 5.5.4 + vite: + specifier: ^5.3.4 + version: 5.3.5(@types/node@20.12.14) + +packages: + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@babel/runtime@7.25.0': + resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} + engines: {node: '>=6.9.0'} + + '@drizzle-team/brocli@0.8.2': + resolution: {integrity: sha512-zTrFENsqGvOkBOuHDC1pXCkDXNd2UhP4lI3gYGhQ1R1SPeAAfqzPsV1dcpMy4uNU6kB5VpU5NGhvwxVNETR02A==} + + '@esbuild-kit/core-utils@3.3.2': + resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} + + '@esbuild-kit/esm-loader@2.6.5': + resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} + + '@esbuild/aix-ppc64@0.19.12': + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.19.12': + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.19.12': + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.19.12': + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.19.12': + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.19.12': + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.19.12': + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.19.12': + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.19.12': + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.19.12': + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.19.12': + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.19.12': + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.19.12': + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.19.12': + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.19.12': + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.19.12': + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.19.12': + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.19.12': + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.19.12': + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.19.12': + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.19.12': + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.19.12': + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.19.12': + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.11.0': + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.0': + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@faker-js/faker@8.4.1': + resolution: {integrity: sha512-XQ3cU+Q8Uqmrbf2e0cIC/QN43sTBSC8KF12u29Mb47tWrt2hAgBXSgpZMj4Ao8Uk0iJcU99QsOCaIL8934obCg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0, npm: '>=6.14.13'} + + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@ioredis/commands@1.2.0': + resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': + resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} + cpu: [arm64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': + resolution: {integrity: sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==} + cpu: [x64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': + resolution: {integrity: sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==} + cpu: [arm64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': + resolution: {integrity: sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==} + cpu: [arm] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': + resolution: {integrity: sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==} + cpu: [x64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': + resolution: {integrity: sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==} + cpu: [x64] + os: [win32] + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@rollup/rollup-android-arm-eabi@4.20.0': + resolution: {integrity: sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.20.0': + resolution: {integrity: sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.20.0': + resolution: {integrity: sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.20.0': + resolution: {integrity: sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.20.0': + resolution: {integrity: sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.20.0': + resolution: {integrity: sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.20.0': + resolution: {integrity: sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.20.0': + resolution: {integrity: sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.20.0': + resolution: {integrity: sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.20.0': + resolution: {integrity: sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.20.0': + resolution: {integrity: sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.20.0': + resolution: {integrity: sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.20.0': + resolution: {integrity: sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.20.0': + resolution: {integrity: sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.20.0': + resolution: {integrity: sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.20.0': + resolution: {integrity: sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==} + cpu: [x64] + os: [win32] + + '@swc/core-darwin-arm64@1.7.6': + resolution: {integrity: sha512-6lYHey84ZzsdtC7UuPheM4Rm0Inzxm6Sb8U6dmKc4eCx8JL0LfWG4LC5RsdsrTxnjTsbriWlnhZBffh8ijUHIQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.7.6': + resolution: {integrity: sha512-Fyl+8aH9O5rpx4O7r2KnsPpoi32iWoKOYKiipeTbGjQ/E95tNPxbmsz4yqE8Ovldcga60IPJ5OKQA3HWRiuzdw==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.7.6': + resolution: {integrity: sha512-2WxYTqFaOx48GKC2cbO1/IntA+w+kfCFy436Ij7qRqqtV/WAvTM9TC1OmiFbqq436rSot52qYmX8fkwdB5UcLQ==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.7.6': + resolution: {integrity: sha512-TBEGMSe0LhvPe4S7E68c7VzgT3OMu4VTmBLS7B2aHv4v8uZO92Khpp7L0WqgYU1y5eMjk+XLDLi4kokiNHv/Hg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.7.6': + resolution: {integrity: sha512-QI8QGL0HGT42tj7F1A+YAzhGkJjUcvvTfI1e2m704W0Enl2/UIK9v5D1zvQzYwusRyKuaQfbeBRYDh0NcLOGLg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-x64-gnu@1.7.6': + resolution: {integrity: sha512-61AYVzhjuNQAVIKKWOJu3H0/pFD28RYJGxnGg3YMhvRLRyuWNyY5Nyyj2WkKcz/ON+g38Arlz00NT1LDIViRLg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.7.6': + resolution: {integrity: sha512-hQFznpfLK8XajfAAN9Cjs0w/aVmO7iu9VZvInyrTCRcPqxV5O+rvrhRxKvC1LRMZXr5M6JRSRtepp5w+TK4kAw==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-win32-arm64-msvc@1.7.6': + resolution: {integrity: sha512-Aqsd9afykVMuekzjm4X4TDqwxmG4CrzoOSFe0hZrn9SMio72l5eAPnMtYoe5LsIqtjV8MNprLfXaNbjHjTegmA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.7.6': + resolution: {integrity: sha512-9h0hYnOeRVNeQgHQTvD1Im67faNSSzBZ7Adtxyu9urNLfBTJilMllFd2QuGHlKW5+uaT6ZH7ZWDb+c/enx7Lcg==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.7.6': + resolution: {integrity: sha512-izeoB8glCSe6IIDQmrVm6bvR9muk9TeKgmtY7b6l1BwL4BFnTUk4dMmpbntT90bEVQn3JPCaPtUG4HfL8VuyuA==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.7.6': + resolution: {integrity: sha512-FZxyao9eQks1MRmUshgsZTmlg/HB2oXK5fghkoWJm/1CU2q2kaJlVDll2as5j+rmWiwkp0Gidlq8wlXcEEAO+g==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '*' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/types@0.1.12': + resolution: {integrity: sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==} + + '@types/bun@1.1.6': + resolution: {integrity: sha512-uJgKjTdX0GkWEHZzQzFsJkWp5+43ZS7HC8sZPFnOwnSo1AsNl2q9o2bFeS23disNDqbggEgyFkKCHl/w8iZsMA==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/node@20.12.14': + resolution: {integrity: sha512-scnD59RpYD91xngrQQLGkE+6UrHUPzeKZWhhjBSa3HSkwjbQc38+q3RoIVEwxQGRw3M+j5hpNAM+lgV3cVormg==} + + '@types/prop-types@15.7.12': + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + + '@types/react-dom@18.3.0': + resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + + '@types/react-lottie@1.2.10': + resolution: {integrity: sha512-rCd1p3US4ELKJlqwVnP0h5b24zt5p9OCvKUoNpYExLqwbFZMWEiJ6EGLMmH7nmq5V7KomBIbWO2X/XRFsL0vCA==} + + '@types/react@18.3.3': + resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} + + '@types/ws@8.5.12': + resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} + + '@typescript-eslint/eslint-plugin@7.18.0': + resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@7.18.0': + resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@7.18.0': + resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/type-utils@7.18.0': + resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@7.18.0': + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/typescript-estree@7.18.0': + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@7.18.0': + resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + + '@typescript-eslint/visitor-keys@7.18.0': + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@vitejs/plugin-react-swc@3.7.0': + resolution: {integrity: sha512-yrknSb3Dci6svCd/qhHqhFPDSw0QtjumcqdKMoNNzmOl5lMXTTiqzjWtG4Qask2HdvvzaNgSunbQGet8/GrKdA==} + peerDependencies: + vite: ^4 || ^5 + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + autoprefixer@10.4.20: + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + babel-runtime@6.26.0: + resolution: {integrity: sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + better-sqlite3@11.1.2: + resolution: {integrity: sha512-gujtFwavWU4MSPT+h9B+4pkvZdyOUkH54zgLdIrMmmmd4ZqiBIrRNBzNzYVFO417xo882uP5HBu4GjOfaSrIQw==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.23.3: + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + bullmq@5.12.1: + resolution: {integrity: sha512-XNUnT4+hJ/bnu3HkIeauN/i+fU+DwC74rubPLktoUsds7zBfugN3jF8XbaT7Ya4U+SANR+3T4u9YG8KUbsp2+g==} + + bun-types@1.1.17: + resolution: {integrity: sha512-Z4+OplcSd/YZq7ZsrfD00DKJeCwuNY96a1IDJyR73+cTBaFIS7SC6LhpY/W3AMEXO9iYq5NJ58WAwnwL1p5vKg==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + caniuse-lite@1.0.30001650: + resolution: {integrity: sha512-fgEc7hP/LB7iicdXHUI9VsBsMZmUmlVJeQP2qqQW+3lkqVhbmjEU8zp+h5stWeilX+G7uXuIUIIlWlDw9jdt8g==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + + cheerio@1.0.0-rc.12: + resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} + engines: {node: '>= 6'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + cluster-key-slot@1.1.2: + resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} + engines: {node: '>=0.10.0'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concurrently@8.2.2: + resolution: {integrity: sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==} + engines: {node: ^14.13.0 || >=16.0.0} + hasBin: true + + core-js@2.6.12: + resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} + deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. + + cron-parser@4.9.0: + resolution: {integrity: sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==} + engines: {node: '>=12.0.0'} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + + css-selector-tokenizer@0.8.0: + resolution: {integrity: sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + culori@3.3.0: + resolution: {integrity: sha512-pHJg+jbuFsCjz9iclQBqyL3B2HLCBF71BwVNujUYEvCeQMvV97R59MNK3R2+jgJ3a1fcZgI9B3vYgz8lzr/BFQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + daisyui@4.12.10: + resolution: {integrity: sha512-jp1RAuzbHhGdXmn957Z2XsTZStXGHzFfF0FgIOZj3Wv9sH7OZgLfXTRZNfKVYxltGUOBsG1kbWAdF5SrqjebvA==} + engines: {node: '>=16.9.0'} + + date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + + dateformat@4.6.3: + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + + dayjs@1.11.12: + resolution: {integrity: sha512-Rt2g+nTbLlDWZTwwrIXjy9MeiZmSDI375FvZs72ngxx8PDC6YXOeR3q5LAuPzjZQxhiWdRKac7RKV+YyQYfYIg==} + + debug@4.3.6: + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + + drizzle-kit@0.23.2: + resolution: {integrity: sha512-NWkQ7GD2OTbQ7HzcjsaCOf3n0tlFPSEAF38fvDpwDj8jRbGWGFtN2cD8I8wp4lU+5Os/oyP2xycTKGLHdPipUw==} + hasBin: true + + drizzle-orm@0.32.2: + resolution: {integrity: sha512-3fXKzPzrgZIcnWCSLiERKN5Opf9Iagrag75snfFlKeKSYB1nlgPBshzW3Zn6dQymkyiib+xc4nIz0t8U+Xdpuw==} + peerDependencies: + '@aws-sdk/client-rds-data': '>=3' + '@cloudflare/workers-types': '>=3' + '@electric-sql/pglite': '>=0.1.1' + '@libsql/client': '*' + '@neondatabase/serverless': '>=0.1' + '@op-engineering/op-sqlite': '>=2' + '@opentelemetry/api': ^1.4.1 + '@planetscale/database': '>=1' + '@prisma/client': '*' + '@tidbcloud/serverless': '*' + '@types/better-sqlite3': '*' + '@types/pg': '*' + '@types/react': '>=18' + '@types/sql.js': '*' + '@vercel/postgres': '>=0.8.0' + '@xata.io/client': '*' + better-sqlite3: '>=7' + bun-types: '*' + expo-sqlite: '>=13.2.0' + knex: '*' + kysely: '*' + mysql2: '>=2' + pg: '>=8' + postgres: '>=3' + prisma: '*' + react: '>=18' + sql.js: '>=1' + sqlite3: '>=5' + peerDependenciesMeta: + '@aws-sdk/client-rds-data': + optional: true + '@cloudflare/workers-types': + optional: true + '@electric-sql/pglite': + optional: true + '@libsql/client': + optional: true + '@neondatabase/serverless': + optional: true + '@op-engineering/op-sqlite': + optional: true + '@opentelemetry/api': + optional: true + '@planetscale/database': + optional: true + '@prisma/client': + optional: true + '@tidbcloud/serverless': + optional: true + '@types/better-sqlite3': + optional: true + '@types/pg': + optional: true + '@types/react': + optional: true + '@types/sql.js': + optional: true + '@vercel/postgres': + optional: true + '@xata.io/client': + optional: true + better-sqlite3: + optional: true + bun-types: + optional: true + expo-sqlite: + optional: true + knex: + optional: true + kysely: + optional: true + mysql2: + optional: true + pg: + optional: true + postgres: + optional: true + prisma: + optional: true + react: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + electron-to-chromium@1.5.5: + resolution: {integrity: sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + esbuild-register@3.6.0: + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} + peerDependencies: + esbuild: '>=0.12 <1' + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-plugin-react-hooks@4.6.2: + resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + + eslint-plugin-react-refresh@0.4.9: + resolution: {integrity: sha512-QK49YrBAo5CLNLseZ7sZgvgTy21E6NEw22eZqc4teZfH8pxV3yXc9XXOYfUI6JNpw7mfHNkAeWtBxrTyykB6HA==} + peerDependencies: + eslint: '>=7' + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + + fast-copy@3.0.2: + resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fastparse@1.1.2: + resolution: {integrity: sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + foreground-child@3.2.1: + resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} + engines: {node: '>=14'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-tsconfig@4.7.6: + resolution: {integrity: sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==} + + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + help-me@5.0.0: + resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + + hono@4.5.4: + resolution: {integrity: sha512-k2IguJfRgNCpDbAfpxk+o+fZBLFHl4+eIZUpjc1ItZWHeZ37SmT3efA1UpkIaC0hSf1NJg0E79/wWn6g9LQ4Cw==} + engines: {node: '>=16.0.0'} + + htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ioredis@5.4.1: + resolution: {integrity: sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==} + engines: {node: '>=12.22.0'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-core-module@2.15.0: + resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + hasBin: true + + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + + lodash.isarguments@3.1.0: + resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lottie-web@5.12.2: + resolution: {integrity: sha512-uvhvYPC8kGPjXT3MyKMrL3JitEAmDMp30lVkuq/590Mw9ok6pWcFCwXJveo0t5uqYw1UREQHofD+jVpdjBv8wg==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + luxon@3.5.0: + resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==} + engines: {node: '>=12'} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + msgpackr-extract@3.0.3: + resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} + hasBin: true + + msgpackr@1.11.0: + resolution: {integrity: sha512-I8qXuuALqJe5laEBYoFykChhSXLikZmUhccjGsPuSJ/7uPip2TJ7lwdIQwWSAi0jGZDXv4WOP8Qg65QZRuXxXw==} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + node-abi@3.65.0: + resolution: {integrity: sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==} + engines: {node: '>=10'} + + node-abort-controller@3.1.1: + resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + + node-gyp-build-optional-packages@5.2.2: + resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} + hasBin: true + + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse5-htmlparser2-tree-adapter@7.0.0: + resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} + + parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pino-abstract-transport@1.2.0: + resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} + + pino-pretty@11.2.2: + resolution: {integrity: sha512-2FnyGir8nAJAqD3srROdrF1J5BIcMT4nwj7hHSc60El6Uxlym00UbCCd8pYIterstVBFlMyF1yFV8XdGIPbj4A==} + hasBin: true + + pino-std-serializers@7.0.0: + resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} + + pino@9.3.2: + resolution: {integrity: sha512-WtARBjgZ7LNEkrGWxMBN/jvlFiE17LTbBoH0konmBU684Kd0uIiDwBXlcTCW7iJnA6HfIKwUssS/2AC6cDEanw==} + hasBin: true + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.1.1: + resolution: {integrity: sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.41: + resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} + engines: {node: ^10 || ^12 || >=14} + + prebuild-install@7.1.2: + resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} + engines: {node: '>=10'} + hasBin: true + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + process-warning@4.0.0: + resolution: {integrity: sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + react-daisyui@5.0.3: + resolution: {integrity: sha512-zTlWwqp08dlvdk7fHnYbkZETYqcd2yZhMteAN9nTSHmOzy/XgiIGqmjuw/Yi6qfMk87/IYexr/J5QceHECrXdg==} + peerDependencies: + daisyui: ^4.12.10 + react: '>=16' + react-dom: '>=16' + tailwindcss: '>=3.2.7' + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-icons@5.2.1: + resolution: {integrity: sha512-zdbW5GstTzXaVKvGSyTaBalt7HSfuK5ovrzlpyiWHAFXndXTdd/1hdDHI4xBM1Mn7YriT6aqESucFl9kEXzrdw==} + peerDependencies: + react: '*' + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-lottie@1.2.4: + resolution: {integrity: sha512-kBGxI+MIZGBf4wZhNCWwHkMcVP+kbpmrLWH/SkO0qCKc7D7eSPcxQbfpsmsCo8v2KCBYjuGSou+xTqK44D/jMg==} + engines: {npm: ^3.0.0} + peerDependencies: + react: '>=15.0.0' + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + + redis-errors@1.2.0: + resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==} + engines: {node: '>=4'} + + redis-parser@3.0.0: + resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==} + engines: {node: '>=4'} + + regenerator-runtime@0.11.1: + resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rollup@4.20.0: + resolution: {integrity: sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + sonic-boom@4.0.1: + resolution: {integrity: sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + spawn-command@0.0.2: + resolution: {integrity: sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + standard-as-callback@2.1.0: + resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + tailwind-merge@2.4.0: + resolution: {integrity: sha512-49AwoOQNKdqKPd9CViyH5wJoSKsCDjUlzL8DxuGp3P1FsGY36NJDAa18jLZcaHAUUuTj+JB8IAo8zWgBNvBF7A==} + + tailwindcss@3.4.7: + resolution: {integrity: sha512-rxWZbe87YJb4OcSopb7up2Ba4U82BoiSGUdoDr3Ydrg9ckxFS/YWsvhN323GMcddgU65QRy7JndC7ahhInhvlQ==} + engines: {node: '>=14.0.0'} + hasBin: true + + tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + thread-stream@3.1.0: + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + use-sync-external-store@1.2.0: + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + vite@5.3.5: + resolution: {integrity: sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yaml@2.5.0: + resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zustand@4.5.4: + resolution: {integrity: sha512-/BPMyLKJPtFEvVL0E9E9BTUM63MNyhPGlvxk1XjrfWTUlV+BR8jufjsovHzrtR6YNcBEcL7cMHovL1n9xHawEg==} + engines: {node: '>=12.7.0'} + peerDependencies: + '@types/react': '>=16.8' + immer: '>=9.0.6' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@babel/runtime@7.25.0': + dependencies: + regenerator-runtime: 0.14.1 + + '@drizzle-team/brocli@0.8.2': {} + + '@esbuild-kit/core-utils@3.3.2': + dependencies: + esbuild: 0.18.20 + source-map-support: 0.5.21 + + '@esbuild-kit/esm-loader@2.6.5': + dependencies: + '@esbuild-kit/core-utils': 3.3.2 + get-tsconfig: 4.7.6 + + '@esbuild/aix-ppc64@0.19.12': + optional: true + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm64@0.19.12': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-arm@0.19.12': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/android-x64@0.19.12': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.18.20': + optional: true + + '@esbuild/darwin-arm64@0.19.12': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.18.20': + optional: true + + '@esbuild/darwin-x64@0.19.12': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.18.20': + optional: true + + '@esbuild/freebsd-arm64@0.19.12': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.18.20': + optional: true + + '@esbuild/freebsd-x64@0.19.12': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.18.20': + optional: true + + '@esbuild/linux-arm64@0.19.12': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.18.20': + optional: true + + '@esbuild/linux-arm@0.19.12': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.18.20': + optional: true + + '@esbuild/linux-ia32@0.19.12': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.18.20': + optional: true + + '@esbuild/linux-loong64@0.19.12': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.18.20': + optional: true + + '@esbuild/linux-mips64el@0.19.12': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.19.12': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.19.12': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.19.12': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/linux-x64@0.19.12': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.19.12': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.19.12': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.19.12': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.19.12': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.19.12': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.18.20': + optional: true + + '@esbuild/win32-x64@0.19.12': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.11.0': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.3.6 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.0': {} + + '@faker-js/faker@8.4.1': {} + + '@humanwhocodes/config-array@0.11.14': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.6 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@ioredis/commands@1.2.0': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@rollup/rollup-android-arm-eabi@4.20.0': + optional: true + + '@rollup/rollup-android-arm64@4.20.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.20.0': + optional: true + + '@rollup/rollup-darwin-x64@4.20.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.20.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.20.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.20.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.20.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.20.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.20.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.20.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.20.0': + optional: true + + '@swc/core-darwin-arm64@1.7.6': + optional: true + + '@swc/core-darwin-x64@1.7.6': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.7.6': + optional: true + + '@swc/core-linux-arm64-gnu@1.7.6': + optional: true + + '@swc/core-linux-arm64-musl@1.7.6': + optional: true + + '@swc/core-linux-x64-gnu@1.7.6': + optional: true + + '@swc/core-linux-x64-musl@1.7.6': + optional: true + + '@swc/core-win32-arm64-msvc@1.7.6': + optional: true + + '@swc/core-win32-ia32-msvc@1.7.6': + optional: true + + '@swc/core-win32-x64-msvc@1.7.6': + optional: true + + '@swc/core@1.7.6': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.12 + optionalDependencies: + '@swc/core-darwin-arm64': 1.7.6 + '@swc/core-darwin-x64': 1.7.6 + '@swc/core-linux-arm-gnueabihf': 1.7.6 + '@swc/core-linux-arm64-gnu': 1.7.6 + '@swc/core-linux-arm64-musl': 1.7.6 + '@swc/core-linux-x64-gnu': 1.7.6 + '@swc/core-linux-x64-musl': 1.7.6 + '@swc/core-win32-arm64-msvc': 1.7.6 + '@swc/core-win32-ia32-msvc': 1.7.6 + '@swc/core-win32-x64-msvc': 1.7.6 + + '@swc/counter@0.1.3': {} + + '@swc/types@0.1.12': + dependencies: + '@swc/counter': 0.1.3 + + '@types/bun@1.1.6': + dependencies: + bun-types: 1.1.17 + + '@types/estree@1.0.5': {} + + '@types/node@20.12.14': + dependencies: + undici-types: 5.26.5 + + '@types/prop-types@15.7.12': {} + + '@types/react-dom@18.3.0': + dependencies: + '@types/react': 18.3.3 + + '@types/react-lottie@1.2.10': + dependencies: + '@types/react': 18.3.3 + + '@types/react@18.3.3': + dependencies: + '@types/prop-types': 15.7.12 + csstype: 3.1.3 + + '@types/ws@8.5.12': + dependencies: + '@types/node': 20.12.14 + + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': + dependencies: + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 7.18.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 7.18.0 + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@7.18.0(eslint@8.57.0)(typescript@5.5.4)': + dependencies: + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.3.6 + eslint: 8.57.0 + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.0)(typescript@5.5.4)': + dependencies: + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.0)(typescript@5.5.4) + debug: 4.3.6 + eslint: 8.57.0 + ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@7.18.0': {} + + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.4)': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.3.6 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@7.18.0(eslint@8.57.0)(typescript@5.5.4)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.4) + eslint: 8.57.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.2.0': {} + + '@vitejs/plugin-react-swc@3.7.0(vite@5.3.5(@types/node@20.12.14))': + dependencies: + '@swc/core': 1.7.6 + vite: 5.3.5(@types/node@20.12.14) + transitivePeerDependencies: + - '@swc/helpers' + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + acorn-jsx@5.3.2(acorn@8.12.1): + dependencies: + acorn: 8.12.1 + + acorn@8.12.1: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-regex@5.0.1: {} + + ansi-regex@6.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@5.0.2: {} + + argparse@2.0.1: {} + + array-union@2.1.0: {} + + atomic-sleep@1.0.0: {} + + autoprefixer@10.4.20(postcss@8.4.41): + dependencies: + browserslist: 4.23.3 + caniuse-lite: 1.0.30001650 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.1 + postcss: 8.4.41 + postcss-value-parser: 4.2.0 + + babel-runtime@6.26.0: + dependencies: + core-js: 2.6.12 + regenerator-runtime: 0.11.1 + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + better-sqlite3@11.1.2: + dependencies: + bindings: 1.5.0 + prebuild-install: 7.1.2 + + binary-extensions@2.3.0: {} + + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + boolbase@1.0.0: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.23.3: + dependencies: + caniuse-lite: 1.0.30001650 + electron-to-chromium: 1.5.5 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.3) + + buffer-from@1.1.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bullmq@5.12.1: + dependencies: + cron-parser: 4.9.0 + ioredis: 5.4.1 + msgpackr: 1.11.0 + node-abort-controller: 3.1.1 + semver: 7.6.3 + tslib: 2.6.3 + uuid: 9.0.1 + transitivePeerDependencies: + - supports-color + + bun-types@1.1.17: + dependencies: + '@types/node': 20.12.14 + '@types/ws': 8.5.12 + + callsites@3.1.0: {} + + camelcase-css@2.0.1: {} + + caniuse-lite@1.0.30001650: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + cheerio-select@2.1.0: + dependencies: + boolbase: 1.0.0 + css-select: 5.1.0 + css-what: 6.1.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + + cheerio@1.0.0-rc.12: + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.1.0 + htmlparser2: 8.0.2 + parse5: 7.1.2 + parse5-htmlparser2-tree-adapter: 7.0.0 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chownr@1.1.4: {} + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clsx@2.1.1: {} + + cluster-key-slot@1.1.2: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colorette@2.0.20: {} + + commander@4.1.1: {} + + concat-map@0.0.1: {} + + concurrently@8.2.2: + dependencies: + chalk: 4.1.2 + date-fns: 2.30.0 + lodash: 4.17.21 + rxjs: 7.8.1 + shell-quote: 1.8.1 + spawn-command: 0.0.2 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + + core-js@2.6.12: {} + + cron-parser@4.9.0: + dependencies: + luxon: 3.5.0 + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-select@5.1.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + + css-selector-tokenizer@0.8.0: + dependencies: + cssesc: 3.0.0 + fastparse: 1.1.2 + + css-what@6.1.0: {} + + cssesc@3.0.0: {} + + csstype@3.1.3: {} + + culori@3.3.0: {} + + daisyui@4.12.10(postcss@8.4.41): + dependencies: + css-selector-tokenizer: 0.8.0 + culori: 3.3.0 + picocolors: 1.0.1 + postcss-js: 4.0.1(postcss@8.4.41) + transitivePeerDependencies: + - postcss + + date-fns@2.30.0: + dependencies: + '@babel/runtime': 7.25.0 + + dateformat@4.6.3: {} + + dayjs@1.11.12: {} + + debug@4.3.6: + dependencies: + ms: 2.1.2 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + deep-extend@0.6.0: {} + + deep-is@0.1.4: {} + + denque@2.1.0: {} + + detect-libc@2.0.3: {} + + didyoumean@1.2.2: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dlv@1.1.3: {} + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.1.0: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + drizzle-kit@0.23.2: + dependencies: + '@drizzle-team/brocli': 0.8.2 + '@esbuild-kit/esm-loader': 2.6.5 + esbuild: 0.19.12 + esbuild-register: 3.6.0(esbuild@0.19.12) + transitivePeerDependencies: + - supports-color + + drizzle-orm@0.32.2(@types/react@18.3.3)(better-sqlite3@11.1.2)(bun-types@1.1.17)(react@18.3.1): + optionalDependencies: + '@types/react': 18.3.3 + better-sqlite3: 11.1.2 + bun-types: 1.1.17 + react: 18.3.1 + + eastasianwidth@0.2.0: {} + + electron-to-chromium@1.5.5: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + entities@4.5.0: {} + + esbuild-register@3.6.0(esbuild@0.19.12): + dependencies: + debug: 4.3.6 + esbuild: 0.19.12 + transitivePeerDependencies: + - supports-color + + esbuild@0.18.20: + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + esbuild@0.19.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + escalade@3.1.2: {} + + escape-string-regexp@4.0.0: {} + + eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-plugin-react-refresh@0.4.9(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.0: + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.11.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.6 + 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.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + 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.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) + eslint-visitor-keys: 3.4.3 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + event-target-shim@5.0.1: {} + + events@3.3.0: {} + + expand-template@2.0.3: {} + + fast-copy@3.0.2: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.7 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-redact@3.5.0: {} + + fast-safe-stringify@2.1.1: {} + + fastparse@1.1.2: {} + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + file-uri-to-path@1.0.0: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.1: {} + + foreground-child@3.2.1: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + fraction.js@4.3.7: {} + + fs-constants@1.0.0: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-caller-file@2.0.5: {} + + get-tsconfig@4.7.6: + dependencies: + resolve-pkg-maps: 1.0.0 + + github-from-package@0.0.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.2.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + + graphemer@1.4.0: {} + + has-flag@4.0.0: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + help-me@5.0.0: {} + + hono@4.5.4: {} + + htmlparser2@8.0.2: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + + ieee754@1.2.1: {} + + ignore@5.3.1: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + ioredis@5.4.1: + dependencies: + '@ioredis/commands': 1.2.0 + cluster-key-slot: 1.1.2 + debug: 4.3.6 + denque: 2.1.0 + lodash.defaults: 4.2.0 + lodash.isarguments: 3.1.0 + redis-errors: 1.2.0 + redis-parser: 3.0.0 + standard-as-callback: 2.1.0 + transitivePeerDependencies: + - supports-color + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-core-module@2.15.0: + dependencies: + hasown: 2.0.2 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-path-inside@3.0.3: {} + + isexe@2.0.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jiti@1.21.6: {} + + joycon@3.1.1: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lilconfig@2.1.0: {} + + lilconfig@3.1.2: {} + + lines-and-columns@1.2.4: {} + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.defaults@4.2.0: {} + + lodash.isarguments@3.1.0: {} + + lodash.merge@4.6.2: {} + + lodash@4.17.21: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lottie-web@5.12.2: {} + + lru-cache@10.4.3: {} + + luxon@3.5.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.7: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mimic-response@3.1.0: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + mkdirp-classic@0.5.3: {} + + ms@2.1.2: {} + + msgpackr-extract@3.0.3: + dependencies: + node-gyp-build-optional-packages: 5.2.2 + optionalDependencies: + '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 + optional: true + + msgpackr@1.11.0: + optionalDependencies: + msgpackr-extract: 3.0.3 + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.7: {} + + napi-build-utils@1.0.2: {} + + natural-compare@1.4.0: {} + + node-abi@3.65.0: + dependencies: + semver: 7.6.3 + + node-abort-controller@3.1.1: {} + + node-gyp-build-optional-packages@5.2.2: + dependencies: + detect-libc: 2.0.3 + optional: true + + node-releases@2.0.18: {} + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + on-exit-leak-free@2.1.2: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + package-json-from-dist@1.0.0: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse5-htmlparser2-tree-adapter@7.0.0: + dependencies: + domhandler: 5.0.3 + parse5: 7.1.2 + + parse5@7.1.2: + dependencies: + entities: 4.5.0 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-type@4.0.0: {} + + picocolors@1.0.1: {} + + picomatch@2.3.1: {} + + pify@2.3.0: {} + + pino-abstract-transport@1.2.0: + dependencies: + readable-stream: 4.5.2 + split2: 4.2.0 + + pino-pretty@11.2.2: + dependencies: + colorette: 2.0.20 + dateformat: 4.6.3 + fast-copy: 3.0.2 + fast-safe-stringify: 2.1.1 + help-me: 5.0.0 + joycon: 3.1.1 + minimist: 1.2.8 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 1.2.0 + pump: 3.0.0 + readable-stream: 4.5.2 + secure-json-parse: 2.7.0 + sonic-boom: 4.0.1 + strip-json-comments: 3.1.1 + + pino-std-serializers@7.0.0: {} + + pino@9.3.2: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 1.2.0 + pino-std-serializers: 7.0.0 + process-warning: 4.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.4.3 + sonic-boom: 4.0.1 + thread-stream: 3.1.0 + + pirates@4.0.6: {} + + postcss-import@15.1.0(postcss@8.4.41): + dependencies: + postcss: 8.4.41 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + + postcss-js@4.0.1(postcss@8.4.41): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.41 + + postcss-load-config@4.0.2(postcss@8.4.41): + dependencies: + lilconfig: 3.1.2 + yaml: 2.5.0 + optionalDependencies: + postcss: 8.4.41 + + postcss-nested@6.2.0(postcss@8.4.41): + dependencies: + postcss: 8.4.41 + postcss-selector-parser: 6.1.1 + + postcss-selector-parser@6.1.1: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.41: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + prebuild-install@7.1.2: + dependencies: + detect-libc: 2.0.3 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.65.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + + prelude-ls@1.2.1: {} + + process-warning@4.0.0: {} + + process@0.11.10: {} + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + pump@3.0.0: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + quick-format-unescaped@4.0.4: {} + + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + react-daisyui@5.0.3(daisyui@4.12.10(postcss@8.4.41))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(tailwindcss@3.4.7): + dependencies: + daisyui: 4.12.10(postcss@8.4.41) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tailwindcss: 3.4.7 + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-icons@5.2.1(react@18.3.1): + dependencies: + react: 18.3.1 + + react-is@16.13.1: {} + + react-lottie@1.2.4(react@18.3.1): + dependencies: + babel-runtime: 6.26.0 + lottie-web: 5.12.2 + react: 18.3.1 + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readable-stream@4.5.2: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + real-require@0.2.0: {} + + redis-errors@1.2.0: {} + + redis-parser@3.0.0: + dependencies: + redis-errors: 1.2.0 + + regenerator-runtime@0.11.1: {} + + regenerator-runtime@0.14.1: {} + + require-directory@2.1.1: {} + + resolve-from@4.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.15.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.0.4: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rollup@4.20.0: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.20.0 + '@rollup/rollup-android-arm64': 4.20.0 + '@rollup/rollup-darwin-arm64': 4.20.0 + '@rollup/rollup-darwin-x64': 4.20.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.20.0 + '@rollup/rollup-linux-arm-musleabihf': 4.20.0 + '@rollup/rollup-linux-arm64-gnu': 4.20.0 + '@rollup/rollup-linux-arm64-musl': 4.20.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.20.0 + '@rollup/rollup-linux-riscv64-gnu': 4.20.0 + '@rollup/rollup-linux-s390x-gnu': 4.20.0 + '@rollup/rollup-linux-x64-gnu': 4.20.0 + '@rollup/rollup-linux-x64-musl': 4.20.0 + '@rollup/rollup-win32-arm64-msvc': 4.20.0 + '@rollup/rollup-win32-ia32-msvc': 4.20.0 + '@rollup/rollup-win32-x64-msvc': 4.20.0 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rxjs@7.8.1: + dependencies: + tslib: 2.6.3 + + safe-buffer@5.2.1: {} + + safe-stable-stringify@2.4.3: {} + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + secure-json-parse@2.7.0: {} + + semver@7.6.3: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shell-quote@1.8.1: {} + + signal-exit@4.1.0: {} + + simple-concat@1.0.1: {} + + simple-get@4.0.1: + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + + slash@3.0.0: {} + + sonic-boom@4.0.1: + dependencies: + atomic-sleep: 1.0.0 + + source-map-js@1.2.0: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + spawn-command@0.0.2: {} + + split2@4.2.0: {} + + standard-as-callback@2.1.0: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + + strip-json-comments@2.0.1: {} + + strip-json-comments@3.1.1: {} + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + tailwind-merge@2.4.0: {} + + tailwindcss@3.4.7: + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.6 + lilconfig: 2.1.0 + micromatch: 4.0.7 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.1 + postcss: 8.4.41 + postcss-import: 15.1.0(postcss@8.4.41) + postcss-js: 4.0.1(postcss@8.4.41) + postcss-load-config: 4.0.2(postcss@8.4.41) + postcss-nested: 6.2.0(postcss@8.4.41) + postcss-selector-parser: 6.1.1 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + + tar-fs@2.1.1: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + text-table@0.2.0: {} + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + thread-stream@3.1.0: + dependencies: + real-require: 0.2.0 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tree-kill@1.2.2: {} + + ts-api-utils@1.3.0(typescript@5.5.4): + dependencies: + typescript: 5.5.4 + + ts-interface-checker@0.1.13: {} + + tslib@2.6.3: {} + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.20.2: {} + + typescript@5.5.4: {} + + undici-types@5.26.5: {} + + update-browserslist-db@1.1.0(browserslist@4.23.3): + dependencies: + browserslist: 4.23.3 + escalade: 3.1.2 + picocolors: 1.0.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + use-sync-external-store@1.2.0(react@18.3.1): + dependencies: + react: 18.3.1 + + util-deprecate@1.0.2: {} + + uuid@9.0.1: {} + + vite@5.3.5(@types/node@20.12.14): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.41 + rollup: 4.20.0 + optionalDependencies: + '@types/node': 20.12.14 + fsevents: 2.3.3 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + y18n@5.0.8: {} + + yaml@2.5.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} + + zustand@4.5.4(@types/react@18.3.3)(react@18.3.1): + dependencies: + use-sync-external-store: 1.2.0(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.3 + react: 18.3.1 diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/public/vite.svg b/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/server/db/index.ts b/server/db/index.ts new file mode 100644 index 0000000..7849aa5 --- /dev/null +++ b/server/db/index.ts @@ -0,0 +1,10 @@ +import { drizzle } from "drizzle-orm/bun-sqlite"; +import { Database } from "bun:sqlite"; +import * as schema from "../models"; + +const DATABASE_PATH = import.meta.env.DATABASE_PATH || "./data.db"; + +const sqlite = new Database(DATABASE_PATH); +const db = drizzle(sqlite, { schema }); + +export default db; diff --git a/server/db/migrations/0000_low_catseye.sql b/server/db/migrations/0000_low_catseye.sql new file mode 100644 index 0000000..b8a255a --- /dev/null +++ b/server/db/migrations/0000_low_catseye.sql @@ -0,0 +1,38 @@ +CREATE TABLE `repositories` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `user_id` integer NOT NULL, + `name` text NOT NULL, + `uri` text NOT NULL, + `language` text NOT NULL, + `stars` integer NOT NULL, + `last_update` text NOT NULL, + `languages` text, + `contributors` text, + `created_at` text DEFAULT CURRENT_TIMESTAMP NOT NULL, + `updated_at` text NOT NULL, + FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE no action +); +--> statement-breakpoint +CREATE TABLE `users` ( + `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, + `username` text NOT NULL, + `name` text NOT NULL, + `avatar` text, + `location` text, + `followers` integer DEFAULT 0 NOT NULL, + `following` integer DEFAULT 0 NOT NULL, + `achievements` text DEFAULT '[]', + `points` integer DEFAULT 0 NOT NULL, + `commits` integer DEFAULT 0 NOT NULL, + `line_of_codes` integer DEFAULT 0 NOT NULL, + `github_id` integer, + `access_token` text, + `created_at` text DEFAULT CURRENT_TIMESTAMP NOT NULL, + `updated_at` text NOT NULL +); +--> statement-breakpoint +CREATE INDEX `repositories_name_idx` ON `repositories` (`name`);--> statement-breakpoint +CREATE INDEX `repositories_uri_idx` ON `repositories` (`uri`);--> statement-breakpoint +CREATE INDEX `repositories_language_idx` ON `repositories` (`language`);--> statement-breakpoint +CREATE UNIQUE INDEX `users_username_unique` ON `users` (`username`);--> statement-breakpoint +CREATE UNIQUE INDEX `users_github_id_unique` ON `users` (`github_id`); \ No newline at end of file diff --git a/server/db/migrations/meta/0000_snapshot.json b/server/db/migrations/meta/0000_snapshot.json new file mode 100644 index 0000000..37e4dba --- /dev/null +++ b/server/db/migrations/meta/0000_snapshot.json @@ -0,0 +1,276 @@ +{ + "version": "6", + "dialect": "sqlite", + "id": "ccf7929b-8198-4452-ad60-e02285ac8149", + "prevId": "00000000-0000-0000-0000-000000000000", + "tables": { + "repositories": { + "name": "repositories", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "user_id": { + "name": "user_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uri": { + "name": "uri", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "language": { + "name": "language", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "stars": { + "name": "stars", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "last_update": { + "name": "last_update", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "languages": { + "name": "languages", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "contributors": { + "name": "contributors", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "repositories_name_idx": { + "name": "repositories_name_idx", + "columns": [ + "name" + ], + "isUnique": false + }, + "repositories_uri_idx": { + "name": "repositories_uri_idx", + "columns": [ + "uri" + ], + "isUnique": false + }, + "repositories_language_idx": { + "name": "repositories_language_idx", + "columns": [ + "language" + ], + "isUnique": false + } + }, + "foreignKeys": { + "repositories_user_id_users_id_fk": { + "name": "repositories_user_id_users_id_fk", + "tableFrom": "repositories", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "users": { + "name": "users", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": true + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "avatar": { + "name": "avatar", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "location": { + "name": "location", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "followers": { + "name": "followers", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "following": { + "name": "following", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "achievements": { + "name": "achievements", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "'[]'" + }, + "points": { + "name": "points", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "commits": { + "name": "commits", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "line_of_codes": { + "name": "line_of_codes", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "github_id": { + "name": "github_id", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "access_token": { + "name": "access_token", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "CURRENT_TIMESTAMP" + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "users_username_unique": { + "name": "users_username_unique", + "columns": [ + "username" + ], + "isUnique": true + }, + "users_github_id_unique": { + "name": "users_github_id_unique", + "columns": [ + "github_id" + ], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "indexes": {} + } +} \ No newline at end of file diff --git a/server/db/migrations/meta/_journal.json b/server/db/migrations/meta/_journal.json new file mode 100644 index 0000000..b0fee30 --- /dev/null +++ b/server/db/migrations/meta/_journal.json @@ -0,0 +1,13 @@ +{ + "version": "7", + "dialect": "sqlite", + "entries": [ + { + "idx": 0, + "version": "6", + "when": 1723071912146, + "tag": "0000_low_catseye", + "breakpoints": true + } + ] +} \ No newline at end of file diff --git a/server/db/seed.ts b/server/db/seed.ts new file mode 100644 index 0000000..ed644f9 --- /dev/null +++ b/server/db/seed.ts @@ -0,0 +1,39 @@ +import { users } from "../models"; +import db from "."; +import logger from "../lib/logger"; +import { sql } from "drizzle-orm"; +import { faker } from "@faker-js/faker"; +import queue from "@server/lib/queue"; + +const seed = async () => { + logger.info("🌿 Seeding database..."); + + await db.transaction(async (tx) => { + tx.run(sql`DELETE FROM users`); + + await tx + .insert(users) + .values({ username: "khairul169", name: "Khairul Hidayat" }); + + await tx.insert(users).values( + [...Array(50)].map(() => ({ + username: faker.internet.userName(), + name: faker.person.fullName(), + location: faker.location.city(), + followers: faker.number.int({ min: 0, max: 1000 }), + following: faker.number.int({ min: 0, max: 1000 }), + points: faker.number.int({ min: 20, max: 3000 }), + commits: faker.number.int({ min: 20, max: 420 }), + lineOfCodes: faker.number.int({ min: 1000, max: 300000 }), + })) + ); + }); + + await queue.add("fetchUserProfile", { userId: 1 }); + + logger.info("🌱 Database seeded"); + + process.exit(); +}; + +seed(); diff --git a/server/drizzle.config.ts b/server/drizzle.config.ts new file mode 100644 index 0000000..dfbfeee --- /dev/null +++ b/server/drizzle.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from "drizzle-kit"; + +const DATABASE_PATH = process.env.DATABASE_PATH || "./data.db"; + +export default defineConfig({ + schema: "./server/models/index.ts", + out: "./server/db/migrations", + dialect: "sqlite", + dbCredentials: { url: DATABASE_PATH }, + verbose: true, +}); diff --git a/server/jobs/calculate-user-points.ts b/server/jobs/calculate-user-points.ts new file mode 100644 index 0000000..53b4493 --- /dev/null +++ b/server/jobs/calculate-user-points.ts @@ -0,0 +1,84 @@ +import db from "@server/db"; +import { repositories, users } from "@server/models"; +import { eq } from "drizzle-orm"; + +type CalculateUserPointsType = { + userId: number; +}; + +const weights = { + followers: 20, + following: 10, + achievements: 100, + repositories: 1, + contributorsAmount: 25, + stars: 10, + forks: 10, + languagesKnown: 50, + commits: 1, + lineOfCodes: 0.01, +}; + +export const calculateUserPoints = async (data: CalculateUserPointsType) => { + const [user] = await db.select().from(users).where(eq(users.id, data.userId)); + if (!user) { + throw new Error("User not found!"); + } + + let points = 0; + let totalCommits = 0; + let totalLineOfCodes = 0; + + // User statistics + points += user.followers * weights.followers; + points += user.following * weights.following; + points += user.achievements + ? user.achievements?.length * weights.achievements + : 0; + + // User repositories + const repos = await db + .select() + .from(repositories) + .where(eq(repositories.userId, user.id)); + points += repos.length * weights.repositories; + + // Languages known + const languages = new Set( + repos.flatMap((i) => i.languages?.map((j) => j.lang)) + ); + points += languages.size * weights.languagesKnown; + + // Activities + repos.forEach((repo) => { + const contributors = repo.contributors?.filter( + (i) => i.author?.login !== user.username + ); + points += contributors + ? contributors.length * weights.contributorsAmount + : 0; + + points += repo.stars * weights.stars; + points += repo.forks * weights.forks; + + const contrib = repo.contributors?.find( + (i) => i.author?.login === user.username + ); + const commits = contrib?.commits || 0; + const lineOfCodes = contrib?.additions || 0; + + points += commits * weights.commits; + points += lineOfCodes * weights.lineOfCodes; + totalCommits += commits; + totalLineOfCodes += lineOfCodes; + }); + + await db + .update(users) + .set({ + points: Math.round(points), + commits: totalCommits, + lineOfCodes: totalLineOfCodes, + }) + .where(eq(users.id, user.id)); +}; diff --git a/server/jobs/fetch-repo-contributors.ts b/server/jobs/fetch-repo-contributors.ts new file mode 100644 index 0000000..69d6952 --- /dev/null +++ b/server/jobs/fetch-repo-contributors.ts @@ -0,0 +1,46 @@ +import db from "@server/db"; +import github from "@server/lib/github"; +import queue from "@server/lib/queue"; +import { repositories, users } from "@server/models"; +import { eq } from "drizzle-orm"; + +export type FetchRepoContributorsType = { + id: number; + uri: string; +}; + +export const fetchRepoContributors = async ( + data: FetchRepoContributorsType +) => { + const [repo] = await db + .select({ id: repositories.id, userAccessToken: users.accessToken }) + .from(repositories) + .innerJoin(users, eq(users.id, repositories.userId)) + .where(eq(repositories.id, data.id)); + + if (!repo) { + throw new Error("Repository not found!"); + } + + if (!repo.userAccessToken) { + throw new Error("User access token not found!"); + } + + const contributors = await github.getRepoContributors(data.uri, { + headers: { + Authorization: `Bearer ${repo.userAccessToken}`, + }, + }); + + const [result] = await db + .update(repositories) + .set({ contributors }) + .where(eq(repositories.id, data.id)) + .returning(); + + if (!result) { + throw new Error("Cannot update repository!"); + } + + await queue.add("calculateUserPoints", { userId: result.userId }); +}; diff --git a/server/jobs/fetch-repo-data.ts b/server/jobs/fetch-repo-data.ts new file mode 100644 index 0000000..0a1dc20 --- /dev/null +++ b/server/jobs/fetch-repo-data.ts @@ -0,0 +1,26 @@ +import db from "@server/db"; +import github from "@server/lib/github"; +import queue from "@server/lib/queue"; +import { repositories } from "@server/models"; +import { eq } from "drizzle-orm"; + +export type FetchRepoDataJobType = { + id: number; + uri: string; +}; + +export const fetchRepoData = async (data: FetchRepoDataJobType) => { + const details = await github.getRepoDetails(data.uri); + + const [result] = await db + .update(repositories) + .set({ languages: details.languages }) + .where(eq(repositories.id, data.id)) + .returning(); + + if (!result) { + throw new Error("Repository not found!"); + } + + await queue.add("calculateUserPoints", { userId: result.userId }); +}; diff --git a/server/jobs/fetch-user-profile.ts b/server/jobs/fetch-user-profile.ts new file mode 100644 index 0000000..01467bc --- /dev/null +++ b/server/jobs/fetch-user-profile.ts @@ -0,0 +1,30 @@ +import db from "@server/db"; +import github from "@server/lib/github"; +import queue from "@server/lib/queue"; +import { users } from "@server/models"; +import { eq } from "drizzle-orm"; + +export type FetchUserProfileType = { + userId: number; +}; + +export const fetchUserProfile = async (data: FetchUserProfileType) => { + const [user] = await db.select().from(users).where(eq(users.id, data.userId)); + if (!user) { + throw new Error("User not found!"); + } + const details = await github.getUser(user.username); + + await db + .update(users) + .set({ + name: details.name, + followers: details.followers, + following: details.following, + location: details.location, + achievements: details.achievements || user.achievements, + }) + .where(eq(users.id, user.id)); + + await queue.add("calculateUserPoints", { userId: user.id }); +}; diff --git a/server/jobs/fetch-user-repos.ts b/server/jobs/fetch-user-repos.ts new file mode 100644 index 0000000..8803f18 --- /dev/null +++ b/server/jobs/fetch-user-repos.ts @@ -0,0 +1,69 @@ +import db from "@server/db"; +import github from "@server/lib/github"; +import queue from "@server/lib/queue"; +import { repositories, users } from "@server/models"; +import { and, eq } from "drizzle-orm"; +import { FetchRepoDataJobType } from "./fetch-repo-data"; + +export type FetchUserRepos = { + userId: number; +}; + +export const fetchUserRepos = async (data: FetchUserRepos) => { + const [user] = await db.select().from(users).where(eq(users.id, data.userId)); + if (!user) { + throw new Error("User not found!"); + } + + const res = await github.getRepositories(user.username, { + sort: "stargazers", + fetchAll: true, + }); + + const jobList = [] as FetchRepoDataJobType[]; + + await db.transaction(async (tx) => { + for (const repo of res.repositories) { + const data = { + ...repo, + userId: user.id, + lastUpdate: repo.lastUpdate.toISOString(), + }; + + const [existing] = await tx + .select({ id: repositories.id }) + .from(repositories) + .where( + and( + eq(repositories.userId, data.userId), + eq(repositories.name, data.name) + ) + ); + + if (existing) { + await tx + .update(repositories) + .set(data) + .where(eq(repositories.id, existing.id)); + jobList.push({ id: existing.id, uri: data.uri }); + } else { + const [result] = await tx.insert(repositories).values(data).returning(); + jobList.push({ id: result.id, uri: data.uri }); + } + } + }); + + // Queue fetch repo details + queue.addBulk(jobList.map((data) => ({ name: "fetchRepoData", data }))); + queue.addBulk( + jobList.map((data) => ({ + name: "fetchRepoContributors", + data, + opts: { + attempts: 5, + backoff: { type: "exponential", delay: 30000 }, + jobId: `contributors:${data.uri}`, + }, + })) + ); +}; diff --git a/server/jobs/index.ts b/server/jobs/index.ts new file mode 100644 index 0000000..ab7afdd --- /dev/null +++ b/server/jobs/index.ts @@ -0,0 +1,15 @@ +import { calculateUserPoints } from "./calculate-user-points"; +import { fetchRepoContributors } from "./fetch-repo-contributors"; +import { fetchRepoData } from "./fetch-repo-data"; +import { fetchUserProfile } from "./fetch-user-profile"; +import { fetchUserRepos } from "./fetch-user-repos"; + +export const jobs = { + fetchUserRepos, + fetchRepoData, + fetchRepoContributors, + calculateUserPoints, + fetchUserProfile, +}; + +export type JobNames = keyof typeof jobs; diff --git a/server/lib/consts.ts b/server/lib/consts.ts new file mode 100644 index 0000000..6ea138a --- /dev/null +++ b/server/lib/consts.ts @@ -0,0 +1,12 @@ +// + +export const __PROD = import.meta.env.NODE_ENV === "production"; +export const __DEV = !__PROD; + +export const BULLMQ_CONNECTION = { + host: import.meta.env.REDIS_HOST || "127.0.0.1", + port: Number(import.meta.env.REDIS_PORT) || 6379, +}; +export const BULLMQ_JOB_NAME = "ghcontribjob"; + +export const JWT_SECRET = import.meta.env.JWT_SECRET || "secret"; diff --git a/server/lib/github.ts b/server/lib/github.ts new file mode 100644 index 0000000..ebe0392 --- /dev/null +++ b/server/lib/github.ts @@ -0,0 +1,283 @@ +import * as cheerio from "cheerio"; +import { intval } from "./utils"; +import dayjs from "dayjs"; + +const GITHUB_URL = "https://github.com"; +const GITHUB_API_URL = "https://api.github.com"; + +const selectors = { + user: { + name: "h1.vcard-names > span.vcard-fullname", + location: "li[itemprop='homeLocation'] span", + followers: ".js-profile-editable-area a[href$='?tab=followers'] > span", + following: ".js-profile-editable-area a[href$='?tab=following'] > span", + achievement: "img.achievement-badge-sidebar", + }, + + repo: { + list: "div#user-repositories-list li", + listForked: ':contains("Forked")', + listLanguage: "span[itemprop='programmingLanguage']", + listStars: "a[href$='stargazers']", + listForks: "a[href$='forks']", + langList: ".Layout-sidebar h2:contains('Languages')", + }, +}; + +const github = { + async getUser(username: string) { + const response = await this.fetch(username); + const $ = cheerio.load(response); + + const name = $(selectors.user.name).text().trim(); + if (typeof name !== "string" || !name?.length) { + throw new Error("User not found"); + } + + const location = $(selectors.user.location).text().trim(); + const followers = intval($(selectors.user.followers).text().trim()); + const following = intval($(selectors.user.following).text().trim()); + const achievements = [] as { name: string; image?: string }[]; + + $(selectors.user.achievement).each((_i, el) => { + const name = $(el).attr("alt")?.split(" ")[1] || ""; + const image = $(el).attr("src"); + achievements.push({ name, image }); + }); + + return { name, username, location, followers, following, achievements }; + }, + + async getRepositories( + username: string, + params?: Partial + ) { + const response = await this.fetch(username, { + params: { + tab: "repositories", + type: "public", + ...params, + }, + }); + const $ = cheerio.load(response); + let repositories = [] as { + name: string; + uri: string; + language: string; + stars: number; + forks: number; + lastUpdate: Date; + }[]; + + $(selectors.repo.list).each((_i, el) => { + const isForked = $(el).find(selectors.repo.listForked).length > 0; + if (isForked) return; + + const name = $(el).find("h3 > a").text().trim(); + const language = $(el).find(selectors.repo.listLanguage).text().trim(); + const stars = intval($(el).find(selectors.repo.listStars).text().trim()); + const forks = intval($(el).find(selectors.repo.listForks).text().trim()); + const lastUpdate = $(el).find("relative-time").attr("datetime"); + + repositories.push({ + name, + uri: `${username}/${name}`, + language, + stars, + forks, + lastUpdate: dayjs(lastUpdate).toDate(), + }); + }); + + const prevPage = intval( + $("a.prev_page") + .attr("href") + ?.match(/page=(\d+)/)?.[1] + ); + const nextPage = intval( + $("a.next_page") + .attr("href") + ?.match(/page=(\d+)/)?.[1] + ); + + if (params?.fetchAll && nextPage > 1 && nextPage < 10) { + try { + const nextPageRes = await this.getRepositories(username, { + ...params, + page: nextPage, + }); + if (nextPageRes.repositories?.length > 0) { + repositories = [...repositories, ...nextPageRes.repositories]; + } + } catch (err) { + // + } + } + + return { repositories, prevPage, nextPage }; + }, + + async getRepoDetails(repo: string) { + const response = await this.fetch(repo); + const $ = cheerio.load(response); + + const languages = [] as { lang: string; amount: number }[]; + + $(selectors.repo.langList) + .parent() + .find("ul > li > a") + .each((_i, el) => { + const lang = $(el).children().eq(1).text().trim(); + const percentage = $(el).children().eq(2).text().trim(); + const amount = parseFloat(percentage?.replace(/[^0-9.]/, "")) || 0; + languages.push({ lang, amount }); + }); + + return { languages }; + }, + + async getRepoContributors(repo: string, options?: Partial) { + const response = await this.fetch(`repos/${repo}/stats/contributors`, { + ...options, + ghApi: true, + headers: { accept: "application/json", ...(options?.headers || {}) }, + }); + + if (!Array.isArray(response)) { + throw new Error("Invalid response: " + JSON.stringify(response)); + } + + const result = response + .map((item: any) => { + const { author, total, weeks } = item; + let additions = 0; + let deletions = 0; + let commits = 0; + + weeks.forEach((week: any) => { + additions += week.a || 0; + deletions += week.d || 0; + commits += week.c || 0; + }); + + return { author, total, additions, deletions, commits }; + }) + .sort((a, b) => b.total - a.total); + + return result; + }, + + async getAllData(username: string, options?: Partial) { + const user = await this.getUser(username); + const repositories = [] as (Repository & { + languages: Language[]; + contributors: Contributors; + })[]; + + const _repos = await this.getRepositories(username, { + sort: "stargazers", + fetchAll: true, + }); + + const repoCount = Math.min( + _repos.repositories.length, + options?.maxRepo || Number.POSITIVE_INFINITY + ); + + for (let idx = 0; idx < repoCount; idx++) { + const repo = _repos.repositories[idx]; + const [details, contributors] = await Promise.all([ + this.getRepoDetails(repo.uri), + this.getRepoContributors(repo.uri), + ]); + + repositories.push({ + ...repo, + languages: details.languages, + contributors, + }); + } + + return { user, repositories }; + }, + + async fetch(path: string, options?: Partial) { + const url = new URL( + "/" + path, + options?.ghApi ? GITHUB_API_URL : GITHUB_URL + ); + + if (options?.params) { + Object.entries(options.params).forEach(([key, value]) => { + url.searchParams.append(key, value as string); + }); + } + + const headers = { + "User-Agent": + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36", + ...(options?.headers || {}), + }; + + if (options?.xhr) { + headers["X-Requested-With"] = "XMLHttpRequest"; + } + + const init = { + method: "GET", + headers, + referrer: options?.referrer || GITHUB_URL, + }; + + const res = await fetch(url, init); + if (!res.ok) { + throw new Error(res.statusText); + } + + const type = res.headers.get("Content-Type"); + + if (type?.includes("application/json")) { + return res.json() as T; + } + + return res.text(); + }, +}; + +type FetchOptions = { + xhr: boolean; + ghApi: boolean; + params: any; + headers: any; + referrer: string; +}; + +type GetRepositoriesParams = { + page: string | number; + sort: "stargazers" | "name" | null; + fetchAll: boolean; +}; + +type GetAllDataOptions = { + maxRepo: number; +}; + +export type GithubUser = Awaited>; + +export type Repository = Awaited< + ReturnType +>["repositories"][number]; + +export type Language = Awaited< + ReturnType +>["languages"][number]; + +export type Contributors = Awaited< + ReturnType +>; + +export type Contributor = NonNullable[number]; + +export type Achievement = GithubUser["achievements"][number]; + +export default github; diff --git a/server/lib/logger.ts b/server/lib/logger.ts new file mode 100644 index 0000000..0a6f7de --- /dev/null +++ b/server/lib/logger.ts @@ -0,0 +1,17 @@ +import pino from "pino"; +import { __DEV } from "./consts"; + +const logger = pino( + __DEV + ? { + transport: { + target: "pino-pretty", + options: { + colorize: true, + }, + }, + } + : {} +); + +export default logger; diff --git a/server/lib/queue.ts b/server/lib/queue.ts new file mode 100644 index 0000000..52658d6 --- /dev/null +++ b/server/lib/queue.ts @@ -0,0 +1,19 @@ +import { Queue } from "bullmq"; +import { BULLMQ_CONNECTION, BULLMQ_JOB_NAME } from "./consts"; +import logger from "./logger"; +import type { JobNames } from "@server/jobs"; + +const queue = new Queue(BULLMQ_JOB_NAME, { + connection: BULLMQ_CONNECTION, + defaultJobOptions: { + attempts: 5, + backoff: { + type: "exponential", + delay: 3000, + }, + }, +}); + +queue.on("error", logger.error); + +export default queue; diff --git a/server/lib/utils.ts b/server/lib/utils.ts new file mode 100644 index 0000000..fa68fe2 --- /dev/null +++ b/server/lib/utils.ts @@ -0,0 +1,10 @@ +// + +export const intval = (value: any) => { + if (typeof value === "number" && !Number.isNaN(value)) { + return value; + } + + const num = parseInt(value); + return Number.isNaN(num) ? 0 : num; +}; diff --git a/server/main.ts b/server/main.ts new file mode 100644 index 0000000..b7604b0 --- /dev/null +++ b/server/main.ts @@ -0,0 +1,40 @@ +import { Hono } from "hono"; +import { cors } from "hono/cors"; +import { serveStatic } from "hono/bun"; +import router from "./router"; +import logger from "./lib/logger"; +import { __DEV, __PROD } from "./lib/consts"; + +const HOST = import.meta.env.HOST || "127.0.0.1"; +const PORT = Number(import.meta.env.PORT) || 5589; + +const app = new Hono(); + +app.onError((err, c) => { + logger.error(err); + return c.text(err.message, 500); +}); + +// Allow all origin on development +if (__DEV) { + app.use(cors({ origin: "*" })); +} + +// Health check +app.get("/health", (c) => c.text("OK")); + +// Serve prod client app +if (__PROD) { + app.use("*", serveStatic({ root: "./dist/client" })); +} + +// API router +app.route("/api", router); + +Bun.serve({ + fetch: app.fetch, + hostname: HOST, + port: PORT, +}); + +logger.info(`Server started at http://${HOST}:${PORT}`); diff --git a/server/middlewares/auth.ts b/server/middlewares/auth.ts new file mode 100644 index 0000000..1d470f1 --- /dev/null +++ b/server/middlewares/auth.ts @@ -0,0 +1,34 @@ +import { JWT_SECRET } from "@server/lib/consts"; +import { Context, Next } from "hono"; +import { getCookie } from "hono/cookie"; +import { HTTPException } from "hono/http-exception"; +import * as jwt from "hono/jwt"; + +type AuthOptions = { + required: boolean; +}; + +export const auth = + (opt?: Partial) => async (c: Context, next: Next) => { + try { + const token = getCookie(c, "token"); + if (!token) { + throw new Error("No token found!"); + } + + const jwtData: any = await jwt.verify(token, JWT_SECRET); + const userId = jwtData.id; + + if (!userId) { + throw new Error("No user id found!"); + } + + c.set("userId", userId); + } catch (err) { + if (opt?.required) { + throw new HTTPException(401, { message: "Unauthorized!" }); + } + } + + return next(); + }; diff --git a/server/models/index.ts b/server/models/index.ts new file mode 100644 index 0000000..c25303f --- /dev/null +++ b/server/models/index.ts @@ -0,0 +1,2 @@ +export { users } from "./users"; +export { repositories } from "./repositories"; diff --git a/server/models/repositories.ts b/server/models/repositories.ts new file mode 100644 index 0000000..8a168df --- /dev/null +++ b/server/models/repositories.ts @@ -0,0 +1,38 @@ +import { Contributor, Language } from "@server/lib/github"; +import { InferInsertModel, InferSelectModel, sql } from "drizzle-orm"; +import { text, sqliteTable, integer, index } from "drizzle-orm/sqlite-core"; +import { users } from "./users"; + +export const repositories = sqliteTable( + "repositories", + { + id: integer("id").primaryKey({ autoIncrement: true }), + userId: integer("user_id") + .notNull() + .references(() => users.id), + + name: text("name").notNull(), + uri: text("uri").notNull(), + language: text("language").notNull(), + stars: integer("stars").notNull(), + forks: integer("stars").notNull(), + lastUpdate: text("last_update").notNull(), + languages: text("languages", { mode: "json" }).$type(), + contributors: text("contributors", { mode: "json" }).$type(), + + createdAt: text("created_at") + .notNull() + .default(sql`CURRENT_TIMESTAMP`), + updatedAt: text("updated_at") + .notNull() + .$onUpdate(() => sql`CURRENT_TIMESTAMP`), + }, + (t) => ({ + nameIdx: index("repositories_name_idx").on(t.name), + uriIdx: index("repositories_uri_idx").on(t.uri), + language: index("repositories_language_idx").on(t.language), + }) +); + +export type Repository = InferSelectModel; +export type CreateRepository = InferInsertModel; diff --git a/server/models/users.ts b/server/models/users.ts new file mode 100644 index 0000000..032bd14 --- /dev/null +++ b/server/models/users.ts @@ -0,0 +1,31 @@ +import { Achievement } from "@server/lib/github"; +import { InferInsertModel, InferSelectModel, sql } from "drizzle-orm"; +import { text, sqliteTable, integer } from "drizzle-orm/sqlite-core"; + +export const users = sqliteTable("users", { + id: integer("id").primaryKey({ autoIncrement: true }), + username: text("username").notNull().unique(), + name: text("name").notNull(), + avatar: text("avatar"), + location: text("location"), + followers: integer("followers").notNull().default(0), + following: integer("following").notNull().default(0), + achievements: text("achievements", { mode: "json" }) + .$type() + .default([]), + points: integer("points").notNull().default(0), + commits: integer("commits").notNull().default(0), + lineOfCodes: integer("line_of_codes").notNull().default(0), + githubId: integer("github_id").unique(), + accessToken: text("access_token"), + + createdAt: text("created_at") + .notNull() + .default(sql`CURRENT_TIMESTAMP`), + updatedAt: text("updated_at") + .notNull() + .$onUpdate(() => sql`CURRENT_TIMESTAMP`), +}); + +export type User = InferSelectModel; +export type CreateUser = InferInsertModel; diff --git a/server/queue-worker.ts b/server/queue-worker.ts new file mode 100644 index 0000000..72ba7a6 --- /dev/null +++ b/server/queue-worker.ts @@ -0,0 +1,42 @@ +import { Job, Worker } from "bullmq"; +import { BULLMQ_CONNECTION, BULLMQ_JOB_NAME } from "./lib/consts"; +import logger from "./lib/logger"; +import { jobs } from "./jobs"; + +const handler = async (job: Job) => { + const jobFn = (jobs as any)[job.name]; + + if (jobFn) { + return jobFn(job.data); + } + + return false; +}; + +const worker = new Worker(BULLMQ_JOB_NAME, handler, { + connection: BULLMQ_CONNECTION, + concurrency: Number(import.meta.env.QUEUE_CONCURRENCY) || 1, + removeOnComplete: { count: 0 }, + removeOnFail: { count: 0 }, +}); + +worker.on("error", logger.error); + +worker.on("active", (job) => { + logger.info(`Job ${job.name}.${job.id} started.`); +}); + +worker.on("failed", (job, err) => { + logger.child({ jobId: job?.id }).error(err); +}); + +worker.on("completed", (job, result) => { + logger.info({ + msg: `Job ${job.name}.${job.id} completed.`, + result, + }); +}); + +worker.on("ready", () => { + logger.info("Worker ready!"); +}); diff --git a/server/router.ts b/server/router.ts new file mode 100644 index 0000000..a33c76a --- /dev/null +++ b/server/router.ts @@ -0,0 +1,17 @@ +import { Hono } from "hono"; +import { auth } from "./routes/auth"; +import { leaderboard } from "./routes/leaderboard"; + +const router = new Hono() + .route("/auth", auth) + .route("/leaderboard", leaderboard); + +export type AppType = typeof router; + +declare module "hono" { + interface ContextVariableMap { + userId?: number; + } +} + +export default router; diff --git a/server/routes/auth.ts b/server/routes/auth.ts new file mode 100644 index 0000000..ae8dd0e --- /dev/null +++ b/server/routes/auth.ts @@ -0,0 +1,115 @@ +import db from "@server/db"; +import { JWT_SECRET } from "@server/lib/consts"; +import github from "@server/lib/github"; +import queue from "@server/lib/queue"; +import { repositories, users } from "@server/models"; +import { CreateUser } from "@server/models/users"; +import { eq } from "drizzle-orm"; +import { Hono } from "hono"; +import { setCookie } from "hono/cookie"; +import * as jwt from "hono/jwt"; +import { auth as authMiddleware } from "../middlewares/auth"; + +const { GITHUB_CLIENT_ID, GITHUB_SECRET_KEY } = import.meta.env; + +export const auth = new Hono() + + /** + * Redirect to github oauth + */ + .get("/login", (c) => { + return c.redirect( + "https://github.com/login/oauth/authorize?client_id=" + GITHUB_CLIENT_ID + ); + }) + + /** + * Auth callback + */ + .get("/callback", async (c) => { + const code = c.req.query("code"); + const result = await github.fetch("login/oauth/access_token", { + params: { + client_id: GITHUB_CLIENT_ID, + client_secret: GITHUB_SECRET_KEY, + code, + }, + headers: { + accept: "application/json", + }, + }); + + const accessToken = result.access_token; + const ghUser = await github.fetch("user", { + ghApi: true, + headers: { + accept: "application/json", + Authorization: "Bearer " + accessToken, + }, + }); + + const userData: CreateUser = { + username: ghUser.login, + name: ghUser.name, + avatar: ghUser.avatar_url, + location: ghUser.location, + accessToken, + githubId: ghUser.id, + followers: ghUser.followers, + following: ghUser.following, + }; + + const [user] = await db + .insert(users) + .values(userData) + .onConflictDoUpdate({ + target: users.username, + set: userData, + }) + .returning(); + + if (!user) { + throw new Error("Auth user failed!"); + } + + // Fetch latest user profile + await queue.add("fetchUserProfile", { userId: user.id }); + + // Fetch user repositories + const [hasRepo] = await db + .select({ id: repositories.id }) + .from(repositories) + .where(eq(repositories.userId, user.id)) + .limit(1); + + if (!hasRepo) { + await queue.add("fetchUserRepos", { userId: user.id }); + } + + const authToken = await jwt.sign({ id: user.id }, JWT_SECRET); + setCookie(c, "token", authToken, { httpOnly: true }); + + return c.redirect("/"); + }) + + /** + * Get authenticated user + */ + .get("/user", authMiddleware(), async (c) => { + const userId = c.get("userId"); + if (!userId) { + return c.json(null); + } + + const [user] = await db.select().from(users).where(eq(users.id, userId)); + + return c.json(user ? { ...user, accessToken: undefined } : null); + }) + + /** + * Logout + */ + .get("/logout", authMiddleware({ required: true }), async (c) => { + setCookie(c, "token", "", { httpOnly: true }); + return c.redirect("/"); + }); diff --git a/server/routes/leaderboard.ts b/server/routes/leaderboard.ts new file mode 100644 index 0000000..12149d7 --- /dev/null +++ b/server/routes/leaderboard.ts @@ -0,0 +1,80 @@ +import db from "@server/db"; +import { repositories, users } from "@server/models"; +import { desc, eq, getTableColumns, sql } from "drizzle-orm"; +import { Hono } from "hono"; +import { HTTPException } from "hono/http-exception"; + +export const leaderboard = new Hono() + + /** + * Get users leaderboard + */ + .get("/", async (c) => { + const rows = await db + .select() + .from(users) + .orderBy(desc(users.points)) + .limit(100); + const result = rows.map((data, idx) => ({ ...data, rank: idx + 1 })); + + return c.json(result); + }) + + /** + * Get specific user data + */ + .get("/:username", async (c) => { + const { username } = c.req.param(); + + const rankSubquery = db + .select({ + userId: users.id, + value: sql`rank() over (order by points desc)`.as("rank"), + }) + .from(users) + .orderBy(desc(users.points)) + .as("rank"); + + const [user] = await db + .select({ + ...getTableColumns(users), + accessToken: sql`null`, + rank: rankSubquery.value, + }) + .from(users) + .leftJoin(rankSubquery, eq(users.id, rankSubquery.userId)) + .where(eq(users.username, username)); + + if (!user) { + throw new HTTPException(404, { message: "User not found!" }); + } + + const repos = await db + .select() + .from(repositories) + .where(eq(repositories.userId, user.id)) + .orderBy(desc(repositories.stars), desc(repositories.forks)); + + const languageMap: Record = {}; + repos + .flatMap((i) => i.languages || []) + .forEach((i) => { + if (!languageMap[i.lang]) languageMap[i.lang] = 0; + languageMap[i.lang] += i.amount; + }); + + const totalLangWeight = Object.values(languageMap).reduce( + (a, b) => a + b, + 0 + ); + let languages = [] as { name: string; percent: number }[]; + for (const [lang, amount] of Object.entries(languageMap)) { + languages.push({ + name: lang, + percent: (amount / totalLangWeight) * 100, + }); + } + languages = languages.sort((a, b) => b.percent - a.percent); + + return c.json({ user, repositories: repos, languages }); + }); diff --git a/src/app/app.tsx b/src/app/app.tsx new file mode 100644 index 0000000..3d86821 --- /dev/null +++ b/src/app/app.tsx @@ -0,0 +1,15 @@ +import { AuthProvider } from "@client/components/context/auth-context"; +import MainLayout from "@client/components/layouts/main-layout"; +import HomePage from "@client/pages/home/page"; + +const App = () => { + return ( + + + + + + ); +}; + +export default App; diff --git a/src/app/styles.css b/src/app/styles.css new file mode 100644 index 0000000..dc5c18a --- /dev/null +++ b/src/app/styles.css @@ -0,0 +1,13 @@ +@import url("https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600&display=swap"); + +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + html, + body { + @apply bg-base-200 min-h-screen; + font-family: "Poppins", system-ui, sans-serif; + } +} diff --git a/src/assets/react.svg b/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/stars-animation.json b/src/assets/stars-animation.json new file mode 100755 index 0000000..599e7ee --- /dev/null +++ b/src/assets/stars-animation.json @@ -0,0 +1 @@ +{"v":"4.8.0","meta":{"g":"LottieFiles AE ","a":"","k":"","d":"","tc":""},"fr":60,"ip":0,"op":300,"w":512,"h":512,"nm":"Yboo-light-efffect","ddd":0,"assets":[{"id":"image_0","w":512,"h":512,"u":"","p":"data:image/png;base64,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","e":1}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"star 20","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":132,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":162,"s":[90]},{"t":222,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":132,"s":[0]},{"t":222,"s":[360]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":132,"s":[256,256,0],"to":[-32.667,31.833,0],"ti":[32.667,-31.833,0]},{"t":222,"s":[60,447,0]}],"ix":2},"a":{"a":0,"k":[256,256,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":132,"s":[8.062,8.062,100]},{"t":222,"s":[12.062,12.062,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,-218.474],[68.793,-71.453],[229.82,-51.589],[111.219,59.174],[142.068,218.474],[0,139.917],[-142.068,218.474],[-111.206,59.174],[-229.82,-51.589],[-68.78,-71.453]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.26666666666666666,0.2901960784313726,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[255.85,255.969],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Группа 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":132,"op":732,"st":132,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"star 19","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":147,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":177,"s":[90]},{"t":237,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":147,"s":[0]},{"t":237,"s":[405]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":147,"s":[256,256,0],"to":[29.333,29,0],"ti":[-29.333,-29,0]},{"t":237,"s":[432,430,0]}],"ix":2},"a":{"a":0,"k":[256,256,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":147,"s":[8.062,8.062,100]},{"t":237,"s":[17.062,17.062,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,-218.474],[68.793,-71.453],[229.82,-51.589],[111.219,59.174],[142.068,218.474],[0,139.917],[-142.068,218.474],[-111.206,59.174],[-229.82,-51.589],[-68.78,-71.453]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.26666666666666666,0.2901960784313726,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[255.85,255.969],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Группа 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":147,"op":747,"st":147,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"star 18","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":162,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":192,"s":[90]},{"t":222,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":162,"s":[0]},{"t":222,"s":[405]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":162,"s":[256,256,0],"to":[29,-27.5,0],"ti":[-29,27.5,0]},{"t":222,"s":[430,91,0]}],"ix":2},"a":{"a":0,"k":[256,256,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":162,"s":[8.062,8.062,100]},{"t":222,"s":[5.062,5.062,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,-218.474],[68.793,-71.453],[229.82,-51.589],[111.219,59.174],[142.068,218.474],[0,139.917],[-142.068,218.474],[-111.206,59.174],[-229.82,-51.589],[-68.78,-71.453]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.26666666666666666,0.2901960784313726,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[255.85,255.969],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Группа 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":162,"op":762,"st":162,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"star 17","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":180,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":210,"s":[90]},{"t":270,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":180,"s":[14]},{"t":270,"s":[405]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":180,"s":[256,256,0],"to":[-7.333,-30.667,0],"ti":[7.333,30.667,0]},{"t":270,"s":[212,72,0]}],"ix":2},"a":{"a":0,"k":[256,256,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":180,"s":[8.062,8.062,100]},{"t":270,"s":[13.062,13.062,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,-218.474],[68.793,-71.453],[229.82,-51.589],[111.219,59.174],[142.068,218.474],[0,139.917],[-142.068,218.474],[-111.206,59.174],[-229.82,-51.589],[-68.78,-71.453]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.26666666666666666,0.2901960784313726,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[255.85,255.969],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Группа 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":180,"op":780,"st":180,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"star 16","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":140,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":170,"s":[90]},{"t":230,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":140,"s":[39]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":230,"s":[405]},{"t":231,"s":[39]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":140,"s":[256,256,0],"to":[-32.333,-15,0],"ti":[32.333,15,0]},{"t":230,"s":[62,166,0]}],"ix":2},"a":{"a":0,"k":[256,256,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":140,"s":[8.062,8.062,100]},{"t":230,"s":[7.063,7.063,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,-218.474],[68.793,-71.453],[229.82,-51.589],[111.219,59.174],[142.068,218.474],[0,139.917],[-142.068,218.474],[-111.206,59.174],[-229.82,-51.589],[-68.78,-71.453]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.26666666666666666,0.2901960784313726,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[255.85,255.969],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Группа 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":140,"op":740,"st":140,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"star 15","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":164,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":194,"s":[90]},{"t":239,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":164,"s":[39]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":239,"s":[364]},{"t":240,"s":[39]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":164,"s":[256,256,0],"to":[-31.167,8.667,0],"ti":[31.167,-8.667,0]},{"t":239,"s":[69,308,0]}],"ix":2},"a":{"a":0,"k":[256,256,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":164,"s":[8.062,8.062,100]},{"t":239,"s":[12.062,12.062,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,-218.474],[68.793,-71.453],[229.82,-51.589],[111.219,59.174],[142.068,218.474],[0,139.917],[-142.068,218.474],[-111.206,59.174],[-229.82,-51.589],[-68.78,-71.453]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.26666666666666666,0.2901960784313726,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[255.85,255.969],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Группа 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":164,"op":764,"st":164,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"star 14","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":175,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":205,"s":[90]},{"t":265,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":175,"s":[39]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":265,"s":[453]},{"t":266,"s":[39]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":175,"s":[256,256,0],"to":[11,30.333,0],"ti":[-11,-30.333,0]},{"t":265,"s":[322,438,0]}],"ix":2},"a":{"a":0,"k":[256,256,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":175,"s":[8.062,8.062,100]},{"t":265,"s":[12.062,12.062,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,-218.474],[68.793,-71.453],[229.82,-51.589],[111.219,59.174],[142.068,218.474],[0,139.917],[-142.068,218.474],[-111.206,59.174],[-229.82,-51.589],[-68.78,-71.453]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.26666666666666666,0.2901960784313726,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[255.85,255.969],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Группа 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":175,"op":775,"st":175,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"star 13","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":190,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":220,"s":[90]},{"t":280,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":190,"s":[39]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":280,"s":[453]},{"t":281,"s":[39]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":190,"s":[256,256,0],"to":[34.667,15.667,0],"ti":[-34.667,-15.667,0]},{"t":280,"s":[463.99999999999994,350,0]}],"ix":2},"a":{"a":0,"k":[256,256,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":190,"s":[8.062,8.062,100]},{"t":280,"s":[5.062,5.062,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,-218.474],[68.793,-71.453],[229.82,-51.589],[111.219,59.174],[142.068,218.474],[0,139.917],[-142.068,218.474],[-111.206,59.174],[-229.82,-51.589],[-68.78,-71.453]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.26666666666666666,0.2901960784313726,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[255.85,255.969],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Группа 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":190,"op":790,"st":190,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"star 12","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":198,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":228,"s":[90]},{"t":288,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":198,"s":[39]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":288,"s":[394]},{"t":289,"s":[39]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":198,"s":[256,256,0],"to":[26.667,-2.833,0],"ti":[-26.667,2.833,0]},{"t":288,"s":[416,239,0]}],"ix":2},"a":{"a":0,"k":[256,256,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":198,"s":[8.062,8.062,100]},{"t":288,"s":[13.062,13.062,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,-218.474],[68.793,-71.453],[229.82,-51.589],[111.219,59.174],[142.068,218.474],[0,139.917],[-142.068,218.474],[-111.206,59.174],[-229.82,-51.589],[-68.78,-71.453]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.26666666666666666,0.2901960784313726,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[255.85,255.969],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Группа 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":198,"op":798,"st":198,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"star 11","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":151,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":181,"s":[90]},{"t":271,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":151,"s":[39]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":271,"s":[381]},{"t":272,"s":[39]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":151,"s":[256,256,0],"to":[16.333,-28.333,0],"ti":[-16.333,28.333,0]},{"t":271,"s":[354,86,0]}],"ix":2},"a":{"a":0,"k":[256,256,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":151,"s":[8.062,8.062,100]},{"t":271,"s":[13.062,13.062,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,-218.474],[68.793,-71.453],[229.82,-51.589],[111.219,59.174],[142.068,218.474],[0,139.917],[-142.068,218.474],[-111.206,59.174],[-229.82,-51.589],[-68.78,-71.453]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.26666666666666666,0.2901960784313726,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[255.85,255.969],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Группа 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":151,"op":751,"st":151,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"star 10","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":49,"s":[90]},{"t":139,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":19,"s":[39]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":139,"s":[381]},{"t":140,"s":[39]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[256,256,0],"to":[16.333,-28.333,0],"ti":[-16.333,28.333,0]},{"t":139,"s":[354,86,0]}],"ix":2},"a":{"a":0,"k":[256,256,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":19,"s":[8.062,8.062,100]},{"t":139,"s":[13.062,13.062,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,-218.474],[68.793,-71.453],[229.82,-51.589],[111.219,59.174],[142.068,218.474],[0,139.917],[-142.068,218.474],[-111.206,59.174],[-229.82,-51.589],[-68.78,-71.453]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.26666666666666666,0.2901960784313726,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[255.85,255.969],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Группа 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":19,"op":619,"st":19,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"star 9","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":66,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":96,"s":[90]},{"t":156,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":66,"s":[39]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":156,"s":[394]},{"t":157,"s":[39]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":66,"s":[256,256,0],"to":[26.667,-2.833,0],"ti":[-26.667,2.833,0]},{"t":156,"s":[416,239,0]}],"ix":2},"a":{"a":0,"k":[256,256,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":66,"s":[8.062,8.062,100]},{"t":156,"s":[13.062,13.062,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,-218.474],[68.793,-71.453],[229.82,-51.589],[111.219,59.174],[142.068,218.474],[0,139.917],[-142.068,218.474],[-111.206,59.174],[-229.82,-51.589],[-68.78,-71.453]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.26666666666666666,0.2901960784313726,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[255.85,255.969],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Группа 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":66,"op":666,"st":66,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"star 8","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":58,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":88,"s":[90]},{"t":148,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":58,"s":[39]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":148,"s":[453]},{"t":149,"s":[39]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":58,"s":[256,256,0],"to":[34.667,15.667,0],"ti":[-34.667,-15.667,0]},{"t":148,"s":[463.99999999999994,350,0]}],"ix":2},"a":{"a":0,"k":[256,256,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":58,"s":[8.062,8.062,100]},{"t":148,"s":[5.062,5.062,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,-218.474],[68.793,-71.453],[229.82,-51.589],[111.219,59.174],[142.068,218.474],[0,139.917],[-142.068,218.474],[-111.206,59.174],[-229.82,-51.589],[-68.78,-71.453]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.26666666666666666,0.2901960784313726,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[255.85,255.969],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Группа 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":58,"op":658,"st":58,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"star 7","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":73,"s":[90]},{"t":133,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":43,"s":[39]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":133,"s":[453]},{"t":134,"s":[39]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[256,256,0],"to":[11,30.333,0],"ti":[-11,-30.333,0]},{"t":133,"s":[322,438,0]}],"ix":2},"a":{"a":0,"k":[256,256,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":43,"s":[8.062,8.062,100]},{"t":133,"s":[12.062,12.062,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,-218.474],[68.793,-71.453],[229.82,-51.589],[111.219,59.174],[142.068,218.474],[0,139.917],[-142.068,218.474],[-111.206,59.174],[-229.82,-51.589],[-68.78,-71.453]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.26666666666666666,0.2901960784313726,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[255.85,255.969],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Группа 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":43,"op":643,"st":43,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"star 6","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":62,"s":[90]},{"t":107,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32,"s":[39]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":107,"s":[364]},{"t":108,"s":[39]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[256,256,0],"to":[-31.167,8.667,0],"ti":[31.167,-8.667,0]},{"t":107,"s":[69,308,0]}],"ix":2},"a":{"a":0,"k":[256,256,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":32,"s":[8.062,8.062,100]},{"t":107,"s":[12.062,12.062,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,-218.474],[68.793,-71.453],[229.82,-51.589],[111.219,59.174],[142.068,218.474],[0,139.917],[-142.068,218.474],[-111.206,59.174],[-229.82,-51.589],[-68.78,-71.453]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.26666666666666666,0.2901960784313726,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[255.85,255.969],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Группа 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":32,"op":632,"st":32,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"star 5","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":38,"s":[90]},{"t":98,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":8,"s":[39]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":98,"s":[405]},{"t":99,"s":[39]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[256,256,0],"to":[-32.333,-15,0],"ti":[32.333,15,0]},{"t":98,"s":[62,166,0]}],"ix":2},"a":{"a":0,"k":[256,256,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":8,"s":[8.062,8.062,100]},{"t":98,"s":[7.063,7.063,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,-218.474],[68.793,-71.453],[229.82,-51.589],[111.219,59.174],[142.068,218.474],[0,139.917],[-142.068,218.474],[-111.206,59.174],[-229.82,-51.589],[-68.78,-71.453]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.26666666666666666,0.2901960784313726,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[255.85,255.969],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Группа 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":8,"op":608,"st":8,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"star 4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":78,"s":[90]},{"t":138,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[14]},{"t":138,"s":[405]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":48,"s":[256,256,0],"to":[-7.333,-30.667,0],"ti":[7.333,30.667,0]},{"t":138,"s":[212,72,0]}],"ix":2},"a":{"a":0,"k":[256,256,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":48,"s":[8.062,8.062,100]},{"t":138,"s":[13.062,13.062,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,-218.474],[68.793,-71.453],[229.82,-51.589],[111.219,59.174],[142.068,218.474],[0,139.917],[-142.068,218.474],[-111.206,59.174],[-229.82,-51.589],[-68.78,-71.453]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.26666666666666666,0.2901960784313726,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[255.85,255.969],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Группа 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":48,"op":648,"st":48,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"star 3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[90]},{"t":90,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[0]},{"t":90,"s":[405]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[256,256,0],"to":[29,-27.5,0],"ti":[-29,27.5,0]},{"t":90,"s":[430,91,0]}],"ix":2},"a":{"a":0,"k":[256,256,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":30,"s":[8.062,8.062,100]},{"t":90,"s":[5.062,5.062,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,-218.474],[68.793,-71.453],[229.82,-51.589],[111.219,59.174],[142.068,218.474],[0,139.917],[-142.068,218.474],[-111.206,59.174],[-229.82,-51.589],[-68.78,-71.453]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.26666666666666666,0.2901960784313726,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[255.85,255.969],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Группа 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":30,"op":630,"st":30,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"star 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[90]},{"t":105,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":15,"s":[0]},{"t":105,"s":[405]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[256,256,0],"to":[29.333,29,0],"ti":[-29.333,-29,0]},{"t":105,"s":[432,430,0]}],"ix":2},"a":{"a":0,"k":[256,256,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":15,"s":[8.062,8.062,100]},{"t":105,"s":[17.062,17.062,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,-218.474],[68.793,-71.453],[229.82,-51.589],[111.219,59.174],[142.068,218.474],[0,139.917],[-142.068,218.474],[-111.206,59.174],[-229.82,-51.589],[-68.78,-71.453]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.26666666666666666,0.2901960784313726,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[255.85,255.969],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Группа 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":615,"st":15,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30,"s":[90]},{"t":90,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":90,"s":[360]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[256,256,0],"to":[-32.667,31.833,0],"ti":[32.667,-31.833,0]},{"t":90,"s":[60,447,0]}],"ix":2},"a":{"a":0,"k":[256,256,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[8.062,8.062,100]},{"t":90,"s":[12.062,12.062,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,-218.474],[68.793,-71.453],[229.82,-51.589],[111.219,59.174],[142.068,218.474],[0,139.917],[-142.068,218.474],[-111.206,59.174],[-229.82,-51.589],[-68.78,-71.453]],"c":true},"ix":2},"nm":"Контур 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.23921568627450981,0.26666666666666666,0.2901960784313726,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Заливка 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[255.85,255.969],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Группа 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[256,256,0],"ix":2},"a":{"a":0,"k":[29.103,48.103,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[310.206,310.206],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.23921568627450981,0.26666666666666666,0.2901960784313726,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,0.993,0.761,0.5,1,0.996,0.858,1,1,0.999,0.954,0,1,0.5,0.5,1,0],"ix":9}},"s":{"a":0,"k":[0,0],"ix":5},"e":{"a":0,"k":[155.083,1.754],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 2","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[29.103,48.103],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"bm":0},{"ddd":0,"ind":24,"ty":2,"nm":"light/light-def.ai","cl":"ai","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":300,"s":[360]}],"ix":10},"p":{"a":0,"k":[256,256,0],"ix":2},"a":{"a":0,"k":[256,256,0],"ix":1},"s":{"a":0,"k":[82.031,82.031,100],"ix":6}},"ao":0,"ip":0,"op":600,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/src/components/containers/appbar.tsx b/src/components/containers/appbar.tsx new file mode 100644 index 0000000..cc45f8a --- /dev/null +++ b/src/components/containers/appbar.tsx @@ -0,0 +1,72 @@ +import { onLogin, onLogout, useAuth } from "@client/hooks/useAuth"; +import { dummyAvatar } from "@client/lib/utils"; +import { Avatar, Button, Card, Dropdown } from "react-daisyui"; +import { FiUser } from "react-icons/fi"; + +type AppbarProps = { + title?: string; +}; + +const Appbar = ({ title }: AppbarProps) => { + const { user } = useAuth(); + + return ( +
+
+ + {title ? ( +

+ Antrian Kick IMPHNEN +

+ ) : ( +
+ )} + + {!user ? ( + + ) : ( + + + + + + +
+ +
+

{user.name}

+

+ {"@" + user.username} +

+ + +
+
+
+
+
+ )} +
+ ); +}; + +export default Appbar; diff --git a/src/components/containers/rank-board.tsx b/src/components/containers/rank-board.tsx new file mode 100644 index 0000000..a37ea42 --- /dev/null +++ b/src/components/containers/rank-board.tsx @@ -0,0 +1,57 @@ +import { cn } from "@client/lib/utils"; +import { Avatar, Badge } from "react-daisyui"; +import { FaTrophy } from "react-icons/fa"; +import Lottie from "react-lottie"; +import starsAnimation from "@client/assets/stars-animation.json"; + +type RankBoardProps = { + name: string; + avatar: string; + points: number; + rank: number; +}; + +const RankBoard = ({ name, avatar, points, rank }: RankBoardProps) => { + return ( + + ); +}; + +export default RankBoard; diff --git a/src/components/containers/rank-list-item.tsx b/src/components/containers/rank-list-item.tsx new file mode 100644 index 0000000..2ba6dd1 --- /dev/null +++ b/src/components/containers/rank-list-item.tsx @@ -0,0 +1,58 @@ +import { cn } from "@client/lib/utils"; +import { Avatar, Badge } from "react-daisyui"; + +type RankListItemProps = { + name: string; + avatar: string; + points: number; + rank: number; + className?: string; +}; + +const RankListItem = ({ + name, + avatar, + points, + rank, + className, +}: RankListItemProps) => { + return ( + + ); +}; + +export const RankListHeader = () => { + return ( +
+
+

Nama

+

Jumlah Poin

+
+ ); +}; + +export default RankListItem; diff --git a/src/components/context/auth-context.tsx b/src/components/context/auth-context.tsx new file mode 100644 index 0000000..6e60f2b --- /dev/null +++ b/src/components/context/auth-context.tsx @@ -0,0 +1,28 @@ +import { useFetch } from "@client/hooks/useFetch"; +import api from "@client/lib/api"; +import { InferResponseType } from "hono"; +import { createContext, PropsWithChildren } from "react"; + +export type AuthUser = NonNullable< + InferResponseType +>; + +export const AuthContext = createContext<{ + user?: AuthUser | null; + isLoading: boolean; + isLoggedIn: boolean; +}>(null!); + +export const AuthProvider = ({ children }: PropsWithChildren) => { + const { data: user, isLoading } = useFetch( + "user", + api.auth.user.$get + ); + + return ( + + ); +}; diff --git a/src/components/layouts/main-layout.tsx b/src/components/layouts/main-layout.tsx new file mode 100644 index 0000000..7f41368 --- /dev/null +++ b/src/components/layouts/main-layout.tsx @@ -0,0 +1,23 @@ +import { PropsWithChildren } from "react"; +import { FaGithub } from "react-icons/fa"; + +const MainLayout = ({ children }: PropsWithChildren) => { + return ( +
+
{children}
+ + +
+ ); +}; + +export default MainLayout; diff --git a/src/hooks/useAuth.ts b/src/hooks/useAuth.ts new file mode 100644 index 0000000..bdeab17 --- /dev/null +++ b/src/hooks/useAuth.ts @@ -0,0 +1,20 @@ +import { useContext } from "react"; +import { AuthContext } from "@client/components/context/auth-context"; +import { API_BASEURL } from "@client/lib/api"; + +export const useAuth = () => { + const ctx = useContext(AuthContext); + if (!ctx) { + throw new Error("useAuth must be used within an AuthProvider"); + } + + return ctx; +}; + +export const onLogin = () => { + window.location.href = API_BASEURL + "/auth/login"; +}; + +export const onLogout = () => { + window.location.href = API_BASEURL + "/auth/logout"; +}; diff --git a/src/hooks/useFetch.ts b/src/hooks/useFetch.ts new file mode 100644 index 0000000..2842e58 --- /dev/null +++ b/src/hooks/useFetch.ts @@ -0,0 +1,62 @@ +import { useCallback, useEffect, useRef, useState } from "react"; + +const cacheStore = new Map(); + +type UseFetchOptions = { + enabled: boolean; +}; + +export const useFetch = ( + fetchKey: any, + fetchFn: () => Promise, + options?: Partial +) => { + const key = JSON.stringify(fetchKey); + const loadingRef = useRef(false); + const [isLoading, setIsLoading] = useState(false); + const [data, setData] = useState(cacheStore.get(key)); + const [error, setError] = useState(); + + const fetchData = useCallback(async () => { + if (loadingRef.current) { + return; + } + + try { + loadingRef.current = true; + setIsLoading(true); + + const res = await fetchFn(); + if (!res.ok) { + throw new Error(res.statusText); + } + + const isJson = res.headers + .get("Content-Type") + ?.includes("application/json"); + + if (isJson) { + const json = (await res.json()) as T; + setData(json); + cacheStore.set(key, json); + } else { + const text = await res.text(); + setData(text as unknown as T); + cacheStore.set(key, text); + } + } catch (err) { + setError(err instanceof Error ? err : new Error("Unknown error")); + } finally { + loadingRef.current = false; + setIsLoading(false); + } + }, [key]); + + useEffect(() => { + if (options?.enabled !== false) { + fetchData(); + } + }, [fetchData, options?.enabled]); + + return { data, isLoading, error, refetch: fetchData }; +}; diff --git a/src/lib/api.ts b/src/lib/api.ts new file mode 100644 index 0000000..13f11d9 --- /dev/null +++ b/src/lib/api.ts @@ -0,0 +1,8 @@ +import type { AppType } from "@server/router"; +import { hc } from "hono/client"; + +export const API_BASEURL = "/api"; + +const api = hc(API_BASEURL); + +export default api; diff --git a/src/lib/utils.ts b/src/lib/utils.ts new file mode 100644 index 0000000..311ff26 --- /dev/null +++ b/src/lib/utils.ts @@ -0,0 +1,10 @@ +import clsx from "clsx"; +import { twMerge } from "tailwind-merge"; + +export const cn = (...args: any[]) => { + return twMerge(clsx(...args)); +}; + +export const dummyAvatar = (id = 1) => { + return `https://avatar.iran.liara.run/public/${id}`; +}; diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..1f7efca --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,10 @@ +import React from "react"; +import ReactDOM from "react-dom/client"; +import App from "./app/app.tsx"; +import "./app/styles.css"; + +ReactDOM.createRoot(document.getElementById("root")!).render( + + + +); diff --git a/src/pages/home/hooks.ts b/src/pages/home/hooks.ts new file mode 100644 index 0000000..6eac5eb --- /dev/null +++ b/src/pages/home/hooks.ts @@ -0,0 +1,22 @@ +import { useFetch } from "@client/hooks/useFetch"; +import api from "@client/lib/api"; +import { InferResponseType } from "hono"; + +export type Leaderboard = InferResponseType; +export type LeaderboardEntry = Leaderboard[number]; + +export const useLeaderboard = () => { + return useFetch("leaderboard", api.leaderboard.$get); +}; + +export type UserLeaderboard = InferResponseType< + (typeof api.leaderboard)[":username"]["$get"] +>; + +export const useGetUserLeaderboard = (username?: string | null) => { + return useFetch( + ["leaderboard", username], + () => api.leaderboard[":username"].$get({ param: { username: username! } }), + { enabled: !!username } + ); +}; diff --git a/src/pages/home/page.tsx b/src/pages/home/page.tsx new file mode 100644 index 0000000..7f5d8a1 --- /dev/null +++ b/src/pages/home/page.tsx @@ -0,0 +1,103 @@ +import Appbar from "@client/components/containers/appbar"; +import RankBoard from "@client/components/containers/rank-board"; +import RankListItem, { + RankListHeader, +} from "@client/components/containers/rank-list-item"; +import { Button } from "react-daisyui"; +import { FaGithub } from "react-icons/fa"; +import { + LeaderboardEntry, + useGetUserLeaderboard, + useLeaderboard, +} from "./hooks"; +import { useMemo } from "react"; +import { dummyAvatar } from "@client/lib/utils"; +import { onLogin, useAuth } from "@client/hooks/useAuth"; + +const HomePage = () => { + const { user } = useAuth(); + const { data } = useLeaderboard(); + const { data: userRank } = useGetUserLeaderboard(user?.username); + + const topLeaderboard = useMemo(() => { + const res = new Array(3).fill(null) as LeaderboardEntry[]; + if (!data) { + return res; + } + + res[1] = data[0]; + res[0] = data[1]; + res[2] = data[2]; + return res; + }, [data]); + + return ( +
+
+ + +
+ {topLeaderboard.map((item, idx) => { + if (!item) { + return
; + } + + return ( + + ); + })} +
+
+ +
+ + + {data?.slice(3).map((item) => ( + + ))} + + {userRank != null ? ( + <> +

Kamu:

+ + + ) : ( +
+

Pengen nama kamu masuk list ini juga?

+

Hayuk

+ +

{"⸜(。˃ ᵕ ˂ )⸝♡"}

+
+ )} +
+
+ ); +}; + +export default HomePage; diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 0000000..abdc66b --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,16 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: [ + "./index.html", + "./src/**/*.{js,ts,jsx,tsx}", + "node_modules/daisyui/dist/**/*.js", + "node_modules/react-daisyui/dist/**/*.js", + ], + theme: { + extend: {}, + }, + plugins: [require("daisyui")], + daisyui: { + themes: ["dracula"], + }, +}; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..979df93 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + "composite": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + + "baseUrl": "./", + "paths": { + "@client/*": ["src/*"], + "@server/*": ["server/*"], + } + }, + "include": ["src", "server"] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..3afdd6e --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "composite": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "strict": true, + "noEmit": true + }, + "include": ["vite.config.ts"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..1243f9b --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,23 @@ +import { defineConfig } from "vite"; +import path from "path"; +import react from "@vitejs/plugin-react-swc"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], + resolve: { + alias: { + "@client": path.resolve(__dirname, "./src"), + "@server": path.resolve(__dirname, "./server"), + }, + }, + build: { + outDir: "dist/client", + emptyOutDir: true, + }, + server: { + proxy: { + "/api": process.env.API_BASEURL || "http://127.0.0.1:5589", + }, + }, +});