commit 1ccca905f30e72c6d1a96cb01c472c132fce1a8c Author: RaghadAlkhous Date: Wed May 6 15:08:57 2026 +0300 initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4d29575 --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..78094a1 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,19 @@ +FROM node:20 AS build + +WORKDIR /app + +COPY package*.json ./ +RUN npm install + +COPY . . +RUN npm run build + +FROM nginx:alpine + +RUN rm -rf /usr/share/nginx/html/* + +COPY --from=build /app/build /usr/share/nginx/html + +EXPOSE 80 + +CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..35aeff0 --- /dev/null +++ b/README.md @@ -0,0 +1,166 @@ + +# kitchn-dashboard + + + +## Getting started + +To make it easy for you to get started with GitLab, here's a list of recommended next steps. + +Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)! + +## Add your files + +- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files +- [ ] [Add files using the command line](https://docs.gitlab.com/topics/git/add_files/#add-files-to-a-git-repository) or push an existing Git repository with the following command: + +``` +cd existing_repo +git remote add origin https://gitlab.com/kitch3/kitchn-dashboard.git +git branch -M main +git push -uf origin main +``` + +## Integrate with your tools + +- [ ] [Set up project integrations](https://gitlab.com/kitch3/kitchn-dashboard/-/settings/integrations) + +## Collaborate with your team + +- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/) +- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html) +- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically) +- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/) +- [ ] [Set auto-merge](https://docs.gitlab.com/user/project/merge_requests/auto_merge/) + +## Test and Deploy + +Use the built-in continuous integration in GitLab. + +- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/) +- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing (SAST)](https://docs.gitlab.com/ee/user/application_security/sast/) +- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html) +- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/) +- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html) + +*** + +# Editing this README + +When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thanks to [makeareadme.com](https://www.makeareadme.com/) for this template. + +## Suggestions for a good README + +Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information. + +## Name +Choose a self-explaining name for your project. + +## Description +Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors. + +## Badges +On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge. + +## Visuals +Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method. + +## Installation +Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection. + +## Usage +Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README. + +## Support +Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc. + +## Roadmap +If you have ideas for releases in the future, it is a good idea to list them in the README. + +## Contributing +State if you are open to contributions and what your requirements are for accepting them. + +For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self. + +You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser. + +## Authors and acknowledgment +Show your appreciation to those who have contributed to the project. + +## License +For open source projects, say how it is licensed. + +## Project status +If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers. +======= +# Getting Started with Create React App + +This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). + +## Available Scripts + +In the project directory, you can run: + +### `npm start` + +Runs the app in the development mode.\ +Open [http://localhost:3000](http://localhost:3000) to view it in your browser. + +The page will reload when you make changes.\ +You may also see any lint errors in the console. + +### `npm test` + +Launches the test runner in the interactive watch mode.\ +See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. + +### `npm run build` + +Builds the app for production to the `build` folder.\ +It correctly bundles React in production mode and optimizes the build for the best performance. + +The build is minified and the filenames include the hashes.\ +Your app is ready to be deployed! + +See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. + +### `npm run eject` + +**Note: this is a one-way operation. Once you `eject`, you can't go back!** + +If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. + +Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own. + +You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it. + +## Learn More + +You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). + +To learn React, check out the [React documentation](https://reactjs.org/). + +### Code Splitting + +This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting) + +### Analyzing the Bundle Size + +This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size) + +### Making a Progressive Web App + +This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app) + +### Advanced Configuration + +This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration) + +### Deployment + +This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment) + +### `npm run build` fails to minify + +This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify) +c56a88f (Initialize project using Create React App) diff --git a/ghaymah.json b/ghaymah.json new file mode 100644 index 0000000..92322bc --- /dev/null +++ b/ghaymah.json @@ -0,0 +1,17 @@ +{ + "id": "a978f1cb-2085-4132-b91b-13d29f1b06e4", + "name": "RestaurantPro", + "projectId": "47561cde-fd37-4475-89f5-1ef9af0b14a1", + "ports": [ + { + "expose": true, + "number": 80 + } + ], + "publicAccess": { + "enabled": true, + "domain": "auto" + }, + "resourceTier": "t1", + "dockerFileName": "Dockerfile" +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..00ab32b --- /dev/null +++ b/package-lock.json @@ -0,0 +1,37780 @@ +{ + + "name": "resturant-dashbord", + + "version": "0.1.0", + + "lockfileVersion": 3, + + "requires": true, + + "packages": { + + "": { + + "name": "resturant-dashbord", + + "version": "0.1.0", + + "license": "ISC", + + "dependencies": { + + "@emotion/react": "^11.14.0", + + "@emotion/styled": "^11.14.0", + + "@mui/icons-material": "^7.0.2", + + "@mui/material": "^7.0.2", + + "@mui/x-date-pickers": "^8.5.2", + + "@react-oauth/google": "^0.12.2", + + "@testing-library/dom": "^10.4.0", + + "@testing-library/jest-dom": "^6.6.3", + + "@testing-library/react": "^16.3.0", + + "@testing-library/user-event": "^13.5.0", + + "axios": "^1.9.0", + + "date-fns": "^4.1.0", + + "dayjs": "^1.11.13", + + "file-saver": "^2.0.5", + + "framer-motion": "^12.23.0", + + "jspdf": "^2.5.1", + + "jspdf-autotable": "^3.5.23", + + "jwt-decode": "^4.0.0", + + "react": "^19.1.0", + + "react-circular-progressbar": "^2.2.0", + + "react-dom": "^19.1.0", + + "react-router-dom": "^7.6.0", + + "react-scripts": "5.0.1", + + "recharts": "^2.15.3", + + "web-vitals": "^2.1.4", + + "xlsx": "^0.18.5" + + } + + }, + + "node_modules/@adobe/css-tools": { + + "version": "4.4.2", + + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.2.tgz", + + "integrity": "sha512-baYZExFpsdkBNuvGKTKWCwKH57HRZLVtycZS05WTQNVOiXVSeAki3nU35zlRbToeMW8aHlJfyS+1C4BOv27q0A==", + + "license": "MIT" + + }, + + "node_modules/@alloc/quick-lru": { + + "version": "5.2.0", + + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + + "license": "MIT", + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/@ampproject/remapping": { + + "version": "2.3.0", + + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + + "license": "Apache-2.0", + + "dependencies": { + + "@jridgewell/gen-mapping": "^0.3.5", + + "@jridgewell/trace-mapping": "^0.3.24" + + }, + + "engines": { + + "node": ">=6.0.0" + + } + + }, + + "node_modules/@babel/code-frame": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-validator-identifier": "^7.27.1", + + "js-tokens": "^4.0.0", + + "picocolors": "^1.1.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + } + + }, + + "node_modules/@babel/compat-data": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.1.tgz", + + "integrity": "sha512-Q+E+rd/yBzNQhXkG+zQnF58e4zoZfBedaxwzPmicKsiK3nt8iJYrSrDbjwFFDGC4f+rPafqRaPH6TsDoSvMf7A==", + + "license": "MIT", + + "engines": { + + "node": ">=6.9.0" + + } + + }, + + "node_modules/@babel/core": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz", + + "integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==", + + "license": "MIT", + + "dependencies": { + + "@ampproject/remapping": "^2.2.0", + + "@babel/code-frame": "^7.27.1", + + "@babel/generator": "^7.27.1", + + "@babel/helper-compilation-targets": "^7.27.1", + + "@babel/helper-module-transforms": "^7.27.1", + + "@babel/helpers": "^7.27.1", + + "@babel/parser": "^7.27.1", + + "@babel/template": "^7.27.1", + + "@babel/traverse": "^7.27.1", + + "@babel/types": "^7.27.1", + + "convert-source-map": "^2.0.0", + + "debug": "^4.1.0", + + "gensync": "^1.0.0-beta.2", + + "json5": "^2.2.3", + + "semver": "^6.3.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/babel" + + } + + }, + + "node_modules/@babel/core/node_modules/semver": { + + "version": "6.3.1", + + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + + "license": "ISC", + + "bin": { + + "semver": "bin/semver.js" + + } + + }, + + "node_modules/@babel/eslint-parser": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.27.1.tgz", + + "integrity": "sha512-q8rjOuadH0V6Zo4XLMkJ3RMQ9MSBqwaDByyYB0izsYdaIWGNLmEblbCOf1vyFHICcg16CD7Fsi51vcQnYxmt6Q==", + + "license": "MIT", + + "dependencies": { + + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + + "eslint-visitor-keys": "^2.1.0", + + "semver": "^6.3.1" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.11.0", + + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" + + } + + }, + + "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { + + "version": "2.1.0", + + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + + "license": "Apache-2.0", + + "engines": { + + "node": ">=10" + + } + + }, + + "node_modules/@babel/eslint-parser/node_modules/semver": { + + "version": "6.3.1", + + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + + "license": "ISC", + + "bin": { + + "semver": "bin/semver.js" + + } + + }, + + "node_modules/@babel/generator": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", + + "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", + + "license": "MIT", + + "dependencies": { + + "@babel/parser": "^7.27.1", + + "@babel/types": "^7.27.1", + + "@jridgewell/gen-mapping": "^0.3.5", + + "@jridgewell/trace-mapping": "^0.3.25", + + "jsesc": "^3.0.2" + + }, + + "engines": { + + "node": ">=6.9.0" + + } + + }, + + "node_modules/@babel/helper-annotate-as-pure": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.1.tgz", + + "integrity": "sha512-WnuuDILl9oOBbKnb4L+DyODx7iC47XfzmNCpTttFsSp6hTG7XZxu60+4IO+2/hPfcGOoKbFiwoI/+zwARbNQow==", + + "license": "MIT", + + "dependencies": { + + "@babel/types": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + } + + }, + + "node_modules/@babel/helper-compilation-targets": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.1.tgz", + + "integrity": "sha512-2YaDd/Rd9E598B5+WIc8wJPmWETiiJXFYVE60oX8FDohv7rAUU3CQj+A1MgeEmcsk2+dQuEjIe/GDvig0SqL4g==", + + "license": "MIT", + + "dependencies": { + + "@babel/compat-data": "^7.27.1", + + "@babel/helper-validator-option": "^7.27.1", + + "browserslist": "^4.24.0", + + "lru-cache": "^5.1.1", + + "semver": "^6.3.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + } + + }, + + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + + "version": "6.3.1", + + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + + "license": "ISC", + + "bin": { + + "semver": "bin/semver.js" + + } + + }, + + "node_modules/@babel/helper-create-class-features-plugin": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", + + "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-annotate-as-pure": "^7.27.1", + + "@babel/helper-member-expression-to-functions": "^7.27.1", + + "@babel/helper-optimise-call-expression": "^7.27.1", + + "@babel/helper-replace-supers": "^7.27.1", + + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + + "@babel/traverse": "^7.27.1", + + "semver": "^6.3.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0" + + } + + }, + + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + + "version": "6.3.1", + + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + + "license": "ISC", + + "bin": { + + "semver": "bin/semver.js" + + } + + }, + + "node_modules/@babel/helper-create-regexp-features-plugin": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", + + "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-annotate-as-pure": "^7.27.1", + + "regexpu-core": "^6.2.0", + + "semver": "^6.3.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0" + + } + + }, + + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + + "version": "6.3.1", + + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + + "license": "ISC", + + "bin": { + + "semver": "bin/semver.js" + + } + + }, + + "node_modules/@babel/helper-define-polyfill-provider": { + + "version": "0.6.4", + + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz", + + "integrity": "sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-compilation-targets": "^7.22.6", + + "@babel/helper-plugin-utils": "^7.22.5", + + "debug": "^4.1.1", + + "lodash.debounce": "^4.0.8", + + "resolve": "^1.14.2" + + }, + + "peerDependencies": { + + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + + } + + }, + + "node_modules/@babel/helper-member-expression-to-functions": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", + + "license": "MIT", + + "dependencies": { + + "@babel/traverse": "^7.27.1", + + "@babel/types": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + } + + }, + + "node_modules/@babel/helper-module-imports": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + + "license": "MIT", + + "dependencies": { + + "@babel/traverse": "^7.27.1", + + "@babel/types": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + } + + }, + + "node_modules/@babel/helper-module-transforms": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz", + + "integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-module-imports": "^7.27.1", + + "@babel/helper-validator-identifier": "^7.27.1", + + "@babel/traverse": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0" + + } + + }, + + "node_modules/@babel/helper-optimise-call-expression": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + + "license": "MIT", + + "dependencies": { + + "@babel/types": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + } + + }, + + "node_modules/@babel/helper-plugin-utils": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + + "license": "MIT", + + "engines": { + + "node": ">=6.9.0" + + } + + }, + + "node_modules/@babel/helper-remap-async-to-generator": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-annotate-as-pure": "^7.27.1", + + "@babel/helper-wrap-function": "^7.27.1", + + "@babel/traverse": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0" + + } + + }, + + "node_modules/@babel/helper-replace-supers": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-member-expression-to-functions": "^7.27.1", + + "@babel/helper-optimise-call-expression": "^7.27.1", + + "@babel/traverse": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0" + + } + + }, + + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + + "license": "MIT", + + "dependencies": { + + "@babel/traverse": "^7.27.1", + + "@babel/types": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + } + + }, + + "node_modules/@babel/helper-string-parser": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + + "license": "MIT", + + "engines": { + + "node": ">=6.9.0" + + } + + }, + + "node_modules/@babel/helper-validator-identifier": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + + "license": "MIT", + + "engines": { + + "node": ">=6.9.0" + + } + + }, + + "node_modules/@babel/helper-validator-option": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + + "license": "MIT", + + "engines": { + + "node": ">=6.9.0" + + } + + }, + + "node_modules/@babel/helper-wrap-function": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", + + "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", + + "license": "MIT", + + "dependencies": { + + "@babel/template": "^7.27.1", + + "@babel/traverse": "^7.27.1", + + "@babel/types": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + } + + }, + + "node_modules/@babel/helpers": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", + + "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", + + "license": "MIT", + + "dependencies": { + + "@babel/template": "^7.27.1", + + "@babel/types": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + } + + }, + + "node_modules/@babel/parser": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.1.tgz", + + "integrity": "sha512-I0dZ3ZpCrJ1c04OqlNsQcKiZlsrXf/kkE4FXzID9rIOYICsAbA8mMDzhW/luRNAHdCNt7os/u8wenklZDlUVUQ==", + + "license": "MIT", + + "dependencies": { + + "@babel/types": "^7.27.1" + + }, + + "bin": { + + "parser": "bin/babel-parser.js" + + }, + + "engines": { + + "node": ">=6.0.0" + + } + + }, + + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", + + "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1", + + "@babel/traverse": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0" + + } + + }, + + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0" + + } + + }, + + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0" + + } + + }, + + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1", + + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + + "@babel/plugin-transform-optional-chaining": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.13.0" + + } + + }, + + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz", + + "integrity": "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1", + + "@babel/traverse": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0" + + } + + }, + + "node_modules/@babel/plugin-proposal-class-properties": { + + "version": "7.18.6", + + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-create-class-features-plugin": "^7.18.6", + + "@babel/helper-plugin-utils": "^7.18.6" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-proposal-decorators": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.27.1.tgz", + + "integrity": "sha512-DTxe4LBPrtFdsWzgpmbBKevg3e9PBy+dXRt19kSbucbZvL2uqtdqwwpluL1jfxYE0wIDTFp1nTy/q6gNLsxXrg==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-create-class-features-plugin": "^7.27.1", + + "@babel/helper-plugin-utils": "^7.27.1", + + "@babel/plugin-syntax-decorators": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + + "version": "7.18.6", + + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.18.6", + + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-proposal-numeric-separator": { + + "version": "7.18.6", + + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.18.6", + + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-proposal-optional-chaining": { + + "version": "7.21.0", + + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.20.2", + + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-proposal-private-methods": { + + "version": "7.18.6", + + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-create-class-features-plugin": "^7.18.6", + + "@babel/helper-plugin-utils": "^7.18.6" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-proposal-private-property-in-object": { + + "version": "7.21.0-placeholder-for-preset-env.2", + + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + + "license": "MIT", + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-syntax-async-generators": { + + "version": "7.8.4", + + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.8.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-syntax-bigint": { + + "version": "7.8.3", + + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.8.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-syntax-class-properties": { + + "version": "7.12.13", + + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.12.13" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-syntax-class-static-block": { + + "version": "7.14.5", + + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.14.5" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-syntax-decorators": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz", + + "integrity": "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-syntax-flow": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", + + "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-syntax-import-assertions": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-syntax-import-attributes": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-syntax-import-meta": { + + "version": "7.10.4", + + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.10.4" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-syntax-json-strings": { + + "version": "7.8.3", + + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.8.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-syntax-jsx": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + + "version": "7.10.4", + + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.10.4" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + + "version": "7.8.3", + + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.8.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-syntax-numeric-separator": { + + "version": "7.10.4", + + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.10.4" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-syntax-object-rest-spread": { + + "version": "7.8.3", + + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.8.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + + "version": "7.8.3", + + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.8.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-syntax-optional-chaining": { + + "version": "7.8.3", + + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.8.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-syntax-private-property-in-object": { + + "version": "7.14.5", + + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.14.5" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-syntax-top-level-await": { + + "version": "7.14.5", + + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.14.5" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-syntax-typescript": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + + "version": "7.18.6", + + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + + "@babel/helper-plugin-utils": "^7.18.6" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0" + + } + + }, + + "node_modules/@babel/plugin-transform-arrow-functions": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-async-generator-functions": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.27.1.tgz", + + "integrity": "sha512-eST9RrwlpaoJBDHShc+DS2SG4ATTi2MYNb4OxYkf3n+7eb49LWpnS+HSpVfW4x927qQwgk8A2hGNVaajAEw0EA==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1", + + "@babel/helper-remap-async-to-generator": "^7.27.1", + + "@babel/traverse": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-async-to-generator": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-module-imports": "^7.27.1", + + "@babel/helper-plugin-utils": "^7.27.1", + + "@babel/helper-remap-async-to-generator": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-block-scoped-functions": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-block-scoping": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.1.tgz", + + "integrity": "sha512-QEcFlMl9nGTgh1rn2nIeU5bkfb9BAjaQcWbiP4LvKxUot52ABcTkpcyJ7f2Q2U2RuQ84BNLgts3jRme2dTx6Fw==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-class-properties": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-create-class-features-plugin": "^7.27.1", + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-class-static-block": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz", + + "integrity": "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-create-class-features-plugin": "^7.27.1", + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.12.0" + + } + + }, + + "node_modules/@babel/plugin-transform-classes": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.27.1.tgz", + + "integrity": "sha512-7iLhfFAubmpeJe/Wo2TVuDrykh/zlWXLzPNdL0Jqn/Xu8R3QQ8h9ff8FQoISZOsw74/HFqFI7NX63HN7QFIHKA==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-annotate-as-pure": "^7.27.1", + + "@babel/helper-compilation-targets": "^7.27.1", + + "@babel/helper-plugin-utils": "^7.27.1", + + "@babel/helper-replace-supers": "^7.27.1", + + "@babel/traverse": "^7.27.1", + + "globals": "^11.1.0" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-computed-properties": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1", + + "@babel/template": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-destructuring": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.27.1.tgz", + + "integrity": "sha512-ttDCqhfvpE9emVkXbPD8vyxxh4TWYACVybGkDj+oReOGwnp066ITEivDlLwe0b1R0+evJ13IXQuLNB5w1fhC5Q==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-dotall-regex": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-duplicate-keys": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0" + + } + + }, + + "node_modules/@babel/plugin-transform-dynamic-import": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-exponentiation-operator": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", + + "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-export-namespace-from": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-flow-strip-types": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.27.1.tgz", + + "integrity": "sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1", + + "@babel/plugin-syntax-flow": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-for-of": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1", + + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-function-name": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-compilation-targets": "^7.27.1", + + "@babel/helper-plugin-utils": "^7.27.1", + + "@babel/traverse": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-json-strings": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-literals": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", + + "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-member-expression-literals": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-modules-amd": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-module-transforms": "^7.27.1", + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-modules-commonjs": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-module-transforms": "^7.27.1", + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-modules-systemjs": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", + + "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-module-transforms": "^7.27.1", + + "@babel/helper-plugin-utils": "^7.27.1", + + "@babel/helper-validator-identifier": "^7.27.1", + + "@babel/traverse": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-modules-umd": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-module-transforms": "^7.27.1", + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0" + + } + + }, + + "node_modules/@babel/plugin-transform-new-target": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-numeric-separator": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-object-rest-spread": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.27.1.tgz", + + "integrity": "sha512-/sSliVc9gHE20/7D5qsdGlq7RG5NCDTWsAhyqzGuq174EtWJoGzIu1BQ7G56eDsTcy1jseBZwv50olSdXOlGuA==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-compilation-targets": "^7.27.1", + + "@babel/helper-plugin-utils": "^7.27.1", + + "@babel/plugin-transform-parameters": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-object-super": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1", + + "@babel/helper-replace-supers": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-optional-catch-binding": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-optional-chaining": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", + + "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1", + + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-parameters": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.1.tgz", + + "integrity": "sha512-018KRk76HWKeZ5l4oTj2zPpSh+NbGdt0st5S6x0pga6HgrjBOJb24mMDHorFopOOd6YHkLgOZ+zaCjZGPO4aKg==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-private-methods": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-create-class-features-plugin": "^7.27.1", + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-private-property-in-object": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-annotate-as-pure": "^7.27.1", + + "@babel/helper-create-class-features-plugin": "^7.27.1", + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-property-literals": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-react-constant-elements": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", + + "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-react-display-name": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.27.1.tgz", + + "integrity": "sha512-p9+Vl3yuHPmkirRrg021XiP+EETmPMQTLr6Ayjj85RLNEbb3Eya/4VI0vAdzQG9SEAl2Lnt7fy5lZyMzjYoZQQ==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-react-jsx": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", + + "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-annotate-as-pure": "^7.27.1", + + "@babel/helper-module-imports": "^7.27.1", + + "@babel/helper-plugin-utils": "^7.27.1", + + "@babel/plugin-syntax-jsx": "^7.27.1", + + "@babel/types": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-react-jsx-development": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + + "license": "MIT", + + "dependencies": { + + "@babel/plugin-transform-react-jsx": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-react-pure-annotations": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-annotate-as-pure": "^7.27.1", + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-regenerator": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.1.tgz", + + "integrity": "sha512-B19lbbL7PMrKr52BNPjCqg1IyNUIjTcxKj8uX9zHO+PmWN93s19NDr/f69mIkEp2x9nmDJ08a7lgHaTTzvW7mw==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-regexp-modifiers": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0" + + } + + }, + + "node_modules/@babel/plugin-transform-reserved-words": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-runtime": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.27.1.tgz", + + "integrity": "sha512-TqGF3desVsTcp3WrJGj4HfKokfCXCLcHpt4PJF0D8/iT6LPd9RS82Upw3KPeyr6B22Lfd3DO8MVrmp0oRkUDdw==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-module-imports": "^7.27.1", + + "@babel/helper-plugin-utils": "^7.27.1", + + "babel-plugin-polyfill-corejs2": "^0.4.10", + + "babel-plugin-polyfill-corejs3": "^0.11.0", + + "babel-plugin-polyfill-regenerator": "^0.6.1", + + "semver": "^6.3.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + + "version": "6.3.1", + + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + + "license": "ISC", + + "bin": { + + "semver": "bin/semver.js" + + } + + }, + + "node_modules/@babel/plugin-transform-shorthand-properties": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-spread": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1", + + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-sticky-regex": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-template-literals": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-typeof-symbol": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-typescript": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.27.1.tgz", + + "integrity": "sha512-Q5sT5+O4QUebHdbwKedFBEwRLb02zJ7r4A5Gg2hUoLuU3FjdMcyqcywqUrLCaDsFCxzokf7u9kuy7qz51YUuAg==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-annotate-as-pure": "^7.27.1", + + "@babel/helper-create-class-features-plugin": "^7.27.1", + + "@babel/helper-plugin-utils": "^7.27.1", + + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + + "@babel/plugin-syntax-typescript": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-unicode-escapes": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-unicode-property-regex": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-unicode-regex": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + + "@babel/helper-plugin-utils": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0" + + } + + }, + + "node_modules/@babel/preset-env": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.27.1.tgz", + + "integrity": "sha512-TZ5USxFpLgKDpdEt8YWBR7p6g+bZo6sHaXLqP2BY/U0acaoI8FTVflcYCr/v94twM1C5IWFdZ/hscq9WjUeLXA==", + + "license": "MIT", + + "dependencies": { + + "@babel/compat-data": "^7.27.1", + + "@babel/helper-compilation-targets": "^7.27.1", + + "@babel/helper-plugin-utils": "^7.27.1", + + "@babel/helper-validator-option": "^7.27.1", + + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1", + + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + + "@babel/plugin-syntax-import-assertions": "^7.27.1", + + "@babel/plugin-syntax-import-attributes": "^7.27.1", + + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + + "@babel/plugin-transform-arrow-functions": "^7.27.1", + + "@babel/plugin-transform-async-generator-functions": "^7.27.1", + + "@babel/plugin-transform-async-to-generator": "^7.27.1", + + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + + "@babel/plugin-transform-block-scoping": "^7.27.1", + + "@babel/plugin-transform-class-properties": "^7.27.1", + + "@babel/plugin-transform-class-static-block": "^7.27.1", + + "@babel/plugin-transform-classes": "^7.27.1", + + "@babel/plugin-transform-computed-properties": "^7.27.1", + + "@babel/plugin-transform-destructuring": "^7.27.1", + + "@babel/plugin-transform-dotall-regex": "^7.27.1", + + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + + "@babel/plugin-transform-dynamic-import": "^7.27.1", + + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + + "@babel/plugin-transform-for-of": "^7.27.1", + + "@babel/plugin-transform-function-name": "^7.27.1", + + "@babel/plugin-transform-json-strings": "^7.27.1", + + "@babel/plugin-transform-literals": "^7.27.1", + + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + + "@babel/plugin-transform-modules-amd": "^7.27.1", + + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + + "@babel/plugin-transform-modules-umd": "^7.27.1", + + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + + "@babel/plugin-transform-new-target": "^7.27.1", + + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + + "@babel/plugin-transform-numeric-separator": "^7.27.1", + + "@babel/plugin-transform-object-rest-spread": "^7.27.1", + + "@babel/plugin-transform-object-super": "^7.27.1", + + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + + "@babel/plugin-transform-optional-chaining": "^7.27.1", + + "@babel/plugin-transform-parameters": "^7.27.1", + + "@babel/plugin-transform-private-methods": "^7.27.1", + + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + + "@babel/plugin-transform-property-literals": "^7.27.1", + + "@babel/plugin-transform-regenerator": "^7.27.1", + + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + + "@babel/plugin-transform-reserved-words": "^7.27.1", + + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + + "@babel/plugin-transform-spread": "^7.27.1", + + "@babel/plugin-transform-sticky-regex": "^7.27.1", + + "@babel/plugin-transform-template-literals": "^7.27.1", + + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + + "@babel/plugin-transform-unicode-regex": "^7.27.1", + + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + + "@babel/preset-modules": "0.1.6-no-external-plugins", + + "babel-plugin-polyfill-corejs2": "^0.4.10", + + "babel-plugin-polyfill-corejs3": "^0.11.0", + + "babel-plugin-polyfill-regenerator": "^0.6.1", + + "core-js-compat": "^3.40.0", + + "semver": "^6.3.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/preset-env/node_modules/semver": { + + "version": "6.3.1", + + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + + "license": "ISC", + + "bin": { + + "semver": "bin/semver.js" + + } + + }, + + "node_modules/@babel/preset-modules": { + + "version": "0.1.6-no-external-plugins", + + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.0.0", + + "@babel/types": "^7.4.4", + + "esutils": "^2.0.2" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + + } + + }, + + "node_modules/@babel/preset-react": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz", + + "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1", + + "@babel/helper-validator-option": "^7.27.1", + + "@babel/plugin-transform-react-display-name": "^7.27.1", + + "@babel/plugin-transform-react-jsx": "^7.27.1", + + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/preset-typescript": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", + + "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.27.1", + + "@babel/helper-validator-option": "^7.27.1", + + "@babel/plugin-syntax-jsx": "^7.27.1", + + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + + "@babel/plugin-transform-typescript": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/@babel/runtime": { + + "version": "7.27.6", + + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz", + + "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==", + + "license": "MIT", + + "engines": { + + "node": ">=6.9.0" + + } + + }, + + "node_modules/@babel/template": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.1.tgz", + + "integrity": "sha512-Fyo3ghWMqkHHpHQCoBs2VnYjR4iWFFjguTDEqA5WgZDOrFesVjMhMM2FSqTKSoUSDO1VQtavj8NFpdRBEvJTtg==", + + "license": "MIT", + + "dependencies": { + + "@babel/code-frame": "^7.27.1", + + "@babel/parser": "^7.27.1", + + "@babel/types": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + } + + }, + + "node_modules/@babel/traverse": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz", + + "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==", + + "license": "MIT", + + "dependencies": { + + "@babel/code-frame": "^7.27.1", + + "@babel/generator": "^7.27.1", + + "@babel/parser": "^7.27.1", + + "@babel/template": "^7.27.1", + + "@babel/types": "^7.27.1", + + "debug": "^4.3.1", + + "globals": "^11.1.0" + + }, + + "engines": { + + "node": ">=6.9.0" + + } + + }, + + "node_modules/@babel/types": { + + "version": "7.27.1", + + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", + + "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-string-parser": "^7.27.1", + + "@babel/helper-validator-identifier": "^7.27.1" + + }, + + "engines": { + + "node": ">=6.9.0" + + } + + }, + + "node_modules/@bcoe/v8-coverage": { + + "version": "0.2.3", + + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + + "license": "MIT" + + }, + + "node_modules/@csstools/normalize.css": { + + "version": "12.1.1", + + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.1.1.tgz", + + "integrity": "sha512-YAYeJ+Xqh7fUou1d1j9XHl44BmsuThiTr4iNrgCQ3J27IbhXsxXDGZ1cXv8Qvs99d4rBbLiSKy3+WZiet32PcQ==", + + "license": "CC0-1.0" + + }, + + "node_modules/@csstools/postcss-cascade-layers": { + + "version": "1.1.1", + + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", + + "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", + + "license": "CC0-1.0", + + "dependencies": { + + "@csstools/selector-specificity": "^2.0.2", + + "postcss-selector-parser": "^6.0.10" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss": "^8.2" + + } + + }, + + "node_modules/@csstools/postcss-color-function": { + + "version": "1.1.1", + + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", + + "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", + + "license": "CC0-1.0", + + "dependencies": { + + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss": "^8.2" + + } + + }, + + "node_modules/@csstools/postcss-font-format-keywords": { + + "version": "1.0.1", + + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", + + "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", + + "license": "CC0-1.0", + + "dependencies": { + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss": "^8.2" + + } + + }, + + "node_modules/@csstools/postcss-hwb-function": { + + "version": "1.0.2", + + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", + + "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", + + "license": "CC0-1.0", + + "dependencies": { + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss": "^8.2" + + } + + }, + + "node_modules/@csstools/postcss-ic-unit": { + + "version": "1.0.1", + + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", + + "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", + + "license": "CC0-1.0", + + "dependencies": { + + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss": "^8.2" + + } + + }, + + "node_modules/@csstools/postcss-is-pseudo-class": { + + "version": "2.0.7", + + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", + + "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", + + "license": "CC0-1.0", + + "dependencies": { + + "@csstools/selector-specificity": "^2.0.0", + + "postcss-selector-parser": "^6.0.10" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss": "^8.2" + + } + + }, + + "node_modules/@csstools/postcss-nested-calc": { + + "version": "1.0.0", + + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", + + "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", + + "license": "CC0-1.0", + + "dependencies": { + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss": "^8.2" + + } + + }, + + "node_modules/@csstools/postcss-normalize-display-values": { + + "version": "1.0.1", + + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", + + "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", + + "license": "CC0-1.0", + + "dependencies": { + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss": "^8.2" + + } + + }, + + "node_modules/@csstools/postcss-oklab-function": { + + "version": "1.1.1", + + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", + + "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", + + "license": "CC0-1.0", + + "dependencies": { + + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss": "^8.2" + + } + + }, + + "node_modules/@csstools/postcss-progressive-custom-properties": { + + "version": "1.3.0", + + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", + + "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + + "license": "CC0-1.0", + + "dependencies": { + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "peerDependencies": { + + "postcss": "^8.3" + + } + + }, + + "node_modules/@csstools/postcss-stepped-value-functions": { + + "version": "1.0.1", + + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", + + "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", + + "license": "CC0-1.0", + + "dependencies": { + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss": "^8.2" + + } + + }, + + "node_modules/@csstools/postcss-text-decoration-shorthand": { + + "version": "1.0.0", + + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", + + "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", + + "license": "CC0-1.0", + + "dependencies": { + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss": "^8.2" + + } + + }, + + "node_modules/@csstools/postcss-trigonometric-functions": { + + "version": "1.0.2", + + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", + + "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", + + "license": "CC0-1.0", + + "dependencies": { + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^14 || >=16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss": "^8.2" + + } + + }, + + "node_modules/@csstools/postcss-unset-value": { + + "version": "1.0.2", + + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", + + "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", + + "license": "CC0-1.0", + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss": "^8.2" + + } + + }, + + "node_modules/@csstools/selector-specificity": { + + "version": "2.2.0", + + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", + + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", + + "license": "CC0-1.0", + + "engines": { + + "node": "^14 || ^16 || >=18" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss-selector-parser": "^6.0.10" + + } + + }, + + "node_modules/@emotion/babel-plugin": { + + "version": "11.13.5", + + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-module-imports": "^7.16.7", + + "@babel/runtime": "^7.18.3", + + "@emotion/hash": "^0.9.2", + + "@emotion/memoize": "^0.9.0", + + "@emotion/serialize": "^1.3.3", + + "babel-plugin-macros": "^3.1.0", + + "convert-source-map": "^1.5.0", + + "escape-string-regexp": "^4.0.0", + + "find-root": "^1.1.0", + + "source-map": "^0.5.7", + + "stylis": "4.2.0" + + } + + }, + + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { + + "version": "1.9.0", + + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + + "license": "MIT" + + }, + + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + + "version": "0.5.7", + + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + + "license": "BSD-3-Clause", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/@emotion/cache": { + + "version": "11.14.0", + + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + + "license": "MIT", + + "dependencies": { + + "@emotion/memoize": "^0.9.0", + + "@emotion/sheet": "^1.4.0", + + "@emotion/utils": "^1.4.2", + + "@emotion/weak-memoize": "^0.4.0", + + "stylis": "4.2.0" + + } + + }, + + "node_modules/@emotion/hash": { + + "version": "0.9.2", + + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + + "license": "MIT" + + }, + + "node_modules/@emotion/is-prop-valid": { + + "version": "1.3.1", + + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz", + + "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==", + + "license": "MIT", + + "dependencies": { + + "@emotion/memoize": "^0.9.0" + + } + + }, + + "node_modules/@emotion/memoize": { + + "version": "0.9.0", + + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + + "license": "MIT" + + }, + + "node_modules/@emotion/react": { + + "version": "11.14.0", + + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + + "license": "MIT", + + "dependencies": { + + "@babel/runtime": "^7.18.3", + + "@emotion/babel-plugin": "^11.13.5", + + "@emotion/cache": "^11.14.0", + + "@emotion/serialize": "^1.3.3", + + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + + "@emotion/utils": "^1.4.2", + + "@emotion/weak-memoize": "^0.4.0", + + "hoist-non-react-statics": "^3.3.1" + + }, + + "peerDependencies": { + + "react": ">=16.8.0" + + }, + + "peerDependenciesMeta": { + + "@types/react": { + + "optional": true + + } + + } + + }, + + "node_modules/@emotion/serialize": { + + "version": "1.3.3", + + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + + "license": "MIT", + + "dependencies": { + + "@emotion/hash": "^0.9.2", + + "@emotion/memoize": "^0.9.0", + + "@emotion/unitless": "^0.10.0", + + "@emotion/utils": "^1.4.2", + + "csstype": "^3.0.2" + + } + + }, + + "node_modules/@emotion/sheet": { + + "version": "1.4.0", + + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + + "license": "MIT" + + }, + + "node_modules/@emotion/styled": { + + "version": "11.14.0", + + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.0.tgz", + + "integrity": "sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==", + + "license": "MIT", + + "dependencies": { + + "@babel/runtime": "^7.18.3", + + "@emotion/babel-plugin": "^11.13.5", + + "@emotion/is-prop-valid": "^1.3.0", + + "@emotion/serialize": "^1.3.3", + + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + + "@emotion/utils": "^1.4.2" + + }, + + "peerDependencies": { + + "@emotion/react": "^11.0.0-rc.0", + + "react": ">=16.8.0" + + }, + + "peerDependenciesMeta": { + + "@types/react": { + + "optional": true + + } + + } + + }, + + "node_modules/@emotion/unitless": { + + "version": "0.10.0", + + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + + "license": "MIT" + + }, + + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + + "version": "1.2.0", + + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + + "license": "MIT", + + "peerDependencies": { + + "react": ">=16.8.0" + + } + + }, + + "node_modules/@emotion/utils": { + + "version": "1.4.2", + + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + + "license": "MIT" + + }, + + "node_modules/@emotion/weak-memoize": { + + "version": "0.4.0", + + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + + "license": "MIT" + + }, + + "node_modules/@eslint-community/eslint-utils": { + + "version": "4.7.0", + + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + + "license": "MIT", + + "dependencies": { + + "eslint-visitor-keys": "^3.4.3" + + }, + + "engines": { + + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + + }, + + "funding": { + + "url": "https://opencollective.com/eslint" + + }, + + "peerDependencies": { + + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + + } + + }, + + "node_modules/@eslint-community/regexpp": { + + "version": "4.12.1", + + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + + "license": "MIT", + + "engines": { + + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + + } + + }, + + "node_modules/@eslint/eslintrc": { + + "version": "2.1.4", + + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + + "license": "MIT", + + "dependencies": { + + "ajv": "^6.12.4", + + "debug": "^4.3.2", + + "espree": "^9.6.0", + + "globals": "^13.19.0", + + "ignore": "^5.2.0", + + "import-fresh": "^3.2.1", + + "js-yaml": "^4.1.0", + + "minimatch": "^3.1.2", + + "strip-json-comments": "^3.1.1" + + }, + + "engines": { + + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + + }, + + "funding": { + + "url": "https://opencollective.com/eslint" + + } + + }, + + "node_modules/@eslint/eslintrc/node_modules/argparse": { + + "version": "2.0.1", + + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + + "license": "Python-2.0" + + }, + + "node_modules/@eslint/eslintrc/node_modules/globals": { + + "version": "13.24.0", + + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + + "license": "MIT", + + "dependencies": { + + "type-fest": "^0.20.2" + + }, + + "engines": { + + "node": ">=8" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + + "version": "4.1.0", + + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + + "license": "MIT", + + "dependencies": { + + "argparse": "^2.0.1" + + }, + + "bin": { + + "js-yaml": "bin/js-yaml.js" + + } + + }, + + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + + "version": "0.20.2", + + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + + "license": "(MIT OR CC0-1.0)", + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/@eslint/js": { + + "version": "8.57.1", + + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + + "license": "MIT", + + "engines": { + + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + + } + + }, + + "node_modules/@humanwhocodes/config-array": { + + "version": "0.13.0", + + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + + "deprecated": "Use @eslint/config-array instead", + + "license": "Apache-2.0", + + "dependencies": { + + "@humanwhocodes/object-schema": "^2.0.3", + + "debug": "^4.3.1", + + "minimatch": "^3.0.5" + + }, + + "engines": { + + "node": ">=10.10.0" + + } + + }, + + "node_modules/@humanwhocodes/module-importer": { + + "version": "1.0.1", + + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + + "license": "Apache-2.0", + + "engines": { + + "node": ">=12.22" + + }, + + "funding": { + + "type": "github", + + "url": "https://github.com/sponsors/nzakas" + + } + + }, + + "node_modules/@humanwhocodes/object-schema": { + + "version": "2.0.3", + + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + + "deprecated": "Use @eslint/object-schema instead", + + "license": "BSD-3-Clause" + + }, + + "node_modules/@isaacs/cliui": { + + "version": "8.0.2", + + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + + "license": "ISC", + + "dependencies": { + + "string-width": "^5.1.2", + + "string-width-cjs": "npm:string-width@^4.2.0", + + "strip-ansi": "^7.0.1", + + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + + "wrap-ansi": "^8.1.0", + + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + + }, + + "engines": { + + "node": ">=12" + + } + + }, + + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + + "version": "6.1.0", + + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + + "license": "MIT", + + "engines": { + + "node": ">=12" + + }, + + "funding": { + + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + + } + + }, + + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + + "version": "6.2.1", + + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + + "license": "MIT", + + "engines": { + + "node": ">=12" + + }, + + "funding": { + + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + + } + + }, + + "node_modules/@isaacs/cliui/node_modules/string-width": { + + "version": "5.1.2", + + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + + "license": "MIT", + + "dependencies": { + + "eastasianwidth": "^0.2.0", + + "emoji-regex": "^9.2.2", + + "strip-ansi": "^7.0.1" + + }, + + "engines": { + + "node": ">=12" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + + "version": "7.1.0", + + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + + "license": "MIT", + + "dependencies": { + + "ansi-regex": "^6.0.1" + + }, + + "engines": { + + "node": ">=12" + + }, + + "funding": { + + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + + } + + }, + + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + + "version": "8.1.0", + + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + + "license": "MIT", + + "dependencies": { + + "ansi-styles": "^6.1.0", + + "string-width": "^5.0.1", + + "strip-ansi": "^7.0.1" + + }, + + "engines": { + + "node": ">=12" + + }, + + "funding": { + + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + + } + + }, + + "node_modules/@istanbuljs/load-nyc-config": { + + "version": "1.1.0", + + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + + "license": "ISC", + + "dependencies": { + + "camelcase": "^5.3.1", + + "find-up": "^4.1.0", + + "get-package-type": "^0.1.0", + + "js-yaml": "^3.13.1", + + "resolve-from": "^5.0.0" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + + "version": "5.3.1", + + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + + "license": "MIT", + + "engines": { + + "node": ">=6" + + } + + }, + + "node_modules/@istanbuljs/schema": { + + "version": "0.1.3", + + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + + "license": "MIT", + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/@jest/console": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + + "license": "MIT", + + "dependencies": { + + "@jest/types": "^27.5.1", + + "@types/node": "*", + + "chalk": "^4.0.0", + + "jest-message-util": "^27.5.1", + + "jest-util": "^27.5.1", + + "slash": "^3.0.0" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/@jest/core": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", + + "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + + "license": "MIT", + + "dependencies": { + + "@jest/console": "^27.5.1", + + "@jest/reporters": "^27.5.1", + + "@jest/test-result": "^27.5.1", + + "@jest/transform": "^27.5.1", + + "@jest/types": "^27.5.1", + + "@types/node": "*", + + "ansi-escapes": "^4.2.1", + + "chalk": "^4.0.0", + + "emittery": "^0.8.1", + + "exit": "^0.1.2", + + "graceful-fs": "^4.2.9", + + "jest-changed-files": "^27.5.1", + + "jest-config": "^27.5.1", + + "jest-haste-map": "^27.5.1", + + "jest-message-util": "^27.5.1", + + "jest-regex-util": "^27.5.1", + + "jest-resolve": "^27.5.1", + + "jest-resolve-dependencies": "^27.5.1", + + "jest-runner": "^27.5.1", + + "jest-runtime": "^27.5.1", + + "jest-snapshot": "^27.5.1", + + "jest-util": "^27.5.1", + + "jest-validate": "^27.5.1", + + "jest-watcher": "^27.5.1", + + "micromatch": "^4.0.4", + + "rimraf": "^3.0.0", + + "slash": "^3.0.0", + + "strip-ansi": "^6.0.0" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + }, + + "peerDependencies": { + + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + + }, + + "peerDependenciesMeta": { + + "node-notifier": { + + "optional": true + + } + + } + + }, + + "node_modules/@jest/environment": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + + "license": "MIT", + + "dependencies": { + + "@jest/fake-timers": "^27.5.1", + + "@jest/types": "^27.5.1", + + "@types/node": "*", + + "jest-mock": "^27.5.1" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/@jest/fake-timers": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + + "license": "MIT", + + "dependencies": { + + "@jest/types": "^27.5.1", + + "@sinonjs/fake-timers": "^8.0.1", + + "@types/node": "*", + + "jest-message-util": "^27.5.1", + + "jest-mock": "^27.5.1", + + "jest-util": "^27.5.1" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/@jest/globals": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + + "license": "MIT", + + "dependencies": { + + "@jest/environment": "^27.5.1", + + "@jest/types": "^27.5.1", + + "expect": "^27.5.1" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/@jest/reporters": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + + "license": "MIT", + + "dependencies": { + + "@bcoe/v8-coverage": "^0.2.3", + + "@jest/console": "^27.5.1", + + "@jest/test-result": "^27.5.1", + + "@jest/transform": "^27.5.1", + + "@jest/types": "^27.5.1", + + "@types/node": "*", + + "chalk": "^4.0.0", + + "collect-v8-coverage": "^1.0.0", + + "exit": "^0.1.2", + + "glob": "^7.1.2", + + "graceful-fs": "^4.2.9", + + "istanbul-lib-coverage": "^3.0.0", + + "istanbul-lib-instrument": "^5.1.0", + + "istanbul-lib-report": "^3.0.0", + + "istanbul-lib-source-maps": "^4.0.0", + + "istanbul-reports": "^3.1.3", + + "jest-haste-map": "^27.5.1", + + "jest-resolve": "^27.5.1", + + "jest-util": "^27.5.1", + + "jest-worker": "^27.5.1", + + "slash": "^3.0.0", + + "source-map": "^0.6.0", + + "string-length": "^4.0.1", + + "terminal-link": "^2.0.0", + + "v8-to-istanbul": "^8.1.0" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + }, + + "peerDependencies": { + + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + + }, + + "peerDependenciesMeta": { + + "node-notifier": { + + "optional": true + + } + + } + + }, + + "node_modules/@jest/reporters/node_modules/source-map": { + + "version": "0.6.1", + + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + + "license": "BSD-3-Clause", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/@jest/schemas": { + + "version": "28.1.3", + + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + + "license": "MIT", + + "dependencies": { + + "@sinclair/typebox": "^0.24.1" + + }, + + "engines": { + + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + + } + + }, + + "node_modules/@jest/source-map": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", + + "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + + "license": "MIT", + + "dependencies": { + + "callsites": "^3.0.0", + + "graceful-fs": "^4.2.9", + + "source-map": "^0.6.0" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/@jest/source-map/node_modules/source-map": { + + "version": "0.6.1", + + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + + "license": "BSD-3-Clause", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/@jest/test-result": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + + "license": "MIT", + + "dependencies": { + + "@jest/console": "^27.5.1", + + "@jest/types": "^27.5.1", + + "@types/istanbul-lib-coverage": "^2.0.0", + + "collect-v8-coverage": "^1.0.0" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/@jest/test-sequencer": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", + + "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + + "license": "MIT", + + "dependencies": { + + "@jest/test-result": "^27.5.1", + + "graceful-fs": "^4.2.9", + + "jest-haste-map": "^27.5.1", + + "jest-runtime": "^27.5.1" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/@jest/transform": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", + + "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + + "license": "MIT", + + "dependencies": { + + "@babel/core": "^7.1.0", + + "@jest/types": "^27.5.1", + + "babel-plugin-istanbul": "^6.1.1", + + "chalk": "^4.0.0", + + "convert-source-map": "^1.4.0", + + "fast-json-stable-stringify": "^2.0.0", + + "graceful-fs": "^4.2.9", + + "jest-haste-map": "^27.5.1", + + "jest-regex-util": "^27.5.1", + + "jest-util": "^27.5.1", + + "micromatch": "^4.0.4", + + "pirates": "^4.0.4", + + "slash": "^3.0.0", + + "source-map": "^0.6.1", + + "write-file-atomic": "^3.0.0" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/@jest/transform/node_modules/convert-source-map": { + + "version": "1.9.0", + + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + + "license": "MIT" + + }, + + "node_modules/@jest/transform/node_modules/source-map": { + + "version": "0.6.1", + + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + + "license": "BSD-3-Clause", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/@jest/types": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + + "license": "MIT", + + "dependencies": { + + "@types/istanbul-lib-coverage": "^2.0.0", + + "@types/istanbul-reports": "^3.0.0", + + "@types/node": "*", + + "@types/yargs": "^16.0.0", + + "chalk": "^4.0.0" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/@jridgewell/gen-mapping": { + + "version": "0.3.8", + + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + + "license": "MIT", + + "dependencies": { + + "@jridgewell/set-array": "^1.2.1", + + "@jridgewell/sourcemap-codec": "^1.4.10", + + "@jridgewell/trace-mapping": "^0.3.24" + + }, + + "engines": { + + "node": ">=6.0.0" + + } + + }, + + "node_modules/@jridgewell/resolve-uri": { + + "version": "3.1.2", + + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + + "license": "MIT", + + "engines": { + + "node": ">=6.0.0" + + } + + }, + + "node_modules/@jridgewell/set-array": { + + "version": "1.2.1", + + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + + "license": "MIT", + + "engines": { + + "node": ">=6.0.0" + + } + + }, + + "node_modules/@jridgewell/source-map": { + + "version": "0.3.6", + + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + + "license": "MIT", + + "dependencies": { + + "@jridgewell/gen-mapping": "^0.3.5", + + "@jridgewell/trace-mapping": "^0.3.25" + + } + + }, + + "node_modules/@jridgewell/sourcemap-codec": { + + "version": "1.5.0", + + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + + "license": "MIT" + + }, + + "node_modules/@jridgewell/trace-mapping": { + + "version": "0.3.25", + + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + + "license": "MIT", + + "dependencies": { + + "@jridgewell/resolve-uri": "^3.1.0", + + "@jridgewell/sourcemap-codec": "^1.4.14" + + } + + }, + + "node_modules/@leichtgewicht/ip-codec": { + + "version": "2.0.5", + + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + + "license": "MIT" + + }, + + "node_modules/@mui/core-downloads-tracker": { + + "version": "7.0.2", + + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-7.0.2.tgz", + + "integrity": "sha512-TfeFU9TgN1N06hyb/pV/63FfO34nijZRMqgHk0TJ3gkl4Fbd+wZ73+ZtOd7jag6hMmzO9HSrBc6Vdn591nhkAg==", + + "license": "MIT", + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/mui-org" + + } + + }, + + "node_modules/@mui/icons-material": { + + "version": "7.1.0", + + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-7.1.0.tgz", + + "integrity": "sha512-1mUPMAZ+Qk3jfgL5ftRR06ATH/Esi0izHl1z56H+df6cwIlCWG66RXciUqeJCttbOXOQ5y2DCjLZI/4t3Yg3LA==", + + "license": "MIT", + + "dependencies": { + + "@babel/runtime": "^7.27.1" + + }, + + "engines": { + + "node": ">=14.0.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/mui-org" + + }, + + "peerDependencies": { + + "@mui/material": "^7.0.2", + + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + + }, + + "peerDependenciesMeta": { + + "@types/react": { + + "optional": true + + } + + } + + }, + + "node_modules/@mui/material": { + + "version": "7.0.2", + + "resolved": "https://registry.npmjs.org/@mui/material/-/material-7.0.2.tgz", + + "integrity": "sha512-rjJlJ13+3LdLfobRplkXbjIFEIkn6LgpetgU/Cs3Xd8qINCCQK9qXQIjjQ6P0FXFTPFzEVMj0VgBR1mN+FhOcA==", + + "license": "MIT", + + "dependencies": { + + "@babel/runtime": "^7.27.0", + + "@mui/core-downloads-tracker": "^7.0.2", + + "@mui/system": "^7.0.2", + + "@mui/types": "^7.4.1", + + "@mui/utils": "^7.0.2", + + "@popperjs/core": "^2.11.8", + + "@types/react-transition-group": "^4.4.12", + + "clsx": "^2.1.1", + + "csstype": "^3.1.3", + + "prop-types": "^15.8.1", + + "react-is": "^19.1.0", + + "react-transition-group": "^4.4.5" + + }, + + "engines": { + + "node": ">=14.0.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/mui-org" + + }, + + "peerDependencies": { + + "@emotion/react": "^11.5.0", + + "@emotion/styled": "^11.3.0", + + "@mui/material-pigment-css": "^7.0.2", + + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + + }, + + "peerDependenciesMeta": { + + "@emotion/react": { + + "optional": true + + }, + + "@emotion/styled": { + + "optional": true + + }, + + "@mui/material-pigment-css": { + + "optional": true + + }, + + "@types/react": { + + "optional": true + + } + + } + + }, + + "node_modules/@mui/material/node_modules/react-is": { + + "version": "19.1.0", + + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.0.tgz", + + "integrity": "sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==", + + "license": "MIT" + + }, + + "node_modules/@mui/private-theming": { + + "version": "7.1.1", + + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.1.1.tgz", + + "integrity": "sha512-M8NbLUx+armk2ZuaxBkkMk11ultnWmrPlN0Xe3jUEaBChg/mcxa5HWIWS1EE4DF36WRACaAHVAvyekWlDQf0PQ==", + + "license": "MIT", + + "dependencies": { + + "@babel/runtime": "^7.27.1", + + "@mui/utils": "^7.1.1", + + "prop-types": "^15.8.1" + + }, + + "engines": { + + "node": ">=14.0.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/mui-org" + + }, + + "peerDependencies": { + + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + + }, + + "peerDependenciesMeta": { + + "@types/react": { + + "optional": true + + } + + } + + }, + + "node_modules/@mui/styled-engine": { + + "version": "7.1.0", + + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.1.0.tgz", + + "integrity": "sha512-m0mJ0c6iRC+f9hMeRe0W7zZX1wme3oUX0+XTVHjPG7DJz6OdQ6K/ggEOq7ZdwilcpdsDUwwMfOmvO71qDkYd2w==", + + "license": "MIT", + + "dependencies": { + + "@babel/runtime": "^7.27.1", + + "@emotion/cache": "^11.13.5", + + "@emotion/serialize": "^1.3.3", + + "@emotion/sheet": "^1.4.0", + + "csstype": "^3.1.3", + + "prop-types": "^15.8.1" + + }, + + "engines": { + + "node": ">=14.0.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/mui-org" + + }, + + "peerDependencies": { + + "@emotion/react": "^11.4.1", + + "@emotion/styled": "^11.3.0", + + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + + }, + + "peerDependenciesMeta": { + + "@emotion/react": { + + "optional": true + + }, + + "@emotion/styled": { + + "optional": true + + } + + } + + }, + + "node_modules/@mui/system": { + + "version": "7.1.0", + + "resolved": "https://registry.npmjs.org/@mui/system/-/system-7.1.0.tgz", + + "integrity": "sha512-iedAWgRJMCxeMHvkEhsDlbvkK+qKf9me6ofsf7twk/jfT4P1ImVf7Rwb5VubEA0sikrVL+1SkoZM41M4+LNAVA==", + + "license": "MIT", + + "dependencies": { + + "@babel/runtime": "^7.27.1", + + "@mui/private-theming": "^7.1.0", + + "@mui/styled-engine": "^7.1.0", + + "@mui/types": "^7.4.2", + + "@mui/utils": "^7.1.0", + + "clsx": "^2.1.1", + + "csstype": "^3.1.3", + + "prop-types": "^15.8.1" + + }, + + "engines": { + + "node": ">=14.0.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/mui-org" + + }, + + "peerDependencies": { + + "@emotion/react": "^11.5.0", + + "@emotion/styled": "^11.3.0", + + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + + }, + + "peerDependenciesMeta": { + + "@emotion/react": { + + "optional": true + + }, + + "@emotion/styled": { + + "optional": true + + }, + + "@types/react": { + + "optional": true + + } + + } + + }, + + "node_modules/@mui/types": { + + "version": "7.4.3", + + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.3.tgz", + + "integrity": "sha512-2UCEiK29vtiZTeLdS2d4GndBKacVyxGvReznGXGr+CzW/YhjIX+OHUdCIczZjzcRAgKBGmE9zCIgoV9FleuyRQ==", + + "license": "MIT", + + "dependencies": { + + "@babel/runtime": "^7.27.1" + + }, + + "peerDependencies": { + + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + + }, + + "peerDependenciesMeta": { + + "@types/react": { + + "optional": true + + } + + } + + }, + + "node_modules/@mui/utils": { + + "version": "7.1.1", + + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-7.1.1.tgz", + + "integrity": "sha512-BkOt2q7MBYl7pweY2JWwfrlahhp+uGLR8S+EhiyRaofeRYUWL2YKbSGQvN4hgSN1i8poN0PaUiii1kEMrchvzg==", + + "license": "MIT", + + "dependencies": { + + "@babel/runtime": "^7.27.1", + + "@mui/types": "^7.4.3", + + "@types/prop-types": "^15.7.14", + + "clsx": "^2.1.1", + + "prop-types": "^15.8.1", + + "react-is": "^19.1.0" + + }, + + "engines": { + + "node": ">=14.0.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/mui-org" + + }, + + "peerDependencies": { + + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + + }, + + "peerDependenciesMeta": { + + "@types/react": { + + "optional": true + + } + + } + + }, + + "node_modules/@mui/utils/node_modules/react-is": { + + "version": "19.1.0", + + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.0.tgz", + + "integrity": "sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==", + + "license": "MIT" + + }, + + "node_modules/@mui/x-date-pickers": { + + "version": "8.5.2", + + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-8.5.2.tgz", + + "integrity": "sha512-KN0GK5aVetGFB3n4W7XsUI79uTSxftTEhHtDCdQjOOeri2lZSY55MVn/CeYZdpuWlBOD1eTLPtCFzueeUp3m6g==", + + "license": "MIT", + + "dependencies": { + + "@babel/runtime": "^7.27.6", + + "@mui/utils": "^7.1.1", + + "@mui/x-internals": "8.5.2", + + "@types/react-transition-group": "^4.4.12", + + "clsx": "^2.1.1", + + "prop-types": "^15.8.1", + + "react-transition-group": "^4.4.5" + + }, + + "engines": { + + "node": ">=14.0.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/mui-org" + + }, + + "peerDependencies": { + + "@emotion/react": "^11.9.0", + + "@emotion/styled": "^11.8.1", + + "@mui/material": "^5.15.14 || ^6.0.0 || ^7.0.0", + + "@mui/system": "^5.15.14 || ^6.0.0 || ^7.0.0", + + "date-fns": "^2.25.0 || ^3.2.0 || ^4.0.0", + + "date-fns-jalali": "^2.13.0-0 || ^3.2.0-0 || ^4.0.0-0", + + "dayjs": "^1.10.7", + + "luxon": "^3.0.2", + + "moment": "^2.29.4", + + "moment-hijri": "^2.1.2 || ^3.0.0", + + "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", + + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + + }, + + "peerDependenciesMeta": { + + "@emotion/react": { + + "optional": true + + }, + + "@emotion/styled": { + + "optional": true + + }, + + "date-fns": { + + "optional": true + + }, + + "date-fns-jalali": { + + "optional": true + + }, + + "dayjs": { + + "optional": true + + }, + + "luxon": { + + "optional": true + + }, + + "moment": { + + "optional": true + + }, + + "moment-hijri": { + + "optional": true + + }, + + "moment-jalaali": { + + "optional": true + + } + + } + + }, + + "node_modules/@mui/x-internals": { + + "version": "8.5.2", + + "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-8.5.2.tgz", + + "integrity": "sha512-5YhB2AekK7G8d0YrAjg3WNf0uy3V73JD98WNxJhbIlCraQgl8QOQzr2zNO7MAf/X7mZQtjpjuAsiG3+gI2NVyg==", + + "license": "MIT", + + "dependencies": { + + "@babel/runtime": "^7.27.6", + + "@mui/utils": "^7.1.1", + + "reselect": "^5.1.1" + + }, + + "engines": { + + "node": ">=14.0.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/mui-org" + + }, + + "peerDependencies": { + + "@mui/system": "^5.15.14 || ^6.0.0 || ^7.0.0", + + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + + } + + }, + + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { + + "version": "5.1.1-v1", + + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + + "license": "MIT", + + "dependencies": { + + "eslint-scope": "5.1.1" + + } + + }, + + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": { + + "version": "5.1.1", + + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + + "license": "BSD-2-Clause", + + "dependencies": { + + "esrecurse": "^4.3.0", + + "estraverse": "^4.1.1" + + }, + + "engines": { + + "node": ">=8.0.0" + + } + + }, + + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": { + + "version": "4.3.0", + + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + + "license": "BSD-2-Clause", + + "engines": { + + "node": ">=4.0" + + } + + }, + + "node_modules/@nodelib/fs.scandir": { + + "version": "2.1.5", + + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + + "license": "MIT", + + "dependencies": { + + "@nodelib/fs.stat": "2.0.5", + + "run-parallel": "^1.1.9" + + }, + + "engines": { + + "node": ">= 8" + + } + + }, + + "node_modules/@nodelib/fs.stat": { + + "version": "2.0.5", + + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + + "license": "MIT", + + "engines": { + + "node": ">= 8" + + } + + }, + + "node_modules/@nodelib/fs.walk": { + + "version": "1.2.8", + + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + + "license": "MIT", + + "dependencies": { + + "@nodelib/fs.scandir": "2.1.5", + + "fastq": "^1.6.0" + + }, + + "engines": { + + "node": ">= 8" + + } + + }, + + "node_modules/@pkgjs/parseargs": { + + "version": "0.11.0", + + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + + "license": "MIT", + + "optional": true, + + "engines": { + + "node": ">=14" + + } + + }, + + "node_modules/@pmmmwh/react-refresh-webpack-plugin": { + + "version": "0.5.16", + + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.16.tgz", + + "integrity": "sha512-kLQc9xz6QIqd2oIYyXRUiAp79kGpFBm3fEM9ahfG1HI0WI5gdZ2OVHWdmZYnwODt7ISck+QuQ6sBPrtvUBML7Q==", + + "license": "MIT", + + "dependencies": { + + "ansi-html": "^0.0.9", + + "core-js-pure": "^3.23.3", + + "error-stack-parser": "^2.0.6", + + "html-entities": "^2.1.0", + + "loader-utils": "^2.0.4", + + "schema-utils": "^4.2.0", + + "source-map": "^0.7.3" + + }, + + "engines": { + + "node": ">= 10.13" + + }, + + "peerDependencies": { + + "@types/webpack": "4.x || 5.x", + + "react-refresh": ">=0.10.0 <1.0.0", + + "sockjs-client": "^1.4.0", + + "type-fest": ">=0.17.0 <5.0.0", + + "webpack": ">=4.43.0 <6.0.0", + + "webpack-dev-server": "3.x || 4.x || 5.x", + + "webpack-hot-middleware": "2.x", + + "webpack-plugin-serve": "0.x || 1.x" + + }, + + "peerDependenciesMeta": { + + "@types/webpack": { + + "optional": true + + }, + + "sockjs-client": { + + "optional": true + + }, + + "type-fest": { + + "optional": true + + }, + + "webpack-dev-server": { + + "optional": true + + }, + + "webpack-hot-middleware": { + + "optional": true + + }, + + "webpack-plugin-serve": { + + "optional": true + + } + + } + + }, + + "node_modules/@popperjs/core": { + + "version": "2.11.8", + + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + + "license": "MIT", + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/popperjs" + + } + + }, + + "node_modules/@react-oauth/google": { + + "version": "0.12.2", + + "resolved": "https://registry.npmjs.org/@react-oauth/google/-/google-0.12.2.tgz", + + "integrity": "sha512-d1GVm2uD4E44EJft2RbKtp8Z1fp/gK8Lb6KHgs3pHlM0PxCXGLaq8LLYQYENnN4xPWO1gkL4apBtlPKzpLvZwg==", + + "license": "MIT", + + "peerDependencies": { + + "react": ">=16.8.0", + + "react-dom": ">=16.8.0" + + } + + }, + + "node_modules/@rollup/plugin-babel": { + + "version": "5.3.1", + + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-module-imports": "^7.10.4", + + "@rollup/pluginutils": "^3.1.0" + + }, + + "engines": { + + "node": ">= 10.0.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0", + + "@types/babel__core": "^7.1.9", + + "rollup": "^1.20.0||^2.0.0" + + }, + + "peerDependenciesMeta": { + + "@types/babel__core": { + + "optional": true + + } + + } + + }, + + "node_modules/@rollup/plugin-node-resolve": { + + "version": "11.2.1", + + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", + + "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + + "license": "MIT", + + "dependencies": { + + "@rollup/pluginutils": "^3.1.0", + + "@types/resolve": "1.17.1", + + "builtin-modules": "^3.1.0", + + "deepmerge": "^4.2.2", + + "is-module": "^1.0.0", + + "resolve": "^1.19.0" + + }, + + "engines": { + + "node": ">= 10.0.0" + + }, + + "peerDependencies": { + + "rollup": "^1.20.0||^2.0.0" + + } + + }, + + "node_modules/@rollup/plugin-replace": { + + "version": "2.4.2", + + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + + "license": "MIT", + + "dependencies": { + + "@rollup/pluginutils": "^3.1.0", + + "magic-string": "^0.25.7" + + }, + + "peerDependencies": { + + "rollup": "^1.20.0 || ^2.0.0" + + } + + }, + + "node_modules/@rollup/pluginutils": { + + "version": "3.1.0", + + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + + "license": "MIT", + + "dependencies": { + + "@types/estree": "0.0.39", + + "estree-walker": "^1.0.1", + + "picomatch": "^2.2.2" + + }, + + "engines": { + + "node": ">= 8.0.0" + + }, + + "peerDependencies": { + + "rollup": "^1.20.0||^2.0.0" + + } + + }, + + "node_modules/@rollup/pluginutils/node_modules/@types/estree": { + + "version": "0.0.39", + + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + + "license": "MIT" + + }, + + "node_modules/@rtsao/scc": { + + "version": "1.1.0", + + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + + "license": "MIT" + + }, + + "node_modules/@rushstack/eslint-patch": { + + "version": "1.11.0", + + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.11.0.tgz", + + "integrity": "sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ==", + + "license": "MIT" + + }, + + "node_modules/@sinclair/typebox": { + + "version": "0.24.51", + + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + + "license": "MIT" + + }, + + "node_modules/@sinonjs/commons": { + + "version": "1.8.6", + + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + + "license": "BSD-3-Clause", + + "dependencies": { + + "type-detect": "4.0.8" + + } + + }, + + "node_modules/@sinonjs/fake-timers": { + + "version": "8.1.0", + + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + + "license": "BSD-3-Clause", + + "dependencies": { + + "@sinonjs/commons": "^1.7.0" + + } + + }, + + "node_modules/@surma/rollup-plugin-off-main-thread": { + + "version": "2.2.3", + + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", + + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", + + "license": "Apache-2.0", + + "dependencies": { + + "ejs": "^3.1.6", + + "json5": "^2.2.0", + + "magic-string": "^0.25.0", + + "string.prototype.matchall": "^4.0.6" + + } + + }, + + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + + "version": "5.4.0", + + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", + + "license": "MIT", + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "type": "github", + + "url": "https://github.com/sponsors/gregberge" + + } + + }, + + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + + "version": "5.4.0", + + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", + + "license": "MIT", + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "type": "github", + + "url": "https://github.com/sponsors/gregberge" + + } + + }, + + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + + "version": "5.0.1", + + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", + + "license": "MIT", + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "type": "github", + + "url": "https://github.com/sponsors/gregberge" + + } + + }, + + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + + "version": "5.0.1", + + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", + + "license": "MIT", + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "type": "github", + + "url": "https://github.com/sponsors/gregberge" + + } + + }, + + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + + "version": "5.4.0", + + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", + + "license": "MIT", + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "type": "github", + + "url": "https://github.com/sponsors/gregberge" + + } + + }, + + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + + "version": "5.4.0", + + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", + + "license": "MIT", + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "type": "github", + + "url": "https://github.com/sponsors/gregberge" + + } + + }, + + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + + "version": "5.4.0", + + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", + + "license": "MIT", + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "type": "github", + + "url": "https://github.com/sponsors/gregberge" + + } + + }, + + "node_modules/@svgr/babel-plugin-transform-svg-component": { + + "version": "5.5.0", + + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", + + "license": "MIT", + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "type": "github", + + "url": "https://github.com/sponsors/gregberge" + + } + + }, + + "node_modules/@svgr/babel-preset": { + + "version": "5.5.0", + + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + + "license": "MIT", + + "dependencies": { + + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + + }, + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "type": "github", + + "url": "https://github.com/sponsors/gregberge" + + } + + }, + + "node_modules/@svgr/core": { + + "version": "5.5.0", + + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + + "license": "MIT", + + "dependencies": { + + "@svgr/plugin-jsx": "^5.5.0", + + "camelcase": "^6.2.0", + + "cosmiconfig": "^7.0.0" + + }, + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "type": "github", + + "url": "https://github.com/sponsors/gregberge" + + } + + }, + + "node_modules/@svgr/hast-util-to-babel-ast": { + + "version": "5.5.0", + + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + + "license": "MIT", + + "dependencies": { + + "@babel/types": "^7.12.6" + + }, + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "type": "github", + + "url": "https://github.com/sponsors/gregberge" + + } + + }, + + "node_modules/@svgr/plugin-jsx": { + + "version": "5.5.0", + + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + + "license": "MIT", + + "dependencies": { + + "@babel/core": "^7.12.3", + + "@svgr/babel-preset": "^5.5.0", + + "@svgr/hast-util-to-babel-ast": "^5.5.0", + + "svg-parser": "^2.0.2" + + }, + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "type": "github", + + "url": "https://github.com/sponsors/gregberge" + + } + + }, + + "node_modules/@svgr/plugin-svgo": { + + "version": "5.5.0", + + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + + "license": "MIT", + + "dependencies": { + + "cosmiconfig": "^7.0.0", + + "deepmerge": "^4.2.2", + + "svgo": "^1.2.2" + + }, + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "type": "github", + + "url": "https://github.com/sponsors/gregberge" + + } + + }, + + "node_modules/@svgr/webpack": { + + "version": "5.5.0", + + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + + "license": "MIT", + + "dependencies": { + + "@babel/core": "^7.12.3", + + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + + "@babel/preset-env": "^7.12.1", + + "@babel/preset-react": "^7.12.5", + + "@svgr/core": "^5.5.0", + + "@svgr/plugin-jsx": "^5.5.0", + + "@svgr/plugin-svgo": "^5.5.0", + + "loader-utils": "^2.0.0" + + }, + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "type": "github", + + "url": "https://github.com/sponsors/gregberge" + + } + + }, + + "node_modules/@testing-library/dom": { + + "version": "10.4.0", + + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + + "license": "MIT", + + "dependencies": { + + "@babel/code-frame": "^7.10.4", + + "@babel/runtime": "^7.12.5", + + "@types/aria-query": "^5.0.1", + + "aria-query": "5.3.0", + + "chalk": "^4.1.0", + + "dom-accessibility-api": "^0.5.9", + + "lz-string": "^1.5.0", + + "pretty-format": "^27.0.2" + + }, + + "engines": { + + "node": ">=18" + + } + + }, + + "node_modules/@testing-library/dom/node_modules/aria-query": { + + "version": "5.3.0", + + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + + "license": "Apache-2.0", + + "dependencies": { + + "dequal": "^2.0.3" + + } + + }, + + "node_modules/@testing-library/jest-dom": { + + "version": "6.6.3", + + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.6.3.tgz", + + "integrity": "sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==", + + "license": "MIT", + + "dependencies": { + + "@adobe/css-tools": "^4.4.0", + + "aria-query": "^5.0.0", + + "chalk": "^3.0.0", + + "css.escape": "^1.5.1", + + "dom-accessibility-api": "^0.6.3", + + "lodash": "^4.17.21", + + "redent": "^3.0.0" + + }, + + "engines": { + + "node": ">=14", + + "npm": ">=6", + + "yarn": ">=1" + + } + + }, + + "node_modules/@testing-library/jest-dom/node_modules/chalk": { + + "version": "3.0.0", + + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + + "license": "MIT", + + "dependencies": { + + "ansi-styles": "^4.1.0", + + "supports-color": "^7.1.0" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + + "version": "0.6.3", + + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + + "license": "MIT" + + }, + + "node_modules/@testing-library/react": { + + "version": "16.3.0", + + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.0.tgz", + + "integrity": "sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==", + + "license": "MIT", + + "dependencies": { + + "@babel/runtime": "^7.12.5" + + }, + + "engines": { + + "node": ">=18" + + }, + + "peerDependencies": { + + "@testing-library/dom": "^10.0.0", + + "@types/react": "^18.0.0 || ^19.0.0", + + "@types/react-dom": "^18.0.0 || ^19.0.0", + + "react": "^18.0.0 || ^19.0.0", + + "react-dom": "^18.0.0 || ^19.0.0" + + }, + + "peerDependenciesMeta": { + + "@types/react": { + + "optional": true + + }, + + "@types/react-dom": { + + "optional": true + + } + + } + + }, + + "node_modules/@testing-library/user-event": { + + "version": "13.5.0", + + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", + + "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", + + "license": "MIT", + + "dependencies": { + + "@babel/runtime": "^7.12.5" + + }, + + "engines": { + + "node": ">=10", + + "npm": ">=6" + + }, + + "peerDependencies": { + + "@testing-library/dom": ">=7.21.4" + + } + + }, + + "node_modules/@tootallnate/once": { + + "version": "1.1.2", + + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + + "license": "MIT", + + "engines": { + + "node": ">= 6" + + } + + }, + + "node_modules/@trysound/sax": { + + "version": "0.2.0", + + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + + "license": "ISC", + + "engines": { + + "node": ">=10.13.0" + + } + + }, + + "node_modules/@types/aria-query": { + + "version": "5.0.4", + + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + + "license": "MIT" + + }, + + "node_modules/@types/babel__core": { + + "version": "7.20.5", + + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + + "license": "MIT", + + "dependencies": { + + "@babel/parser": "^7.20.7", + + "@babel/types": "^7.20.7", + + "@types/babel__generator": "*", + + "@types/babel__template": "*", + + "@types/babel__traverse": "*" + + } + + }, + + "node_modules/@types/babel__generator": { + + "version": "7.27.0", + + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + + "license": "MIT", + + "dependencies": { + + "@babel/types": "^7.0.0" + + } + + }, + + "node_modules/@types/babel__template": { + + "version": "7.4.4", + + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + + "license": "MIT", + + "dependencies": { + + "@babel/parser": "^7.1.0", + + "@babel/types": "^7.0.0" + + } + + }, + + "node_modules/@types/babel__traverse": { + + "version": "7.20.7", + + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + + "license": "MIT", + + "dependencies": { + + "@babel/types": "^7.20.7" + + } + + }, + + "node_modules/@types/body-parser": { + + "version": "1.19.5", + + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + + "license": "MIT", + + "dependencies": { + + "@types/connect": "*", + + "@types/node": "*" + + } + + }, + + "node_modules/@types/bonjour": { + + "version": "3.5.13", + + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + + "license": "MIT", + + "dependencies": { + + "@types/node": "*" + + } + + }, + + "node_modules/@types/connect": { + + "version": "3.4.38", + + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + + "license": "MIT", + + "dependencies": { + + "@types/node": "*" + + } + + }, + + "node_modules/@types/connect-history-api-fallback": { + + "version": "1.5.4", + + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + + "license": "MIT", + + "dependencies": { + + "@types/express-serve-static-core": "*", + + "@types/node": "*" + + } + + }, + + "node_modules/@types/d3-array": { + + "version": "3.2.1", + + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + + "license": "MIT" + + }, + + "node_modules/@types/d3-color": { + + "version": "3.1.3", + + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + + "license": "MIT" + + }, + + "node_modules/@types/d3-ease": { + + "version": "3.0.2", + + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + + "license": "MIT" + + }, + + "node_modules/@types/d3-interpolate": { + + "version": "3.0.4", + + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + + "license": "MIT", + + "dependencies": { + + "@types/d3-color": "*" + + } + + }, + + "node_modules/@types/d3-path": { + + "version": "3.1.1", + + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + + "license": "MIT" + + }, + + "node_modules/@types/d3-scale": { + + "version": "4.0.9", + + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + + "license": "MIT", + + "dependencies": { + + "@types/d3-time": "*" + + } + + }, + + "node_modules/@types/d3-shape": { + + "version": "3.1.7", + + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + + "license": "MIT", + + "dependencies": { + + "@types/d3-path": "*" + + } + + }, + + "node_modules/@types/d3-time": { + + "version": "3.0.4", + + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + + "license": "MIT" + + }, + + "node_modules/@types/d3-timer": { + + "version": "3.0.2", + + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + + "license": "MIT" + + }, + + "node_modules/@types/eslint": { + + "version": "8.56.12", + + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz", + + "integrity": "sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==", + + "license": "MIT", + + "dependencies": { + + "@types/estree": "*", + + "@types/json-schema": "*" + + } + + }, + + "node_modules/@types/eslint-scope": { + + "version": "3.7.7", + + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + + "license": "MIT", + + "dependencies": { + + "@types/eslint": "*", + + "@types/estree": "*" + + } + + }, + + "node_modules/@types/estree": { + + "version": "1.0.7", + + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + + "license": "MIT" + + }, + + "node_modules/@types/express": { + + "version": "4.17.21", + + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + + "license": "MIT", + + "dependencies": { + + "@types/body-parser": "*", + + "@types/express-serve-static-core": "^4.17.33", + + "@types/qs": "*", + + "@types/serve-static": "*" + + } + + }, + + "node_modules/@types/express-serve-static-core": { + + "version": "5.0.6", + + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + + "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", + + "license": "MIT", + + "dependencies": { + + "@types/node": "*", + + "@types/qs": "*", + + "@types/range-parser": "*", + + "@types/send": "*" + + } + + }, + + "node_modules/@types/express/node_modules/@types/express-serve-static-core": { + + "version": "4.19.6", + + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + + "license": "MIT", + + "dependencies": { + + "@types/node": "*", + + "@types/qs": "*", + + "@types/range-parser": "*", + + "@types/send": "*" + + } + + }, + + "node_modules/@types/graceful-fs": { + + "version": "4.1.9", + + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + + "license": "MIT", + + "dependencies": { + + "@types/node": "*" + + } + + }, + + "node_modules/@types/html-minifier-terser": { + + "version": "6.1.0", + + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + + "license": "MIT" + + }, + + "node_modules/@types/http-errors": { + + "version": "2.0.4", + + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + + "license": "MIT" + + }, + + "node_modules/@types/http-proxy": { + + "version": "1.17.16", + + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", + + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", + + "license": "MIT", + + "dependencies": { + + "@types/node": "*" + + } + + }, + + "node_modules/@types/istanbul-lib-coverage": { + + "version": "2.0.6", + + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + + "license": "MIT" + + }, + + "node_modules/@types/istanbul-lib-report": { + + "version": "3.0.3", + + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + + "license": "MIT", + + "dependencies": { + + "@types/istanbul-lib-coverage": "*" + + } + + }, + + "node_modules/@types/istanbul-reports": { + + "version": "3.0.4", + + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + + "license": "MIT", + + "dependencies": { + + "@types/istanbul-lib-report": "*" + + } + + }, + + "node_modules/@types/json-schema": { + + "version": "7.0.15", + + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + + "license": "MIT" + + }, + + "node_modules/@types/json5": { + + "version": "0.0.29", + + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + + "license": "MIT" + + }, + + "node_modules/@types/mime": { + + "version": "1.3.5", + + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + + "license": "MIT" + + }, + + "node_modules/@types/node": { + + "version": "22.15.3", + + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.3.tgz", + + "integrity": "sha512-lX7HFZeHf4QG/J7tBZqrCAXwz9J5RD56Y6MpP0eJkka8p+K0RY/yBTW7CYFJ4VGCclxqOLKmiGP5juQc6MKgcw==", + + "license": "MIT", + + "dependencies": { + + "undici-types": "~6.21.0" + + } + + }, + + "node_modules/@types/node-forge": { + + "version": "1.3.11", + + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + + "license": "MIT", + + "dependencies": { + + "@types/node": "*" + + } + + }, + + "node_modules/@types/parse-json": { + + "version": "4.0.2", + + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + + "license": "MIT" + + }, + + "node_modules/@types/prettier": { + + "version": "2.7.3", + + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + + "license": "MIT" + + }, + + "node_modules/@types/prop-types": { + + "version": "15.7.14", + + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", + + "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + + "license": "MIT" + + }, + + "node_modules/@types/q": { + + "version": "1.5.8", + + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz", + + "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==", + + "license": "MIT" + + }, + + "node_modules/@types/qs": { + + "version": "6.9.18", + + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", + + "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", + + "license": "MIT" + + }, + + "node_modules/@types/raf": { + + "version": "3.4.3", + + "resolved": "https://registry.npmjs.org/@types/raf/-/raf-3.4.3.tgz", + + "integrity": "sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==", + + "license": "MIT", + + "optional": true + + }, + + "node_modules/@types/range-parser": { + + "version": "1.2.7", + + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + + "license": "MIT" + + }, + + "node_modules/@types/react": { + + "version": "19.1.4", + + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.4.tgz", + + "integrity": "sha512-EB1yiiYdvySuIITtD5lhW4yPyJ31RkJkkDw794LaQYrxCSaQV/47y5o1FMC4zF9ZyjUjzJMZwbovEnT5yHTW6g==", + + "license": "MIT", + + "peer": true, + + "dependencies": { + + "csstype": "^3.0.2" + + } + + }, + + "node_modules/@types/react-transition-group": { + + "version": "4.4.12", + + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + + "license": "MIT", + + "peerDependencies": { + + "@types/react": "*" + + } + + }, + + "node_modules/@types/resolve": { + + "version": "1.17.1", + + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + + "license": "MIT", + + "dependencies": { + + "@types/node": "*" + + } + + }, + + "node_modules/@types/retry": { + + "version": "0.12.0", + + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + + "license": "MIT" + + }, + + "node_modules/@types/semver": { + + "version": "7.7.0", + + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz", + + "integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==", + + "license": "MIT" + + }, + + "node_modules/@types/send": { + + "version": "0.17.4", + + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + + "license": "MIT", + + "dependencies": { + + "@types/mime": "^1", + + "@types/node": "*" + + } + + }, + + "node_modules/@types/serve-index": { + + "version": "1.9.4", + + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + + "license": "MIT", + + "dependencies": { + + "@types/express": "*" + + } + + }, + + "node_modules/@types/serve-static": { + + "version": "1.15.7", + + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + + "license": "MIT", + + "dependencies": { + + "@types/http-errors": "*", + + "@types/node": "*", + + "@types/send": "*" + + } + + }, + + "node_modules/@types/sockjs": { + + "version": "0.3.36", + + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + + "license": "MIT", + + "dependencies": { + + "@types/node": "*" + + } + + }, + + "node_modules/@types/stack-utils": { + + "version": "2.0.3", + + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + + "license": "MIT" + + }, + + "node_modules/@types/trusted-types": { + + "version": "2.0.7", + + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + + "license": "MIT" + + }, + + "node_modules/@types/ws": { + + "version": "8.18.1", + + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + + "license": "MIT", + + "dependencies": { + + "@types/node": "*" + + } + + }, + + "node_modules/@types/yargs": { + + "version": "16.0.9", + + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + + "license": "MIT", + + "dependencies": { + + "@types/yargs-parser": "*" + + } + + }, + + "node_modules/@types/yargs-parser": { + + "version": "21.0.3", + + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + + "license": "MIT" + + }, + + "node_modules/@typescript-eslint/eslint-plugin": { + + "version": "5.62.0", + + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + + "license": "MIT", + + "dependencies": { + + "@eslint-community/regexpp": "^4.4.0", + + "@typescript-eslint/scope-manager": "5.62.0", + + "@typescript-eslint/type-utils": "5.62.0", + + "@typescript-eslint/utils": "5.62.0", + + "debug": "^4.3.4", + + "graphemer": "^1.4.0", + + "ignore": "^5.2.0", + + "natural-compare-lite": "^1.4.0", + + "semver": "^7.3.7", + + "tsutils": "^3.21.0" + + }, + + "engines": { + + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/typescript-eslint" + + }, + + "peerDependencies": { + + "@typescript-eslint/parser": "^5.0.0", + + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + + }, + + "peerDependenciesMeta": { + + "typescript": { + + "optional": true + + } + + } + + }, + + "node_modules/@typescript-eslint/experimental-utils": { + + "version": "5.62.0", + + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", + + "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", + + "license": "MIT", + + "dependencies": { + + "@typescript-eslint/utils": "5.62.0" + + }, + + "engines": { + + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/typescript-eslint" + + }, + + "peerDependencies": { + + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + + } + + }, + + "node_modules/@typescript-eslint/parser": { + + "version": "5.62.0", + + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + + "license": "BSD-2-Clause", + + "dependencies": { + + "@typescript-eslint/scope-manager": "5.62.0", + + "@typescript-eslint/types": "5.62.0", + + "@typescript-eslint/typescript-estree": "5.62.0", + + "debug": "^4.3.4" + + }, + + "engines": { + + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/typescript-eslint" + + }, + + "peerDependencies": { + + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + + }, + + "peerDependenciesMeta": { + + "typescript": { + + "optional": true + + } + + } + + }, + + "node_modules/@typescript-eslint/scope-manager": { + + "version": "5.62.0", + + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + + "license": "MIT", + + "dependencies": { + + "@typescript-eslint/types": "5.62.0", + + "@typescript-eslint/visitor-keys": "5.62.0" + + }, + + "engines": { + + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/typescript-eslint" + + } + + }, + + "node_modules/@typescript-eslint/type-utils": { + + "version": "5.62.0", + + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + + "license": "MIT", + + "dependencies": { + + "@typescript-eslint/typescript-estree": "5.62.0", + + "@typescript-eslint/utils": "5.62.0", + + "debug": "^4.3.4", + + "tsutils": "^3.21.0" + + }, + + "engines": { + + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/typescript-eslint" + + }, + + "peerDependencies": { + + "eslint": "*" + + }, + + "peerDependenciesMeta": { + + "typescript": { + + "optional": true + + } + + } + + }, + + "node_modules/@typescript-eslint/types": { + + "version": "5.62.0", + + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + + "license": "MIT", + + "engines": { + + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/typescript-eslint" + + } + + }, + + "node_modules/@typescript-eslint/typescript-estree": { + + "version": "5.62.0", + + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + + "license": "BSD-2-Clause", + + "dependencies": { + + "@typescript-eslint/types": "5.62.0", + + "@typescript-eslint/visitor-keys": "5.62.0", + + "debug": "^4.3.4", + + "globby": "^11.1.0", + + "is-glob": "^4.0.3", + + "semver": "^7.3.7", + + "tsutils": "^3.21.0" + + }, + + "engines": { + + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/typescript-eslint" + + }, + + "peerDependenciesMeta": { + + "typescript": { + + "optional": true + + } + + } + + }, + + "node_modules/@typescript-eslint/utils": { + + "version": "5.62.0", + + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + + "license": "MIT", + + "dependencies": { + + "@eslint-community/eslint-utils": "^4.2.0", + + "@types/json-schema": "^7.0.9", + + "@types/semver": "^7.3.12", + + "@typescript-eslint/scope-manager": "5.62.0", + + "@typescript-eslint/types": "5.62.0", + + "@typescript-eslint/typescript-estree": "5.62.0", + + "eslint-scope": "^5.1.1", + + "semver": "^7.3.7" + + }, + + "engines": { + + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/typescript-eslint" + + }, + + "peerDependencies": { + + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + + } + + }, + + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + + "version": "5.1.1", + + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + + "license": "BSD-2-Clause", + + "dependencies": { + + "esrecurse": "^4.3.0", + + "estraverse": "^4.1.1" + + }, + + "engines": { + + "node": ">=8.0.0" + + } + + }, + + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + + "version": "4.3.0", + + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + + "license": "BSD-2-Clause", + + "engines": { + + "node": ">=4.0" + + } + + }, + + "node_modules/@typescript-eslint/visitor-keys": { + + "version": "5.62.0", + + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + + "license": "MIT", + + "dependencies": { + + "@typescript-eslint/types": "5.62.0", + + "eslint-visitor-keys": "^3.3.0" + + }, + + "engines": { + + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/typescript-eslint" + + } + + }, + + "node_modules/@ungap/structured-clone": { + + "version": "1.3.0", + + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + + "license": "ISC" + + }, + + "node_modules/@webassemblyjs/ast": { + + "version": "1.14.1", + + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + + "license": "MIT", + + "dependencies": { + + "@webassemblyjs/helper-numbers": "1.13.2", + + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + + } + + }, + + "node_modules/@webassemblyjs/floating-point-hex-parser": { + + "version": "1.13.2", + + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + + "license": "MIT" + + }, + + "node_modules/@webassemblyjs/helper-api-error": { + + "version": "1.13.2", + + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + + "license": "MIT" + + }, + + "node_modules/@webassemblyjs/helper-buffer": { + + "version": "1.14.1", + + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + + "license": "MIT" + + }, + + "node_modules/@webassemblyjs/helper-numbers": { + + "version": "1.13.2", + + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + + "license": "MIT", + + "dependencies": { + + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + + "@webassemblyjs/helper-api-error": "1.13.2", + + "@xtuc/long": "4.2.2" + + } + + }, + + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + + "version": "1.13.2", + + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + + "license": "MIT" + + }, + + "node_modules/@webassemblyjs/helper-wasm-section": { + + "version": "1.14.1", + + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + + "license": "MIT", + + "dependencies": { + + "@webassemblyjs/ast": "1.14.1", + + "@webassemblyjs/helper-buffer": "1.14.1", + + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + + "@webassemblyjs/wasm-gen": "1.14.1" + + } + + }, + + "node_modules/@webassemblyjs/ieee754": { + + "version": "1.13.2", + + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + + "license": "MIT", + + "dependencies": { + + "@xtuc/ieee754": "^1.2.0" + + } + + }, + + "node_modules/@webassemblyjs/leb128": { + + "version": "1.13.2", + + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + + "license": "Apache-2.0", + + "dependencies": { + + "@xtuc/long": "4.2.2" + + } + + }, + + "node_modules/@webassemblyjs/utf8": { + + "version": "1.13.2", + + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + + "license": "MIT" + + }, + + "node_modules/@webassemblyjs/wasm-edit": { + + "version": "1.14.1", + + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + + "license": "MIT", + + "dependencies": { + + "@webassemblyjs/ast": "1.14.1", + + "@webassemblyjs/helper-buffer": "1.14.1", + + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + + "@webassemblyjs/helper-wasm-section": "1.14.1", + + "@webassemblyjs/wasm-gen": "1.14.1", + + "@webassemblyjs/wasm-opt": "1.14.1", + + "@webassemblyjs/wasm-parser": "1.14.1", + + "@webassemblyjs/wast-printer": "1.14.1" + + } + + }, + + "node_modules/@webassemblyjs/wasm-gen": { + + "version": "1.14.1", + + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + + "license": "MIT", + + "dependencies": { + + "@webassemblyjs/ast": "1.14.1", + + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + + "@webassemblyjs/ieee754": "1.13.2", + + "@webassemblyjs/leb128": "1.13.2", + + "@webassemblyjs/utf8": "1.13.2" + + } + + }, + + "node_modules/@webassemblyjs/wasm-opt": { + + "version": "1.14.1", + + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + + "license": "MIT", + + "dependencies": { + + "@webassemblyjs/ast": "1.14.1", + + "@webassemblyjs/helper-buffer": "1.14.1", + + "@webassemblyjs/wasm-gen": "1.14.1", + + "@webassemblyjs/wasm-parser": "1.14.1" + + } + + }, + + "node_modules/@webassemblyjs/wasm-parser": { + + "version": "1.14.1", + + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + + "license": "MIT", + + "dependencies": { + + "@webassemblyjs/ast": "1.14.1", + + "@webassemblyjs/helper-api-error": "1.13.2", + + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + + "@webassemblyjs/ieee754": "1.13.2", + + "@webassemblyjs/leb128": "1.13.2", + + "@webassemblyjs/utf8": "1.13.2" + + } + + }, + + "node_modules/@webassemblyjs/wast-printer": { + + "version": "1.14.1", + + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + + "license": "MIT", + + "dependencies": { + + "@webassemblyjs/ast": "1.14.1", + + "@xtuc/long": "4.2.2" + + } + + }, + + "node_modules/@xtuc/ieee754": { + + "version": "1.2.0", + + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + + "license": "BSD-3-Clause" + + }, + + "node_modules/@xtuc/long": { + + "version": "4.2.2", + + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + + "license": "Apache-2.0" + + }, + + "node_modules/abab": { + + "version": "2.0.6", + + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + + "deprecated": "Use your platform's native atob() and btoa() methods instead", + + "license": "BSD-3-Clause" + + }, + + "node_modules/accepts": { + + "version": "1.3.8", + + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + + "license": "MIT", + + "dependencies": { + + "mime-types": "~2.1.34", + + "negotiator": "0.6.3" + + }, + + "engines": { + + "node": ">= 0.6" + + } + + }, + + "node_modules/accepts/node_modules/negotiator": { + + "version": "0.6.3", + + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.6" + + } + + }, + + "node_modules/acorn": { + + "version": "8.14.1", + + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + + "license": "MIT", + + "bin": { + + "acorn": "bin/acorn" + + }, + + "engines": { + + "node": ">=0.4.0" + + } + + }, + + "node_modules/acorn-globals": { + + "version": "6.0.0", + + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + + "license": "MIT", + + "dependencies": { + + "acorn": "^7.1.1", + + "acorn-walk": "^7.1.1" + + } + + }, + + "node_modules/acorn-globals/node_modules/acorn": { + + "version": "7.4.1", + + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + + "license": "MIT", + + "bin": { + + "acorn": "bin/acorn" + + }, + + "engines": { + + "node": ">=0.4.0" + + } + + }, + + "node_modules/acorn-jsx": { + + "version": "5.3.2", + + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + + "license": "MIT", + + "peerDependencies": { + + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + + } + + }, + + "node_modules/acorn-walk": { + + "version": "7.2.0", + + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + + "license": "MIT", + + "engines": { + + "node": ">=0.4.0" + + } + + }, + + "node_modules/address": { + + "version": "1.2.2", + + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + + "license": "MIT", + + "engines": { + + "node": ">= 10.0.0" + + } + + }, + + "node_modules/adjust-sourcemap-loader": { + + "version": "4.0.0", + + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + + "license": "MIT", + + "dependencies": { + + "loader-utils": "^2.0.0", + + "regex-parser": "^2.2.11" + + }, + + "engines": { + + "node": ">=8.9" + + } + + }, + + "node_modules/adler-32": { + + "version": "1.3.1", + + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz", + + "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", + + "license": "Apache-2.0", + + "engines": { + + "node": ">=0.8" + + } + + }, + + "node_modules/agent-base": { + + "version": "6.0.2", + + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + + "license": "MIT", + + "dependencies": { + + "debug": "4" + + }, + + "engines": { + + "node": ">= 6.0.0" + + } + + }, + + "node_modules/ajv": { + + "version": "6.12.6", + + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + + "license": "MIT", + + "dependencies": { + + "fast-deep-equal": "^3.1.1", + + "fast-json-stable-stringify": "^2.0.0", + + "json-schema-traverse": "^0.4.1", + + "uri-js": "^4.2.2" + + }, + + "funding": { + + "type": "github", + + "url": "https://github.com/sponsors/epoberezkin" + + } + + }, + + "node_modules/ajv-formats": { + + "version": "2.1.1", + + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + + "license": "MIT", + + "dependencies": { + + "ajv": "^8.0.0" + + }, + + "peerDependencies": { + + "ajv": "^8.0.0" + + }, + + "peerDependenciesMeta": { + + "ajv": { + + "optional": true + + } + + } + + }, + + "node_modules/ajv-formats/node_modules/ajv": { + + "version": "8.17.1", + + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + + "license": "MIT", + + "dependencies": { + + "fast-deep-equal": "^3.1.3", + + "fast-uri": "^3.0.1", + + "json-schema-traverse": "^1.0.0", + + "require-from-string": "^2.0.2" + + }, + + "funding": { + + "type": "github", + + "url": "https://github.com/sponsors/epoberezkin" + + } + + }, + + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + + "version": "1.0.0", + + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + + "license": "MIT" + + }, + + "node_modules/ajv-keywords": { + + "version": "3.5.2", + + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + + "license": "MIT", + + "peerDependencies": { + + "ajv": "^6.9.1" + + } + + }, + + "node_modules/ansi-escapes": { + + "version": "4.3.2", + + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + + "license": "MIT", + + "dependencies": { + + "type-fest": "^0.21.3" + + }, + + "engines": { + + "node": ">=8" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/ansi-html": { + + "version": "0.0.9", + + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz", + + "integrity": "sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==", + + "engines": [ + + "node >= 0.8.0" + + ], + + "license": "Apache-2.0", + + "bin": { + + "ansi-html": "bin/ansi-html" + + } + + }, + + "node_modules/ansi-html-community": { + + "version": "0.0.8", + + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + + "engines": [ + + "node >= 0.8.0" + + ], + + "license": "Apache-2.0", + + "bin": { + + "ansi-html": "bin/ansi-html" + + } + + }, + + "node_modules/ansi-regex": { + + "version": "5.0.1", + + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + + "license": "MIT", + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/ansi-styles": { + + "version": "4.3.0", + + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + + "license": "MIT", + + "dependencies": { + + "color-convert": "^2.0.1" + + }, + + "engines": { + + "node": ">=8" + + }, + + "funding": { + + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + + } + + }, + + "node_modules/any-promise": { + + "version": "1.3.0", + + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + + "license": "MIT" + + }, + + "node_modules/anymatch": { + + "version": "3.1.3", + + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + + "license": "ISC", + + "dependencies": { + + "normalize-path": "^3.0.0", + + "picomatch": "^2.0.4" + + }, + + "engines": { + + "node": ">= 8" + + } + + }, + + "node_modules/arg": { + + "version": "5.0.2", + + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + + "license": "MIT" + + }, + + "node_modules/argparse": { + + "version": "1.0.10", + + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + + "license": "MIT", + + "dependencies": { + + "sprintf-js": "~1.0.2" + + } + + }, + + "node_modules/aria-query": { + + "version": "5.3.2", + + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + + "license": "Apache-2.0", + + "engines": { + + "node": ">= 0.4" + + } + + }, + + "node_modules/array-buffer-byte-length": { + + "version": "1.0.2", + + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + + "license": "MIT", + + "dependencies": { + + "call-bound": "^1.0.3", + + "is-array-buffer": "^3.0.5" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/array-flatten": { + + "version": "1.1.1", + + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + + "license": "MIT" + + }, + + "node_modules/array-includes": { + + "version": "3.1.8", + + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + + "license": "MIT", + + "dependencies": { + + "call-bind": "^1.0.7", + + "define-properties": "^1.2.1", + + "es-abstract": "^1.23.2", + + "es-object-atoms": "^1.0.0", + + "get-intrinsic": "^1.2.4", + + "is-string": "^1.0.7" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/array-union": { + + "version": "2.1.0", + + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + + "license": "MIT", + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/array.prototype.findlast": { + + "version": "1.2.5", + + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + + "license": "MIT", + + "dependencies": { + + "call-bind": "^1.0.7", + + "define-properties": "^1.2.1", + + "es-abstract": "^1.23.2", + + "es-errors": "^1.3.0", + + "es-object-atoms": "^1.0.0", + + "es-shim-unscopables": "^1.0.2" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/array.prototype.findlastindex": { + + "version": "1.2.6", + + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + + "license": "MIT", + + "dependencies": { + + "call-bind": "^1.0.8", + + "call-bound": "^1.0.4", + + "define-properties": "^1.2.1", + + "es-abstract": "^1.23.9", + + "es-errors": "^1.3.0", + + "es-object-atoms": "^1.1.1", + + "es-shim-unscopables": "^1.1.0" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/array.prototype.flat": { + + "version": "1.3.3", + + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + + "license": "MIT", + + "dependencies": { + + "call-bind": "^1.0.8", + + "define-properties": "^1.2.1", + + "es-abstract": "^1.23.5", + + "es-shim-unscopables": "^1.0.2" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/array.prototype.flatmap": { + + "version": "1.3.3", + + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + + "license": "MIT", + + "dependencies": { + + "call-bind": "^1.0.8", + + "define-properties": "^1.2.1", + + "es-abstract": "^1.23.5", + + "es-shim-unscopables": "^1.0.2" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/array.prototype.reduce": { + + "version": "1.0.8", + + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.8.tgz", + + "integrity": "sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw==", + + "license": "MIT", + + "dependencies": { + + "call-bind": "^1.0.8", + + "call-bound": "^1.0.4", + + "define-properties": "^1.2.1", + + "es-abstract": "^1.23.9", + + "es-array-method-boxes-properly": "^1.0.0", + + "es-errors": "^1.3.0", + + "es-object-atoms": "^1.1.1", + + "is-string": "^1.1.1" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/array.prototype.tosorted": { + + "version": "1.1.4", + + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + + "license": "MIT", + + "dependencies": { + + "call-bind": "^1.0.7", + + "define-properties": "^1.2.1", + + "es-abstract": "^1.23.3", + + "es-errors": "^1.3.0", + + "es-shim-unscopables": "^1.0.2" + + }, + + "engines": { + + "node": ">= 0.4" + + } + + }, + + "node_modules/arraybuffer.prototype.slice": { + + "version": "1.0.4", + + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + + "license": "MIT", + + "dependencies": { + + "array-buffer-byte-length": "^1.0.1", + + "call-bind": "^1.0.8", + + "define-properties": "^1.2.1", + + "es-abstract": "^1.23.5", + + "es-errors": "^1.3.0", + + "get-intrinsic": "^1.2.6", + + "is-array-buffer": "^3.0.4" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/asap": { + + "version": "2.0.6", + + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + + "license": "MIT" + + }, + + "node_modules/ast-types-flow": { + + "version": "0.0.8", + + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + + "license": "MIT" + + }, + + "node_modules/async": { + + "version": "3.2.6", + + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + + "license": "MIT" + + }, + + "node_modules/async-function": { + + "version": "1.0.0", + + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.4" + + } + + }, + + "node_modules/asynckit": { + + "version": "0.4.0", + + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + + "license": "MIT" + + }, + + "node_modules/at-least-node": { + + "version": "1.0.0", + + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + + "license": "ISC", + + "engines": { + + "node": ">= 4.0.0" + + } + + }, + + "node_modules/atob": { + + "version": "2.1.2", + + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + + "license": "(MIT OR Apache-2.0)", + + "bin": { + + "atob": "bin/atob.js" + + }, + + "engines": { + + "node": ">= 4.5.0" + + } + + }, + + "node_modules/autoprefixer": { + + "version": "10.4.21", + + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + + "funding": [ + + { + + "type": "opencollective", + + "url": "https://opencollective.com/postcss/" + + }, + + { + + "type": "tidelift", + + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + + }, + + { + + "type": "github", + + "url": "https://github.com/sponsors/ai" + + } + + ], + + "license": "MIT", + + "dependencies": { + + "browserslist": "^4.24.4", + + "caniuse-lite": "^1.0.30001702", + + "fraction.js": "^4.3.7", + + "normalize-range": "^0.1.2", + + "picocolors": "^1.1.1", + + "postcss-value-parser": "^4.2.0" + + }, + + "bin": { + + "autoprefixer": "bin/autoprefixer" + + }, + + "engines": { + + "node": "^10 || ^12 || >=14" + + }, + + "peerDependencies": { + + "postcss": "^8.1.0" + + } + + }, + + "node_modules/available-typed-arrays": { + + "version": "1.0.7", + + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + + "license": "MIT", + + "dependencies": { + + "possible-typed-array-names": "^1.0.0" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/axe-core": { + + "version": "4.10.3", + + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz", + + "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==", + + "license": "MPL-2.0", + + "engines": { + + "node": ">=4" + + } + + }, + + "node_modules/axios": { + + "version": "1.9.0", + + "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", + + "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + + "license": "MIT", + + "dependencies": { + + "follow-redirects": "^1.15.6", + + "form-data": "^4.0.0", + + "proxy-from-env": "^1.1.0" + + } + + }, + + "node_modules/axios/node_modules/form-data": { + + "version": "4.0.2", + + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + + "license": "MIT", + + "dependencies": { + + "asynckit": "^0.4.0", + + "combined-stream": "^1.0.8", + + "es-set-tostringtag": "^2.1.0", + + "mime-types": "^2.1.12" + + }, + + "engines": { + + "node": ">= 6" + + } + + }, + + "node_modules/axobject-query": { + + "version": "4.1.0", + + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + + "license": "Apache-2.0", + + "engines": { + + "node": ">= 0.4" + + } + + }, + + "node_modules/babel-jest": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + + "license": "MIT", + + "dependencies": { + + "@jest/transform": "^27.5.1", + + "@jest/types": "^27.5.1", + + "@types/babel__core": "^7.1.14", + + "babel-plugin-istanbul": "^6.1.1", + + "babel-preset-jest": "^27.5.1", + + "chalk": "^4.0.0", + + "graceful-fs": "^4.2.9", + + "slash": "^3.0.0" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.8.0" + + } + + }, + + "node_modules/babel-loader": { + + "version": "8.4.1", + + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.4.1.tgz", + + "integrity": "sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==", + + "license": "MIT", + + "dependencies": { + + "find-cache-dir": "^3.3.1", + + "loader-utils": "^2.0.4", + + "make-dir": "^3.1.0", + + "schema-utils": "^2.6.5" + + }, + + "engines": { + + "node": ">= 8.9" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0", + + "webpack": ">=2" + + } + + }, + + "node_modules/babel-loader/node_modules/schema-utils": { + + "version": "2.7.1", + + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + + "license": "MIT", + + "dependencies": { + + "@types/json-schema": "^7.0.5", + + "ajv": "^6.12.4", + + "ajv-keywords": "^3.5.2" + + }, + + "engines": { + + "node": ">= 8.9.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/webpack" + + } + + }, + + "node_modules/babel-plugin-istanbul": { + + "version": "6.1.1", + + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + + "license": "BSD-3-Clause", + + "dependencies": { + + "@babel/helper-plugin-utils": "^7.0.0", + + "@istanbuljs/load-nyc-config": "^1.0.0", + + "@istanbuljs/schema": "^0.1.2", + + "istanbul-lib-instrument": "^5.0.4", + + "test-exclude": "^6.0.0" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/babel-plugin-jest-hoist": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + + "license": "MIT", + + "dependencies": { + + "@babel/template": "^7.3.3", + + "@babel/types": "^7.3.3", + + "@types/babel__core": "^7.0.0", + + "@types/babel__traverse": "^7.0.6" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/babel-plugin-macros": { + + "version": "3.1.0", + + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + + "license": "MIT", + + "dependencies": { + + "@babel/runtime": "^7.12.5", + + "cosmiconfig": "^7.0.0", + + "resolve": "^1.19.0" + + }, + + "engines": { + + "node": ">=10", + + "npm": ">=6" + + } + + }, + + "node_modules/babel-plugin-named-asset-import": { + + "version": "0.3.8", + + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", + + "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", + + "license": "MIT", + + "peerDependencies": { + + "@babel/core": "^7.1.0" + + } + + }, + + "node_modules/babel-plugin-polyfill-corejs2": { + + "version": "0.4.13", + + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz", + + "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==", + + "license": "MIT", + + "dependencies": { + + "@babel/compat-data": "^7.22.6", + + "@babel/helper-define-polyfill-provider": "^0.6.4", + + "semver": "^6.3.1" + + }, + + "peerDependencies": { + + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + + } + + }, + + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + + "version": "6.3.1", + + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + + "license": "ISC", + + "bin": { + + "semver": "bin/semver.js" + + } + + }, + + "node_modules/babel-plugin-polyfill-corejs3": { + + "version": "0.11.1", + + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-define-polyfill-provider": "^0.6.3", + + "core-js-compat": "^3.40.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + + } + + }, + + "node_modules/babel-plugin-polyfill-regenerator": { + + "version": "0.6.4", + + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz", + + "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-define-polyfill-provider": "^0.6.4" + + }, + + "peerDependencies": { + + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + + } + + }, + + "node_modules/babel-plugin-transform-react-remove-prop-types": { + + "version": "0.4.24", + + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==", + + "license": "MIT" + + }, + + "node_modules/babel-preset-current-node-syntax": { + + "version": "1.1.0", + + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", + + "license": "MIT", + + "dependencies": { + + "@babel/plugin-syntax-async-generators": "^7.8.4", + + "@babel/plugin-syntax-bigint": "^7.8.3", + + "@babel/plugin-syntax-class-properties": "^7.12.13", + + "@babel/plugin-syntax-class-static-block": "^7.14.5", + + "@babel/plugin-syntax-import-attributes": "^7.24.7", + + "@babel/plugin-syntax-import-meta": "^7.10.4", + + "@babel/plugin-syntax-json-strings": "^7.8.3", + + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + + "@babel/plugin-syntax-top-level-await": "^7.14.5" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0" + + } + + }, + + "node_modules/babel-preset-jest": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + + "license": "MIT", + + "dependencies": { + + "babel-plugin-jest-hoist": "^27.5.1", + + "babel-preset-current-node-syntax": "^1.0.0" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0" + + } + + }, + + "node_modules/babel-preset-react-app": { + + "version": "10.1.0", + + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.1.0.tgz", + + "integrity": "sha512-f9B1xMdnkCIqe+2dHrJsoQFRz7reChaAHE/65SdaykPklQqhme2WaC08oD3is77x9ff98/9EazAKFDZv5rFEQg==", + + "license": "MIT", + + "dependencies": { + + "@babel/core": "^7.16.0", + + "@babel/plugin-proposal-class-properties": "^7.16.0", + + "@babel/plugin-proposal-decorators": "^7.16.4", + + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + + "@babel/plugin-proposal-private-methods": "^7.16.0", + + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + + "@babel/plugin-transform-flow-strip-types": "^7.16.0", + + "@babel/plugin-transform-react-display-name": "^7.16.0", + + "@babel/plugin-transform-runtime": "^7.16.4", + + "@babel/preset-env": "^7.16.4", + + "@babel/preset-react": "^7.16.0", + + "@babel/preset-typescript": "^7.16.0", + + "@babel/runtime": "^7.16.3", + + "babel-plugin-macros": "^3.1.0", + + "babel-plugin-transform-react-remove-prop-types": "^0.4.24" + + } + + }, + + "node_modules/babel-preset-react-app/node_modules/@babel/plugin-proposal-private-property-in-object": { + + "version": "7.21.11", + + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", + + "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", + + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.", + + "license": "MIT", + + "dependencies": { + + "@babel/helper-annotate-as-pure": "^7.18.6", + + "@babel/helper-create-class-features-plugin": "^7.21.0", + + "@babel/helper-plugin-utils": "^7.20.2", + + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + + }, + + "engines": { + + "node": ">=6.9.0" + + }, + + "peerDependencies": { + + "@babel/core": "^7.0.0-0" + + } + + }, + + "node_modules/balanced-match": { + + "version": "1.0.2", + + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + + "license": "MIT" + + }, + + "node_modules/base64-arraybuffer": { + + "version": "1.0.2", + + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + + "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", + + "license": "MIT", + + "optional": true, + + "engines": { + + "node": ">= 0.6.0" + + } + + }, + + "node_modules/batch": { + + "version": "0.6.1", + + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + + "license": "MIT" + + }, + + "node_modules/bfj": { + + "version": "7.1.0", + + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", + + "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==", + + "license": "MIT", + + "dependencies": { + + "bluebird": "^3.7.2", + + "check-types": "^11.2.3", + + "hoopy": "^0.1.4", + + "jsonpath": "^1.1.1", + + "tryer": "^1.0.1" + + }, + + "engines": { + + "node": ">= 8.0.0" + + } + + }, + + "node_modules/big.js": { + + "version": "5.2.2", + + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + + "license": "MIT", + + "engines": { + + "node": "*" + + } + + }, + + "node_modules/binary-extensions": { + + "version": "2.3.0", + + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + + "license": "MIT", + + "engines": { + + "node": ">=8" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/bluebird": { + + "version": "3.7.2", + + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + + "license": "MIT" + + }, + + "node_modules/body-parser": { + + "version": "1.20.3", + + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + + "license": "MIT", + + "dependencies": { + + "bytes": "3.1.2", + + "content-type": "~1.0.5", + + "debug": "2.6.9", + + "depd": "2.0.0", + + "destroy": "1.2.0", + + "http-errors": "2.0.0", + + "iconv-lite": "0.4.24", + + "on-finished": "2.4.1", + + "qs": "6.13.0", + + "raw-body": "2.5.2", + + "type-is": "~1.6.18", + + "unpipe": "1.0.0" + + }, + + "engines": { + + "node": ">= 0.8", + + "npm": "1.2.8000 || >= 1.4.16" + + } + + }, + + "node_modules/body-parser/node_modules/debug": { + + "version": "2.6.9", + + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + + "license": "MIT", + + "dependencies": { + + "ms": "2.0.0" + + } + + }, + + "node_modules/body-parser/node_modules/iconv-lite": { + + "version": "0.4.24", + + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + + "license": "MIT", + + "dependencies": { + + "safer-buffer": ">= 2.1.2 < 3" + + }, + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/body-parser/node_modules/ms": { + + "version": "2.0.0", + + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + + "license": "MIT" + + }, + + "node_modules/bonjour-service": { + + "version": "1.3.0", + + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", + + "license": "MIT", + + "dependencies": { + + "fast-deep-equal": "^3.1.3", + + "multicast-dns": "^7.2.5" + + } + + }, + + "node_modules/boolbase": { + + "version": "1.0.0", + + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + + "license": "ISC" + + }, + + "node_modules/brace-expansion": { + + "version": "1.1.11", + + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + + "license": "MIT", + + "dependencies": { + + "balanced-match": "^1.0.0", + + "concat-map": "0.0.1" + + } + + }, + + "node_modules/braces": { + + "version": "3.0.3", + + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + + "license": "MIT", + + "dependencies": { + + "fill-range": "^7.1.1" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/browser-process-hrtime": { + + "version": "1.0.0", + + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + + "license": "BSD-2-Clause" + + }, + + "node_modules/browserslist": { + + "version": "4.24.5", + + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", + + "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", + + "funding": [ + + { + + "type": "opencollective", + + "url": "https://opencollective.com/browserslist" + + }, + + { + + "type": "tidelift", + + "url": "https://tidelift.com/funding/github/npm/browserslist" + + }, + + { + + "type": "github", + + "url": "https://github.com/sponsors/ai" + + } + + ], + + "license": "MIT", + + "dependencies": { + + "caniuse-lite": "^1.0.30001716", + + "electron-to-chromium": "^1.5.149", + + "node-releases": "^2.0.19", + + "update-browserslist-db": "^1.1.3" + + }, + + "bin": { + + "browserslist": "cli.js" + + }, + + "engines": { + + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + + } + + }, + + "node_modules/bser": { + + "version": "2.1.1", + + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + + "license": "Apache-2.0", + + "dependencies": { + + "node-int64": "^0.4.0" + + } + + }, + + "node_modules/btoa": { + + "version": "1.2.1", + + "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", + + "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", + + "license": "(MIT OR Apache-2.0)", + + "bin": { + + "btoa": "bin/btoa.js" + + }, + + "engines": { + + "node": ">= 0.4.0" + + } + + }, + + "node_modules/buffer-from": { + + "version": "1.1.2", + + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + + "license": "MIT" + + }, + + "node_modules/builtin-modules": { + + "version": "3.3.0", + + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + + "license": "MIT", + + "engines": { + + "node": ">=6" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/bytes": { + + "version": "3.1.2", + + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.8" + + } + + }, + + "node_modules/call-bind": { + + "version": "1.0.8", + + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + + "license": "MIT", + + "dependencies": { + + "call-bind-apply-helpers": "^1.0.0", + + "es-define-property": "^1.0.0", + + "get-intrinsic": "^1.2.4", + + "set-function-length": "^1.2.2" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/call-bind-apply-helpers": { + + "version": "1.0.2", + + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + + "license": "MIT", + + "dependencies": { + + "es-errors": "^1.3.0", + + "function-bind": "^1.1.2" + + }, + + "engines": { + + "node": ">= 0.4" + + } + + }, + + "node_modules/call-bound": { + + "version": "1.0.4", + + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + + "license": "MIT", + + "dependencies": { + + "call-bind-apply-helpers": "^1.0.2", + + "get-intrinsic": "^1.3.0" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/callsites": { + + "version": "3.1.0", + + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + + "license": "MIT", + + "engines": { + + "node": ">=6" + + } + + }, + + "node_modules/camel-case": { + + "version": "4.1.2", + + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + + "license": "MIT", + + "dependencies": { + + "pascal-case": "^3.1.2", + + "tslib": "^2.0.3" + + } + + }, + + "node_modules/camelcase": { + + "version": "6.3.0", + + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + + "license": "MIT", + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/camelcase-css": { + + "version": "2.0.1", + + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + + "license": "MIT", + + "engines": { + + "node": ">= 6" + + } + + }, + + "node_modules/caniuse-api": { + + "version": "3.0.0", + + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + + "license": "MIT", + + "dependencies": { + + "browserslist": "^4.0.0", + + "caniuse-lite": "^1.0.0", + + "lodash.memoize": "^4.1.2", + + "lodash.uniq": "^4.5.0" + + } + + }, + + "node_modules/caniuse-lite": { + + "version": "1.0.30001717", + + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001717.tgz", + + "integrity": "sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw==", + + "funding": [ + + { + + "type": "opencollective", + + "url": "https://opencollective.com/browserslist" + + }, + + { + + "type": "tidelift", + + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + + }, + + { + + "type": "github", + + "url": "https://github.com/sponsors/ai" + + } + + ], + + "license": "CC-BY-4.0" + + }, + + "node_modules/canvg": { + + "version": "3.0.11", + + "resolved": "https://registry.npmjs.org/canvg/-/canvg-3.0.11.tgz", + + "integrity": "sha512-5ON+q7jCTgMp9cjpu4Jo6XbvfYwSB2Ow3kzHKfIyJfaCAOHLbdKPQqGKgfED/R5B+3TFFfe8pegYA+b423SRyA==", + + "license": "MIT", + + "optional": true, + + "dependencies": { + + "@babel/runtime": "^7.12.5", + + "@types/raf": "^3.4.0", + + "core-js": "^3.8.3", + + "raf": "^3.4.1", + + "regenerator-runtime": "^0.13.7", + + "rgbcolor": "^1.0.1", + + "stackblur-canvas": "^2.0.0", + + "svg-pathdata": "^6.0.3" + + }, + + "engines": { + + "node": ">=10.0.0" + + } + + }, + + "node_modules/case-sensitive-paths-webpack-plugin": { + + "version": "2.4.0", + + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", + + "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", + + "license": "MIT", + + "engines": { + + "node": ">=4" + + } + + }, + + "node_modules/cfb": { + + "version": "1.2.2", + + "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz", + + "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", + + "license": "Apache-2.0", + + "dependencies": { + + "adler-32": "~1.3.0", + + "crc-32": "~1.2.0" + + }, + + "engines": { + + "node": ">=0.8" + + } + + }, + + "node_modules/chalk": { + + "version": "4.1.2", + + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + + "license": "MIT", + + "dependencies": { + + "ansi-styles": "^4.1.0", + + "supports-color": "^7.1.0" + + }, + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/chalk/chalk?sponsor=1" + + } + + }, + + "node_modules/char-regex": { + + "version": "1.0.2", + + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + + "license": "MIT", + + "engines": { + + "node": ">=10" + + } + + }, + + "node_modules/check-types": { + + "version": "11.2.3", + + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz", + + "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==", + + "license": "MIT" + + }, + + "node_modules/chokidar": { + + "version": "3.6.0", + + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + + "license": "MIT", + + "dependencies": { + + "anymatch": "~3.1.2", + + "braces": "~3.0.2", + + "glob-parent": "~5.1.2", + + "is-binary-path": "~2.1.0", + + "is-glob": "~4.0.1", + + "normalize-path": "~3.0.0", + + "readdirp": "~3.6.0" + + }, + + "engines": { + + "node": ">= 8.10.0" + + }, + + "funding": { + + "url": "https://paulmillr.com/funding/" + + }, + + "optionalDependencies": { + + "fsevents": "~2.3.2" + + } + + }, + + "node_modules/chokidar/node_modules/glob-parent": { + + "version": "5.1.2", + + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + + "license": "ISC", + + "dependencies": { + + "is-glob": "^4.0.1" + + }, + + "engines": { + + "node": ">= 6" + + } + + }, + + "node_modules/chrome-trace-event": { + + "version": "1.0.4", + + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + + "license": "MIT", + + "engines": { + + "node": ">=6.0" + + } + + }, + + "node_modules/ci-info": { + + "version": "3.9.0", + + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + + "funding": [ + + { + + "type": "github", + + "url": "https://github.com/sponsors/sibiraj-s" + + } + + ], + + "license": "MIT", + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/cjs-module-lexer": { + + "version": "1.4.3", + + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + + "license": "MIT" + + }, + + "node_modules/clean-css": { + + "version": "5.3.3", + + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + + "license": "MIT", + + "dependencies": { + + "source-map": "~0.6.0" + + }, + + "engines": { + + "node": ">= 10.0" + + } + + }, + + "node_modules/clean-css/node_modules/source-map": { + + "version": "0.6.1", + + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + + "license": "BSD-3-Clause", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/cliui": { + + "version": "7.0.4", + + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + + "license": "ISC", + + "dependencies": { + + "string-width": "^4.2.0", + + "strip-ansi": "^6.0.0", + + "wrap-ansi": "^7.0.0" + + } + + }, + + "node_modules/clsx": { + + "version": "2.1.1", + + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + + "license": "MIT", + + "engines": { + + "node": ">=6" + + } + + }, + + "node_modules/co": { + + "version": "4.6.0", + + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + + "license": "MIT", + + "engines": { + + "iojs": ">= 1.0.0", + + "node": ">= 0.12.0" + + } + + }, + + "node_modules/coa": { + + "version": "2.0.2", + + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + + "license": "MIT", + + "dependencies": { + + "@types/q": "^1.5.1", + + "chalk": "^2.4.1", + + "q": "^1.1.2" + + }, + + "engines": { + + "node": ">= 4.0" + + } + + }, + + "node_modules/coa/node_modules/ansi-styles": { + + "version": "3.2.1", + + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + + "license": "MIT", + + "dependencies": { + + "color-convert": "^1.9.0" + + }, + + "engines": { + + "node": ">=4" + + } + + }, + + "node_modules/coa/node_modules/chalk": { + + "version": "2.4.2", + + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + + "license": "MIT", + + "dependencies": { + + "ansi-styles": "^3.2.1", + + "escape-string-regexp": "^1.0.5", + + "supports-color": "^5.3.0" + + }, + + "engines": { + + "node": ">=4" + + } + + }, + + "node_modules/coa/node_modules/color-convert": { + + "version": "1.9.3", + + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + + "license": "MIT", + + "dependencies": { + + "color-name": "1.1.3" + + } + + }, + + "node_modules/coa/node_modules/color-name": { + + "version": "1.1.3", + + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + + "license": "MIT" + + }, + + "node_modules/coa/node_modules/escape-string-regexp": { + + "version": "1.0.5", + + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + + "license": "MIT", + + "engines": { + + "node": ">=0.8.0" + + } + + }, + + "node_modules/coa/node_modules/has-flag": { + + "version": "3.0.0", + + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + + "license": "MIT", + + "engines": { + + "node": ">=4" + + } + + }, + + "node_modules/coa/node_modules/supports-color": { + + "version": "5.5.0", + + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + + "license": "MIT", + + "dependencies": { + + "has-flag": "^3.0.0" + + }, + + "engines": { + + "node": ">=4" + + } + + }, + + "node_modules/codepage": { + + "version": "1.15.0", + + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz", + + "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==", + + "license": "Apache-2.0", + + "engines": { + + "node": ">=0.8" + + } + + }, + + "node_modules/collect-v8-coverage": { + + "version": "1.0.2", + + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + + "license": "MIT" + + }, + + "node_modules/color-convert": { + + "version": "2.0.1", + + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + + "license": "MIT", + + "dependencies": { + + "color-name": "~1.1.4" + + }, + + "engines": { + + "node": ">=7.0.0" + + } + + }, + + "node_modules/color-name": { + + "version": "1.1.4", + + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + + "license": "MIT" + + }, + + "node_modules/colord": { + + "version": "2.9.3", + + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + + "license": "MIT" + + }, + + "node_modules/colorette": { + + "version": "2.0.20", + + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + + "license": "MIT" + + }, + + "node_modules/combined-stream": { + + "version": "1.0.8", + + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + + "license": "MIT", + + "dependencies": { + + "delayed-stream": "~1.0.0" + + }, + + "engines": { + + "node": ">= 0.8" + + } + + }, + + "node_modules/commander": { + + "version": "8.3.0", + + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + + "license": "MIT", + + "engines": { + + "node": ">= 12" + + } + + }, + + "node_modules/common-tags": { + + "version": "1.8.2", + + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + + "license": "MIT", + + "engines": { + + "node": ">=4.0.0" + + } + + }, + + "node_modules/commondir": { + + "version": "1.0.1", + + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + + "license": "MIT" + + }, + + "node_modules/compressible": { + + "version": "2.0.18", + + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + + "license": "MIT", + + "dependencies": { + + "mime-db": ">= 1.43.0 < 2" + + }, + + "engines": { + + "node": ">= 0.6" + + } + + }, + + "node_modules/compression": { + + "version": "1.8.0", + + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.0.tgz", + + "integrity": "sha512-k6WLKfunuqCYD3t6AsuPGvQWaKwuLLh2/xHNcX4qE+vIfDNXpSqnrhwA7O53R7WVQUnt8dVAIW+YHr7xTgOgGA==", + + "license": "MIT", + + "dependencies": { + + "bytes": "3.1.2", + + "compressible": "~2.0.18", + + "debug": "2.6.9", + + "negotiator": "~0.6.4", + + "on-headers": "~1.0.2", + + "safe-buffer": "5.2.1", + + "vary": "~1.1.2" + + }, + + "engines": { + + "node": ">= 0.8.0" + + } + + }, + + "node_modules/compression/node_modules/debug": { + + "version": "2.6.9", + + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + + "license": "MIT", + + "dependencies": { + + "ms": "2.0.0" + + } + + }, + + "node_modules/compression/node_modules/ms": { + + "version": "2.0.0", + + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + + "license": "MIT" + + }, + + "node_modules/concat-map": { + + "version": "0.0.1", + + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + + "license": "MIT" + + }, + + "node_modules/confusing-browser-globals": { + + "version": "1.0.11", + + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + + "license": "MIT" + + }, + + "node_modules/connect-history-api-fallback": { + + "version": "2.0.0", + + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + + "license": "MIT", + + "engines": { + + "node": ">=0.8" + + } + + }, + + "node_modules/content-disposition": { + + "version": "0.5.4", + + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + + "license": "MIT", + + "dependencies": { + + "safe-buffer": "5.2.1" + + }, + + "engines": { + + "node": ">= 0.6" + + } + + }, + + "node_modules/content-type": { + + "version": "1.0.5", + + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.6" + + } + + }, + + "node_modules/convert-source-map": { + + "version": "2.0.0", + + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + + "license": "MIT" + + }, + + "node_modules/cookie": { + + "version": "0.7.1", + + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.6" + + } + + }, + + "node_modules/cookie-signature": { + + "version": "1.0.6", + + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + + "license": "MIT" + + }, + + "node_modules/core-js": { + + "version": "3.42.0", + + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.42.0.tgz", + + "integrity": "sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g==", + + "hasInstallScript": true, + + "license": "MIT", + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/core-js" + + } + + }, + + "node_modules/core-js-compat": { + + "version": "3.42.0", + + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.42.0.tgz", + + "integrity": "sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==", + + "license": "MIT", + + "dependencies": { + + "browserslist": "^4.24.4" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/core-js" + + } + + }, + + "node_modules/core-js-pure": { + + "version": "3.42.0", + + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.42.0.tgz", + + "integrity": "sha512-007bM04u91fF4kMgwom2I5cQxAFIy8jVulgr9eozILl/SZE53QOqnW/+vviC+wQWLv+AunBG+8Q0TLoeSsSxRQ==", + + "hasInstallScript": true, + + "license": "MIT", + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/core-js" + + } + + }, + + "node_modules/core-util-is": { + + "version": "1.0.3", + + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + + "license": "MIT" + + }, + + "node_modules/cosmiconfig": { + + "version": "7.1.0", + + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + + "license": "MIT", + + "dependencies": { + + "@types/parse-json": "^4.0.0", + + "import-fresh": "^3.2.1", + + "parse-json": "^5.0.0", + + "path-type": "^4.0.0", + + "yaml": "^1.10.0" + + }, + + "engines": { + + "node": ">=10" + + } + + }, + + "node_modules/crc-32": { + + "version": "1.2.2", + + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + + "license": "Apache-2.0", + + "bin": { + + "crc32": "bin/crc32.njs" + + }, + + "engines": { + + "node": ">=0.8" + + } + + }, + + "node_modules/cross-spawn": { + + "version": "7.0.6", + + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + + "license": "MIT", + + "dependencies": { + + "path-key": "^3.1.0", + + "shebang-command": "^2.0.0", + + "which": "^2.0.1" + + }, + + "engines": { + + "node": ">= 8" + + } + + }, + + "node_modules/crypto-random-string": { + + "version": "2.0.0", + + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + + "license": "MIT", + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/css-blank-pseudo": { + + "version": "3.0.3", + + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", + + "license": "CC0-1.0", + + "dependencies": { + + "postcss-selector-parser": "^6.0.9" + + }, + + "bin": { + + "css-blank-pseudo": "dist/cli.cjs" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "peerDependencies": { + + "postcss": "^8.4" + + } + + }, + + "node_modules/css-declaration-sorter": { + + "version": "6.4.1", + + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", + + "license": "ISC", + + "engines": { + + "node": "^10 || ^12 || >=14" + + }, + + "peerDependencies": { + + "postcss": "^8.0.9" + + } + + }, + + "node_modules/css-has-pseudo": { + + "version": "3.0.4", + + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", + + "license": "CC0-1.0", + + "dependencies": { + + "postcss-selector-parser": "^6.0.9" + + }, + + "bin": { + + "css-has-pseudo": "dist/cli.cjs" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "peerDependencies": { + + "postcss": "^8.4" + + } + + }, + + "node_modules/css-line-break": { + + "version": "2.1.0", + + "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", + + "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", + + "license": "MIT", + + "optional": true, + + "dependencies": { + + "utrie": "^1.0.2" + + } + + }, + + "node_modules/css-loader": { + + "version": "6.11.0", + + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + + "license": "MIT", + + "dependencies": { + + "icss-utils": "^5.1.0", + + "postcss": "^8.4.33", + + "postcss-modules-extract-imports": "^3.1.0", + + "postcss-modules-local-by-default": "^4.0.5", + + "postcss-modules-scope": "^3.2.0", + + "postcss-modules-values": "^4.0.0", + + "postcss-value-parser": "^4.2.0", + + "semver": "^7.5.4" + + }, + + "engines": { + + "node": ">= 12.13.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/webpack" + + }, + + "peerDependencies": { + + "@rspack/core": "0.x || 1.x", + + "webpack": "^5.0.0" + + }, + + "peerDependenciesMeta": { + + "@rspack/core": { + + "optional": true + + }, + + "webpack": { + + "optional": true + + } + + } + + }, + + "node_modules/css-minimizer-webpack-plugin": { + + "version": "3.4.1", + + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", + + "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", + + "license": "MIT", + + "dependencies": { + + "cssnano": "^5.0.6", + + "jest-worker": "^27.0.2", + + "postcss": "^8.3.5", + + "schema-utils": "^4.0.0", + + "serialize-javascript": "^6.0.0", + + "source-map": "^0.6.1" + + }, + + "engines": { + + "node": ">= 12.13.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/webpack" + + }, + + "peerDependencies": { + + "webpack": "^5.0.0" + + }, + + "peerDependenciesMeta": { + + "@parcel/css": { + + "optional": true + + }, + + "clean-css": { + + "optional": true + + }, + + "csso": { + + "optional": true + + }, + + "esbuild": { + + "optional": true + + } + + } + + }, + + "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": { + + "version": "0.6.1", + + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + + "license": "BSD-3-Clause", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/css-prefers-color-scheme": { + + "version": "6.0.3", + + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + + "license": "CC0-1.0", + + "bin": { + + "css-prefers-color-scheme": "dist/cli.cjs" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "peerDependencies": { + + "postcss": "^8.4" + + } + + }, + + "node_modules/css-select": { + + "version": "4.3.0", + + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + + "license": "BSD-2-Clause", + + "dependencies": { + + "boolbase": "^1.0.0", + + "css-what": "^6.0.1", + + "domhandler": "^4.3.1", + + "domutils": "^2.8.0", + + "nth-check": "^2.0.1" + + }, + + "funding": { + + "url": "https://github.com/sponsors/fb55" + + } + + }, + + "node_modules/css-select-base-adapter": { + + "version": "0.1.1", + + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + + "license": "MIT" + + }, + + "node_modules/css-tree": { + + "version": "1.0.0-alpha.37", + + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + + "license": "MIT", + + "dependencies": { + + "mdn-data": "2.0.4", + + "source-map": "^0.6.1" + + }, + + "engines": { + + "node": ">=8.0.0" + + } + + }, + + "node_modules/css-tree/node_modules/source-map": { + + "version": "0.6.1", + + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + + "license": "BSD-3-Clause", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/css-what": { + + "version": "6.1.0", + + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + + "license": "BSD-2-Clause", + + "engines": { + + "node": ">= 6" + + }, + + "funding": { + + "url": "https://github.com/sponsors/fb55" + + } + + }, + + "node_modules/css.escape": { + + "version": "1.5.1", + + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + + "license": "MIT" + + }, + + "node_modules/cssdb": { + + "version": "7.11.2", + + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.11.2.tgz", + + "integrity": "sha512-lhQ32TFkc1X4eTefGfYPvgovRSzIMofHkigfH8nWtyRL4XJLsRhJFreRvEgKzept7x1rjBuy3J/MurXLaFxW/A==", + + "funding": [ + + { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + { + + "type": "github", + + "url": "https://github.com/sponsors/csstools" + + } + + ], + + "license": "CC0-1.0" + + }, + + "node_modules/cssesc": { + + "version": "3.0.0", + + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + + "license": "MIT", + + "bin": { + + "cssesc": "bin/cssesc" + + }, + + "engines": { + + "node": ">=4" + + } + + }, + + "node_modules/cssnano": { + + "version": "5.1.15", + + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + + "license": "MIT", + + "dependencies": { + + "cssnano-preset-default": "^5.2.14", + + "lilconfig": "^2.0.3", + + "yaml": "^1.10.2" + + }, + + "engines": { + + "node": "^10 || ^12 || >=14.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/cssnano" + + }, + + "peerDependencies": { + + "postcss": "^8.2.15" + + } + + }, + + "node_modules/cssnano-preset-default": { + + "version": "5.2.14", + + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + + "license": "MIT", + + "dependencies": { + + "css-declaration-sorter": "^6.3.1", + + "cssnano-utils": "^3.1.0", + + "postcss-calc": "^8.2.3", + + "postcss-colormin": "^5.3.1", + + "postcss-convert-values": "^5.1.3", + + "postcss-discard-comments": "^5.1.2", + + "postcss-discard-duplicates": "^5.1.0", + + "postcss-discard-empty": "^5.1.1", + + "postcss-discard-overridden": "^5.1.0", + + "postcss-merge-longhand": "^5.1.7", + + "postcss-merge-rules": "^5.1.4", + + "postcss-minify-font-values": "^5.1.0", + + "postcss-minify-gradients": "^5.1.1", + + "postcss-minify-params": "^5.1.4", + + "postcss-minify-selectors": "^5.2.1", + + "postcss-normalize-charset": "^5.1.0", + + "postcss-normalize-display-values": "^5.1.0", + + "postcss-normalize-positions": "^5.1.1", + + "postcss-normalize-repeat-style": "^5.1.1", + + "postcss-normalize-string": "^5.1.0", + + "postcss-normalize-timing-functions": "^5.1.0", + + "postcss-normalize-unicode": "^5.1.1", + + "postcss-normalize-url": "^5.1.0", + + "postcss-normalize-whitespace": "^5.1.1", + + "postcss-ordered-values": "^5.1.3", + + "postcss-reduce-initial": "^5.1.2", + + "postcss-reduce-transforms": "^5.1.0", + + "postcss-svgo": "^5.1.0", + + "postcss-unique-selectors": "^5.1.1" + + }, + + "engines": { + + "node": "^10 || ^12 || >=14.0" + + }, + + "peerDependencies": { + + "postcss": "^8.2.15" + + } + + }, + + "node_modules/cssnano-utils": { + + "version": "3.1.0", + + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + + "license": "MIT", + + "engines": { + + "node": "^10 || ^12 || >=14.0" + + }, + + "peerDependencies": { + + "postcss": "^8.2.15" + + } + + }, + + "node_modules/csso": { + + "version": "4.2.0", + + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + + "license": "MIT", + + "dependencies": { + + "css-tree": "^1.1.2" + + }, + + "engines": { + + "node": ">=8.0.0" + + } + + }, + + "node_modules/csso/node_modules/css-tree": { + + "version": "1.1.3", + + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + + "license": "MIT", + + "dependencies": { + + "mdn-data": "2.0.14", + + "source-map": "^0.6.1" + + }, + + "engines": { + + "node": ">=8.0.0" + + } + + }, + + "node_modules/csso/node_modules/mdn-data": { + + "version": "2.0.14", + + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + + "license": "CC0-1.0" + + }, + + "node_modules/csso/node_modules/source-map": { + + "version": "0.6.1", + + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + + "license": "BSD-3-Clause", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/cssom": { + + "version": "0.4.4", + + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + + "license": "MIT" + + }, + + "node_modules/cssstyle": { + + "version": "2.3.0", + + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + + "license": "MIT", + + "dependencies": { + + "cssom": "~0.3.6" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/cssstyle/node_modules/cssom": { + + "version": "0.3.8", + + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + + "license": "MIT" + + }, + + "node_modules/csstype": { + + "version": "3.1.3", + + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + + "license": "MIT" + + }, + + "node_modules/d3-array": { + + "version": "3.2.4", + + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + + "license": "ISC", + + "dependencies": { + + "internmap": "1 - 2" + + }, + + "engines": { + + "node": ">=12" + + } + + }, + + "node_modules/d3-color": { + + "version": "3.1.0", + + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + + "license": "ISC", + + "engines": { + + "node": ">=12" + + } + + }, + + "node_modules/d3-ease": { + + "version": "3.0.1", + + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + + "license": "BSD-3-Clause", + + "engines": { + + "node": ">=12" + + } + + }, + + "node_modules/d3-format": { + + "version": "3.1.0", + + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + + "license": "ISC", + + "engines": { + + "node": ">=12" + + } + + }, + + "node_modules/d3-interpolate": { + + "version": "3.0.1", + + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + + "license": "ISC", + + "dependencies": { + + "d3-color": "1 - 3" + + }, + + "engines": { + + "node": ">=12" + + } + + }, + + "node_modules/d3-path": { + + "version": "3.1.0", + + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + + "license": "ISC", + + "engines": { + + "node": ">=12" + + } + + }, + + "node_modules/d3-scale": { + + "version": "4.0.2", + + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + + "license": "ISC", + + "dependencies": { + + "d3-array": "2.10.0 - 3", + + "d3-format": "1 - 3", + + "d3-interpolate": "1.2.0 - 3", + + "d3-time": "2.1.1 - 3", + + "d3-time-format": "2 - 4" + + }, + + "engines": { + + "node": ">=12" + + } + + }, + + "node_modules/d3-shape": { + + "version": "3.2.0", + + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + + "license": "ISC", + + "dependencies": { + + "d3-path": "^3.1.0" + + }, + + "engines": { + + "node": ">=12" + + } + + }, + + "node_modules/d3-time": { + + "version": "3.1.0", + + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + + "license": "ISC", + + "dependencies": { + + "d3-array": "2 - 3" + + }, + + "engines": { + + "node": ">=12" + + } + + }, + + "node_modules/d3-time-format": { + + "version": "4.1.0", + + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + + "license": "ISC", + + "dependencies": { + + "d3-time": "1 - 3" + + }, + + "engines": { + + "node": ">=12" + + } + + }, + + "node_modules/d3-timer": { + + "version": "3.0.1", + + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + + "license": "ISC", + + "engines": { + + "node": ">=12" + + } + + }, + + "node_modules/damerau-levenshtein": { + + "version": "1.0.8", + + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + + "license": "BSD-2-Clause" + + }, + + "node_modules/data-urls": { + + "version": "2.0.0", + + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + + "license": "MIT", + + "dependencies": { + + "abab": "^2.0.3", + + "whatwg-mimetype": "^2.3.0", + + "whatwg-url": "^8.0.0" + + }, + + "engines": { + + "node": ">=10" + + } + + }, + + "node_modules/data-view-buffer": { + + "version": "1.0.2", + + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + + "license": "MIT", + + "dependencies": { + + "call-bound": "^1.0.3", + + "es-errors": "^1.3.0", + + "is-data-view": "^1.0.2" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/data-view-byte-length": { + + "version": "1.0.2", + + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + + "license": "MIT", + + "dependencies": { + + "call-bound": "^1.0.3", + + "es-errors": "^1.3.0", + + "is-data-view": "^1.0.2" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/inspect-js" + + } + + }, + + "node_modules/data-view-byte-offset": { + + "version": "1.0.1", + + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + + "license": "MIT", + + "dependencies": { + + "call-bound": "^1.0.2", + + "es-errors": "^1.3.0", + + "is-data-view": "^1.0.1" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/date-fns": { + + "version": "4.1.0", + + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + + "license": "MIT", + + "funding": { + + "type": "github", + + "url": "https://github.com/sponsors/kossnocorp" + + } + + }, + + "node_modules/dayjs": { + + "version": "1.11.13", + + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + + "license": "MIT" + + }, + + "node_modules/debug": { + + "version": "4.4.0", + + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + + "license": "MIT", + + "dependencies": { + + "ms": "^2.1.3" + + }, + + "engines": { + + "node": ">=6.0" + + }, + + "peerDependenciesMeta": { + + "supports-color": { + + "optional": true + + } + + } + + }, + + "node_modules/decimal.js": { + + "version": "10.5.0", + + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz", + + "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", + + "license": "MIT" + + }, + + "node_modules/decimal.js-light": { + + "version": "2.5.1", + + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + + "license": "MIT" + + }, + + "node_modules/dedent": { + + "version": "0.7.0", + + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + + "license": "MIT" + + }, + + "node_modules/deep-is": { + + "version": "0.1.4", + + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + + "license": "MIT" + + }, + + "node_modules/deepmerge": { + + "version": "4.3.1", + + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + + "license": "MIT", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/default-gateway": { + + "version": "6.0.3", + + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + + "license": "BSD-2-Clause", + + "dependencies": { + + "execa": "^5.0.0" + + }, + + "engines": { + + "node": ">= 10" + + } + + }, + + "node_modules/define-data-property": { + + "version": "1.1.4", + + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + + "license": "MIT", + + "dependencies": { + + "es-define-property": "^1.0.0", + + "es-errors": "^1.3.0", + + "gopd": "^1.0.1" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/define-lazy-prop": { + + "version": "2.0.0", + + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + + "license": "MIT", + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/define-properties": { + + "version": "1.2.1", + + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + + "license": "MIT", + + "dependencies": { + + "define-data-property": "^1.0.1", + + "has-property-descriptors": "^1.0.0", + + "object-keys": "^1.1.1" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/delayed-stream": { + + "version": "1.0.0", + + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + + "license": "MIT", + + "engines": { + + "node": ">=0.4.0" + + } + + }, + + "node_modules/depd": { + + "version": "2.0.0", + + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.8" + + } + + }, + + "node_modules/dequal": { + + "version": "2.0.3", + + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + + "license": "MIT", + + "engines": { + + "node": ">=6" + + } + + }, + + "node_modules/destroy": { + + "version": "1.2.0", + + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.8", + + "npm": "1.2.8000 || >= 1.4.16" + + } + + }, + + "node_modules/detect-newline": { + + "version": "3.1.0", + + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + + "license": "MIT", + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/detect-node": { + + "version": "2.1.0", + + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + + "license": "MIT" + + }, + + "node_modules/detect-port-alt": { + + "version": "1.1.6", + + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + + "license": "MIT", + + "dependencies": { + + "address": "^1.0.1", + + "debug": "^2.6.0" + + }, + + "bin": { + + "detect": "bin/detect-port", + + "detect-port": "bin/detect-port" + + }, + + "engines": { + + "node": ">= 4.2.1" + + } + + }, + + "node_modules/detect-port-alt/node_modules/debug": { + + "version": "2.6.9", + + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + + "license": "MIT", + + "dependencies": { + + "ms": "2.0.0" + + } + + }, + + "node_modules/detect-port-alt/node_modules/ms": { + + "version": "2.0.0", + + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + + "license": "MIT" + + }, + + "node_modules/didyoumean": { + + "version": "1.2.2", + + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + + "license": "Apache-2.0" + + }, + + "node_modules/diff-sequences": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + + "license": "MIT", + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/dir-glob": { + + "version": "3.0.1", + + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + + "license": "MIT", + + "dependencies": { + + "path-type": "^4.0.0" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/dlv": { + + "version": "1.1.3", + + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + + "license": "MIT" + + }, + + "node_modules/dns-packet": { + + "version": "5.6.1", + + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + + "license": "MIT", + + "dependencies": { + + "@leichtgewicht/ip-codec": "^2.0.1" + + }, + + "engines": { + + "node": ">=6" + + } + + }, + + "node_modules/doctrine": { + + "version": "3.0.0", + + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + + "license": "Apache-2.0", + + "dependencies": { + + "esutils": "^2.0.2" + + }, + + "engines": { + + "node": ">=6.0.0" + + } + + }, + + "node_modules/dom-accessibility-api": { + + "version": "0.5.16", + + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + + "license": "MIT" + + }, + + "node_modules/dom-converter": { + + "version": "0.2.0", + + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + + "license": "MIT", + + "dependencies": { + + "utila": "~0.4" + + } + + }, + + "node_modules/dom-helpers": { + + "version": "5.2.1", + + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + + "license": "MIT", + + "dependencies": { + + "@babel/runtime": "^7.8.7", + + "csstype": "^3.0.2" + + } + + }, + + "node_modules/dom-serializer": { + + "version": "1.4.1", + + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + + "license": "MIT", + + "dependencies": { + + "domelementtype": "^2.0.1", + + "domhandler": "^4.2.0", + + "entities": "^2.0.0" + + }, + + "funding": { + + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + + } + + }, + + "node_modules/domelementtype": { + + "version": "2.3.0", + + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + + "funding": [ + + { + + "type": "github", + + "url": "https://github.com/sponsors/fb55" + + } + + ], + + "license": "BSD-2-Clause" + + }, + + "node_modules/domexception": { + + "version": "2.0.1", + + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + + "deprecated": "Use your platform's native DOMException instead", + + "license": "MIT", + + "dependencies": { + + "webidl-conversions": "^5.0.0" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/domexception/node_modules/webidl-conversions": { + + "version": "5.0.0", + + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + + "license": "BSD-2-Clause", + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/domhandler": { + + "version": "4.3.1", + + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + + "license": "BSD-2-Clause", + + "dependencies": { + + "domelementtype": "^2.2.0" + + }, + + "engines": { + + "node": ">= 4" + + }, + + "funding": { + + "url": "https://github.com/fb55/domhandler?sponsor=1" + + } + + }, + + "node_modules/dompurify": { + + "version": "2.5.8", + + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.5.8.tgz", + + "integrity": "sha512-o1vSNgrmYMQObbSSvF/1brBYEQPHhV1+gsmrusO7/GXtp1T9rCS8cXFqVxK/9crT1jA6Ccv+5MTSjBNqr7Sovw==", + + "license": "(MPL-2.0 OR Apache-2.0)", + + "optional": true + + }, + + "node_modules/domutils": { + + "version": "2.8.0", + + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + + "license": "BSD-2-Clause", + + "dependencies": { + + "dom-serializer": "^1.0.1", + + "domelementtype": "^2.2.0", + + "domhandler": "^4.2.0" + + }, + + "funding": { + + "url": "https://github.com/fb55/domutils?sponsor=1" + + } + + }, + + "node_modules/dot-case": { + + "version": "3.0.4", + + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + + "license": "MIT", + + "dependencies": { + + "no-case": "^3.0.4", + + "tslib": "^2.0.3" + + } + + }, + + "node_modules/dotenv": { + + "version": "10.0.0", + + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + + "license": "BSD-2-Clause", + + "engines": { + + "node": ">=10" + + } + + }, + + "node_modules/dotenv-expand": { + + "version": "5.1.0", + + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + + "license": "BSD-2-Clause" + + }, + + "node_modules/dunder-proto": { + + "version": "1.0.1", + + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + + "license": "MIT", + + "dependencies": { + + "call-bind-apply-helpers": "^1.0.1", + + "es-errors": "^1.3.0", + + "gopd": "^1.2.0" + + }, + + "engines": { + + "node": ">= 0.4" + + } + + }, + + "node_modules/duplexer": { + + "version": "0.1.2", + + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + + "license": "MIT" + + }, + + "node_modules/eastasianwidth": { + + "version": "0.2.0", + + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + + "license": "MIT" + + }, + + "node_modules/ee-first": { + + "version": "1.1.1", + + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + + "license": "MIT" + + }, + + "node_modules/ejs": { + + "version": "3.1.10", + + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + + "license": "Apache-2.0", + + "dependencies": { + + "jake": "^10.8.5" + + }, + + "bin": { + + "ejs": "bin/cli.js" + + }, + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/electron-to-chromium": { + + "version": "1.5.149", + + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.149.tgz", + + "integrity": "sha512-UyiO82eb9dVOx8YO3ajDf9jz2kKyt98DEITRdeLPstOEuTlLzDA4Gyq5K9he71TQziU5jUVu2OAu5N48HmQiyQ==", + + "license": "ISC" + + }, + + "node_modules/emittery": { + + "version": "0.8.1", + + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + + "license": "MIT", + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + + } + + }, + + "node_modules/emoji-regex": { + + "version": "9.2.2", + + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + + "license": "MIT" + + }, + + "node_modules/emojis-list": { + + "version": "3.0.0", + + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + + "license": "MIT", + + "engines": { + + "node": ">= 4" + + } + + }, + + "node_modules/encodeurl": { + + "version": "2.0.0", + + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.8" + + } + + }, + + "node_modules/enhanced-resolve": { + + "version": "5.18.1", + + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + + "license": "MIT", + + "dependencies": { + + "graceful-fs": "^4.2.4", + + "tapable": "^2.2.0" + + }, + + "engines": { + + "node": ">=10.13.0" + + } + + }, + + "node_modules/entities": { + + "version": "2.2.0", + + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + + "license": "BSD-2-Clause", + + "funding": { + + "url": "https://github.com/fb55/entities?sponsor=1" + + } + + }, + + "node_modules/error-ex": { + + "version": "1.3.2", + + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + + "license": "MIT", + + "dependencies": { + + "is-arrayish": "^0.2.1" + + } + + }, + + "node_modules/error-stack-parser": { + + "version": "2.1.4", + + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + + "license": "MIT", + + "dependencies": { + + "stackframe": "^1.3.4" + + } + + }, + + "node_modules/es-abstract": { + + "version": "1.23.9", + + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", + + "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", + + "license": "MIT", + + "dependencies": { + + "array-buffer-byte-length": "^1.0.2", + + "arraybuffer.prototype.slice": "^1.0.4", + + "available-typed-arrays": "^1.0.7", + + "call-bind": "^1.0.8", + + "call-bound": "^1.0.3", + + "data-view-buffer": "^1.0.2", + + "data-view-byte-length": "^1.0.2", + + "data-view-byte-offset": "^1.0.1", + + "es-define-property": "^1.0.1", + + "es-errors": "^1.3.0", + + "es-object-atoms": "^1.0.0", + + "es-set-tostringtag": "^2.1.0", + + "es-to-primitive": "^1.3.0", + + "function.prototype.name": "^1.1.8", + + "get-intrinsic": "^1.2.7", + + "get-proto": "^1.0.0", + + "get-symbol-description": "^1.1.0", + + "globalthis": "^1.0.4", + + "gopd": "^1.2.0", + + "has-property-descriptors": "^1.0.2", + + "has-proto": "^1.2.0", + + "has-symbols": "^1.1.0", + + "hasown": "^2.0.2", + + "internal-slot": "^1.1.0", + + "is-array-buffer": "^3.0.5", + + "is-callable": "^1.2.7", + + "is-data-view": "^1.0.2", + + "is-regex": "^1.2.1", + + "is-shared-array-buffer": "^1.0.4", + + "is-string": "^1.1.1", + + "is-typed-array": "^1.1.15", + + "is-weakref": "^1.1.0", + + "math-intrinsics": "^1.1.0", + + "object-inspect": "^1.13.3", + + "object-keys": "^1.1.1", + + "object.assign": "^4.1.7", + + "own-keys": "^1.0.1", + + "regexp.prototype.flags": "^1.5.3", + + "safe-array-concat": "^1.1.3", + + "safe-push-apply": "^1.0.0", + + "safe-regex-test": "^1.1.0", + + "set-proto": "^1.0.0", + + "string.prototype.trim": "^1.2.10", + + "string.prototype.trimend": "^1.0.9", + + "string.prototype.trimstart": "^1.0.8", + + "typed-array-buffer": "^1.0.3", + + "typed-array-byte-length": "^1.0.3", + + "typed-array-byte-offset": "^1.0.4", + + "typed-array-length": "^1.0.7", + + "unbox-primitive": "^1.1.0", + + "which-typed-array": "^1.1.18" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/es-array-method-boxes-properly": { + + "version": "1.0.0", + + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + + "license": "MIT" + + }, + + "node_modules/es-define-property": { + + "version": "1.0.1", + + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.4" + + } + + }, + + "node_modules/es-errors": { + + "version": "1.3.0", + + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.4" + + } + + }, + + "node_modules/es-iterator-helpers": { + + "version": "1.2.1", + + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + + "license": "MIT", + + "dependencies": { + + "call-bind": "^1.0.8", + + "call-bound": "^1.0.3", + + "define-properties": "^1.2.1", + + "es-abstract": "^1.23.6", + + "es-errors": "^1.3.0", + + "es-set-tostringtag": "^2.0.3", + + "function-bind": "^1.1.2", + + "get-intrinsic": "^1.2.6", + + "globalthis": "^1.0.4", + + "gopd": "^1.2.0", + + "has-property-descriptors": "^1.0.2", + + "has-proto": "^1.2.0", + + "has-symbols": "^1.1.0", + + "internal-slot": "^1.1.0", + + "iterator.prototype": "^1.1.4", + + "safe-array-concat": "^1.1.3" + + }, + + "engines": { + + "node": ">= 0.4" + + } + + }, + + "node_modules/es-module-lexer": { + + "version": "1.7.0", + + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + + "license": "MIT" + + }, + + "node_modules/es-object-atoms": { + + "version": "1.1.1", + + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + + "license": "MIT", + + "dependencies": { + + "es-errors": "^1.3.0" + + }, + + "engines": { + + "node": ">= 0.4" + + } + + }, + + "node_modules/es-set-tostringtag": { + + "version": "2.1.0", + + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + + "license": "MIT", + + "dependencies": { + + "es-errors": "^1.3.0", + + "get-intrinsic": "^1.2.6", + + "has-tostringtag": "^1.0.2", + + "hasown": "^2.0.2" + + }, + + "engines": { + + "node": ">= 0.4" + + } + + }, + + "node_modules/es-shim-unscopables": { + + "version": "1.1.0", + + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + + "license": "MIT", + + "dependencies": { + + "hasown": "^2.0.2" + + }, + + "engines": { + + "node": ">= 0.4" + + } + + }, + + "node_modules/es-to-primitive": { + + "version": "1.3.0", + + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + + "license": "MIT", + + "dependencies": { + + "is-callable": "^1.2.7", + + "is-date-object": "^1.0.5", + + "is-symbol": "^1.0.4" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/escalade": { + + "version": "3.2.0", + + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + + "license": "MIT", + + "engines": { + + "node": ">=6" + + } + + }, + + "node_modules/escape-html": { + + "version": "1.0.3", + + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + + "license": "MIT" + + }, + + "node_modules/escape-string-regexp": { + + "version": "4.0.0", + + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + + "license": "MIT", + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/escodegen": { + + "version": "2.1.0", + + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + + "license": "BSD-2-Clause", + + "dependencies": { + + "esprima": "^4.0.1", + + "estraverse": "^5.2.0", + + "esutils": "^2.0.2" + + }, + + "bin": { + + "escodegen": "bin/escodegen.js", + + "esgenerate": "bin/esgenerate.js" + + }, + + "engines": { + + "node": ">=6.0" + + }, + + "optionalDependencies": { + + "source-map": "~0.6.1" + + } + + }, + + "node_modules/escodegen/node_modules/source-map": { + + "version": "0.6.1", + + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + + "license": "BSD-3-Clause", + + "optional": true, + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/eslint": { + + "version": "8.57.1", + + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + + "license": "MIT", + + "dependencies": { + + "@eslint-community/eslint-utils": "^4.2.0", + + "@eslint-community/regexpp": "^4.6.1", + + "@eslint/eslintrc": "^2.1.4", + + "@eslint/js": "8.57.1", + + "@humanwhocodes/config-array": "^0.13.0", + + "@humanwhocodes/module-importer": "^1.0.1", + + "@nodelib/fs.walk": "^1.2.8", + + "@ungap/structured-clone": "^1.2.0", + + "ajv": "^6.12.4", + + "chalk": "^4.0.0", + + "cross-spawn": "^7.0.2", + + "debug": "^4.3.2", + + "doctrine": "^3.0.0", + + "escape-string-regexp": "^4.0.0", + + "eslint-scope": "^7.2.2", + + "eslint-visitor-keys": "^3.4.3", + + "espree": "^9.6.1", + + "esquery": "^1.4.2", + + "esutils": "^2.0.2", + + "fast-deep-equal": "^3.1.3", + + "file-entry-cache": "^6.0.1", + + "find-up": "^5.0.0", + + "glob-parent": "^6.0.2", + + "globals": "^13.19.0", + + "graphemer": "^1.4.0", + + "ignore": "^5.2.0", + + "imurmurhash": "^0.1.4", + + "is-glob": "^4.0.0", + + "is-path-inside": "^3.0.3", + + "js-yaml": "^4.1.0", + + "json-stable-stringify-without-jsonify": "^1.0.1", + + "levn": "^0.4.1", + + "lodash.merge": "^4.6.2", + + "minimatch": "^3.1.2", + + "natural-compare": "^1.4.0", + + "optionator": "^0.9.3", + + "strip-ansi": "^6.0.1", + + "text-table": "^0.2.0" + + }, + + "bin": { + + "eslint": "bin/eslint.js" + + }, + + "engines": { + + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + + }, + + "funding": { + + "url": "https://opencollective.com/eslint" + + } + + }, + + "node_modules/eslint-config-react-app": { + + "version": "7.0.1", + + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", + + "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", + + "license": "MIT", + + "dependencies": { + + "@babel/core": "^7.16.0", + + "@babel/eslint-parser": "^7.16.3", + + "@rushstack/eslint-patch": "^1.1.0", + + "@typescript-eslint/eslint-plugin": "^5.5.0", + + "@typescript-eslint/parser": "^5.5.0", + + "babel-preset-react-app": "^10.0.1", + + "confusing-browser-globals": "^1.0.11", + + "eslint-plugin-flowtype": "^8.0.3", + + "eslint-plugin-import": "^2.25.3", + + "eslint-plugin-jest": "^25.3.0", + + "eslint-plugin-jsx-a11y": "^6.5.1", + + "eslint-plugin-react": "^7.27.1", + + "eslint-plugin-react-hooks": "^4.3.0", + + "eslint-plugin-testing-library": "^5.0.1" + + }, + + "engines": { + + "node": ">=14.0.0" + + }, + + "peerDependencies": { + + "eslint": "^8.0.0" + + } + + }, + + "node_modules/eslint-import-resolver-node": { + + "version": "0.3.9", + + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + + "license": "MIT", + + "dependencies": { + + "debug": "^3.2.7", + + "is-core-module": "^2.13.0", + + "resolve": "^1.22.4" + + } + + }, + + "node_modules/eslint-import-resolver-node/node_modules/debug": { + + "version": "3.2.7", + + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + + "license": "MIT", + + "dependencies": { + + "ms": "^2.1.1" + + } + + }, + + "node_modules/eslint-module-utils": { + + "version": "2.12.0", + + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + + "license": "MIT", + + "dependencies": { + + "debug": "^3.2.7" + + }, + + "engines": { + + "node": ">=4" + + }, + + "peerDependenciesMeta": { + + "eslint": { + + "optional": true + + } + + } + + }, + + "node_modules/eslint-module-utils/node_modules/debug": { + + "version": "3.2.7", + + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + + "license": "MIT", + + "dependencies": { + + "ms": "^2.1.1" + + } + + }, + + "node_modules/eslint-plugin-flowtype": { + + "version": "8.0.3", + + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", + + "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", + + "license": "BSD-3-Clause", + + "dependencies": { + + "lodash": "^4.17.21", + + "string-natural-compare": "^3.0.1" + + }, + + "engines": { + + "node": ">=12.0.0" + + }, + + "peerDependencies": { + + "@babel/plugin-syntax-flow": "^7.14.5", + + "@babel/plugin-transform-react-jsx": "^7.14.9", + + "eslint": "^8.1.0" + + } + + }, + + "node_modules/eslint-plugin-import": { + + "version": "2.31.0", + + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + + "license": "MIT", + + "dependencies": { + + "@rtsao/scc": "^1.1.0", + + "array-includes": "^3.1.8", + + "array.prototype.findlastindex": "^1.2.5", + + "array.prototype.flat": "^1.3.2", + + "array.prototype.flatmap": "^1.3.2", + + "debug": "^3.2.7", + + "doctrine": "^2.1.0", + + "eslint-import-resolver-node": "^0.3.9", + + "eslint-module-utils": "^2.12.0", + + "hasown": "^2.0.2", + + "is-core-module": "^2.15.1", + + "is-glob": "^4.0.3", + + "minimatch": "^3.1.2", + + "object.fromentries": "^2.0.8", + + "object.groupby": "^1.0.3", + + "object.values": "^1.2.0", + + "semver": "^6.3.1", + + "string.prototype.trimend": "^1.0.8", + + "tsconfig-paths": "^3.15.0" + + }, + + "engines": { + + "node": ">=4" + + }, + + "peerDependencies": { + + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + + } + + }, + + "node_modules/eslint-plugin-import/node_modules/debug": { + + "version": "3.2.7", + + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + + "license": "MIT", + + "dependencies": { + + "ms": "^2.1.1" + + } + + }, + + "node_modules/eslint-plugin-import/node_modules/doctrine": { + + "version": "2.1.0", + + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + + "license": "Apache-2.0", + + "dependencies": { + + "esutils": "^2.0.2" + + }, + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/eslint-plugin-import/node_modules/semver": { + + "version": "6.3.1", + + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + + "license": "ISC", + + "bin": { + + "semver": "bin/semver.js" + + } + + }, + + "node_modules/eslint-plugin-jest": { + + "version": "25.7.0", + + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", + + "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", + + "license": "MIT", + + "dependencies": { + + "@typescript-eslint/experimental-utils": "^5.0.0" + + }, + + "engines": { + + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + + }, + + "peerDependencies": { + + "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", + + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + + }, + + "peerDependenciesMeta": { + + "@typescript-eslint/eslint-plugin": { + + "optional": true + + }, + + "jest": { + + "optional": true + + } + + } + + }, + + "node_modules/eslint-plugin-jsx-a11y": { + + "version": "6.10.2", + + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + + "license": "MIT", + + "dependencies": { + + "aria-query": "^5.3.2", + + "array-includes": "^3.1.8", + + "array.prototype.flatmap": "^1.3.2", + + "ast-types-flow": "^0.0.8", + + "axe-core": "^4.10.0", + + "axobject-query": "^4.1.0", + + "damerau-levenshtein": "^1.0.8", + + "emoji-regex": "^9.2.2", + + "hasown": "^2.0.2", + + "jsx-ast-utils": "^3.3.5", + + "language-tags": "^1.0.9", + + "minimatch": "^3.1.2", + + "object.fromentries": "^2.0.8", + + "safe-regex-test": "^1.0.3", + + "string.prototype.includes": "^2.0.1" + + }, + + "engines": { + + "node": ">=4.0" + + }, + + "peerDependencies": { + + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + + } + + }, + + "node_modules/eslint-plugin-react": { + + "version": "7.37.5", + + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + + "license": "MIT", + + "dependencies": { + + "array-includes": "^3.1.8", + + "array.prototype.findlast": "^1.2.5", + + "array.prototype.flatmap": "^1.3.3", + + "array.prototype.tosorted": "^1.1.4", + + "doctrine": "^2.1.0", + + "es-iterator-helpers": "^1.2.1", + + "estraverse": "^5.3.0", + + "hasown": "^2.0.2", + + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + + "minimatch": "^3.1.2", + + "object.entries": "^1.1.9", + + "object.fromentries": "^2.0.8", + + "object.values": "^1.2.1", + + "prop-types": "^15.8.1", + + "resolve": "^2.0.0-next.5", + + "semver": "^6.3.1", + + "string.prototype.matchall": "^4.0.12", + + "string.prototype.repeat": "^1.0.0" + + }, + + "engines": { + + "node": ">=4" + + }, + + "peerDependencies": { + + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + + } + + }, + + "node_modules/eslint-plugin-react-hooks": { + + "version": "4.6.2", + + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + + "license": "MIT", + + "engines": { + + "node": ">=10" + + }, + + "peerDependencies": { + + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + + } + + }, + + "node_modules/eslint-plugin-react/node_modules/doctrine": { + + "version": "2.1.0", + + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + + "license": "Apache-2.0", + + "dependencies": { + + "esutils": "^2.0.2" + + }, + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/eslint-plugin-react/node_modules/resolve": { + + "version": "2.0.0-next.5", + + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + + "license": "MIT", + + "dependencies": { + + "is-core-module": "^2.13.0", + + "path-parse": "^1.0.7", + + "supports-preserve-symlinks-flag": "^1.0.0" + + }, + + "bin": { + + "resolve": "bin/resolve" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/eslint-plugin-react/node_modules/semver": { + + "version": "6.3.1", + + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + + "license": "ISC", + + "bin": { + + "semver": "bin/semver.js" + + } + + }, + + "node_modules/eslint-plugin-testing-library": { + + "version": "5.11.1", + + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz", + + "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==", + + "license": "MIT", + + "dependencies": { + + "@typescript-eslint/utils": "^5.58.0" + + }, + + "engines": { + + "node": "^12.22.0 || ^14.17.0 || >=16.0.0", + + "npm": ">=6" + + }, + + "peerDependencies": { + + "eslint": "^7.5.0 || ^8.0.0" + + } + + }, + + "node_modules/eslint-scope": { + + "version": "7.2.2", + + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + + "license": "BSD-2-Clause", + + "dependencies": { + + "esrecurse": "^4.3.0", + + "estraverse": "^5.2.0" + + }, + + "engines": { + + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + + }, + + "funding": { + + "url": "https://opencollective.com/eslint" + + } + + }, + + "node_modules/eslint-visitor-keys": { + + "version": "3.4.3", + + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + + "license": "Apache-2.0", + + "engines": { + + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + + }, + + "funding": { + + "url": "https://opencollective.com/eslint" + + } + + }, + + "node_modules/eslint-webpack-plugin": { + + "version": "3.2.0", + + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", + + "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", + + "license": "MIT", + + "dependencies": { + + "@types/eslint": "^7.29.0 || ^8.4.1", + + "jest-worker": "^28.0.2", + + "micromatch": "^4.0.5", + + "normalize-path": "^3.0.0", + + "schema-utils": "^4.0.0" + + }, + + "engines": { + + "node": ">= 12.13.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/webpack" + + }, + + "peerDependencies": { + + "eslint": "^7.0.0 || ^8.0.0", + + "webpack": "^5.0.0" + + } + + }, + + "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { + + "version": "28.1.3", + + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + + "license": "MIT", + + "dependencies": { + + "@types/node": "*", + + "merge-stream": "^2.0.0", + + "supports-color": "^8.0.0" + + }, + + "engines": { + + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + + } + + }, + + "node_modules/eslint-webpack-plugin/node_modules/supports-color": { + + "version": "8.1.1", + + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + + "license": "MIT", + + "dependencies": { + + "has-flag": "^4.0.0" + + }, + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/chalk/supports-color?sponsor=1" + + } + + }, + + "node_modules/eslint/node_modules/argparse": { + + "version": "2.0.1", + + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + + "license": "Python-2.0" + + }, + + "node_modules/eslint/node_modules/find-up": { + + "version": "5.0.0", + + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + + "license": "MIT", + + "dependencies": { + + "locate-path": "^6.0.0", + + "path-exists": "^4.0.0" + + }, + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/eslint/node_modules/globals": { + + "version": "13.24.0", + + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + + "license": "MIT", + + "dependencies": { + + "type-fest": "^0.20.2" + + }, + + "engines": { + + "node": ">=8" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/eslint/node_modules/js-yaml": { + + "version": "4.1.0", + + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + + "license": "MIT", + + "dependencies": { + + "argparse": "^2.0.1" + + }, + + "bin": { + + "js-yaml": "bin/js-yaml.js" + + } + + }, + + "node_modules/eslint/node_modules/locate-path": { + + "version": "6.0.0", + + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + + "license": "MIT", + + "dependencies": { + + "p-locate": "^5.0.0" + + }, + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/eslint/node_modules/p-limit": { + + "version": "3.1.0", + + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + + "license": "MIT", + + "dependencies": { + + "yocto-queue": "^0.1.0" + + }, + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/eslint/node_modules/p-locate": { + + "version": "5.0.0", + + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + + "license": "MIT", + + "dependencies": { + + "p-limit": "^3.0.2" + + }, + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/eslint/node_modules/type-fest": { + + "version": "0.20.2", + + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + + "license": "(MIT OR CC0-1.0)", + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/espree": { + + "version": "9.6.1", + + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + + "license": "BSD-2-Clause", + + "dependencies": { + + "acorn": "^8.9.0", + + "acorn-jsx": "^5.3.2", + + "eslint-visitor-keys": "^3.4.1" + + }, + + "engines": { + + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + + }, + + "funding": { + + "url": "https://opencollective.com/eslint" + + } + + }, + + "node_modules/esprima": { + + "version": "4.0.1", + + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + + "license": "BSD-2-Clause", + + "bin": { + + "esparse": "bin/esparse.js", + + "esvalidate": "bin/esvalidate.js" + + }, + + "engines": { + + "node": ">=4" + + } + + }, + + "node_modules/esquery": { + + "version": "1.6.0", + + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + + "license": "BSD-3-Clause", + + "dependencies": { + + "estraverse": "^5.1.0" + + }, + + "engines": { + + "node": ">=0.10" + + } + + }, + + "node_modules/esrecurse": { + + "version": "4.3.0", + + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + + "license": "BSD-2-Clause", + + "dependencies": { + + "estraverse": "^5.2.0" + + }, + + "engines": { + + "node": ">=4.0" + + } + + }, + + "node_modules/estraverse": { + + "version": "5.3.0", + + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + + "license": "BSD-2-Clause", + + "engines": { + + "node": ">=4.0" + + } + + }, + + "node_modules/estree-walker": { + + "version": "1.0.1", + + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + + "license": "MIT" + + }, + + "node_modules/esutils": { + + "version": "2.0.3", + + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + + "license": "BSD-2-Clause", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/etag": { + + "version": "1.8.1", + + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.6" + + } + + }, + + "node_modules/eventemitter3": { + + "version": "4.0.7", + + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + + "license": "MIT" + + }, + + "node_modules/events": { + + "version": "3.3.0", + + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + + "license": "MIT", + + "engines": { + + "node": ">=0.8.x" + + } + + }, + + "node_modules/execa": { + + "version": "5.1.1", + + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + + "license": "MIT", + + "dependencies": { + + "cross-spawn": "^7.0.3", + + "get-stream": "^6.0.0", + + "human-signals": "^2.1.0", + + "is-stream": "^2.0.0", + + "merge-stream": "^2.0.0", + + "npm-run-path": "^4.0.1", + + "onetime": "^5.1.2", + + "signal-exit": "^3.0.3", + + "strip-final-newline": "^2.0.0" + + }, + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/sindresorhus/execa?sponsor=1" + + } + + }, + + "node_modules/exit": { + + "version": "0.1.2", + + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + + "engines": { + + "node": ">= 0.8.0" + + } + + }, + + "node_modules/expect": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + + "license": "MIT", + + "dependencies": { + + "@jest/types": "^27.5.1", + + "jest-get-type": "^27.5.1", + + "jest-matcher-utils": "^27.5.1", + + "jest-message-util": "^27.5.1" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/express": { + + "version": "4.21.2", + + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + + "license": "MIT", + + "dependencies": { + + "accepts": "~1.3.8", + + "array-flatten": "1.1.1", + + "body-parser": "1.20.3", + + "content-disposition": "0.5.4", + + "content-type": "~1.0.4", + + "cookie": "0.7.1", + + "cookie-signature": "1.0.6", + + "debug": "2.6.9", + + "depd": "2.0.0", + + "encodeurl": "~2.0.0", + + "escape-html": "~1.0.3", + + "etag": "~1.8.1", + + "finalhandler": "1.3.1", + + "fresh": "0.5.2", + + "http-errors": "2.0.0", + + "merge-descriptors": "1.0.3", + + "methods": "~1.1.2", + + "on-finished": "2.4.1", + + "parseurl": "~1.3.3", + + "path-to-regexp": "0.1.12", + + "proxy-addr": "~2.0.7", + + "qs": "6.13.0", + + "range-parser": "~1.2.1", + + "safe-buffer": "5.2.1", + + "send": "0.19.0", + + "serve-static": "1.16.2", + + "setprototypeof": "1.2.0", + + "statuses": "2.0.1", + + "type-is": "~1.6.18", + + "utils-merge": "1.0.1", + + "vary": "~1.1.2" + + }, + + "engines": { + + "node": ">= 0.10.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/express" + + } + + }, + + "node_modules/express/node_modules/debug": { + + "version": "2.6.9", + + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + + "license": "MIT", + + "dependencies": { + + "ms": "2.0.0" + + } + + }, + + "node_modules/express/node_modules/ms": { + + "version": "2.0.0", + + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + + "license": "MIT" + + }, + + "node_modules/fast-deep-equal": { + + "version": "3.1.3", + + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + + "license": "MIT" + + }, + + "node_modules/fast-equals": { + + "version": "5.2.2", + + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz", + + "integrity": "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==", + + "license": "MIT", + + "engines": { + + "node": ">=6.0.0" + + } + + }, + + "node_modules/fast-glob": { + + "version": "3.3.3", + + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + + "license": "MIT", + + "dependencies": { + + "@nodelib/fs.stat": "^2.0.2", + + "@nodelib/fs.walk": "^1.2.3", + + "glob-parent": "^5.1.2", + + "merge2": "^1.3.0", + + "micromatch": "^4.0.8" + + }, + + "engines": { + + "node": ">=8.6.0" + + } + + }, + + "node_modules/fast-glob/node_modules/glob-parent": { + + "version": "5.1.2", + + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + + "license": "ISC", + + "dependencies": { + + "is-glob": "^4.0.1" + + }, + + "engines": { + + "node": ">= 6" + + } + + }, + + "node_modules/fast-json-stable-stringify": { + + "version": "2.1.0", + + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + + "license": "MIT" + + }, + + "node_modules/fast-levenshtein": { + + "version": "2.0.6", + + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + + "license": "MIT" + + }, + + "node_modules/fast-uri": { + + "version": "3.0.6", + + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + + "funding": [ + + { + + "type": "github", + + "url": "https://github.com/sponsors/fastify" + + }, + + { + + "type": "opencollective", + + "url": "https://opencollective.com/fastify" + + } + + ], + + "license": "BSD-3-Clause" + + }, + + "node_modules/fastq": { + + "version": "1.19.1", + + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + + "license": "ISC", + + "dependencies": { + + "reusify": "^1.0.4" + + } + + }, + + "node_modules/faye-websocket": { + + "version": "0.11.4", + + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + + "license": "Apache-2.0", + + "dependencies": { + + "websocket-driver": ">=0.5.1" + + }, + + "engines": { + + "node": ">=0.8.0" + + } + + }, + + "node_modules/fb-watchman": { + + "version": "2.0.2", + + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + + "license": "Apache-2.0", + + "dependencies": { + + "bser": "2.1.1" + + } + + }, + + "node_modules/fflate": { + + "version": "0.4.8", + + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz", + + "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==", + + "license": "MIT" + + }, + + "node_modules/file-entry-cache": { + + "version": "6.0.1", + + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + + "license": "MIT", + + "dependencies": { + + "flat-cache": "^3.0.4" + + }, + + "engines": { + + "node": "^10.12.0 || >=12.0.0" + + } + + }, + + "node_modules/file-loader": { + + "version": "6.2.0", + + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + + "license": "MIT", + + "dependencies": { + + "loader-utils": "^2.0.0", + + "schema-utils": "^3.0.0" + + }, + + "engines": { + + "node": ">= 10.13.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/webpack" + + }, + + "peerDependencies": { + + "webpack": "^4.0.0 || ^5.0.0" + + } + + }, + + "node_modules/file-loader/node_modules/schema-utils": { + + "version": "3.3.0", + + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + + "license": "MIT", + + "dependencies": { + + "@types/json-schema": "^7.0.8", + + "ajv": "^6.12.5", + + "ajv-keywords": "^3.5.2" + + }, + + "engines": { + + "node": ">= 10.13.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/webpack" + + } + + }, + + "node_modules/file-saver": { + + "version": "2.0.5", + + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", + + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==", + + "license": "MIT" + + }, + + "node_modules/filelist": { + + "version": "1.0.4", + + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + + "license": "Apache-2.0", + + "dependencies": { + + "minimatch": "^5.0.1" + + } + + }, + + "node_modules/filelist/node_modules/brace-expansion": { + + "version": "2.0.1", + + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + + "license": "MIT", + + "dependencies": { + + "balanced-match": "^1.0.0" + + } + + }, + + "node_modules/filelist/node_modules/minimatch": { + + "version": "5.1.6", + + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + + "license": "ISC", + + "dependencies": { + + "brace-expansion": "^2.0.1" + + }, + + "engines": { + + "node": ">=10" + + } + + }, + + "node_modules/filesize": { + + "version": "8.0.7", + + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", + + "license": "BSD-3-Clause", + + "engines": { + + "node": ">= 0.4.0" + + } + + }, + + "node_modules/fill-range": { + + "version": "7.1.1", + + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + + "license": "MIT", + + "dependencies": { + + "to-regex-range": "^5.0.1" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/finalhandler": { + + "version": "1.3.1", + + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + + "license": "MIT", + + "dependencies": { + + "debug": "2.6.9", + + "encodeurl": "~2.0.0", + + "escape-html": "~1.0.3", + + "on-finished": "2.4.1", + + "parseurl": "~1.3.3", + + "statuses": "2.0.1", + + "unpipe": "~1.0.0" + + }, + + "engines": { + + "node": ">= 0.8" + + } + + }, + + "node_modules/finalhandler/node_modules/debug": { + + "version": "2.6.9", + + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + + "license": "MIT", + + "dependencies": { + + "ms": "2.0.0" + + } + + }, + + "node_modules/finalhandler/node_modules/ms": { + + "version": "2.0.0", + + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + + "license": "MIT" + + }, + + "node_modules/find-cache-dir": { + + "version": "3.3.2", + + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + + "license": "MIT", + + "dependencies": { + + "commondir": "^1.0.1", + + "make-dir": "^3.0.2", + + "pkg-dir": "^4.1.0" + + }, + + "engines": { + + "node": ">=8" + + }, + + "funding": { + + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + + } + + }, + + "node_modules/find-root": { + + "version": "1.1.0", + + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + + "license": "MIT" + + }, + + "node_modules/find-up": { + + "version": "4.1.0", + + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + + "license": "MIT", + + "dependencies": { + + "locate-path": "^5.0.0", + + "path-exists": "^4.0.0" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/flat-cache": { + + "version": "3.2.0", + + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + + "license": "MIT", + + "dependencies": { + + "flatted": "^3.2.9", + + "keyv": "^4.5.3", + + "rimraf": "^3.0.2" + + }, + + "engines": { + + "node": "^10.12.0 || >=12.0.0" + + } + + }, + + "node_modules/flatted": { + + "version": "3.3.3", + + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + + "license": "ISC" + + }, + + "node_modules/follow-redirects": { + + "version": "1.15.9", + + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + + "funding": [ + + { + + "type": "individual", + + "url": "https://github.com/sponsors/RubenVerborgh" + + } + + ], + + "license": "MIT", + + "engines": { + + "node": ">=4.0" + + }, + + "peerDependenciesMeta": { + + "debug": { + + "optional": true + + } + + } + + }, + + "node_modules/for-each": { + + "version": "0.3.5", + + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + + "license": "MIT", + + "dependencies": { + + "is-callable": "^1.2.7" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/foreground-child": { + + "version": "3.3.1", + + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + + "license": "ISC", + + "dependencies": { + + "cross-spawn": "^7.0.6", + + "signal-exit": "^4.0.1" + + }, + + "engines": { + + "node": ">=14" + + }, + + "funding": { + + "url": "https://github.com/sponsors/isaacs" + + } + + }, + + "node_modules/foreground-child/node_modules/signal-exit": { + + "version": "4.1.0", + + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + + "license": "ISC", + + "engines": { + + "node": ">=14" + + }, + + "funding": { + + "url": "https://github.com/sponsors/isaacs" + + } + + }, + + "node_modules/fork-ts-checker-webpack-plugin": { + + "version": "6.5.3", + + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", + + "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", + + "license": "MIT", + + "dependencies": { + + "@babel/code-frame": "^7.8.3", + + "@types/json-schema": "^7.0.5", + + "chalk": "^4.1.0", + + "chokidar": "^3.4.2", + + "cosmiconfig": "^6.0.0", + + "deepmerge": "^4.2.2", + + "fs-extra": "^9.0.0", + + "glob": "^7.1.6", + + "memfs": "^3.1.2", + + "minimatch": "^3.0.4", + + "schema-utils": "2.7.0", + + "semver": "^7.3.2", + + "tapable": "^1.0.0" + + }, + + "engines": { + + "node": ">=10", + + "yarn": ">=1.0.0" + + }, + + "peerDependencies": { + + "eslint": ">= 6", + + "typescript": ">= 2.7", + + "vue-template-compiler": "*", + + "webpack": ">= 4" + + }, + + "peerDependenciesMeta": { + + "eslint": { + + "optional": true + + }, + + "vue-template-compiler": { + + "optional": true + + } + + } + + }, + + "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + + "version": "6.0.0", + + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + + "license": "MIT", + + "dependencies": { + + "@types/parse-json": "^4.0.0", + + "import-fresh": "^3.1.0", + + "parse-json": "^5.0.0", + + "path-type": "^4.0.0", + + "yaml": "^1.7.2" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + + "version": "9.1.0", + + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + + "license": "MIT", + + "dependencies": { + + "at-least-node": "^1.0.0", + + "graceful-fs": "^4.2.0", + + "jsonfile": "^6.0.1", + + "universalify": "^2.0.0" + + }, + + "engines": { + + "node": ">=10" + + } + + }, + + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + + "version": "2.7.0", + + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + + "license": "MIT", + + "dependencies": { + + "@types/json-schema": "^7.0.4", + + "ajv": "^6.12.2", + + "ajv-keywords": "^3.4.1" + + }, + + "engines": { + + "node": ">= 8.9.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/webpack" + + } + + }, + + "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + + "version": "1.1.3", + + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + + "license": "MIT", + + "engines": { + + "node": ">=6" + + } + + }, + + "node_modules/form-data": { + + "version": "3.0.3", + + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.3.tgz", + + "integrity": "sha512-q5YBMeWy6E2Un0nMGWMgI65MAKtaylxfNJGJxpGh45YDciZB4epbWpaAfImil6CPAPTYB4sh0URQNDRIZG5F2w==", + + "license": "MIT", + + "dependencies": { + + "asynckit": "^0.4.0", + + "combined-stream": "^1.0.8", + + "es-set-tostringtag": "^2.1.0", + + "mime-types": "^2.1.35" + + }, + + "engines": { + + "node": ">= 6" + + } + + }, + + "node_modules/forwarded": { + + "version": "0.2.0", + + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.6" + + } + + }, + + "node_modules/frac": { + + "version": "1.1.2", + + "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", + + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", + + "license": "Apache-2.0", + + "engines": { + + "node": ">=0.8" + + } + + }, + + "node_modules/fraction.js": { + + "version": "4.3.7", + + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + + "license": "MIT", + + "engines": { + + "node": "*" + + }, + + "funding": { + + "type": "patreon", + + "url": "https://github.com/sponsors/rawify" + + } + + }, + + "node_modules/framer-motion": { + + "version": "12.23.0", + + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.0.tgz", + + "integrity": "sha512-xf6NxTGAyf7zR4r2KlnhFmsRfKIbjqeBupEDBAaEtVIBJX96sAon00kMlsKButSIRwPSHjbRrAPnYdJJ9kyhbA==", + + "license": "MIT", + + "dependencies": { + + "motion-dom": "^12.22.0", + + "motion-utils": "^12.19.0", + + "tslib": "^2.4.0" + + }, + + "peerDependencies": { + + "@emotion/is-prop-valid": "*", + + "react": "^18.0.0 || ^19.0.0", + + "react-dom": "^18.0.0 || ^19.0.0" + + }, + + "peerDependenciesMeta": { + + "@emotion/is-prop-valid": { + + "optional": true + + }, + + "react": { + + "optional": true + + }, + + "react-dom": { + + "optional": true + + } + + } + + }, + + "node_modules/fresh": { + + "version": "0.5.2", + + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.6" + + } + + }, + + "node_modules/fs-extra": { + + "version": "10.1.0", + + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + + "license": "MIT", + + "dependencies": { + + "graceful-fs": "^4.2.0", + + "jsonfile": "^6.0.1", + + "universalify": "^2.0.0" + + }, + + "engines": { + + "node": ">=12" + + } + + }, + + "node_modules/fs-monkey": { + + "version": "1.0.6", + + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", + + "license": "Unlicense" + + }, + + "node_modules/fs.realpath": { + + "version": "1.0.0", + + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + + "license": "ISC" + + }, + + "node_modules/fsevents": { + + "version": "2.3.3", + + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + + "hasInstallScript": true, + + "license": "MIT", + + "optional": true, + + "os": [ + + "darwin" + + ], + + "engines": { + + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + + } + + }, + + "node_modules/function-bind": { + + "version": "1.1.2", + + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + + "license": "MIT", + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/function.prototype.name": { + + "version": "1.1.8", + + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + + "license": "MIT", + + "dependencies": { + + "call-bind": "^1.0.8", + + "call-bound": "^1.0.3", + + "define-properties": "^1.2.1", + + "functions-have-names": "^1.2.3", + + "hasown": "^2.0.2", + + "is-callable": "^1.2.7" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/functions-have-names": { + + "version": "1.2.3", + + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + + "license": "MIT", + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/gensync": { + + "version": "1.0.0-beta.2", + + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + + "license": "MIT", + + "engines": { + + "node": ">=6.9.0" + + } + + }, + + "node_modules/get-caller-file": { + + "version": "2.0.5", + + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + + "license": "ISC", + + "engines": { + + "node": "6.* || 8.* || >= 10.*" + + } + + }, + + "node_modules/get-intrinsic": { + + "version": "1.3.0", + + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + + "license": "MIT", + + "dependencies": { + + "call-bind-apply-helpers": "^1.0.2", + + "es-define-property": "^1.0.1", + + "es-errors": "^1.3.0", + + "es-object-atoms": "^1.1.1", + + "function-bind": "^1.1.2", + + "get-proto": "^1.0.1", + + "gopd": "^1.2.0", + + "has-symbols": "^1.1.0", + + "hasown": "^2.0.2", + + "math-intrinsics": "^1.1.0" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/get-own-enumerable-property-symbols": { + + "version": "3.0.2", + + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + + "license": "ISC" + + }, + + "node_modules/get-package-type": { + + "version": "0.1.0", + + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + + "license": "MIT", + + "engines": { + + "node": ">=8.0.0" + + } + + }, + + "node_modules/get-proto": { + + "version": "1.0.1", + + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + + "license": "MIT", + + "dependencies": { + + "dunder-proto": "^1.0.1", + + "es-object-atoms": "^1.0.0" + + }, + + "engines": { + + "node": ">= 0.4" + + } + + }, + + "node_modules/get-stream": { + + "version": "6.0.1", + + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + + "license": "MIT", + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/get-symbol-description": { + + "version": "1.1.0", + + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + + "license": "MIT", + + "dependencies": { + + "call-bound": "^1.0.3", + + "es-errors": "^1.3.0", + + "get-intrinsic": "^1.2.6" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/glob": { + + "version": "7.2.3", + + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + + "deprecated": "Glob versions prior to v9 are no longer supported", + + "license": "ISC", + + "dependencies": { + + "fs.realpath": "^1.0.0", + + "inflight": "^1.0.4", + + "inherits": "2", + + "minimatch": "^3.1.1", + + "once": "^1.3.0", + + "path-is-absolute": "^1.0.0" + + }, + + "engines": { + + "node": "*" + + }, + + "funding": { + + "url": "https://github.com/sponsors/isaacs" + + } + + }, + + "node_modules/glob-parent": { + + "version": "6.0.2", + + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + + "license": "ISC", + + "dependencies": { + + "is-glob": "^4.0.3" + + }, + + "engines": { + + "node": ">=10.13.0" + + } + + }, + + "node_modules/glob-to-regexp": { + + "version": "0.4.1", + + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + + "license": "BSD-2-Clause" + + }, + + "node_modules/global-modules": { + + "version": "2.0.0", + + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + + "license": "MIT", + + "dependencies": { + + "global-prefix": "^3.0.0" + + }, + + "engines": { + + "node": ">=6" + + } + + }, + + "node_modules/global-prefix": { + + "version": "3.0.0", + + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + + "license": "MIT", + + "dependencies": { + + "ini": "^1.3.5", + + "kind-of": "^6.0.2", + + "which": "^1.3.1" + + }, + + "engines": { + + "node": ">=6" + + } + + }, + + "node_modules/global-prefix/node_modules/which": { + + "version": "1.3.1", + + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + + "license": "ISC", + + "dependencies": { + + "isexe": "^2.0.0" + + }, + + "bin": { + + "which": "bin/which" + + } + + }, + + "node_modules/globals": { + + "version": "11.12.0", + + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + + "license": "MIT", + + "engines": { + + "node": ">=4" + + } + + }, + + "node_modules/globalthis": { + + "version": "1.0.4", + + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + + "license": "MIT", + + "dependencies": { + + "define-properties": "^1.2.1", + + "gopd": "^1.0.1" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/globby": { + + "version": "11.1.0", + + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + + "license": "MIT", + + "dependencies": { + + "array-union": "^2.1.0", + + "dir-glob": "^3.0.1", + + "fast-glob": "^3.2.9", + + "ignore": "^5.2.0", + + "merge2": "^1.4.1", + + "slash": "^3.0.0" + + }, + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/gopd": { + + "version": "1.2.0", + + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/graceful-fs": { + + "version": "4.2.11", + + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + + "license": "ISC" + + }, + + "node_modules/graphemer": { + + "version": "1.4.0", + + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + + "license": "MIT" + + }, + + "node_modules/gzip-size": { + + "version": "6.0.0", + + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + + "license": "MIT", + + "dependencies": { + + "duplexer": "^0.1.2" + + }, + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/handle-thing": { + + "version": "2.0.1", + + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + + "license": "MIT" + + }, + + "node_modules/harmony-reflect": { + + "version": "1.6.2", + + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==", + + "license": "(Apache-2.0 OR MPL-1.1)" + + }, + + "node_modules/has-bigints": { + + "version": "1.1.0", + + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/has-flag": { + + "version": "4.0.0", + + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + + "license": "MIT", + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/has-property-descriptors": { + + "version": "1.0.2", + + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + + "license": "MIT", + + "dependencies": { + + "es-define-property": "^1.0.0" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/has-proto": { + + "version": "1.2.0", + + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + + "license": "MIT", + + "dependencies": { + + "dunder-proto": "^1.0.0" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/has-symbols": { + + "version": "1.1.0", + + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/has-tostringtag": { + + "version": "1.0.2", + + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + + "license": "MIT", + + "dependencies": { + + "has-symbols": "^1.0.3" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/hasown": { + + "version": "2.0.2", + + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + + "license": "MIT", + + "dependencies": { + + "function-bind": "^1.1.2" + + }, + + "engines": { + + "node": ">= 0.4" + + } + + }, + + "node_modules/he": { + + "version": "1.2.0", + + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + + "license": "MIT", + + "bin": { + + "he": "bin/he" + + } + + }, + + "node_modules/hoist-non-react-statics": { + + "version": "3.3.2", + + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + + "license": "BSD-3-Clause", + + "dependencies": { + + "react-is": "^16.7.0" + + } + + }, + + "node_modules/hoist-non-react-statics/node_modules/react-is": { + + "version": "16.13.1", + + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + + "license": "MIT" + + }, + + "node_modules/hoopy": { + + "version": "0.1.4", + + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + + "license": "MIT", + + "engines": { + + "node": ">= 6.0.0" + + } + + }, + + "node_modules/hpack.js": { + + "version": "2.1.6", + + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + + "license": "MIT", + + "dependencies": { + + "inherits": "^2.0.1", + + "obuf": "^1.0.0", + + "readable-stream": "^2.0.1", + + "wbuf": "^1.1.0" + + } + + }, + + "node_modules/hpack.js/node_modules/isarray": { + + "version": "1.0.0", + + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + + "license": "MIT" + + }, + + "node_modules/hpack.js/node_modules/readable-stream": { + + "version": "2.3.8", + + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + + "license": "MIT", + + "dependencies": { + + "core-util-is": "~1.0.0", + + "inherits": "~2.0.3", + + "isarray": "~1.0.0", + + "process-nextick-args": "~2.0.0", + + "safe-buffer": "~5.1.1", + + "string_decoder": "~1.1.1", + + "util-deprecate": "~1.0.1" + + } + + }, + + "node_modules/hpack.js/node_modules/safe-buffer": { + + "version": "5.1.2", + + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + + "license": "MIT" + + }, + + "node_modules/hpack.js/node_modules/string_decoder": { + + "version": "1.1.1", + + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + + "license": "MIT", + + "dependencies": { + + "safe-buffer": "~5.1.0" + + } + + }, + + "node_modules/html-encoding-sniffer": { + + "version": "2.0.1", + + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + + "license": "MIT", + + "dependencies": { + + "whatwg-encoding": "^1.0.5" + + }, + + "engines": { + + "node": ">=10" + + } + + }, + + "node_modules/html-entities": { + + "version": "2.6.0", + + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + + "funding": [ + + { + + "type": "github", + + "url": "https://github.com/sponsors/mdevils" + + }, + + { + + "type": "patreon", + + "url": "https://patreon.com/mdevils" + + } + + ], + + "license": "MIT" + + }, + + "node_modules/html-escaper": { + + "version": "2.0.2", + + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + + "license": "MIT" + + }, + + "node_modules/html-minifier-terser": { + + "version": "6.1.0", + + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + + "license": "MIT", + + "dependencies": { + + "camel-case": "^4.1.2", + + "clean-css": "^5.2.2", + + "commander": "^8.3.0", + + "he": "^1.2.0", + + "param-case": "^3.0.4", + + "relateurl": "^0.2.7", + + "terser": "^5.10.0" + + }, + + "bin": { + + "html-minifier-terser": "cli.js" + + }, + + "engines": { + + "node": ">=12" + + } + + }, + + "node_modules/html-webpack-plugin": { + + "version": "5.6.3", + + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz", + + "integrity": "sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==", + + "license": "MIT", + + "dependencies": { + + "@types/html-minifier-terser": "^6.0.0", + + "html-minifier-terser": "^6.0.2", + + "lodash": "^4.17.21", + + "pretty-error": "^4.0.0", + + "tapable": "^2.0.0" + + }, + + "engines": { + + "node": ">=10.13.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/html-webpack-plugin" + + }, + + "peerDependencies": { + + "@rspack/core": "0.x || 1.x", + + "webpack": "^5.20.0" + + }, + + "peerDependenciesMeta": { + + "@rspack/core": { + + "optional": true + + }, + + "webpack": { + + "optional": true + + } + + } + + }, + + "node_modules/html2canvas": { + + "version": "1.4.1", + + "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", + + "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", + + "license": "MIT", + + "optional": true, + + "dependencies": { + + "css-line-break": "^2.1.0", + + "text-segmentation": "^1.0.3" + + }, + + "engines": { + + "node": ">=8.0.0" + + } + + }, + + "node_modules/htmlparser2": { + + "version": "6.1.0", + + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + + "funding": [ + + "https://github.com/fb55/htmlparser2?sponsor=1", + + { + + "type": "github", + + "url": "https://github.com/sponsors/fb55" + + } + + ], + + "license": "MIT", + + "dependencies": { + + "domelementtype": "^2.0.1", + + "domhandler": "^4.0.0", + + "domutils": "^2.5.2", + + "entities": "^2.0.0" + + } + + }, + + "node_modules/http-deceiver": { + + "version": "1.2.7", + + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + + "license": "MIT" + + }, + + "node_modules/http-errors": { + + "version": "2.0.0", + + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + + "license": "MIT", + + "dependencies": { + + "depd": "2.0.0", + + "inherits": "2.0.4", + + "setprototypeof": "1.2.0", + + "statuses": "2.0.1", + + "toidentifier": "1.0.1" + + }, + + "engines": { + + "node": ">= 0.8" + + } + + }, + + "node_modules/http-parser-js": { + + "version": "0.5.10", + + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + + "license": "MIT" + + }, + + "node_modules/http-proxy": { + + "version": "1.18.1", + + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + + "license": "MIT", + + "dependencies": { + + "eventemitter3": "^4.0.0", + + "follow-redirects": "^1.0.0", + + "requires-port": "^1.0.0" + + }, + + "engines": { + + "node": ">=8.0.0" + + } + + }, + + "node_modules/http-proxy-agent": { + + "version": "4.0.1", + + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + + "license": "MIT", + + "dependencies": { + + "@tootallnate/once": "1", + + "agent-base": "6", + + "debug": "4" + + }, + + "engines": { + + "node": ">= 6" + + } + + }, + + "node_modules/http-proxy-middleware": { + + "version": "2.0.9", + + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + + "license": "MIT", + + "dependencies": { + + "@types/http-proxy": "^1.17.8", + + "http-proxy": "^1.18.1", + + "is-glob": "^4.0.1", + + "is-plain-obj": "^3.0.0", + + "micromatch": "^4.0.2" + + }, + + "engines": { + + "node": ">=12.0.0" + + }, + + "peerDependencies": { + + "@types/express": "^4.17.13" + + }, + + "peerDependenciesMeta": { + + "@types/express": { + + "optional": true + + } + + } + + }, + + "node_modules/https-proxy-agent": { + + "version": "5.0.1", + + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + + "license": "MIT", + + "dependencies": { + + "agent-base": "6", + + "debug": "4" + + }, + + "engines": { + + "node": ">= 6" + + } + + }, + + "node_modules/human-signals": { + + "version": "2.1.0", + + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + + "license": "Apache-2.0", + + "engines": { + + "node": ">=10.17.0" + + } + + }, + + "node_modules/iconv-lite": { + + "version": "0.6.3", + + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + + "license": "MIT", + + "dependencies": { + + "safer-buffer": ">= 2.1.2 < 3.0.0" + + }, + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/icss-utils": { + + "version": "5.1.0", + + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + + "license": "ISC", + + "engines": { + + "node": "^10 || ^12 || >= 14" + + }, + + "peerDependencies": { + + "postcss": "^8.1.0" + + } + + }, + + "node_modules/idb": { + + "version": "7.1.1", + + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", + + "license": "ISC" + + }, + + "node_modules/identity-obj-proxy": { + + "version": "3.0.0", + + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + + "license": "MIT", + + "dependencies": { + + "harmony-reflect": "^1.4.6" + + }, + + "engines": { + + "node": ">=4" + + } + + }, + + "node_modules/ignore": { + + "version": "5.3.2", + + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + + "license": "MIT", + + "engines": { + + "node": ">= 4" + + } + + }, + + "node_modules/immer": { + + "version": "9.0.21", + + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + + "license": "MIT", + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/immer" + + } + + }, + + "node_modules/import-fresh": { + + "version": "3.3.1", + + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + + "license": "MIT", + + "dependencies": { + + "parent-module": "^1.0.0", + + "resolve-from": "^4.0.0" + + }, + + "engines": { + + "node": ">=6" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/import-fresh/node_modules/resolve-from": { + + "version": "4.0.0", + + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + + "license": "MIT", + + "engines": { + + "node": ">=4" + + } + + }, + + "node_modules/import-local": { + + "version": "3.2.0", + + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + + "license": "MIT", + + "dependencies": { + + "pkg-dir": "^4.2.0", + + "resolve-cwd": "^3.0.0" + + }, + + "bin": { + + "import-local-fixture": "fixtures/cli.js" + + }, + + "engines": { + + "node": ">=8" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/imurmurhash": { + + "version": "0.1.4", + + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + + "license": "MIT", + + "engines": { + + "node": ">=0.8.19" + + } + + }, + + "node_modules/indent-string": { + + "version": "4.0.0", + + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + + "license": "MIT", + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/inflight": { + + "version": "1.0.6", + + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + + "license": "ISC", + + "dependencies": { + + "once": "^1.3.0", + + "wrappy": "1" + + } + + }, + + "node_modules/inherits": { + + "version": "2.0.4", + + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + + "license": "ISC" + + }, + + "node_modules/ini": { + + "version": "1.3.8", + + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + + "license": "ISC" + + }, + + "node_modules/internal-slot": { + + "version": "1.1.0", + + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + + "license": "MIT", + + "dependencies": { + + "es-errors": "^1.3.0", + + "hasown": "^2.0.2", + + "side-channel": "^1.1.0" + + }, + + "engines": { + + "node": ">= 0.4" + + } + + }, + + "node_modules/internmap": { + + "version": "2.0.3", + + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + + "license": "ISC", + + "engines": { + + "node": ">=12" + + } + + }, + + "node_modules/ipaddr.js": { + + "version": "2.2.0", + + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + + "license": "MIT", + + "engines": { + + "node": ">= 10" + + } + + }, + + "node_modules/is-array-buffer": { + + "version": "3.0.5", + + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + + "license": "MIT", + + "dependencies": { + + "call-bind": "^1.0.8", + + "call-bound": "^1.0.3", + + "get-intrinsic": "^1.2.6" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/is-arrayish": { + + "version": "0.2.1", + + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + + "license": "MIT" + + }, + + "node_modules/is-async-function": { + + "version": "2.1.1", + + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + + "license": "MIT", + + "dependencies": { + + "async-function": "^1.0.0", + + "call-bound": "^1.0.3", + + "get-proto": "^1.0.1", + + "has-tostringtag": "^1.0.2", + + "safe-regex-test": "^1.1.0" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/is-bigint": { + + "version": "1.1.0", + + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + + "license": "MIT", + + "dependencies": { + + "has-bigints": "^1.0.2" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/is-binary-path": { + + "version": "2.1.0", + + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + + "license": "MIT", + + "dependencies": { + + "binary-extensions": "^2.0.0" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/is-boolean-object": { + + "version": "1.2.2", + + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + + "license": "MIT", + + "dependencies": { + + "call-bound": "^1.0.3", + + "has-tostringtag": "^1.0.2" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/is-callable": { + + "version": "1.2.7", + + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/is-core-module": { + + "version": "2.16.1", + + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + + "license": "MIT", + + "dependencies": { + + "hasown": "^2.0.2" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/is-data-view": { + + "version": "1.0.2", + + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + + "license": "MIT", + + "dependencies": { + + "call-bound": "^1.0.2", + + "get-intrinsic": "^1.2.6", + + "is-typed-array": "^1.1.13" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/is-date-object": { + + "version": "1.1.0", + + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + + "license": "MIT", + + "dependencies": { + + "call-bound": "^1.0.2", + + "has-tostringtag": "^1.0.2" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/is-docker": { + + "version": "2.2.1", + + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + + "license": "MIT", + + "bin": { + + "is-docker": "cli.js" + + }, + + "engines": { + + "node": ">=8" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/is-extglob": { + + "version": "2.1.1", + + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + + "license": "MIT", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/is-finalizationregistry": { + + "version": "1.1.1", + + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + + "license": "MIT", + + "dependencies": { + + "call-bound": "^1.0.3" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/is-fullwidth-code-point": { + + "version": "3.0.0", + + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + + "license": "MIT", + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/is-generator-fn": { + + "version": "2.1.0", + + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + + "license": "MIT", + + "engines": { + + "node": ">=6" + + } + + }, + + "node_modules/is-generator-function": { + + "version": "1.1.0", + + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + + "license": "MIT", + + "dependencies": { + + "call-bound": "^1.0.3", + + "get-proto": "^1.0.0", + + "has-tostringtag": "^1.0.2", + + "safe-regex-test": "^1.1.0" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/is-glob": { + + "version": "4.0.3", + + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + + "license": "MIT", + + "dependencies": { + + "is-extglob": "^2.1.1" + + }, + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/is-map": { + + "version": "2.0.3", + + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/is-module": { + + "version": "1.0.0", + + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + + "license": "MIT" + + }, + + "node_modules/is-number": { + + "version": "7.0.0", + + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + + "license": "MIT", + + "engines": { + + "node": ">=0.12.0" + + } + + }, + + "node_modules/is-number-object": { + + "version": "1.1.1", + + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + + "license": "MIT", + + "dependencies": { + + "call-bound": "^1.0.3", + + "has-tostringtag": "^1.0.2" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/is-obj": { + + "version": "1.0.1", + + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + + "license": "MIT", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/is-path-inside": { + + "version": "3.0.3", + + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + + "license": "MIT", + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/is-plain-obj": { + + "version": "3.0.0", + + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + + "license": "MIT", + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/is-potential-custom-element-name": { + + "version": "1.0.1", + + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + + "license": "MIT" + + }, + + "node_modules/is-regex": { + + "version": "1.2.1", + + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + + "license": "MIT", + + "dependencies": { + + "call-bound": "^1.0.2", + + "gopd": "^1.2.0", + + "has-tostringtag": "^1.0.2", + + "hasown": "^2.0.2" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/is-regexp": { + + "version": "1.0.0", + + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + + "license": "MIT", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/is-root": { + + "version": "2.1.0", + + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + + "license": "MIT", + + "engines": { + + "node": ">=6" + + } + + }, + + "node_modules/is-set": { + + "version": "2.0.3", + + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/is-shared-array-buffer": { + + "version": "1.0.4", + + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + + "license": "MIT", + + "dependencies": { + + "call-bound": "^1.0.3" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/is-stream": { + + "version": "2.0.1", + + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + + "license": "MIT", + + "engines": { + + "node": ">=8" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/is-string": { + + "version": "1.1.1", + + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + + "license": "MIT", + + "dependencies": { + + "call-bound": "^1.0.3", + + "has-tostringtag": "^1.0.2" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/is-symbol": { + + "version": "1.1.1", + + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + + "license": "MIT", + + "dependencies": { + + "call-bound": "^1.0.2", + + "has-symbols": "^1.1.0", + + "safe-regex-test": "^1.1.0" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/is-typed-array": { + + "version": "1.1.15", + + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + + "license": "MIT", + + "dependencies": { + + "which-typed-array": "^1.1.16" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/is-typedarray": { + + "version": "1.0.0", + + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + + "license": "MIT" + + }, + + "node_modules/is-weakmap": { + + "version": "2.0.2", + + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/is-weakref": { + + "version": "1.1.1", + + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + + "license": "MIT", + + "dependencies": { + + "call-bound": "^1.0.3" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/is-weakset": { + + "version": "2.0.4", + + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + + "license": "MIT", + + "dependencies": { + + "call-bound": "^1.0.3", + + "get-intrinsic": "^1.2.6" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/is-wsl": { + + "version": "2.2.0", + + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + + "license": "MIT", + + "dependencies": { + + "is-docker": "^2.0.0" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/isarray": { + + "version": "2.0.5", + + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + + "license": "MIT" + + }, + + "node_modules/isexe": { + + "version": "2.0.0", + + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + + "license": "ISC" + + }, + + "node_modules/istanbul-lib-coverage": { + + "version": "3.2.2", + + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + + "license": "BSD-3-Clause", + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/istanbul-lib-instrument": { + + "version": "5.2.1", + + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + + "license": "BSD-3-Clause", + + "dependencies": { + + "@babel/core": "^7.12.3", + + "@babel/parser": "^7.14.7", + + "@istanbuljs/schema": "^0.1.2", + + "istanbul-lib-coverage": "^3.2.0", + + "semver": "^6.3.0" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/istanbul-lib-instrument/node_modules/semver": { + + "version": "6.3.1", + + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + + "license": "ISC", + + "bin": { + + "semver": "bin/semver.js" + + } + + }, + + "node_modules/istanbul-lib-report": { + + "version": "3.0.1", + + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + + "license": "BSD-3-Clause", + + "dependencies": { + + "istanbul-lib-coverage": "^3.0.0", + + "make-dir": "^4.0.0", + + "supports-color": "^7.1.0" + + }, + + "engines": { + + "node": ">=10" + + } + + }, + + "node_modules/istanbul-lib-report/node_modules/make-dir": { + + "version": "4.0.0", + + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + + "license": "MIT", + + "dependencies": { + + "semver": "^7.5.3" + + }, + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/istanbul-lib-source-maps": { + + "version": "4.0.1", + + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + + "license": "BSD-3-Clause", + + "dependencies": { + + "debug": "^4.1.1", + + "istanbul-lib-coverage": "^3.0.0", + + "source-map": "^0.6.1" + + }, + + "engines": { + + "node": ">=10" + + } + + }, + + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + + "version": "0.6.1", + + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + + "license": "BSD-3-Clause", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/istanbul-reports": { + + "version": "3.1.7", + + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + + "license": "BSD-3-Clause", + + "dependencies": { + + "html-escaper": "^2.0.0", + + "istanbul-lib-report": "^3.0.0" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/iterator.prototype": { + + "version": "1.1.5", + + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + + "license": "MIT", + + "dependencies": { + + "define-data-property": "^1.1.4", + + "es-object-atoms": "^1.0.0", + + "get-intrinsic": "^1.2.6", + + "get-proto": "^1.0.0", + + "has-symbols": "^1.1.0", + + "set-function-name": "^2.0.2" + + }, + + "engines": { + + "node": ">= 0.4" + + } + + }, + + "node_modules/jackspeak": { + + "version": "3.4.3", + + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + + "license": "BlueOak-1.0.0", + + "dependencies": { + + "@isaacs/cliui": "^8.0.2" + + }, + + "funding": { + + "url": "https://github.com/sponsors/isaacs" + + }, + + "optionalDependencies": { + + "@pkgjs/parseargs": "^0.11.0" + + } + + }, + + "node_modules/jake": { + + "version": "10.9.2", + + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + + "license": "Apache-2.0", + + "dependencies": { + + "async": "^3.2.3", + + "chalk": "^4.0.2", + + "filelist": "^1.0.4", + + "minimatch": "^3.1.2" + + }, + + "bin": { + + "jake": "bin/cli.js" + + }, + + "engines": { + + "node": ">=10" + + } + + }, + + "node_modules/jest": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + + "license": "MIT", + + "dependencies": { + + "@jest/core": "^27.5.1", + + "import-local": "^3.0.2", + + "jest-cli": "^27.5.1" + + }, + + "bin": { + + "jest": "bin/jest.js" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + }, + + "peerDependencies": { + + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + + }, + + "peerDependenciesMeta": { + + "node-notifier": { + + "optional": true + + } + + } + + }, + + "node_modules/jest-changed-files": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + + "license": "MIT", + + "dependencies": { + + "@jest/types": "^27.5.1", + + "execa": "^5.0.0", + + "throat": "^6.0.1" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/jest-circus": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", + + "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + + "license": "MIT", + + "dependencies": { + + "@jest/environment": "^27.5.1", + + "@jest/test-result": "^27.5.1", + + "@jest/types": "^27.5.1", + + "@types/node": "*", + + "chalk": "^4.0.0", + + "co": "^4.6.0", + + "dedent": "^0.7.0", + + "expect": "^27.5.1", + + "is-generator-fn": "^2.0.0", + + "jest-each": "^27.5.1", + + "jest-matcher-utils": "^27.5.1", + + "jest-message-util": "^27.5.1", + + "jest-runtime": "^27.5.1", + + "jest-snapshot": "^27.5.1", + + "jest-util": "^27.5.1", + + "pretty-format": "^27.5.1", + + "slash": "^3.0.0", + + "stack-utils": "^2.0.3", + + "throat": "^6.0.1" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/jest-cli": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + + "license": "MIT", + + "dependencies": { + + "@jest/core": "^27.5.1", + + "@jest/test-result": "^27.5.1", + + "@jest/types": "^27.5.1", + + "chalk": "^4.0.0", + + "exit": "^0.1.2", + + "graceful-fs": "^4.2.9", + + "import-local": "^3.0.2", + + "jest-config": "^27.5.1", + + "jest-util": "^27.5.1", + + "jest-validate": "^27.5.1", + + "prompts": "^2.0.1", + + "yargs": "^16.2.0" + + }, + + "bin": { + + "jest": "bin/jest.js" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + }, + + "peerDependencies": { + + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + + }, + + "peerDependenciesMeta": { + + "node-notifier": { + + "optional": true + + } + + } + + }, + + "node_modules/jest-config": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", + + "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + + "license": "MIT", + + "dependencies": { + + "@babel/core": "^7.8.0", + + "@jest/test-sequencer": "^27.5.1", + + "@jest/types": "^27.5.1", + + "babel-jest": "^27.5.1", + + "chalk": "^4.0.0", + + "ci-info": "^3.2.0", + + "deepmerge": "^4.2.2", + + "glob": "^7.1.1", + + "graceful-fs": "^4.2.9", + + "jest-circus": "^27.5.1", + + "jest-environment-jsdom": "^27.5.1", + + "jest-environment-node": "^27.5.1", + + "jest-get-type": "^27.5.1", + + "jest-jasmine2": "^27.5.1", + + "jest-regex-util": "^27.5.1", + + "jest-resolve": "^27.5.1", + + "jest-runner": "^27.5.1", + + "jest-util": "^27.5.1", + + "jest-validate": "^27.5.1", + + "micromatch": "^4.0.4", + + "parse-json": "^5.2.0", + + "pretty-format": "^27.5.1", + + "slash": "^3.0.0", + + "strip-json-comments": "^3.1.1" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + }, + + "peerDependencies": { + + "ts-node": ">=9.0.0" + + }, + + "peerDependenciesMeta": { + + "ts-node": { + + "optional": true + + } + + } + + }, + + "node_modules/jest-diff": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + + "license": "MIT", + + "dependencies": { + + "chalk": "^4.0.0", + + "diff-sequences": "^27.5.1", + + "jest-get-type": "^27.5.1", + + "pretty-format": "^27.5.1" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/jest-docblock": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", + + "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + + "license": "MIT", + + "dependencies": { + + "detect-newline": "^3.0.0" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/jest-each": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + + "license": "MIT", + + "dependencies": { + + "@jest/types": "^27.5.1", + + "chalk": "^4.0.0", + + "jest-get-type": "^27.5.1", + + "jest-util": "^27.5.1", + + "pretty-format": "^27.5.1" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/jest-environment-jsdom": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + + "license": "MIT", + + "dependencies": { + + "@jest/environment": "^27.5.1", + + "@jest/fake-timers": "^27.5.1", + + "@jest/types": "^27.5.1", + + "@types/node": "*", + + "jest-mock": "^27.5.1", + + "jest-util": "^27.5.1", + + "jsdom": "^16.6.0" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/jest-environment-node": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + + "license": "MIT", + + "dependencies": { + + "@jest/environment": "^27.5.1", + + "@jest/fake-timers": "^27.5.1", + + "@jest/types": "^27.5.1", + + "@types/node": "*", + + "jest-mock": "^27.5.1", + + "jest-util": "^27.5.1" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/jest-get-type": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + + "license": "MIT", + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/jest-haste-map": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + + "license": "MIT", + + "dependencies": { + + "@jest/types": "^27.5.1", + + "@types/graceful-fs": "^4.1.2", + + "@types/node": "*", + + "anymatch": "^3.0.3", + + "fb-watchman": "^2.0.0", + + "graceful-fs": "^4.2.9", + + "jest-regex-util": "^27.5.1", + + "jest-serializer": "^27.5.1", + + "jest-util": "^27.5.1", + + "jest-worker": "^27.5.1", + + "micromatch": "^4.0.4", + + "walker": "^1.0.7" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + }, + + "optionalDependencies": { + + "fsevents": "^2.3.2" + + } + + }, + + "node_modules/jest-jasmine2": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + + "license": "MIT", + + "dependencies": { + + "@jest/environment": "^27.5.1", + + "@jest/source-map": "^27.5.1", + + "@jest/test-result": "^27.5.1", + + "@jest/types": "^27.5.1", + + "@types/node": "*", + + "chalk": "^4.0.0", + + "co": "^4.6.0", + + "expect": "^27.5.1", + + "is-generator-fn": "^2.0.0", + + "jest-each": "^27.5.1", + + "jest-matcher-utils": "^27.5.1", + + "jest-message-util": "^27.5.1", + + "jest-runtime": "^27.5.1", + + "jest-snapshot": "^27.5.1", + + "jest-util": "^27.5.1", + + "pretty-format": "^27.5.1", + + "throat": "^6.0.1" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/jest-leak-detector": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + + "license": "MIT", + + "dependencies": { + + "jest-get-type": "^27.5.1", + + "pretty-format": "^27.5.1" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/jest-matcher-utils": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + + "license": "MIT", + + "dependencies": { + + "chalk": "^4.0.0", + + "jest-diff": "^27.5.1", + + "jest-get-type": "^27.5.1", + + "pretty-format": "^27.5.1" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/jest-message-util": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + + "license": "MIT", + + "dependencies": { + + "@babel/code-frame": "^7.12.13", + + "@jest/types": "^27.5.1", + + "@types/stack-utils": "^2.0.0", + + "chalk": "^4.0.0", + + "graceful-fs": "^4.2.9", + + "micromatch": "^4.0.4", + + "pretty-format": "^27.5.1", + + "slash": "^3.0.0", + + "stack-utils": "^2.0.3" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/jest-mock": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + + "license": "MIT", + + "dependencies": { + + "@jest/types": "^27.5.1", + + "@types/node": "*" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/jest-pnp-resolver": { + + "version": "1.2.3", + + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + + "license": "MIT", + + "engines": { + + "node": ">=6" + + }, + + "peerDependencies": { + + "jest-resolve": "*" + + }, + + "peerDependenciesMeta": { + + "jest-resolve": { + + "optional": true + + } + + } + + }, + + "node_modules/jest-regex-util": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + + "license": "MIT", + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/jest-resolve": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + + "license": "MIT", + + "dependencies": { + + "@jest/types": "^27.5.1", + + "chalk": "^4.0.0", + + "graceful-fs": "^4.2.9", + + "jest-haste-map": "^27.5.1", + + "jest-pnp-resolver": "^1.2.2", + + "jest-util": "^27.5.1", + + "jest-validate": "^27.5.1", + + "resolve": "^1.20.0", + + "resolve.exports": "^1.1.0", + + "slash": "^3.0.0" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/jest-resolve-dependencies": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + + "license": "MIT", + + "dependencies": { + + "@jest/types": "^27.5.1", + + "jest-regex-util": "^27.5.1", + + "jest-snapshot": "^27.5.1" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/jest-runner": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + + "license": "MIT", + + "dependencies": { + + "@jest/console": "^27.5.1", + + "@jest/environment": "^27.5.1", + + "@jest/test-result": "^27.5.1", + + "@jest/transform": "^27.5.1", + + "@jest/types": "^27.5.1", + + "@types/node": "*", + + "chalk": "^4.0.0", + + "emittery": "^0.8.1", + + "graceful-fs": "^4.2.9", + + "jest-docblock": "^27.5.1", + + "jest-environment-jsdom": "^27.5.1", + + "jest-environment-node": "^27.5.1", + + "jest-haste-map": "^27.5.1", + + "jest-leak-detector": "^27.5.1", + + "jest-message-util": "^27.5.1", + + "jest-resolve": "^27.5.1", + + "jest-runtime": "^27.5.1", + + "jest-util": "^27.5.1", + + "jest-worker": "^27.5.1", + + "source-map-support": "^0.5.6", + + "throat": "^6.0.1" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/jest-runtime": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + + "license": "MIT", + + "dependencies": { + + "@jest/environment": "^27.5.1", + + "@jest/fake-timers": "^27.5.1", + + "@jest/globals": "^27.5.1", + + "@jest/source-map": "^27.5.1", + + "@jest/test-result": "^27.5.1", + + "@jest/transform": "^27.5.1", + + "@jest/types": "^27.5.1", + + "chalk": "^4.0.0", + + "cjs-module-lexer": "^1.0.0", + + "collect-v8-coverage": "^1.0.0", + + "execa": "^5.0.0", + + "glob": "^7.1.3", + + "graceful-fs": "^4.2.9", + + "jest-haste-map": "^27.5.1", + + "jest-message-util": "^27.5.1", + + "jest-mock": "^27.5.1", + + "jest-regex-util": "^27.5.1", + + "jest-resolve": "^27.5.1", + + "jest-snapshot": "^27.5.1", + + "jest-util": "^27.5.1", + + "slash": "^3.0.0", + + "strip-bom": "^4.0.0" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/jest-serializer": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + + "license": "MIT", + + "dependencies": { + + "@types/node": "*", + + "graceful-fs": "^4.2.9" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/jest-snapshot": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + + "license": "MIT", + + "dependencies": { + + "@babel/core": "^7.7.2", + + "@babel/generator": "^7.7.2", + + "@babel/plugin-syntax-typescript": "^7.7.2", + + "@babel/traverse": "^7.7.2", + + "@babel/types": "^7.0.0", + + "@jest/transform": "^27.5.1", + + "@jest/types": "^27.5.1", + + "@types/babel__traverse": "^7.0.4", + + "@types/prettier": "^2.1.5", + + "babel-preset-current-node-syntax": "^1.0.0", + + "chalk": "^4.0.0", + + "expect": "^27.5.1", + + "graceful-fs": "^4.2.9", + + "jest-diff": "^27.5.1", + + "jest-get-type": "^27.5.1", + + "jest-haste-map": "^27.5.1", + + "jest-matcher-utils": "^27.5.1", + + "jest-message-util": "^27.5.1", + + "jest-util": "^27.5.1", + + "natural-compare": "^1.4.0", + + "pretty-format": "^27.5.1", + + "semver": "^7.3.2" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/jest-util": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + + "license": "MIT", + + "dependencies": { + + "@jest/types": "^27.5.1", + + "@types/node": "*", + + "chalk": "^4.0.0", + + "ci-info": "^3.2.0", + + "graceful-fs": "^4.2.9", + + "picomatch": "^2.2.3" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/jest-validate": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + + "license": "MIT", + + "dependencies": { + + "@jest/types": "^27.5.1", + + "camelcase": "^6.2.0", + + "chalk": "^4.0.0", + + "jest-get-type": "^27.5.1", + + "leven": "^3.1.0", + + "pretty-format": "^27.5.1" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/jest-watch-typeahead": { + + "version": "1.1.0", + + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", + + "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", + + "license": "MIT", + + "dependencies": { + + "ansi-escapes": "^4.3.1", + + "chalk": "^4.0.0", + + "jest-regex-util": "^28.0.0", + + "jest-watcher": "^28.0.0", + + "slash": "^4.0.0", + + "string-length": "^5.0.1", + + "strip-ansi": "^7.0.1" + + }, + + "engines": { + + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + + }, + + "peerDependencies": { + + "jest": "^27.0.0 || ^28.0.0" + + } + + }, + + "node_modules/jest-watch-typeahead/node_modules/@jest/console": { + + "version": "28.1.3", + + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", + + "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + + "license": "MIT", + + "dependencies": { + + "@jest/types": "^28.1.3", + + "@types/node": "*", + + "chalk": "^4.0.0", + + "jest-message-util": "^28.1.3", + + "jest-util": "^28.1.3", + + "slash": "^3.0.0" + + }, + + "engines": { + + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + + } + + }, + + "node_modules/jest-watch-typeahead/node_modules/@jest/console/node_modules/slash": { + + "version": "3.0.0", + + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + + "license": "MIT", + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/jest-watch-typeahead/node_modules/@jest/test-result": { + + "version": "28.1.3", + + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + + "license": "MIT", + + "dependencies": { + + "@jest/console": "^28.1.3", + + "@jest/types": "^28.1.3", + + "@types/istanbul-lib-coverage": "^2.0.0", + + "collect-v8-coverage": "^1.0.0" + + }, + + "engines": { + + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + + } + + }, + + "node_modules/jest-watch-typeahead/node_modules/@jest/types": { + + "version": "28.1.3", + + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + + "license": "MIT", + + "dependencies": { + + "@jest/schemas": "^28.1.3", + + "@types/istanbul-lib-coverage": "^2.0.0", + + "@types/istanbul-reports": "^3.0.0", + + "@types/node": "*", + + "@types/yargs": "^17.0.8", + + "chalk": "^4.0.0" + + }, + + "engines": { + + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + + } + + }, + + "node_modules/jest-watch-typeahead/node_modules/@types/yargs": { + + "version": "17.0.33", + + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + + "license": "MIT", + + "dependencies": { + + "@types/yargs-parser": "*" + + } + + }, + + "node_modules/jest-watch-typeahead/node_modules/ansi-styles": { + + "version": "5.2.0", + + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + + "license": "MIT", + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + + } + + }, + + "node_modules/jest-watch-typeahead/node_modules/emittery": { + + "version": "0.10.2", + + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", + + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + + "license": "MIT", + + "engines": { + + "node": ">=12" + + }, + + "funding": { + + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + + } + + }, + + "node_modules/jest-watch-typeahead/node_modules/jest-message-util": { + + "version": "28.1.3", + + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + + "license": "MIT", + + "dependencies": { + + "@babel/code-frame": "^7.12.13", + + "@jest/types": "^28.1.3", + + "@types/stack-utils": "^2.0.0", + + "chalk": "^4.0.0", + + "graceful-fs": "^4.2.9", + + "micromatch": "^4.0.4", + + "pretty-format": "^28.1.3", + + "slash": "^3.0.0", + + "stack-utils": "^2.0.3" + + }, + + "engines": { + + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + + } + + }, + + "node_modules/jest-watch-typeahead/node_modules/jest-message-util/node_modules/slash": { + + "version": "3.0.0", + + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + + "license": "MIT", + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/jest-watch-typeahead/node_modules/jest-regex-util": { + + "version": "28.0.2", + + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + + "license": "MIT", + + "engines": { + + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + + } + + }, + + "node_modules/jest-watch-typeahead/node_modules/jest-util": { + + "version": "28.1.3", + + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + + "license": "MIT", + + "dependencies": { + + "@jest/types": "^28.1.3", + + "@types/node": "*", + + "chalk": "^4.0.0", + + "ci-info": "^3.2.0", + + "graceful-fs": "^4.2.9", + + "picomatch": "^2.2.3" + + }, + + "engines": { + + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + + } + + }, + + "node_modules/jest-watch-typeahead/node_modules/jest-watcher": { + + "version": "28.1.3", + + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", + + "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + + "license": "MIT", + + "dependencies": { + + "@jest/test-result": "^28.1.3", + + "@jest/types": "^28.1.3", + + "@types/node": "*", + + "ansi-escapes": "^4.2.1", + + "chalk": "^4.0.0", + + "emittery": "^0.10.2", + + "jest-util": "^28.1.3", + + "string-length": "^4.0.1" + + }, + + "engines": { + + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + + } + + }, + + "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/string-length": { + + "version": "4.0.2", + + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + + "license": "MIT", + + "dependencies": { + + "char-regex": "^1.0.2", + + "strip-ansi": "^6.0.0" + + }, + + "engines": { + + "node": ">=10" + + } + + }, + + "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/strip-ansi": { + + "version": "6.0.1", + + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + + "license": "MIT", + + "dependencies": { + + "ansi-regex": "^5.0.1" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/jest-watch-typeahead/node_modules/pretty-format": { + + "version": "28.1.3", + + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + + "license": "MIT", + + "dependencies": { + + "@jest/schemas": "^28.1.3", + + "ansi-regex": "^5.0.1", + + "ansi-styles": "^5.0.0", + + "react-is": "^18.0.0" + + }, + + "engines": { + + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + + } + + }, + + "node_modules/jest-watch-typeahead/node_modules/react-is": { + + "version": "18.3.1", + + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + + "license": "MIT" + + }, + + "node_modules/jest-watch-typeahead/node_modules/slash": { + + "version": "4.0.0", + + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + + "license": "MIT", + + "engines": { + + "node": ">=12" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/jest-watch-typeahead/node_modules/string-length": { + + "version": "5.0.1", + + "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", + + "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", + + "license": "MIT", + + "dependencies": { + + "char-regex": "^2.0.0", + + "strip-ansi": "^7.0.1" + + }, + + "engines": { + + "node": ">=12.20" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": { + + "version": "2.0.2", + + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.2.tgz", + + "integrity": "sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==", + + "license": "MIT", + + "engines": { + + "node": ">=12.20" + + } + + }, + + "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { + + "version": "7.1.0", + + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + + "license": "MIT", + + "dependencies": { + + "ansi-regex": "^6.0.1" + + }, + + "engines": { + + "node": ">=12" + + }, + + "funding": { + + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + + } + + }, + + "node_modules/jest-watch-typeahead/node_modules/strip-ansi/node_modules/ansi-regex": { + + "version": "6.1.0", + + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + + "license": "MIT", + + "engines": { + + "node": ">=12" + + }, + + "funding": { + + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + + } + + }, + + "node_modules/jest-watcher": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + + "license": "MIT", + + "dependencies": { + + "@jest/test-result": "^27.5.1", + + "@jest/types": "^27.5.1", + + "@types/node": "*", + + "ansi-escapes": "^4.2.1", + + "chalk": "^4.0.0", + + "jest-util": "^27.5.1", + + "string-length": "^4.0.1" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/jest-worker": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + + "license": "MIT", + + "dependencies": { + + "@types/node": "*", + + "merge-stream": "^2.0.0", + + "supports-color": "^8.0.0" + + }, + + "engines": { + + "node": ">= 10.13.0" + + } + + }, + + "node_modules/jest-worker/node_modules/supports-color": { + + "version": "8.1.1", + + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + + "license": "MIT", + + "dependencies": { + + "has-flag": "^4.0.0" + + }, + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/chalk/supports-color?sponsor=1" + + } + + }, + + "node_modules/jiti": { + + "version": "1.21.7", + + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + + "license": "MIT", + + "bin": { + + "jiti": "bin/jiti.js" + + } + + }, + + "node_modules/js-tokens": { + + "version": "4.0.0", + + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + + "license": "MIT" + + }, + + "node_modules/js-yaml": { + + "version": "3.14.1", + + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + + "license": "MIT", + + "dependencies": { + + "argparse": "^1.0.7", + + "esprima": "^4.0.0" + + }, + + "bin": { + + "js-yaml": "bin/js-yaml.js" + + } + + }, + + "node_modules/jsdom": { + + "version": "16.7.0", + + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + + "license": "MIT", + + "dependencies": { + + "abab": "^2.0.5", + + "acorn": "^8.2.4", + + "acorn-globals": "^6.0.0", + + "cssom": "^0.4.4", + + "cssstyle": "^2.3.0", + + "data-urls": "^2.0.0", + + "decimal.js": "^10.2.1", + + "domexception": "^2.0.1", + + "escodegen": "^2.0.0", + + "form-data": "^3.0.0", + + "html-encoding-sniffer": "^2.0.1", + + "http-proxy-agent": "^4.0.1", + + "https-proxy-agent": "^5.0.0", + + "is-potential-custom-element-name": "^1.0.1", + + "nwsapi": "^2.2.0", + + "parse5": "6.0.1", + + "saxes": "^5.0.1", + + "symbol-tree": "^3.2.4", + + "tough-cookie": "^4.0.0", + + "w3c-hr-time": "^1.0.2", + + "w3c-xmlserializer": "^2.0.0", + + "webidl-conversions": "^6.1.0", + + "whatwg-encoding": "^1.0.5", + + "whatwg-mimetype": "^2.3.0", + + "whatwg-url": "^8.5.0", + + "ws": "^7.4.6", + + "xml-name-validator": "^3.0.0" + + }, + + "engines": { + + "node": ">=10" + + }, + + "peerDependencies": { + + "canvas": "^2.5.0" + + }, + + "peerDependenciesMeta": { + + "canvas": { + + "optional": true + + } + + } + + }, + + "node_modules/jsesc": { + + "version": "3.1.0", + + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + + "license": "MIT", + + "bin": { + + "jsesc": "bin/jsesc" + + }, + + "engines": { + + "node": ">=6" + + } + + }, + + "node_modules/json-buffer": { + + "version": "3.0.1", + + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + + "license": "MIT" + + }, + + "node_modules/json-parse-even-better-errors": { + + "version": "2.3.1", + + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + + "license": "MIT" + + }, + + "node_modules/json-schema": { + + "version": "0.4.0", + + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + + "license": "(AFL-2.1 OR BSD-3-Clause)" + + }, + + "node_modules/json-schema-traverse": { + + "version": "0.4.1", + + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + + "license": "MIT" + + }, + + "node_modules/json-stable-stringify-without-jsonify": { + + "version": "1.0.1", + + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + + "license": "MIT" + + }, + + "node_modules/json5": { + + "version": "2.2.3", + + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + + "license": "MIT", + + "bin": { + + "json5": "lib/cli.js" + + }, + + "engines": { + + "node": ">=6" + + } + + }, + + "node_modules/jsonfile": { + + "version": "6.1.0", + + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + + "license": "MIT", + + "dependencies": { + + "universalify": "^2.0.0" + + }, + + "optionalDependencies": { + + "graceful-fs": "^4.1.6" + + } + + }, + + "node_modules/jsonpath": { + + "version": "1.1.1", + + "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", + + "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", + + "license": "MIT", + + "dependencies": { + + "esprima": "1.2.2", + + "static-eval": "2.0.2", + + "underscore": "1.12.1" + + } + + }, + + "node_modules/jsonpath/node_modules/esprima": { + + "version": "1.2.2", + + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", + + "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==", + + "bin": { + + "esparse": "bin/esparse.js", + + "esvalidate": "bin/esvalidate.js" + + }, + + "engines": { + + "node": ">=0.4.0" + + } + + }, + + "node_modules/jsonpointer": { + + "version": "5.0.1", + + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + + "license": "MIT", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/jspdf": { + + "version": "2.5.1", + + "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-2.5.1.tgz", + + "integrity": "sha512-hXObxz7ZqoyhxET78+XR34Xu2qFGrJJ2I2bE5w4SM8eFaFEkW2xcGRVUss360fYelwRSid/jT078kbNvmoW0QA==", + + "license": "MIT", + + "dependencies": { + + "@babel/runtime": "^7.14.0", + + "atob": "^2.1.2", + + "btoa": "^1.2.1", + + "fflate": "^0.4.8" + + }, + + "optionalDependencies": { + + "canvg": "^3.0.6", + + "core-js": "^3.6.0", + + "dompurify": "^2.2.0", + + "html2canvas": "^1.0.0-rc.5" + + } + + }, + + "node_modules/jspdf-autotable": { + + "version": "3.5.23", + + "resolved": "https://registry.npmjs.org/jspdf-autotable/-/jspdf-autotable-3.5.23.tgz", + + "integrity": "sha512-uIYxQsdKrDdbhygEFlbTVoaxawZMZXMasAOryQ1oMFTragcxLhhWIfc8peLCBXuB7fJ5SICtPZ2De7Pk7eS8SQ==", + + "license": "MIT", + + "peerDependencies": { + + "jspdf": "^2.3.1" + + } + + }, + + "node_modules/jsx-ast-utils": { + + "version": "3.3.5", + + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + + "license": "MIT", + + "dependencies": { + + "array-includes": "^3.1.6", + + "array.prototype.flat": "^1.3.1", + + "object.assign": "^4.1.4", + + "object.values": "^1.1.6" + + }, + + "engines": { + + "node": ">=4.0" + + } + + }, + + "node_modules/jwt-decode": { + + "version": "4.0.0", + + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", + + "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", + + "license": "MIT", + + "engines": { + + "node": ">=18" + + } + + }, + + "node_modules/keyv": { + + "version": "4.5.4", + + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + + "license": "MIT", + + "dependencies": { + + "json-buffer": "3.0.1" + + } + + }, + + "node_modules/kind-of": { + + "version": "6.0.3", + + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + + "license": "MIT", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/kleur": { + + "version": "3.0.3", + + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + + "license": "MIT", + + "engines": { + + "node": ">=6" + + } + + }, + + "node_modules/klona": { + + "version": "2.0.6", + + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + + "license": "MIT", + + "engines": { + + "node": ">= 8" + + } + + }, + + "node_modules/language-subtag-registry": { + + "version": "0.3.23", + + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + + "license": "CC0-1.0" + + }, + + "node_modules/language-tags": { + + "version": "1.0.9", + + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + + "license": "MIT", + + "dependencies": { + + "language-subtag-registry": "^0.3.20" + + }, + + "engines": { + + "node": ">=0.10" + + } + + }, + + "node_modules/launch-editor": { + + "version": "2.10.0", + + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.10.0.tgz", + + "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==", + + "license": "MIT", + + "dependencies": { + + "picocolors": "^1.0.0", + + "shell-quote": "^1.8.1" + + } + + }, + + "node_modules/leven": { + + "version": "3.1.0", + + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + + "license": "MIT", + + "engines": { + + "node": ">=6" + + } + + }, + + "node_modules/levn": { + + "version": "0.4.1", + + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + + "license": "MIT", + + "dependencies": { + + "prelude-ls": "^1.2.1", + + "type-check": "~0.4.0" + + }, + + "engines": { + + "node": ">= 0.8.0" + + } + + }, + + "node_modules/lilconfig": { + + "version": "2.1.0", + + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + + "license": "MIT", + + "engines": { + + "node": ">=10" + + } + + }, + + "node_modules/lines-and-columns": { + + "version": "1.2.4", + + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + + "license": "MIT" + + }, + + "node_modules/loader-runner": { + + "version": "4.3.0", + + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + + "license": "MIT", + + "engines": { + + "node": ">=6.11.5" + + } + + }, + + "node_modules/loader-utils": { + + "version": "2.0.4", + + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + + "license": "MIT", + + "dependencies": { + + "big.js": "^5.2.2", + + "emojis-list": "^3.0.0", + + "json5": "^2.1.2" + + }, + + "engines": { + + "node": ">=8.9.0" + + } + + }, + + "node_modules/locate-path": { + + "version": "5.0.0", + + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + + "license": "MIT", + + "dependencies": { + + "p-locate": "^4.1.0" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/lodash": { + + "version": "4.17.21", + + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + + "license": "MIT" + + }, + + "node_modules/lodash.debounce": { + + "version": "4.0.8", + + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + + "license": "MIT" + + }, + + "node_modules/lodash.memoize": { + + "version": "4.1.2", + + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + + "license": "MIT" + + }, + + "node_modules/lodash.merge": { + + "version": "4.6.2", + + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + + "license": "MIT" + + }, + + "node_modules/lodash.sortby": { + + "version": "4.7.0", + + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + + "license": "MIT" + + }, + + "node_modules/lodash.uniq": { + + "version": "4.5.0", + + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + + "license": "MIT" + + }, + + "node_modules/loose-envify": { + + "version": "1.4.0", + + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + + "license": "MIT", + + "dependencies": { + + "js-tokens": "^3.0.0 || ^4.0.0" + + }, + + "bin": { + + "loose-envify": "cli.js" + + } + + }, + + "node_modules/lower-case": { + + "version": "2.0.2", + + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + + "license": "MIT", + + "dependencies": { + + "tslib": "^2.0.3" + + } + + }, + + "node_modules/lru-cache": { + + "version": "5.1.1", + + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + + "license": "ISC", + + "dependencies": { + + "yallist": "^3.0.2" + + } + + }, + + "node_modules/lz-string": { + + "version": "1.5.0", + + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + + "license": "MIT", + + "bin": { + + "lz-string": "bin/bin.js" + + } + + }, + + "node_modules/magic-string": { + + "version": "0.25.9", + + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + + "license": "MIT", + + "dependencies": { + + "sourcemap-codec": "^1.4.8" + + } + + }, + + "node_modules/make-dir": { + + "version": "3.1.0", + + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + + "license": "MIT", + + "dependencies": { + + "semver": "^6.0.0" + + }, + + "engines": { + + "node": ">=8" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/make-dir/node_modules/semver": { + + "version": "6.3.1", + + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + + "license": "ISC", + + "bin": { + + "semver": "bin/semver.js" + + } + + }, + + "node_modules/makeerror": { + + "version": "1.0.12", + + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + + "license": "BSD-3-Clause", + + "dependencies": { + + "tmpl": "1.0.5" + + } + + }, + + "node_modules/math-intrinsics": { + + "version": "1.1.0", + + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.4" + + } + + }, + + "node_modules/mdn-data": { + + "version": "2.0.4", + + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + + "license": "CC0-1.0" + + }, + + "node_modules/media-typer": { + + "version": "0.3.0", + + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.6" + + } + + }, + + "node_modules/memfs": { + + "version": "3.5.3", + + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + + "license": "Unlicense", + + "dependencies": { + + "fs-monkey": "^1.0.4" + + }, + + "engines": { + + "node": ">= 4.0.0" + + } + + }, + + "node_modules/merge-descriptors": { + + "version": "1.0.3", + + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + + "license": "MIT", + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/merge-stream": { + + "version": "2.0.0", + + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + + "license": "MIT" + + }, + + "node_modules/merge2": { + + "version": "1.4.1", + + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + + "license": "MIT", + + "engines": { + + "node": ">= 8" + + } + + }, + + "node_modules/methods": { + + "version": "1.1.2", + + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.6" + + } + + }, + + "node_modules/micromatch": { + + "version": "4.0.8", + + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + + "license": "MIT", + + "dependencies": { + + "braces": "^3.0.3", + + "picomatch": "^2.3.1" + + }, + + "engines": { + + "node": ">=8.6" + + } + + }, + + "node_modules/mime": { + + "version": "1.6.0", + + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + + "license": "MIT", + + "bin": { + + "mime": "cli.js" + + }, + + "engines": { + + "node": ">=4" + + } + + }, + + "node_modules/mime-db": { + + "version": "1.52.0", + + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.6" + + } + + }, + + "node_modules/mime-types": { + + "version": "2.1.35", + + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + + "license": "MIT", + + "dependencies": { + + "mime-db": "1.52.0" + + }, + + "engines": { + + "node": ">= 0.6" + + } + + }, + + "node_modules/mimic-fn": { + + "version": "2.1.0", + + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + + "license": "MIT", + + "engines": { + + "node": ">=6" + + } + + }, + + "node_modules/min-indent": { + + "version": "1.0.1", + + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + + "license": "MIT", + + "engines": { + + "node": ">=4" + + } + + }, + + "node_modules/mini-css-extract-plugin": { + + "version": "2.9.2", + + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", + + "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", + + "license": "MIT", + + "dependencies": { + + "schema-utils": "^4.0.0", + + "tapable": "^2.2.1" + + }, + + "engines": { + + "node": ">= 12.13.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/webpack" + + }, + + "peerDependencies": { + + "webpack": "^5.0.0" + + } + + }, + + "node_modules/minimalistic-assert": { + + "version": "1.0.1", + + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + + "license": "ISC" + + }, + + "node_modules/minimatch": { + + "version": "3.1.2", + + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + + "license": "ISC", + + "dependencies": { + + "brace-expansion": "^1.1.7" + + }, + + "engines": { + + "node": "*" + + } + + }, + + "node_modules/minimist": { + + "version": "1.2.8", + + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + + "license": "MIT", + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/minipass": { + + "version": "7.1.2", + + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + + "license": "ISC", + + "engines": { + + "node": ">=16 || 14 >=14.17" + + } + + }, + + "node_modules/mkdirp": { + + "version": "0.5.6", + + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + + "license": "MIT", + + "dependencies": { + + "minimist": "^1.2.6" + + }, + + "bin": { + + "mkdirp": "bin/cmd.js" + + } + + }, + + "node_modules/motion-dom": { + + "version": "12.22.0", + + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.22.0.tgz", + + "integrity": "sha512-ooH7+/BPw9gOsL9VtPhEJHE2m4ltnhMlcGMhEqA0YGNhKof7jdaszvsyThXI6LVIKshJUZ9/CP6HNqQhJfV7kw==", + + "license": "MIT", + + "dependencies": { + + "motion-utils": "^12.19.0" + + } + + }, + + "node_modules/motion-utils": { + + "version": "12.19.0", + + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.19.0.tgz", + + "integrity": "sha512-BuFTHINYmV07pdWs6lj6aI63vr2N4dg0vR+td0rtrdpWOhBzIkEklZyLcvKBoEtwSqx8Jg06vUB5RS0xDiUybw==", + + "license": "MIT" + + }, + + "node_modules/ms": { + + "version": "2.1.3", + + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + + "license": "MIT" + + }, + + "node_modules/multicast-dns": { + + "version": "7.2.5", + + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + + "license": "MIT", + + "dependencies": { + + "dns-packet": "^5.2.2", + + "thunky": "^1.0.2" + + }, + + "bin": { + + "multicast-dns": "cli.js" + + } + + }, + + "node_modules/mz": { + + "version": "2.7.0", + + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + + "license": "MIT", + + "dependencies": { + + "any-promise": "^1.0.0", + + "object-assign": "^4.0.1", + + "thenify-all": "^1.0.0" + + } + + }, + + "node_modules/nanoid": { + + "version": "3.3.11", + + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + + "funding": [ + + { + + "type": "github", + + "url": "https://github.com/sponsors/ai" + + } + + ], + + "license": "MIT", + + "bin": { + + "nanoid": "bin/nanoid.cjs" + + }, + + "engines": { + + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + + } + + }, + + "node_modules/natural-compare": { + + "version": "1.4.0", + + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + + "license": "MIT" + + }, + + "node_modules/natural-compare-lite": { + + "version": "1.4.0", + + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + + "license": "MIT" + + }, + + "node_modules/negotiator": { + + "version": "0.6.4", + + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.6" + + } + + }, + + "node_modules/neo-async": { + + "version": "2.6.2", + + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + + "license": "MIT" + + }, + + "node_modules/no-case": { + + "version": "3.0.4", + + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + + "license": "MIT", + + "dependencies": { + + "lower-case": "^2.0.2", + + "tslib": "^2.0.3" + + } + + }, + + "node_modules/node-forge": { + + "version": "1.3.1", + + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + + "license": "(BSD-3-Clause OR GPL-2.0)", + + "engines": { + + "node": ">= 6.13.0" + + } + + }, + + "node_modules/node-int64": { + + "version": "0.4.0", + + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + + "license": "MIT" + + }, + + "node_modules/node-releases": { + + "version": "2.0.19", + + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + + "license": "MIT" + + }, + + "node_modules/normalize-path": { + + "version": "3.0.0", + + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + + "license": "MIT", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/normalize-range": { + + "version": "0.1.2", + + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + + "license": "MIT", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/normalize-url": { + + "version": "6.1.0", + + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + + "license": "MIT", + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/npm-run-path": { + + "version": "4.0.1", + + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + + "license": "MIT", + + "dependencies": { + + "path-key": "^3.0.0" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/nth-check": { + + "version": "2.1.1", + + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + + "license": "BSD-2-Clause", + + "dependencies": { + + "boolbase": "^1.0.0" + + }, + + "funding": { + + "url": "https://github.com/fb55/nth-check?sponsor=1" + + } + + }, + + "node_modules/nwsapi": { + + "version": "2.2.20", + + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz", + + "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==", + + "license": "MIT" + + }, + + "node_modules/object-assign": { + + "version": "4.1.1", + + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + + "license": "MIT", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/object-hash": { + + "version": "3.0.0", + + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + + "license": "MIT", + + "engines": { + + "node": ">= 6" + + } + + }, + + "node_modules/object-inspect": { + + "version": "1.13.4", + + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/object-keys": { + + "version": "1.1.1", + + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.4" + + } + + }, + + "node_modules/object.assign": { + + "version": "4.1.7", + + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + + "license": "MIT", + + "dependencies": { + + "call-bind": "^1.0.8", + + "call-bound": "^1.0.3", + + "define-properties": "^1.2.1", + + "es-object-atoms": "^1.0.0", + + "has-symbols": "^1.1.0", + + "object-keys": "^1.1.1" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/object.entries": { + + "version": "1.1.9", + + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + + "license": "MIT", + + "dependencies": { + + "call-bind": "^1.0.8", + + "call-bound": "^1.0.4", + + "define-properties": "^1.2.1", + + "es-object-atoms": "^1.1.1" + + }, + + "engines": { + + "node": ">= 0.4" + + } + + }, + + "node_modules/object.fromentries": { + + "version": "2.0.8", + + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + + "license": "MIT", + + "dependencies": { + + "call-bind": "^1.0.7", + + "define-properties": "^1.2.1", + + "es-abstract": "^1.23.2", + + "es-object-atoms": "^1.0.0" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/object.getownpropertydescriptors": { + + "version": "2.1.8", + + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz", + + "integrity": "sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==", + + "license": "MIT", + + "dependencies": { + + "array.prototype.reduce": "^1.0.6", + + "call-bind": "^1.0.7", + + "define-properties": "^1.2.1", + + "es-abstract": "^1.23.2", + + "es-object-atoms": "^1.0.0", + + "gopd": "^1.0.1", + + "safe-array-concat": "^1.1.2" + + }, + + "engines": { + + "node": ">= 0.8" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/object.groupby": { + + "version": "1.0.3", + + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + + "license": "MIT", + + "dependencies": { + + "call-bind": "^1.0.7", + + "define-properties": "^1.2.1", + + "es-abstract": "^1.23.2" + + }, + + "engines": { + + "node": ">= 0.4" + + } + + }, + + "node_modules/object.values": { + + "version": "1.2.1", + + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + + "license": "MIT", + + "dependencies": { + + "call-bind": "^1.0.8", + + "call-bound": "^1.0.3", + + "define-properties": "^1.2.1", + + "es-object-atoms": "^1.0.0" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/obuf": { + + "version": "1.1.2", + + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + + "license": "MIT" + + }, + + "node_modules/on-finished": { + + "version": "2.4.1", + + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + + "license": "MIT", + + "dependencies": { + + "ee-first": "1.1.1" + + }, + + "engines": { + + "node": ">= 0.8" + + } + + }, + + "node_modules/on-headers": { + + "version": "1.0.2", + + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.8" + + } + + }, + + "node_modules/once": { + + "version": "1.4.0", + + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + + "license": "ISC", + + "dependencies": { + + "wrappy": "1" + + } + + }, + + "node_modules/onetime": { + + "version": "5.1.2", + + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + + "license": "MIT", + + "dependencies": { + + "mimic-fn": "^2.1.0" + + }, + + "engines": { + + "node": ">=6" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/open": { + + "version": "8.4.2", + + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + + "license": "MIT", + + "dependencies": { + + "define-lazy-prop": "^2.0.0", + + "is-docker": "^2.1.1", + + "is-wsl": "^2.2.0" + + }, + + "engines": { + + "node": ">=12" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/optionator": { + + "version": "0.9.4", + + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + + "license": "MIT", + + "dependencies": { + + "deep-is": "^0.1.3", + + "fast-levenshtein": "^2.0.6", + + "levn": "^0.4.1", + + "prelude-ls": "^1.2.1", + + "type-check": "^0.4.0", + + "word-wrap": "^1.2.5" + + }, + + "engines": { + + "node": ">= 0.8.0" + + } + + }, + + "node_modules/own-keys": { + + "version": "1.0.1", + + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + + "license": "MIT", + + "dependencies": { + + "get-intrinsic": "^1.2.6", + + "object-keys": "^1.1.1", + + "safe-push-apply": "^1.0.0" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/p-limit": { + + "version": "2.3.0", + + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + + "license": "MIT", + + "dependencies": { + + "p-try": "^2.0.0" + + }, + + "engines": { + + "node": ">=6" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/p-locate": { + + "version": "4.1.0", + + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + + "license": "MIT", + + "dependencies": { + + "p-limit": "^2.2.0" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/p-retry": { + + "version": "4.6.2", + + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + + "license": "MIT", + + "dependencies": { + + "@types/retry": "0.12.0", + + "retry": "^0.13.1" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/p-try": { + + "version": "2.2.0", + + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + + "license": "MIT", + + "engines": { + + "node": ">=6" + + } + + }, + + "node_modules/package-json-from-dist": { + + "version": "1.0.1", + + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + + "license": "BlueOak-1.0.0" + + }, + + "node_modules/param-case": { + + "version": "3.0.4", + + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + + "license": "MIT", + + "dependencies": { + + "dot-case": "^3.0.4", + + "tslib": "^2.0.3" + + } + + }, + + "node_modules/parent-module": { + + "version": "1.0.1", + + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + + "license": "MIT", + + "dependencies": { + + "callsites": "^3.0.0" + + }, + + "engines": { + + "node": ">=6" + + } + + }, + + "node_modules/parse-json": { + + "version": "5.2.0", + + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + + "license": "MIT", + + "dependencies": { + + "@babel/code-frame": "^7.0.0", + + "error-ex": "^1.3.1", + + "json-parse-even-better-errors": "^2.3.0", + + "lines-and-columns": "^1.1.6" + + }, + + "engines": { + + "node": ">=8" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/parse5": { + + "version": "6.0.1", + + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + + "license": "MIT" + + }, + + "node_modules/parseurl": { + + "version": "1.3.3", + + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.8" + + } + + }, + + "node_modules/pascal-case": { + + "version": "3.1.2", + + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + + "license": "MIT", + + "dependencies": { + + "no-case": "^3.0.4", + + "tslib": "^2.0.3" + + } + + }, + + "node_modules/path-exists": { + + "version": "4.0.0", + + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + + "license": "MIT", + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/path-is-absolute": { + + "version": "1.0.1", + + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + + "license": "MIT", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/path-key": { + + "version": "3.1.1", + + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + + "license": "MIT", + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/path-parse": { + + "version": "1.0.7", + + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + + "license": "MIT" + + }, + + "node_modules/path-scurry": { + + "version": "1.11.1", + + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + + "license": "BlueOak-1.0.0", + + "dependencies": { + + "lru-cache": "^10.2.0", + + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + + }, + + "engines": { + + "node": ">=16 || 14 >=14.18" + + }, + + "funding": { + + "url": "https://github.com/sponsors/isaacs" + + } + + }, + + "node_modules/path-scurry/node_modules/lru-cache": { + + "version": "10.4.3", + + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + + "license": "ISC" + + }, + + "node_modules/path-to-regexp": { + + "version": "0.1.12", + + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + + "license": "MIT" + + }, + + "node_modules/path-type": { + + "version": "4.0.0", + + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + + "license": "MIT", + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/performance-now": { + + "version": "2.1.0", + + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + + "license": "MIT" + + }, + + "node_modules/picocolors": { + + "version": "1.1.1", + + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + + "license": "ISC" + + }, + + "node_modules/picomatch": { + + "version": "2.3.1", + + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + + "license": "MIT", + + "engines": { + + "node": ">=8.6" + + }, + + "funding": { + + "url": "https://github.com/sponsors/jonschlinkert" + + } + + }, + + "node_modules/pify": { + + "version": "2.3.0", + + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + + "license": "MIT", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/pirates": { + + "version": "4.0.7", + + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + + "license": "MIT", + + "engines": { + + "node": ">= 6" + + } + + }, + + "node_modules/pkg-dir": { + + "version": "4.2.0", + + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + + "license": "MIT", + + "dependencies": { + + "find-up": "^4.0.0" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/pkg-up": { + + "version": "3.1.0", + + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + + "license": "MIT", + + "dependencies": { + + "find-up": "^3.0.0" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/pkg-up/node_modules/find-up": { + + "version": "3.0.0", + + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + + "license": "MIT", + + "dependencies": { + + "locate-path": "^3.0.0" + + }, + + "engines": { + + "node": ">=6" + + } + + }, + + "node_modules/pkg-up/node_modules/locate-path": { + + "version": "3.0.0", + + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + + "license": "MIT", + + "dependencies": { + + "p-locate": "^3.0.0", + + "path-exists": "^3.0.0" + + }, + + "engines": { + + "node": ">=6" + + } + + }, + + "node_modules/pkg-up/node_modules/p-locate": { + + "version": "3.0.0", + + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + + "license": "MIT", + + "dependencies": { + + "p-limit": "^2.0.0" + + }, + + "engines": { + + "node": ">=6" + + } + + }, + + "node_modules/pkg-up/node_modules/path-exists": { + + "version": "3.0.0", + + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + + "license": "MIT", + + "engines": { + + "node": ">=4" + + } + + }, + + "node_modules/possible-typed-array-names": { + + "version": "1.1.0", + + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.4" + + } + + }, + + "node_modules/postcss": { + + "version": "8.5.3", + + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + + "funding": [ + + { + + "type": "opencollective", + + "url": "https://opencollective.com/postcss/" + + }, + + { + + "type": "tidelift", + + "url": "https://tidelift.com/funding/github/npm/postcss" + + }, + + { + + "type": "github", + + "url": "https://github.com/sponsors/ai" + + } + + ], + + "license": "MIT", + + "dependencies": { + + "nanoid": "^3.3.8", + + "picocolors": "^1.1.1", + + "source-map-js": "^1.2.1" + + }, + + "engines": { + + "node": "^10 || ^12 || >=14" + + } + + }, + + "node_modules/postcss-attribute-case-insensitive": { + + "version": "5.0.2", + + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", + + "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", + + "license": "MIT", + + "dependencies": { + + "postcss-selector-parser": "^6.0.10" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss": "^8.2" + + } + + }, + + "node_modules/postcss-browser-comments": { + + "version": "4.0.0", + + "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", + + "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", + + "license": "CC0-1.0", + + "engines": { + + "node": ">=8" + + }, + + "peerDependencies": { + + "browserslist": ">=4", + + "postcss": ">=8" + + } + + }, + + "node_modules/postcss-calc": { + + "version": "8.2.4", + + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + + "license": "MIT", + + "dependencies": { + + "postcss-selector-parser": "^6.0.9", + + "postcss-value-parser": "^4.2.0" + + }, + + "peerDependencies": { + + "postcss": "^8.2.2" + + } + + }, + + "node_modules/postcss-clamp": { + + "version": "4.1.0", + + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + + "license": "MIT", + + "dependencies": { + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": ">=7.6.0" + + }, + + "peerDependencies": { + + "postcss": "^8.4.6" + + } + + }, + + "node_modules/postcss-color-functional-notation": { + + "version": "4.2.4", + + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", + + "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", + + "license": "CC0-1.0", + + "dependencies": { + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss": "^8.2" + + } + + }, + + "node_modules/postcss-color-hex-alpha": { + + "version": "8.0.4", + + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", + + "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", + + "license": "MIT", + + "dependencies": { + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss": "^8.4" + + } + + }, + + "node_modules/postcss-color-rebeccapurple": { + + "version": "7.1.1", + + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", + + "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", + + "license": "CC0-1.0", + + "dependencies": { + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss": "^8.2" + + } + + }, + + "node_modules/postcss-colormin": { + + "version": "5.3.1", + + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + + "license": "MIT", + + "dependencies": { + + "browserslist": "^4.21.4", + + "caniuse-api": "^3.0.0", + + "colord": "^2.9.1", + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^10 || ^12 || >=14.0" + + }, + + "peerDependencies": { + + "postcss": "^8.2.15" + + } + + }, + + "node_modules/postcss-convert-values": { + + "version": "5.1.3", + + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + + "license": "MIT", + + "dependencies": { + + "browserslist": "^4.21.4", + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^10 || ^12 || >=14.0" + + }, + + "peerDependencies": { + + "postcss": "^8.2.15" + + } + + }, + + "node_modules/postcss-custom-media": { + + "version": "8.0.2", + + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", + + "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", + + "license": "MIT", + + "dependencies": { + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss": "^8.3" + + } + + }, + + "node_modules/postcss-custom-properties": { + + "version": "12.1.11", + + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", + + "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", + + "license": "MIT", + + "dependencies": { + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss": "^8.2" + + } + + }, + + "node_modules/postcss-custom-selectors": { + + "version": "6.0.3", + + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", + + "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", + + "license": "MIT", + + "dependencies": { + + "postcss-selector-parser": "^6.0.4" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss": "^8.3" + + } + + }, + + "node_modules/postcss-dir-pseudo-class": { + + "version": "6.0.5", + + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", + + "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", + + "license": "CC0-1.0", + + "dependencies": { + + "postcss-selector-parser": "^6.0.10" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss": "^8.2" + + } + + }, + + "node_modules/postcss-discard-comments": { + + "version": "5.1.2", + + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + + "license": "MIT", + + "engines": { + + "node": "^10 || ^12 || >=14.0" + + }, + + "peerDependencies": { + + "postcss": "^8.2.15" + + } + + }, + + "node_modules/postcss-discard-duplicates": { + + "version": "5.1.0", + + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + + "license": "MIT", + + "engines": { + + "node": "^10 || ^12 || >=14.0" + + }, + + "peerDependencies": { + + "postcss": "^8.2.15" + + } + + }, + + "node_modules/postcss-discard-empty": { + + "version": "5.1.1", + + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + + "license": "MIT", + + "engines": { + + "node": "^10 || ^12 || >=14.0" + + }, + + "peerDependencies": { + + "postcss": "^8.2.15" + + } + + }, + + "node_modules/postcss-discard-overridden": { + + "version": "5.1.0", + + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + + "license": "MIT", + + "engines": { + + "node": "^10 || ^12 || >=14.0" + + }, + + "peerDependencies": { + + "postcss": "^8.2.15" + + } + + }, + + "node_modules/postcss-double-position-gradients": { + + "version": "3.1.2", + + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", + + "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", + + "license": "CC0-1.0", + + "dependencies": { + + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss": "^8.2" + + } + + }, + + "node_modules/postcss-env-function": { + + "version": "4.0.6", + + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", + + "license": "CC0-1.0", + + "dependencies": { + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "peerDependencies": { + + "postcss": "^8.4" + + } + + }, + + "node_modules/postcss-flexbugs-fixes": { + + "version": "5.0.2", + + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", + + "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", + + "license": "MIT", + + "peerDependencies": { + + "postcss": "^8.1.4" + + } + + }, + + "node_modules/postcss-focus-visible": { + + "version": "6.0.4", + + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + + "license": "CC0-1.0", + + "dependencies": { + + "postcss-selector-parser": "^6.0.9" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "peerDependencies": { + + "postcss": "^8.4" + + } + + }, + + "node_modules/postcss-focus-within": { + + "version": "5.0.4", + + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + + "license": "CC0-1.0", + + "dependencies": { + + "postcss-selector-parser": "^6.0.9" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "peerDependencies": { + + "postcss": "^8.4" + + } + + }, + + "node_modules/postcss-font-variant": { + + "version": "5.0.0", + + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + + "license": "MIT", + + "peerDependencies": { + + "postcss": "^8.1.0" + + } + + }, + + "node_modules/postcss-gap-properties": { + + "version": "3.0.5", + + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", + + "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", + + "license": "CC0-1.0", + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss": "^8.2" + + } + + }, + + "node_modules/postcss-image-set-function": { + + "version": "4.0.7", + + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", + + "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", + + "license": "CC0-1.0", + + "dependencies": { + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss": "^8.2" + + } + + }, + + "node_modules/postcss-import": { + + "version": "15.1.0", + + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + + "license": "MIT", + + "dependencies": { + + "postcss-value-parser": "^4.0.0", + + "read-cache": "^1.0.0", + + "resolve": "^1.1.7" + + }, + + "engines": { + + "node": ">=14.0.0" + + }, + + "peerDependencies": { + + "postcss": "^8.0.0" + + } + + }, + + "node_modules/postcss-initial": { + + "version": "4.0.1", + + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + + "license": "MIT", + + "peerDependencies": { + + "postcss": "^8.0.0" + + } + + }, + + "node_modules/postcss-js": { + + "version": "4.0.1", + + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + + "license": "MIT", + + "dependencies": { + + "camelcase-css": "^2.0.1" + + }, + + "engines": { + + "node": "^12 || ^14 || >= 16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/postcss/" + + }, + + "peerDependencies": { + + "postcss": "^8.4.21" + + } + + }, + + "node_modules/postcss-lab-function": { + + "version": "4.2.1", + + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", + + "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", + + "license": "CC0-1.0", + + "dependencies": { + + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss": "^8.2" + + } + + }, + + "node_modules/postcss-load-config": { + + "version": "4.0.2", + + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + + "funding": [ + + { + + "type": "opencollective", + + "url": "https://opencollective.com/postcss/" + + }, + + { + + "type": "github", + + "url": "https://github.com/sponsors/ai" + + } + + ], + + "license": "MIT", + + "dependencies": { + + "lilconfig": "^3.0.0", + + "yaml": "^2.3.4" + + }, + + "engines": { + + "node": ">= 14" + + }, + + "peerDependencies": { + + "postcss": ">=8.0.9", + + "ts-node": ">=9.0.0" + + }, + + "peerDependenciesMeta": { + + "postcss": { + + "optional": true + + }, + + "ts-node": { + + "optional": true + + } + + } + + }, + + "node_modules/postcss-load-config/node_modules/lilconfig": { + + "version": "3.1.3", + + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + + "license": "MIT", + + "engines": { + + "node": ">=14" + + }, + + "funding": { + + "url": "https://github.com/sponsors/antonk52" + + } + + }, + + "node_modules/postcss-load-config/node_modules/yaml": { + + "version": "2.7.1", + + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", + + "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", + + "license": "ISC", + + "bin": { + + "yaml": "bin.mjs" + + }, + + "engines": { + + "node": ">= 14" + + } + + }, + + "node_modules/postcss-loader": { + + "version": "6.2.1", + + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + + "license": "MIT", + + "dependencies": { + + "cosmiconfig": "^7.0.0", + + "klona": "^2.0.5", + + "semver": "^7.3.5" + + }, + + "engines": { + + "node": ">= 12.13.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/webpack" + + }, + + "peerDependencies": { + + "postcss": "^7.0.0 || ^8.0.1", + + "webpack": "^5.0.0" + + } + + }, + + "node_modules/postcss-logical": { + + "version": "5.0.4", + + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + + "license": "CC0-1.0", + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "peerDependencies": { + + "postcss": "^8.4" + + } + + }, + + "node_modules/postcss-media-minmax": { + + "version": "5.0.0", + + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + + "license": "MIT", + + "engines": { + + "node": ">=10.0.0" + + }, + + "peerDependencies": { + + "postcss": "^8.1.0" + + } + + }, + + "node_modules/postcss-merge-longhand": { + + "version": "5.1.7", + + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + + "license": "MIT", + + "dependencies": { + + "postcss-value-parser": "^4.2.0", + + "stylehacks": "^5.1.1" + + }, + + "engines": { + + "node": "^10 || ^12 || >=14.0" + + }, + + "peerDependencies": { + + "postcss": "^8.2.15" + + } + + }, + + "node_modules/postcss-merge-rules": { + + "version": "5.1.4", + + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + + "license": "MIT", + + "dependencies": { + + "browserslist": "^4.21.4", + + "caniuse-api": "^3.0.0", + + "cssnano-utils": "^3.1.0", + + "postcss-selector-parser": "^6.0.5" + + }, + + "engines": { + + "node": "^10 || ^12 || >=14.0" + + }, + + "peerDependencies": { + + "postcss": "^8.2.15" + + } + + }, + + "node_modules/postcss-minify-font-values": { + + "version": "5.1.0", + + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + + "license": "MIT", + + "dependencies": { + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^10 || ^12 || >=14.0" + + }, + + "peerDependencies": { + + "postcss": "^8.2.15" + + } + + }, + + "node_modules/postcss-minify-gradients": { + + "version": "5.1.1", + + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + + "license": "MIT", + + "dependencies": { + + "colord": "^2.9.1", + + "cssnano-utils": "^3.1.0", + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^10 || ^12 || >=14.0" + + }, + + "peerDependencies": { + + "postcss": "^8.2.15" + + } + + }, + + "node_modules/postcss-minify-params": { + + "version": "5.1.4", + + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + + "license": "MIT", + + "dependencies": { + + "browserslist": "^4.21.4", + + "cssnano-utils": "^3.1.0", + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^10 || ^12 || >=14.0" + + }, + + "peerDependencies": { + + "postcss": "^8.2.15" + + } + + }, + + "node_modules/postcss-minify-selectors": { + + "version": "5.2.1", + + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + + "license": "MIT", + + "dependencies": { + + "postcss-selector-parser": "^6.0.5" + + }, + + "engines": { + + "node": "^10 || ^12 || >=14.0" + + }, + + "peerDependencies": { + + "postcss": "^8.2.15" + + } + + }, + + "node_modules/postcss-modules-extract-imports": { + + "version": "3.1.0", + + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + + "license": "ISC", + + "engines": { + + "node": "^10 || ^12 || >= 14" + + }, + + "peerDependencies": { + + "postcss": "^8.1.0" + + } + + }, + + "node_modules/postcss-modules-local-by-default": { + + "version": "4.2.0", + + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + + "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", + + "license": "MIT", + + "dependencies": { + + "icss-utils": "^5.0.0", + + "postcss-selector-parser": "^7.0.0", + + "postcss-value-parser": "^4.1.0" + + }, + + "engines": { + + "node": "^10 || ^12 || >= 14" + + }, + + "peerDependencies": { + + "postcss": "^8.1.0" + + } + + }, + + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + + "version": "7.1.0", + + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + + "license": "MIT", + + "dependencies": { + + "cssesc": "^3.0.0", + + "util-deprecate": "^1.0.2" + + }, + + "engines": { + + "node": ">=4" + + } + + }, + + "node_modules/postcss-modules-scope": { + + "version": "3.2.1", + + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + + "license": "ISC", + + "dependencies": { + + "postcss-selector-parser": "^7.0.0" + + }, + + "engines": { + + "node": "^10 || ^12 || >= 14" + + }, + + "peerDependencies": { + + "postcss": "^8.1.0" + + } + + }, + + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + + "version": "7.1.0", + + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", + + "license": "MIT", + + "dependencies": { + + "cssesc": "^3.0.0", + + "util-deprecate": "^1.0.2" + + }, + + "engines": { + + "node": ">=4" + + } + + }, + + "node_modules/postcss-modules-values": { + + "version": "4.0.0", + + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + + "license": "ISC", + + "dependencies": { + + "icss-utils": "^5.0.0" + + }, + + "engines": { + + "node": "^10 || ^12 || >= 14" + + }, + + "peerDependencies": { + + "postcss": "^8.1.0" + + } + + }, + + "node_modules/postcss-nested": { + + "version": "6.2.0", + + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + + "funding": [ + + { + + "type": "opencollective", + + "url": "https://opencollective.com/postcss/" + + }, + + { + + "type": "github", + + "url": "https://github.com/sponsors/ai" + + } + + ], + + "license": "MIT", + + "dependencies": { + + "postcss-selector-parser": "^6.1.1" + + }, + + "engines": { + + "node": ">=12.0" + + }, + + "peerDependencies": { + + "postcss": "^8.2.14" + + } + + }, + + "node_modules/postcss-nesting": { + + "version": "10.2.0", + + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", + + "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", + + "license": "CC0-1.0", + + "dependencies": { + + "@csstools/selector-specificity": "^2.0.0", + + "postcss-selector-parser": "^6.0.10" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss": "^8.2" + + } + + }, + + "node_modules/postcss-normalize": { + + "version": "10.0.1", + + "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", + + "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", + + "license": "CC0-1.0", + + "dependencies": { + + "@csstools/normalize.css": "*", + + "postcss-browser-comments": "^4", + + "sanitize.css": "*" + + }, + + "engines": { + + "node": ">= 12" + + }, + + "peerDependencies": { + + "browserslist": ">= 4", + + "postcss": ">= 8" + + } + + }, + + "node_modules/postcss-normalize-charset": { + + "version": "5.1.0", + + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + + "license": "MIT", + + "engines": { + + "node": "^10 || ^12 || >=14.0" + + }, + + "peerDependencies": { + + "postcss": "^8.2.15" + + } + + }, + + "node_modules/postcss-normalize-display-values": { + + "version": "5.1.0", + + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + + "license": "MIT", + + "dependencies": { + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^10 || ^12 || >=14.0" + + }, + + "peerDependencies": { + + "postcss": "^8.2.15" + + } + + }, + + "node_modules/postcss-normalize-positions": { + + "version": "5.1.1", + + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + + "license": "MIT", + + "dependencies": { + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^10 || ^12 || >=14.0" + + }, + + "peerDependencies": { + + "postcss": "^8.2.15" + + } + + }, + + "node_modules/postcss-normalize-repeat-style": { + + "version": "5.1.1", + + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + + "license": "MIT", + + "dependencies": { + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^10 || ^12 || >=14.0" + + }, + + "peerDependencies": { + + "postcss": "^8.2.15" + + } + + }, + + "node_modules/postcss-normalize-string": { + + "version": "5.1.0", + + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + + "license": "MIT", + + "dependencies": { + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^10 || ^12 || >=14.0" + + }, + + "peerDependencies": { + + "postcss": "^8.2.15" + + } + + }, + + "node_modules/postcss-normalize-timing-functions": { + + "version": "5.1.0", + + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + + "license": "MIT", + + "dependencies": { + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^10 || ^12 || >=14.0" + + }, + + "peerDependencies": { + + "postcss": "^8.2.15" + + } + + }, + + "node_modules/postcss-normalize-unicode": { + + "version": "5.1.1", + + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + + "license": "MIT", + + "dependencies": { + + "browserslist": "^4.21.4", + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^10 || ^12 || >=14.0" + + }, + + "peerDependencies": { + + "postcss": "^8.2.15" + + } + + }, + + "node_modules/postcss-normalize-url": { + + "version": "5.1.0", + + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + + "license": "MIT", + + "dependencies": { + + "normalize-url": "^6.0.1", + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^10 || ^12 || >=14.0" + + }, + + "peerDependencies": { + + "postcss": "^8.2.15" + + } + + }, + + "node_modules/postcss-normalize-whitespace": { + + "version": "5.1.1", + + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + + "license": "MIT", + + "dependencies": { + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^10 || ^12 || >=14.0" + + }, + + "peerDependencies": { + + "postcss": "^8.2.15" + + } + + }, + + "node_modules/postcss-opacity-percentage": { + + "version": "1.1.3", + + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", + + "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", + + "funding": [ + + { + + "type": "kofi", + + "url": "https://ko-fi.com/mrcgrtz" + + }, + + { + + "type": "liberapay", + + "url": "https://liberapay.com/mrcgrtz" + + } + + ], + + "license": "MIT", + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "peerDependencies": { + + "postcss": "^8.2" + + } + + }, + + "node_modules/postcss-ordered-values": { + + "version": "5.1.3", + + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + + "license": "MIT", + + "dependencies": { + + "cssnano-utils": "^3.1.0", + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^10 || ^12 || >=14.0" + + }, + + "peerDependencies": { + + "postcss": "^8.2.15" + + } + + }, + + "node_modules/postcss-overflow-shorthand": { + + "version": "3.0.4", + + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", + + "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", + + "license": "CC0-1.0", + + "dependencies": { + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss": "^8.2" + + } + + }, + + "node_modules/postcss-page-break": { + + "version": "3.0.4", + + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + + "license": "MIT", + + "peerDependencies": { + + "postcss": "^8" + + } + + }, + + "node_modules/postcss-place": { + + "version": "7.0.5", + + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", + + "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", + + "license": "CC0-1.0", + + "dependencies": { + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss": "^8.2" + + } + + }, + + "node_modules/postcss-preset-env": { + + "version": "7.8.3", + + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", + + "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", + + "license": "CC0-1.0", + + "dependencies": { + + "@csstools/postcss-cascade-layers": "^1.1.1", + + "@csstools/postcss-color-function": "^1.1.1", + + "@csstools/postcss-font-format-keywords": "^1.0.1", + + "@csstools/postcss-hwb-function": "^1.0.2", + + "@csstools/postcss-ic-unit": "^1.0.1", + + "@csstools/postcss-is-pseudo-class": "^2.0.7", + + "@csstools/postcss-nested-calc": "^1.0.0", + + "@csstools/postcss-normalize-display-values": "^1.0.1", + + "@csstools/postcss-oklab-function": "^1.1.1", + + "@csstools/postcss-progressive-custom-properties": "^1.3.0", + + "@csstools/postcss-stepped-value-functions": "^1.0.1", + + "@csstools/postcss-text-decoration-shorthand": "^1.0.0", + + "@csstools/postcss-trigonometric-functions": "^1.0.2", + + "@csstools/postcss-unset-value": "^1.0.2", + + "autoprefixer": "^10.4.13", + + "browserslist": "^4.21.4", + + "css-blank-pseudo": "^3.0.3", + + "css-has-pseudo": "^3.0.4", + + "css-prefers-color-scheme": "^6.0.3", + + "cssdb": "^7.1.0", + + "postcss-attribute-case-insensitive": "^5.0.2", + + "postcss-clamp": "^4.1.0", + + "postcss-color-functional-notation": "^4.2.4", + + "postcss-color-hex-alpha": "^8.0.4", + + "postcss-color-rebeccapurple": "^7.1.1", + + "postcss-custom-media": "^8.0.2", + + "postcss-custom-properties": "^12.1.10", + + "postcss-custom-selectors": "^6.0.3", + + "postcss-dir-pseudo-class": "^6.0.5", + + "postcss-double-position-gradients": "^3.1.2", + + "postcss-env-function": "^4.0.6", + + "postcss-focus-visible": "^6.0.4", + + "postcss-focus-within": "^5.0.4", + + "postcss-font-variant": "^5.0.0", + + "postcss-gap-properties": "^3.0.5", + + "postcss-image-set-function": "^4.0.7", + + "postcss-initial": "^4.0.1", + + "postcss-lab-function": "^4.2.1", + + "postcss-logical": "^5.0.4", + + "postcss-media-minmax": "^5.0.0", + + "postcss-nesting": "^10.2.0", + + "postcss-opacity-percentage": "^1.1.2", + + "postcss-overflow-shorthand": "^3.0.4", + + "postcss-page-break": "^3.0.4", + + "postcss-place": "^7.0.5", + + "postcss-pseudo-class-any-link": "^7.1.6", + + "postcss-replace-overflow-wrap": "^4.0.0", + + "postcss-selector-not": "^6.0.1", + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss": "^8.2" + + } + + }, + + "node_modules/postcss-pseudo-class-any-link": { + + "version": "7.1.6", + + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", + + "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", + + "license": "CC0-1.0", + + "dependencies": { + + "postcss-selector-parser": "^6.0.10" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss": "^8.2" + + } + + }, + + "node_modules/postcss-reduce-initial": { + + "version": "5.1.2", + + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + + "license": "MIT", + + "dependencies": { + + "browserslist": "^4.21.4", + + "caniuse-api": "^3.0.0" + + }, + + "engines": { + + "node": "^10 || ^12 || >=14.0" + + }, + + "peerDependencies": { + + "postcss": "^8.2.15" + + } + + }, + + "node_modules/postcss-reduce-transforms": { + + "version": "5.1.0", + + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + + "license": "MIT", + + "dependencies": { + + "postcss-value-parser": "^4.2.0" + + }, + + "engines": { + + "node": "^10 || ^12 || >=14.0" + + }, + + "peerDependencies": { + + "postcss": "^8.2.15" + + } + + }, + + "node_modules/postcss-replace-overflow-wrap": { + + "version": "4.0.0", + + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + + "license": "MIT", + + "peerDependencies": { + + "postcss": "^8.0.3" + + } + + }, + + "node_modules/postcss-selector-not": { + + "version": "6.0.1", + + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", + + "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", + + "license": "MIT", + + "dependencies": { + + "postcss-selector-parser": "^6.0.10" + + }, + + "engines": { + + "node": "^12 || ^14 || >=16" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/csstools" + + }, + + "peerDependencies": { + + "postcss": "^8.2" + + } + + }, + + "node_modules/postcss-selector-parser": { + + "version": "6.1.2", + + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + + "license": "MIT", + + "dependencies": { + + "cssesc": "^3.0.0", + + "util-deprecate": "^1.0.2" + + }, + + "engines": { + + "node": ">=4" + + } + + }, + + "node_modules/postcss-svgo": { + + "version": "5.1.0", + + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + + "license": "MIT", + + "dependencies": { + + "postcss-value-parser": "^4.2.0", + + "svgo": "^2.7.0" + + }, + + "engines": { + + "node": "^10 || ^12 || >=14.0" + + }, + + "peerDependencies": { + + "postcss": "^8.2.15" + + } + + }, + + "node_modules/postcss-svgo/node_modules/commander": { + + "version": "7.2.0", + + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + + "license": "MIT", + + "engines": { + + "node": ">= 10" + + } + + }, + + "node_modules/postcss-svgo/node_modules/css-tree": { + + "version": "1.1.3", + + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + + "license": "MIT", + + "dependencies": { + + "mdn-data": "2.0.14", + + "source-map": "^0.6.1" + + }, + + "engines": { + + "node": ">=8.0.0" + + } + + }, + + "node_modules/postcss-svgo/node_modules/mdn-data": { + + "version": "2.0.14", + + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + + "license": "CC0-1.0" + + }, + + "node_modules/postcss-svgo/node_modules/source-map": { + + "version": "0.6.1", + + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + + "license": "BSD-3-Clause", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/postcss-svgo/node_modules/svgo": { + + "version": "2.8.0", + + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + + "license": "MIT", + + "dependencies": { + + "@trysound/sax": "0.2.0", + + "commander": "^7.2.0", + + "css-select": "^4.1.3", + + "css-tree": "^1.1.3", + + "csso": "^4.2.0", + + "picocolors": "^1.0.0", + + "stable": "^0.1.8" + + }, + + "bin": { + + "svgo": "bin/svgo" + + }, + + "engines": { + + "node": ">=10.13.0" + + } + + }, + + "node_modules/postcss-unique-selectors": { + + "version": "5.1.1", + + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + + "license": "MIT", + + "dependencies": { + + "postcss-selector-parser": "^6.0.5" + + }, + + "engines": { + + "node": "^10 || ^12 || >=14.0" + + }, + + "peerDependencies": { + + "postcss": "^8.2.15" + + } + + }, + + "node_modules/postcss-value-parser": { + + "version": "4.2.0", + + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + + "license": "MIT" + + }, + + "node_modules/prelude-ls": { + + "version": "1.2.1", + + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.8.0" + + } + + }, + + "node_modules/pretty-bytes": { + + "version": "5.6.0", + + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + + "license": "MIT", + + "engines": { + + "node": ">=6" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/pretty-error": { + + "version": "4.0.0", + + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + + "license": "MIT", + + "dependencies": { + + "lodash": "^4.17.20", + + "renderkid": "^3.0.0" + + } + + }, + + "node_modules/pretty-format": { + + "version": "27.5.1", + + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + + "license": "MIT", + + "dependencies": { + + "ansi-regex": "^5.0.1", + + "ansi-styles": "^5.0.0", + + "react-is": "^17.0.1" + + }, + + "engines": { + + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + + } + + }, + + "node_modules/pretty-format/node_modules/ansi-styles": { + + "version": "5.2.0", + + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + + "license": "MIT", + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + + } + + }, + + "node_modules/process-nextick-args": { + + "version": "2.0.1", + + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + + "license": "MIT" + + }, + + "node_modules/promise": { + + "version": "8.3.0", + + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + + "license": "MIT", + + "dependencies": { + + "asap": "~2.0.6" + + } + + }, + + "node_modules/prompts": { + + "version": "2.4.2", + + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + + "license": "MIT", + + "dependencies": { + + "kleur": "^3.0.3", + + "sisteransi": "^1.0.5" + + }, + + "engines": { + + "node": ">= 6" + + } + + }, + + "node_modules/prop-types": { + + "version": "15.8.1", + + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + + "license": "MIT", + + "dependencies": { + + "loose-envify": "^1.4.0", + + "object-assign": "^4.1.1", + + "react-is": "^16.13.1" + + } + + }, + + "node_modules/prop-types/node_modules/react-is": { + + "version": "16.13.1", + + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + + "license": "MIT" + + }, + + "node_modules/proxy-addr": { + + "version": "2.0.7", + + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + + "license": "MIT", + + "dependencies": { + + "forwarded": "0.2.0", + + "ipaddr.js": "1.9.1" + + }, + + "engines": { + + "node": ">= 0.10" + + } + + }, + + "node_modules/proxy-addr/node_modules/ipaddr.js": { + + "version": "1.9.1", + + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.10" + + } + + }, + + "node_modules/proxy-from-env": { + + "version": "1.1.0", + + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + + "license": "MIT" + + }, + + "node_modules/psl": { + + "version": "1.15.0", + + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + + "license": "MIT", + + "dependencies": { + + "punycode": "^2.3.1" + + }, + + "funding": { + + "url": "https://github.com/sponsors/lupomontero" + + } + + }, + + "node_modules/punycode": { + + "version": "2.3.1", + + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + + "license": "MIT", + + "engines": { + + "node": ">=6" + + } + + }, + + "node_modules/q": { + + "version": "1.5.1", + + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + + "license": "MIT", + + "engines": { + + "node": ">=0.6.0", + + "teleport": ">=0.2.0" + + } + + }, + + "node_modules/qs": { + + "version": "6.13.0", + + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + + "license": "BSD-3-Clause", + + "dependencies": { + + "side-channel": "^1.0.6" + + }, + + "engines": { + + "node": ">=0.6" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/querystringify": { + + "version": "2.2.0", + + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + + "license": "MIT" + + }, + + "node_modules/queue-microtask": { + + "version": "1.2.3", + + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + + "funding": [ + + { + + "type": "github", + + "url": "https://github.com/sponsors/feross" + + }, + + { + + "type": "patreon", + + "url": "https://www.patreon.com/feross" + + }, + + { + + "type": "consulting", + + "url": "https://feross.org/support" + + } + + ], + + "license": "MIT" + + }, + + "node_modules/raf": { + + "version": "3.4.1", + + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + + "license": "MIT", + + "dependencies": { + + "performance-now": "^2.1.0" + + } + + }, + + "node_modules/randombytes": { + + "version": "2.1.0", + + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + + "license": "MIT", + + "dependencies": { + + "safe-buffer": "^5.1.0" + + } + + }, + + "node_modules/range-parser": { + + "version": "1.2.1", + + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.6" + + } + + }, + + "node_modules/raw-body": { + + "version": "2.5.2", + + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + + "license": "MIT", + + "dependencies": { + + "bytes": "3.1.2", + + "http-errors": "2.0.0", + + "iconv-lite": "0.4.24", + + "unpipe": "1.0.0" + + }, + + "engines": { + + "node": ">= 0.8" + + } + + }, + + "node_modules/raw-body/node_modules/iconv-lite": { + + "version": "0.4.24", + + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + + "license": "MIT", + + "dependencies": { + + "safer-buffer": ">= 2.1.2 < 3" + + }, + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/react": { + + "version": "19.1.0", + + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + + "license": "MIT", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/react-app-polyfill": { + + "version": "3.0.0", + + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", + + "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", + + "license": "MIT", + + "dependencies": { + + "core-js": "^3.19.2", + + "object-assign": "^4.1.1", + + "promise": "^8.1.0", + + "raf": "^3.4.1", + + "regenerator-runtime": "^0.13.9", + + "whatwg-fetch": "^3.6.2" + + }, + + "engines": { + + "node": ">=14" + + } + + }, + + "node_modules/react-circular-progressbar": { + + "version": "2.2.0", + + "resolved": "https://registry.npmjs.org/react-circular-progressbar/-/react-circular-progressbar-2.2.0.tgz", + + "integrity": "sha512-cgyqEHOzB0nWMZjKfWN3MfSa1LV3OatcDjPz68lchXQUEiBD5O1WsAtoVK4/DSL0B4USR//cTdok4zCBkq8X5g==", + + "license": "MIT", + + "peerDependencies": { + + "react": ">=0.14.0" + + } + + }, + + "node_modules/react-dev-utils": { + + "version": "12.0.1", + + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + + "license": "MIT", + + "dependencies": { + + "@babel/code-frame": "^7.16.0", + + "address": "^1.1.2", + + "browserslist": "^4.18.1", + + "chalk": "^4.1.2", + + "cross-spawn": "^7.0.3", + + "detect-port-alt": "^1.1.6", + + "escape-string-regexp": "^4.0.0", + + "filesize": "^8.0.6", + + "find-up": "^5.0.0", + + "fork-ts-checker-webpack-plugin": "^6.5.0", + + "global-modules": "^2.0.0", + + "globby": "^11.0.4", + + "gzip-size": "^6.0.0", + + "immer": "^9.0.7", + + "is-root": "^2.1.0", + + "loader-utils": "^3.2.0", + + "open": "^8.4.0", + + "pkg-up": "^3.1.0", + + "prompts": "^2.4.2", + + "react-error-overlay": "^6.0.11", + + "recursive-readdir": "^2.2.2", + + "shell-quote": "^1.7.3", + + "strip-ansi": "^6.0.1", + + "text-table": "^0.2.0" + + }, + + "engines": { + + "node": ">=14" + + } + + }, + + "node_modules/react-dev-utils/node_modules/find-up": { + + "version": "5.0.0", + + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + + "license": "MIT", + + "dependencies": { + + "locate-path": "^6.0.0", + + "path-exists": "^4.0.0" + + }, + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/react-dev-utils/node_modules/loader-utils": { + + "version": "3.3.1", + + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", + + "license": "MIT", + + "engines": { + + "node": ">= 12.13.0" + + } + + }, + + "node_modules/react-dev-utils/node_modules/locate-path": { + + "version": "6.0.0", + + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + + "license": "MIT", + + "dependencies": { + + "p-locate": "^5.0.0" + + }, + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/react-dev-utils/node_modules/p-limit": { + + "version": "3.1.0", + + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + + "license": "MIT", + + "dependencies": { + + "yocto-queue": "^0.1.0" + + }, + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/react-dev-utils/node_modules/p-locate": { + + "version": "5.0.0", + + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + + "license": "MIT", + + "dependencies": { + + "p-limit": "^3.0.2" + + }, + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/react-dom": { + + "version": "19.1.0", + + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + + "license": "MIT", + + "dependencies": { + + "scheduler": "^0.26.0" + + }, + + "peerDependencies": { + + "react": "^19.1.0" + + } + + }, + + "node_modules/react-error-overlay": { + + "version": "6.1.0", + + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.1.0.tgz", + + "integrity": "sha512-SN/U6Ytxf1QGkw/9ve5Y+NxBbZM6Ht95tuXNMKs8EJyFa/Vy/+Co3stop3KBHARfn/giv+Lj1uUnTfOJ3moFEQ==", + + "license": "MIT" + + }, + + "node_modules/react-is": { + + "version": "17.0.2", + + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + + "license": "MIT" + + }, + + "node_modules/react-refresh": { + + "version": "0.11.0", + + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", + + "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", + + "license": "MIT", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/react-router": { + + "version": "7.6.0", + + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.6.0.tgz", + + "integrity": "sha512-GGufuHIVCJDbnIAXP3P9Sxzq3UUsddG3rrI3ut1q6m0FI6vxVBF3JoPQ38+W/blslLH4a5Yutp8drkEpXoddGQ==", + + "license": "MIT", + + "dependencies": { + + "cookie": "^1.0.1", + + "set-cookie-parser": "^2.6.0" + + }, + + "engines": { + + "node": ">=20.0.0" + + }, + + "peerDependencies": { + + "react": ">=18", + + "react-dom": ">=18" + + }, + + "peerDependenciesMeta": { + + "react-dom": { + + "optional": true + + } + + } + + }, + + "node_modules/react-router-dom": { + + "version": "7.6.0", + + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.6.0.tgz", + + "integrity": "sha512-DYgm6RDEuKdopSyGOWZGtDfSm7Aofb8CCzgkliTjtu/eDuB0gcsv6qdFhhi8HdtmA+KHkt5MfZ5K2PdzjugYsA==", + + "license": "MIT", + + "dependencies": { + + "react-router": "7.6.0" + + }, + + "engines": { + + "node": ">=20.0.0" + + }, + + "peerDependencies": { + + "react": ">=18", + + "react-dom": ">=18" + + } + + }, + + "node_modules/react-router/node_modules/cookie": { + + "version": "1.0.2", + + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + + "license": "MIT", + + "engines": { + + "node": ">=18" + + } + + }, + + "node_modules/react-scripts": { + + "version": "5.0.1", + + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", + + "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", + + "license": "MIT", + + "dependencies": { + + "@babel/core": "^7.16.0", + + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", + + "@svgr/webpack": "^5.5.0", + + "babel-jest": "^27.4.2", + + "babel-loader": "^8.2.3", + + "babel-plugin-named-asset-import": "^0.3.8", + + "babel-preset-react-app": "^10.0.1", + + "bfj": "^7.0.2", + + "browserslist": "^4.18.1", + + "camelcase": "^6.2.1", + + "case-sensitive-paths-webpack-plugin": "^2.4.0", + + "css-loader": "^6.5.1", + + "css-minimizer-webpack-plugin": "^3.2.0", + + "dotenv": "^10.0.0", + + "dotenv-expand": "^5.1.0", + + "eslint": "^8.3.0", + + "eslint-config-react-app": "^7.0.1", + + "eslint-webpack-plugin": "^3.1.1", + + "file-loader": "^6.2.0", + + "fs-extra": "^10.0.0", + + "html-webpack-plugin": "^5.5.0", + + "identity-obj-proxy": "^3.0.0", + + "jest": "^27.4.3", + + "jest-resolve": "^27.4.2", + + "jest-watch-typeahead": "^1.0.0", + + "mini-css-extract-plugin": "^2.4.5", + + "postcss": "^8.4.4", + + "postcss-flexbugs-fixes": "^5.0.2", + + "postcss-loader": "^6.2.1", + + "postcss-normalize": "^10.0.1", + + "postcss-preset-env": "^7.0.1", + + "prompts": "^2.4.2", + + "react-app-polyfill": "^3.0.0", + + "react-dev-utils": "^12.0.1", + + "react-refresh": "^0.11.0", + + "resolve": "^1.20.0", + + "resolve-url-loader": "^4.0.0", + + "sass-loader": "^12.3.0", + + "semver": "^7.3.5", + + "source-map-loader": "^3.0.0", + + "style-loader": "^3.3.1", + + "tailwindcss": "^3.0.2", + + "terser-webpack-plugin": "^5.2.5", + + "webpack": "^5.64.4", + + "webpack-dev-server": "^4.6.0", + + "webpack-manifest-plugin": "^4.0.2", + + "workbox-webpack-plugin": "^6.4.1" + + }, + + "bin": { + + "react-scripts": "bin/react-scripts.js" + + }, + + "engines": { + + "node": ">=14.0.0" + + }, + + "optionalDependencies": { + + "fsevents": "^2.3.2" + + }, + + "peerDependencies": { + + "react": ">= 16", + + "typescript": "^3.2.1 || ^4" + + }, + + "peerDependenciesMeta": { + + "typescript": { + + "optional": true + + } + + } + + }, + + "node_modules/react-smooth": { + + "version": "4.0.4", + + "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz", + + "integrity": "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==", + + "license": "MIT", + + "dependencies": { + + "fast-equals": "^5.0.1", + + "prop-types": "^15.8.1", + + "react-transition-group": "^4.4.5" + + }, + + "peerDependencies": { + + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + + } + + }, + + "node_modules/react-transition-group": { + + "version": "4.4.5", + + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + + "license": "BSD-3-Clause", + + "dependencies": { + + "@babel/runtime": "^7.5.5", + + "dom-helpers": "^5.0.1", + + "loose-envify": "^1.4.0", + + "prop-types": "^15.6.2" + + }, + + "peerDependencies": { + + "react": ">=16.6.0", + + "react-dom": ">=16.6.0" + + } + + }, + + "node_modules/read-cache": { + + "version": "1.0.0", + + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + + "license": "MIT", + + "dependencies": { + + "pify": "^2.3.0" + + } + + }, + + "node_modules/readable-stream": { + + "version": "3.6.2", + + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + + "license": "MIT", + + "dependencies": { + + "inherits": "^2.0.3", + + "string_decoder": "^1.1.1", + + "util-deprecate": "^1.0.1" + + }, + + "engines": { + + "node": ">= 6" + + } + + }, + + "node_modules/readdirp": { + + "version": "3.6.0", + + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + + "license": "MIT", + + "dependencies": { + + "picomatch": "^2.2.1" + + }, + + "engines": { + + "node": ">=8.10.0" + + } + + }, + + "node_modules/recharts": { + + "version": "2.15.3", + + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.3.tgz", + + "integrity": "sha512-EdOPzTwcFSuqtvkDoaM5ws/Km1+WTAO2eizL7rqiG0V2UVhTnz0m7J2i0CjVPUCdEkZImaWvXLbZDS2H5t6GFQ==", + + "license": "MIT", + + "dependencies": { + + "clsx": "^2.0.0", + + "eventemitter3": "^4.0.1", + + "lodash": "^4.17.21", + + "react-is": "^18.3.1", + + "react-smooth": "^4.0.4", + + "recharts-scale": "^0.4.4", + + "tiny-invariant": "^1.3.1", + + "victory-vendor": "^36.6.8" + + }, + + "engines": { + + "node": ">=14" + + }, + + "peerDependencies": { + + "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + + } + + }, + + "node_modules/recharts-scale": { + + "version": "0.4.5", + + "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", + + "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", + + "license": "MIT", + + "dependencies": { + + "decimal.js-light": "^2.4.1" + + } + + }, + + "node_modules/recharts/node_modules/react-is": { + + "version": "18.3.1", + + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + + "license": "MIT" + + }, + + "node_modules/recursive-readdir": { + + "version": "2.2.3", + + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + + "license": "MIT", + + "dependencies": { + + "minimatch": "^3.0.5" + + }, + + "engines": { + + "node": ">=6.0.0" + + } + + }, + + "node_modules/redent": { + + "version": "3.0.0", + + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + + "license": "MIT", + + "dependencies": { + + "indent-string": "^4.0.0", + + "strip-indent": "^3.0.0" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/reflect.getprototypeof": { + + "version": "1.0.10", + + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + + "license": "MIT", + + "dependencies": { + + "call-bind": "^1.0.8", + + "define-properties": "^1.2.1", + + "es-abstract": "^1.23.9", + + "es-errors": "^1.3.0", + + "es-object-atoms": "^1.0.0", + + "get-intrinsic": "^1.2.7", + + "get-proto": "^1.0.1", + + "which-builtin-type": "^1.2.1" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/regenerate": { + + "version": "1.4.2", + + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + + "license": "MIT" + + }, + + "node_modules/regenerate-unicode-properties": { + + "version": "10.2.0", + + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", + + "license": "MIT", + + "dependencies": { + + "regenerate": "^1.4.2" + + }, + + "engines": { + + "node": ">=4" + + } + + }, + + "node_modules/regenerator-runtime": { + + "version": "0.13.11", + + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + + "license": "MIT" + + }, + + "node_modules/regex-parser": { + + "version": "2.3.1", + + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.3.1.tgz", + + "integrity": "sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==", + + "license": "MIT" + + }, + + "node_modules/regexp.prototype.flags": { + + "version": "1.5.4", + + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + + "license": "MIT", + + "dependencies": { + + "call-bind": "^1.0.8", + + "define-properties": "^1.2.1", + + "es-errors": "^1.3.0", + + "get-proto": "^1.0.1", + + "gopd": "^1.2.0", + + "set-function-name": "^2.0.2" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/regexpu-core": { + + "version": "6.2.0", + + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", + + "license": "MIT", + + "dependencies": { + + "regenerate": "^1.4.2", + + "regenerate-unicode-properties": "^10.2.0", + + "regjsgen": "^0.8.0", + + "regjsparser": "^0.12.0", + + "unicode-match-property-ecmascript": "^2.0.0", + + "unicode-match-property-value-ecmascript": "^2.1.0" + + }, + + "engines": { + + "node": ">=4" + + } + + }, + + "node_modules/regjsgen": { + + "version": "0.8.0", + + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + + "license": "MIT" + + }, + + "node_modules/regjsparser": { + + "version": "0.12.0", + + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + + "license": "BSD-2-Clause", + + "dependencies": { + + "jsesc": "~3.0.2" + + }, + + "bin": { + + "regjsparser": "bin/parser" + + } + + }, + + "node_modules/regjsparser/node_modules/jsesc": { + + "version": "3.0.2", + + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + + "license": "MIT", + + "bin": { + + "jsesc": "bin/jsesc" + + }, + + "engines": { + + "node": ">=6" + + } + + }, + + "node_modules/relateurl": { + + "version": "0.2.7", + + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.10" + + } + + }, + + "node_modules/renderkid": { + + "version": "3.0.0", + + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + + "license": "MIT", + + "dependencies": { + + "css-select": "^4.1.3", + + "dom-converter": "^0.2.0", + + "htmlparser2": "^6.1.0", + + "lodash": "^4.17.21", + + "strip-ansi": "^6.0.1" + + } + + }, + + "node_modules/require-directory": { + + "version": "2.1.1", + + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + + "license": "MIT", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/require-from-string": { + + "version": "2.0.2", + + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + + "license": "MIT", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/requires-port": { + + "version": "1.0.0", + + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + + "license": "MIT" + + }, + + "node_modules/reselect": { + + "version": "5.1.1", + + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", + + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", + + "license": "MIT" + + }, + + "node_modules/resolve": { + + "version": "1.22.10", + + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + + "license": "MIT", + + "dependencies": { + + "is-core-module": "^2.16.0", + + "path-parse": "^1.0.7", + + "supports-preserve-symlinks-flag": "^1.0.0" + + }, + + "bin": { + + "resolve": "bin/resolve" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/resolve-cwd": { + + "version": "3.0.0", + + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + + "license": "MIT", + + "dependencies": { + + "resolve-from": "^5.0.0" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/resolve-from": { + + "version": "5.0.0", + + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + + "license": "MIT", + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/resolve-url-loader": { + + "version": "4.0.0", + + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", + + "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", + + "license": "MIT", + + "dependencies": { + + "adjust-sourcemap-loader": "^4.0.0", + + "convert-source-map": "^1.7.0", + + "loader-utils": "^2.0.0", + + "postcss": "^7.0.35", + + "source-map": "0.6.1" + + }, + + "engines": { + + "node": ">=8.9" + + }, + + "peerDependencies": { + + "rework": "1.0.1", + + "rework-visit": "1.0.0" + + }, + + "peerDependenciesMeta": { + + "rework": { + + "optional": true + + }, + + "rework-visit": { + + "optional": true + + } + + } + + }, + + "node_modules/resolve-url-loader/node_modules/convert-source-map": { + + "version": "1.9.0", + + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + + "license": "MIT" + + }, + + "node_modules/resolve-url-loader/node_modules/picocolors": { + + "version": "0.2.1", + + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + + "license": "ISC" + + }, + + "node_modules/resolve-url-loader/node_modules/postcss": { + + "version": "7.0.39", + + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + + "license": "MIT", + + "dependencies": { + + "picocolors": "^0.2.1", + + "source-map": "^0.6.1" + + }, + + "engines": { + + "node": ">=6.0.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/postcss/" + + } + + }, + + "node_modules/resolve-url-loader/node_modules/source-map": { + + "version": "0.6.1", + + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + + "license": "BSD-3-Clause", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/resolve.exports": { + + "version": "1.1.1", + + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", + + "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", + + "license": "MIT", + + "engines": { + + "node": ">=10" + + } + + }, + + "node_modules/retry": { + + "version": "0.13.1", + + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + + "license": "MIT", + + "engines": { + + "node": ">= 4" + + } + + }, + + "node_modules/reusify": { + + "version": "1.1.0", + + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + + "license": "MIT", + + "engines": { + + "iojs": ">=1.0.0", + + "node": ">=0.10.0" + + } + + }, + + "node_modules/rgbcolor": { + + "version": "1.0.1", + + "resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz", + + "integrity": "sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==", + + "license": "MIT OR SEE LICENSE IN FEEL-FREE.md", + + "optional": true, + + "engines": { + + "node": ">= 0.8.15" + + } + + }, + + "node_modules/rimraf": { + + "version": "3.0.2", + + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + + "deprecated": "Rimraf versions prior to v4 are no longer supported", + + "license": "ISC", + + "dependencies": { + + "glob": "^7.1.3" + + }, + + "bin": { + + "rimraf": "bin.js" + + }, + + "funding": { + + "url": "https://github.com/sponsors/isaacs" + + } + + }, + + "node_modules/rollup": { + + "version": "2.79.2", + + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", + + "license": "MIT", + + "bin": { + + "rollup": "dist/bin/rollup" + + }, + + "engines": { + + "node": ">=10.0.0" + + }, + + "optionalDependencies": { + + "fsevents": "~2.3.2" + + } + + }, + + "node_modules/rollup-plugin-terser": { + + "version": "7.0.2", + + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", + + "license": "MIT", + + "dependencies": { + + "@babel/code-frame": "^7.10.4", + + "jest-worker": "^26.2.1", + + "serialize-javascript": "^4.0.0", + + "terser": "^5.0.0" + + }, + + "peerDependencies": { + + "rollup": "^2.0.0" + + } + + }, + + "node_modules/rollup-plugin-terser/node_modules/jest-worker": { + + "version": "26.6.2", + + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + + "license": "MIT", + + "dependencies": { + + "@types/node": "*", + + "merge-stream": "^2.0.0", + + "supports-color": "^7.0.0" + + }, + + "engines": { + + "node": ">= 10.13.0" + + } + + }, + + "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { + + "version": "4.0.0", + + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + + "license": "BSD-3-Clause", + + "dependencies": { + + "randombytes": "^2.1.0" + + } + + }, + + "node_modules/run-parallel": { + + "version": "1.2.0", + + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + + "funding": [ + + { + + "type": "github", + + "url": "https://github.com/sponsors/feross" + + }, + + { + + "type": "patreon", + + "url": "https://www.patreon.com/feross" + + }, + + { + + "type": "consulting", + + "url": "https://feross.org/support" + + } + + ], + + "license": "MIT", + + "dependencies": { + + "queue-microtask": "^1.2.2" + + } + + }, + + "node_modules/safe-array-concat": { + + "version": "1.1.3", + + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + + "license": "MIT", + + "dependencies": { + + "call-bind": "^1.0.8", + + "call-bound": "^1.0.2", + + "get-intrinsic": "^1.2.6", + + "has-symbols": "^1.1.0", + + "isarray": "^2.0.5" + + }, + + "engines": { + + "node": ">=0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/safe-buffer": { + + "version": "5.2.1", + + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + + "funding": [ + + { + + "type": "github", + + "url": "https://github.com/sponsors/feross" + + }, + + { + + "type": "patreon", + + "url": "https://www.patreon.com/feross" + + }, + + { + + "type": "consulting", + + "url": "https://feross.org/support" + + } + + ], + + "license": "MIT" + + }, + + "node_modules/safe-push-apply": { + + "version": "1.0.0", + + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + + "license": "MIT", + + "dependencies": { + + "es-errors": "^1.3.0", + + "isarray": "^2.0.5" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/safe-regex-test": { + + "version": "1.1.0", + + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + + "license": "MIT", + + "dependencies": { + + "call-bound": "^1.0.2", + + "es-errors": "^1.3.0", + + "is-regex": "^1.2.1" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/safer-buffer": { + + "version": "2.1.2", + + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + + "license": "MIT" + + }, + + "node_modules/sanitize.css": { + + "version": "13.0.0", + + "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", + + "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==", + + "license": "CC0-1.0" + + }, + + "node_modules/sass-loader": { + + "version": "12.6.0", + + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", + + "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + + "license": "MIT", + + "dependencies": { + + "klona": "^2.0.4", + + "neo-async": "^2.6.2" + + }, + + "engines": { + + "node": ">= 12.13.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/webpack" + + }, + + "peerDependencies": { + + "fibers": ">= 3.1.0", + + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + + "sass": "^1.3.0", + + "sass-embedded": "*", + + "webpack": "^5.0.0" + + }, + + "peerDependenciesMeta": { + + "fibers": { + + "optional": true + + }, + + "node-sass": { + + "optional": true + + }, + + "sass": { + + "optional": true + + }, + + "sass-embedded": { + + "optional": true + + } + + } + + }, + + "node_modules/sax": { + + "version": "1.2.4", + + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + + "license": "ISC" + + }, + + "node_modules/saxes": { + + "version": "5.0.1", + + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + + "license": "ISC", + + "dependencies": { + + "xmlchars": "^2.2.0" + + }, + + "engines": { + + "node": ">=10" + + } + + }, + + "node_modules/scheduler": { + + "version": "0.26.0", + + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + + "license": "MIT" + + }, + + "node_modules/schema-utils": { + + "version": "4.3.2", + + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + + "license": "MIT", + + "dependencies": { + + "@types/json-schema": "^7.0.9", + + "ajv": "^8.9.0", + + "ajv-formats": "^2.1.1", + + "ajv-keywords": "^5.1.0" + + }, + + "engines": { + + "node": ">= 10.13.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/webpack" + + } + + }, + + "node_modules/schema-utils/node_modules/ajv": { + + "version": "8.17.1", + + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + + "license": "MIT", + + "dependencies": { + + "fast-deep-equal": "^3.1.3", + + "fast-uri": "^3.0.1", + + "json-schema-traverse": "^1.0.0", + + "require-from-string": "^2.0.2" + + }, + + "funding": { + + "type": "github", + + "url": "https://github.com/sponsors/epoberezkin" + + } + + }, + + "node_modules/schema-utils/node_modules/ajv-keywords": { + + "version": "5.1.0", + + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + + "license": "MIT", + + "dependencies": { + + "fast-deep-equal": "^3.1.3" + + }, + + "peerDependencies": { + + "ajv": "^8.8.2" + + } + + }, + + "node_modules/schema-utils/node_modules/json-schema-traverse": { + + "version": "1.0.0", + + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + + "license": "MIT" + + }, + + "node_modules/select-hose": { + + "version": "2.0.0", + + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + + "license": "MIT" + + }, + + "node_modules/selfsigned": { + + "version": "2.4.1", + + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + + "license": "MIT", + + "dependencies": { + + "@types/node-forge": "^1.3.0", + + "node-forge": "^1" + + }, + + "engines": { + + "node": ">=10" + + } + + }, + + "node_modules/semver": { + + "version": "7.7.1", + + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + + "license": "ISC", + + "bin": { + + "semver": "bin/semver.js" + + }, + + "engines": { + + "node": ">=10" + + } + + }, + + "node_modules/send": { + + "version": "0.19.0", + + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + + "license": "MIT", + + "dependencies": { + + "debug": "2.6.9", + + "depd": "2.0.0", + + "destroy": "1.2.0", + + "encodeurl": "~1.0.2", + + "escape-html": "~1.0.3", + + "etag": "~1.8.1", + + "fresh": "0.5.2", + + "http-errors": "2.0.0", + + "mime": "1.6.0", + + "ms": "2.1.3", + + "on-finished": "2.4.1", + + "range-parser": "~1.2.1", + + "statuses": "2.0.1" + + }, + + "engines": { + + "node": ">= 0.8.0" + + } + + }, + + "node_modules/send/node_modules/debug": { + + "version": "2.6.9", + + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + + "license": "MIT", + + "dependencies": { + + "ms": "2.0.0" + + } + + }, + + "node_modules/send/node_modules/debug/node_modules/ms": { + + "version": "2.0.0", + + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + + "license": "MIT" + + }, + + "node_modules/send/node_modules/encodeurl": { + + "version": "1.0.2", + + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.8" + + } + + }, + + "node_modules/serialize-javascript": { + + "version": "6.0.2", + + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + + "license": "BSD-3-Clause", + + "dependencies": { + + "randombytes": "^2.1.0" + + } + + }, + + "node_modules/serve-index": { + + "version": "1.9.1", + + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + + "license": "MIT", + + "dependencies": { + + "accepts": "~1.3.4", + + "batch": "0.6.1", + + "debug": "2.6.9", + + "escape-html": "~1.0.3", + + "http-errors": "~1.6.2", + + "mime-types": "~2.1.17", + + "parseurl": "~1.3.2" + + }, + + "engines": { + + "node": ">= 0.8.0" + + } + + }, + + "node_modules/serve-index/node_modules/debug": { + + "version": "2.6.9", + + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + + "license": "MIT", + + "dependencies": { + + "ms": "2.0.0" + + } + + }, + + "node_modules/serve-index/node_modules/depd": { + + "version": "1.1.2", + + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.6" + + } + + }, + + "node_modules/serve-index/node_modules/http-errors": { + + "version": "1.6.3", + + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + + "license": "MIT", + + "dependencies": { + + "depd": "~1.1.2", + + "inherits": "2.0.3", + + "setprototypeof": "1.1.0", + + "statuses": ">= 1.4.0 < 2" + + }, + + "engines": { + + "node": ">= 0.6" + + } + + }, + + "node_modules/serve-index/node_modules/inherits": { + + "version": "2.0.3", + + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + + "license": "ISC" + + }, + + "node_modules/serve-index/node_modules/ms": { + + "version": "2.0.0", + + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + + "license": "MIT" + + }, + + "node_modules/serve-index/node_modules/setprototypeof": { + + "version": "1.1.0", + + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + + "license": "ISC" + + }, + + "node_modules/serve-index/node_modules/statuses": { + + "version": "1.5.0", + + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.6" + + } + + }, + + "node_modules/serve-static": { + + "version": "1.16.2", + + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + + "license": "MIT", + + "dependencies": { + + "encodeurl": "~2.0.0", + + "escape-html": "~1.0.3", + + "parseurl": "~1.3.3", + + "send": "0.19.0" + + }, + + "engines": { + + "node": ">= 0.8.0" + + } + + }, + + "node_modules/set-cookie-parser": { + + "version": "2.7.1", + + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + + "license": "MIT" + + }, + + "node_modules/set-function-length": { + + "version": "1.2.2", + + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + + "license": "MIT", + + "dependencies": { + + "define-data-property": "^1.1.4", + + "es-errors": "^1.3.0", + + "function-bind": "^1.1.2", + + "get-intrinsic": "^1.2.4", + + "gopd": "^1.0.1", + + "has-property-descriptors": "^1.0.2" + + }, + + "engines": { + + "node": ">= 0.4" + + } + + }, + + "node_modules/set-function-name": { + + "version": "2.0.2", + + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + + "license": "MIT", + + "dependencies": { + + "define-data-property": "^1.1.4", + + "es-errors": "^1.3.0", + + "functions-have-names": "^1.2.3", + + "has-property-descriptors": "^1.0.2" + + }, + + "engines": { + + "node": ">= 0.4" + + } + + }, + + "node_modules/set-proto": { + + "version": "1.0.0", + + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + + "license": "MIT", + + "dependencies": { + + "dunder-proto": "^1.0.1", + + "es-errors": "^1.3.0", + + "es-object-atoms": "^1.0.0" + + }, + + "engines": { + + "node": ">= 0.4" + + } + + }, + + "node_modules/setprototypeof": { + + "version": "1.2.0", + + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + + "license": "ISC" + + }, + + "node_modules/shebang-command": { + + "version": "2.0.0", + + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + + "license": "MIT", + + "dependencies": { + + "shebang-regex": "^3.0.0" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/shebang-regex": { + + "version": "3.0.0", + + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + + "license": "MIT", + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/shell-quote": { + + "version": "1.8.2", + + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", + + "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/side-channel": { + + "version": "1.1.0", + + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + + "license": "MIT", + + "dependencies": { + + "es-errors": "^1.3.0", + + "object-inspect": "^1.13.3", + + "side-channel-list": "^1.0.0", + + "side-channel-map": "^1.0.1", + + "side-channel-weakmap": "^1.0.2" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/side-channel-list": { + + "version": "1.0.0", + + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + + "license": "MIT", + + "dependencies": { + + "es-errors": "^1.3.0", + + "object-inspect": "^1.13.3" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/side-channel-map": { + + "version": "1.0.1", + + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + + "license": "MIT", + + "dependencies": { + + "call-bound": "^1.0.2", + + "es-errors": "^1.3.0", + + "get-intrinsic": "^1.2.5", + + "object-inspect": "^1.13.3" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/side-channel-weakmap": { + + "version": "1.0.2", + + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + + "license": "MIT", + + "dependencies": { + + "call-bound": "^1.0.2", + + "es-errors": "^1.3.0", + + "get-intrinsic": "^1.2.5", + + "object-inspect": "^1.13.3", + + "side-channel-map": "^1.0.1" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/signal-exit": { + + "version": "3.0.7", + + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + + "license": "ISC" + + }, + + "node_modules/sisteransi": { + + "version": "1.0.5", + + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + + "license": "MIT" + + }, + + "node_modules/slash": { + + "version": "3.0.0", + + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + + "license": "MIT", + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/sockjs": { + + "version": "0.3.24", + + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + + "license": "MIT", + + "dependencies": { + + "faye-websocket": "^0.11.3", + + "uuid": "^8.3.2", + + "websocket-driver": "^0.7.4" + + } + + }, + + "node_modules/source-list-map": { + + "version": "2.0.1", + + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + + "license": "MIT" + + }, + + "node_modules/source-map": { + + "version": "0.7.4", + + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + + "license": "BSD-3-Clause", + + "engines": { + + "node": ">= 8" + + } + + }, + + "node_modules/source-map-js": { + + "version": "1.2.1", + + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + + "license": "BSD-3-Clause", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/source-map-loader": { + + "version": "3.0.2", + + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz", + + "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==", + + "license": "MIT", + + "dependencies": { + + "abab": "^2.0.5", + + "iconv-lite": "^0.6.3", + + "source-map-js": "^1.0.1" + + }, + + "engines": { + + "node": ">= 12.13.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/webpack" + + }, + + "peerDependencies": { + + "webpack": "^5.0.0" + + } + + }, + + "node_modules/source-map-support": { + + "version": "0.5.21", + + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + + "license": "MIT", + + "dependencies": { + + "buffer-from": "^1.0.0", + + "source-map": "^0.6.0" + + } + + }, + + "node_modules/source-map-support/node_modules/source-map": { + + "version": "0.6.1", + + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + + "license": "BSD-3-Clause", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/sourcemap-codec": { + + "version": "1.4.8", + + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + + "license": "MIT" + + }, + + "node_modules/spdy": { + + "version": "4.0.2", + + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + + "license": "MIT", + + "dependencies": { + + "debug": "^4.1.0", + + "handle-thing": "^2.0.0", + + "http-deceiver": "^1.2.7", + + "select-hose": "^2.0.0", + + "spdy-transport": "^3.0.0" + + }, + + "engines": { + + "node": ">=6.0.0" + + } + + }, + + "node_modules/spdy-transport": { + + "version": "3.0.0", + + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + + "license": "MIT", + + "dependencies": { + + "debug": "^4.1.0", + + "detect-node": "^2.0.4", + + "hpack.js": "^2.1.6", + + "obuf": "^1.1.2", + + "readable-stream": "^3.0.6", + + "wbuf": "^1.7.3" + + } + + }, + + "node_modules/sprintf-js": { + + "version": "1.0.3", + + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + + "license": "BSD-3-Clause" + + }, + + "node_modules/ssf": { + + "version": "0.11.2", + + "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz", + + "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", + + "license": "Apache-2.0", + + "dependencies": { + + "frac": "~1.1.2" + + }, + + "engines": { + + "node": ">=0.8" + + } + + }, + + "node_modules/stable": { + + "version": "0.1.8", + + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + + "license": "MIT" + + }, + + "node_modules/stack-utils": { + + "version": "2.0.6", + + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + + "license": "MIT", + + "dependencies": { + + "escape-string-regexp": "^2.0.0" + + }, + + "engines": { + + "node": ">=10" + + } + + }, + + "node_modules/stack-utils/node_modules/escape-string-regexp": { + + "version": "2.0.0", + + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + + "license": "MIT", + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/stackblur-canvas": { + + "version": "2.7.0", + + "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz", + + "integrity": "sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==", + + "license": "MIT", + + "optional": true, + + "engines": { + + "node": ">=0.1.14" + + } + + }, + + "node_modules/stackframe": { + + "version": "1.3.4", + + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + + "license": "MIT" + + }, + + "node_modules/static-eval": { + + "version": "2.0.2", + + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", + + "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", + + "license": "MIT", + + "dependencies": { + + "escodegen": "^1.8.1" + + } + + }, + + "node_modules/static-eval/node_modules/escodegen": { + + "version": "1.14.3", + + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", + + "license": "BSD-2-Clause", + + "dependencies": { + + "esprima": "^4.0.1", + + "estraverse": "^4.2.0", + + "esutils": "^2.0.2", + + "optionator": "^0.8.1" + + }, + + "bin": { + + "escodegen": "bin/escodegen.js", + + "esgenerate": "bin/esgenerate.js" + + }, + + "engines": { + + "node": ">=4.0" + + }, + + "optionalDependencies": { + + "source-map": "~0.6.1" + + } + + }, + + "node_modules/static-eval/node_modules/estraverse": { + + "version": "4.3.0", + + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + + "license": "BSD-2-Clause", + + "engines": { + + "node": ">=4.0" + + } + + }, + + "node_modules/static-eval/node_modules/levn": { + + "version": "0.3.0", + + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + + "license": "MIT", + + "dependencies": { + + "prelude-ls": "~1.1.2", + + "type-check": "~0.3.2" + + }, + + "engines": { + + "node": ">= 0.8.0" + + } + + }, + + "node_modules/static-eval/node_modules/optionator": { + + "version": "0.8.3", + + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + + "license": "MIT", + + "dependencies": { + + "deep-is": "~0.1.3", + + "fast-levenshtein": "~2.0.6", + + "levn": "~0.3.0", + + "prelude-ls": "~1.1.2", + + "type-check": "~0.3.2", + + "word-wrap": "~1.2.3" + + }, + + "engines": { + + "node": ">= 0.8.0" + + } + + }, + + "node_modules/static-eval/node_modules/prelude-ls": { + + "version": "1.1.2", + + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + + "engines": { + + "node": ">= 0.8.0" + + } + + }, + + "node_modules/static-eval/node_modules/source-map": { + + "version": "0.6.1", + + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + + "license": "BSD-3-Clause", + + "optional": true, + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/static-eval/node_modules/type-check": { + + "version": "0.3.2", + + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + + "license": "MIT", + + "dependencies": { + + "prelude-ls": "~1.1.2" + + }, + + "engines": { + + "node": ">= 0.8.0" + + } + + }, + + "node_modules/statuses": { + + "version": "2.0.1", + + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.8" + + } + + }, + + "node_modules/string_decoder": { + + "version": "1.3.0", + + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + + "license": "MIT", + + "dependencies": { + + "safe-buffer": "~5.2.0" + + } + + }, + + "node_modules/string-length": { + + "version": "4.0.2", + + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + + "license": "MIT", + + "dependencies": { + + "char-regex": "^1.0.2", + + "strip-ansi": "^6.0.0" + + }, + + "engines": { + + "node": ">=10" + + } + + }, + + "node_modules/string-natural-compare": { + + "version": "3.0.1", + + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==", + + "license": "MIT" + + }, + + "node_modules/string-width": { + + "version": "4.2.3", + + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + + "license": "MIT", + + "dependencies": { + + "emoji-regex": "^8.0.0", + + "is-fullwidth-code-point": "^3.0.0", + + "strip-ansi": "^6.0.1" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/string-width-cjs": { + + "name": "string-width", + + "version": "4.2.3", + + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + + "license": "MIT", + + "dependencies": { + + "emoji-regex": "^8.0.0", + + "is-fullwidth-code-point": "^3.0.0", + + "strip-ansi": "^6.0.1" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/string-width-cjs/node_modules/emoji-regex": { + + "version": "8.0.0", + + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + + "license": "MIT" + + }, + + "node_modules/string-width/node_modules/emoji-regex": { + + "version": "8.0.0", + + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + + "license": "MIT" + + }, + + "node_modules/string.prototype.includes": { + + "version": "2.0.1", + + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + + "license": "MIT", + + "dependencies": { + + "call-bind": "^1.0.7", + + "define-properties": "^1.2.1", + + "es-abstract": "^1.23.3" + + }, + + "engines": { + + "node": ">= 0.4" + + } + + }, + + "node_modules/string.prototype.matchall": { + + "version": "4.0.12", + + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + + "license": "MIT", + + "dependencies": { + + "call-bind": "^1.0.8", + + "call-bound": "^1.0.3", + + "define-properties": "^1.2.1", + + "es-abstract": "^1.23.6", + + "es-errors": "^1.3.0", + + "es-object-atoms": "^1.0.0", + + "get-intrinsic": "^1.2.6", + + "gopd": "^1.2.0", + + "has-symbols": "^1.1.0", + + "internal-slot": "^1.1.0", + + "regexp.prototype.flags": "^1.5.3", + + "set-function-name": "^2.0.2", + + "side-channel": "^1.1.0" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/string.prototype.repeat": { + + "version": "1.0.0", + + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + + "license": "MIT", + + "dependencies": { + + "define-properties": "^1.1.3", + + "es-abstract": "^1.17.5" + + } + + }, + + "node_modules/string.prototype.trim": { + + "version": "1.2.10", + + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + + "license": "MIT", + + "dependencies": { + + "call-bind": "^1.0.8", + + "call-bound": "^1.0.2", + + "define-data-property": "^1.1.4", + + "define-properties": "^1.2.1", + + "es-abstract": "^1.23.5", + + "es-object-atoms": "^1.0.0", + + "has-property-descriptors": "^1.0.2" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/string.prototype.trimend": { + + "version": "1.0.9", + + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + + "license": "MIT", + + "dependencies": { + + "call-bind": "^1.0.8", + + "call-bound": "^1.0.2", + + "define-properties": "^1.2.1", + + "es-object-atoms": "^1.0.0" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/string.prototype.trimstart": { + + "version": "1.0.8", + + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + + "license": "MIT", + + "dependencies": { + + "call-bind": "^1.0.7", + + "define-properties": "^1.2.1", + + "es-object-atoms": "^1.0.0" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/stringify-object": { + + "version": "3.3.0", + + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + + "license": "BSD-2-Clause", + + "dependencies": { + + "get-own-enumerable-property-symbols": "^3.0.0", + + "is-obj": "^1.0.1", + + "is-regexp": "^1.0.0" + + }, + + "engines": { + + "node": ">=4" + + } + + }, + + "node_modules/strip-ansi": { + + "version": "6.0.1", + + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + + "license": "MIT", + + "dependencies": { + + "ansi-regex": "^5.0.1" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/strip-ansi-cjs": { + + "name": "strip-ansi", + + "version": "6.0.1", + + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + + "license": "MIT", + + "dependencies": { + + "ansi-regex": "^5.0.1" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/strip-bom": { + + "version": "4.0.0", + + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + + "license": "MIT", + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/strip-comments": { + + "version": "2.0.1", + + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + + "license": "MIT", + + "engines": { + + "node": ">=10" + + } + + }, + + "node_modules/strip-final-newline": { + + "version": "2.0.0", + + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + + "license": "MIT", + + "engines": { + + "node": ">=6" + + } + + }, + + "node_modules/strip-indent": { + + "version": "3.0.0", + + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + + "license": "MIT", + + "dependencies": { + + "min-indent": "^1.0.0" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/strip-json-comments": { + + "version": "3.1.1", + + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + + "license": "MIT", + + "engines": { + + "node": ">=8" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/style-loader": { + + "version": "3.3.4", + + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", + + "license": "MIT", + + "engines": { + + "node": ">= 12.13.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/webpack" + + }, + + "peerDependencies": { + + "webpack": "^5.0.0" + + } + + }, + + "node_modules/stylehacks": { + + "version": "5.1.1", + + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + + "license": "MIT", + + "dependencies": { + + "browserslist": "^4.21.4", + + "postcss-selector-parser": "^6.0.4" + + }, + + "engines": { + + "node": "^10 || ^12 || >=14.0" + + }, + + "peerDependencies": { + + "postcss": "^8.2.15" + + } + + }, + + "node_modules/stylis": { + + "version": "4.2.0", + + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + + "license": "MIT" + + }, + + "node_modules/sucrase": { + + "version": "3.35.0", + + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + + "license": "MIT", + + "dependencies": { + + "@jridgewell/gen-mapping": "^0.3.2", + + "commander": "^4.0.0", + + "glob": "^10.3.10", + + "lines-and-columns": "^1.1.6", + + "mz": "^2.7.0", + + "pirates": "^4.0.1", + + "ts-interface-checker": "^0.1.9" + + }, + + "bin": { + + "sucrase": "bin/sucrase", + + "sucrase-node": "bin/sucrase-node" + + }, + + "engines": { + + "node": ">=16 || 14 >=14.17" + + } + + }, + + "node_modules/sucrase/node_modules/brace-expansion": { + + "version": "2.0.1", + + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + + "license": "MIT", + + "dependencies": { + + "balanced-match": "^1.0.0" + + } + + }, + + "node_modules/sucrase/node_modules/commander": { + + "version": "4.1.1", + + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + + "license": "MIT", + + "engines": { + + "node": ">= 6" + + } + + }, + + "node_modules/sucrase/node_modules/glob": { + + "version": "10.4.5", + + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + + "license": "ISC", + + "dependencies": { + + "foreground-child": "^3.1.0", + + "jackspeak": "^3.1.2", + + "minimatch": "^9.0.4", + + "minipass": "^7.1.2", + + "package-json-from-dist": "^1.0.0", + + "path-scurry": "^1.11.1" + + }, + + "bin": { + + "glob": "dist/esm/bin.mjs" + + }, + + "funding": { + + "url": "https://github.com/sponsors/isaacs" + + } + + }, + + "node_modules/sucrase/node_modules/minimatch": { + + "version": "9.0.5", + + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + + "license": "ISC", + + "dependencies": { + + "brace-expansion": "^2.0.1" + + }, + + "engines": { + + "node": ">=16 || 14 >=14.17" + + }, + + "funding": { + + "url": "https://github.com/sponsors/isaacs" + + } + + }, + + "node_modules/supports-color": { + + "version": "7.2.0", + + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + + "license": "MIT", + + "dependencies": { + + "has-flag": "^4.0.0" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/supports-hyperlinks": { + + "version": "2.3.0", + + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + + "license": "MIT", + + "dependencies": { + + "has-flag": "^4.0.0", + + "supports-color": "^7.0.0" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/supports-preserve-symlinks-flag": { + + "version": "1.0.0", + + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/svg-parser": { + + "version": "2.0.4", + + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + + "license": "MIT" + + }, + + "node_modules/svg-pathdata": { + + "version": "6.0.3", + + "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.3.tgz", + + "integrity": "sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==", + + "license": "MIT", + + "optional": true, + + "engines": { + + "node": ">=12.0.0" + + } + + }, + + "node_modules/svgo": { + + "version": "1.3.2", + + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", + + "license": "MIT", + + "dependencies": { + + "chalk": "^2.4.1", + + "coa": "^2.0.2", + + "css-select": "^2.0.0", + + "css-select-base-adapter": "^0.1.1", + + "css-tree": "1.0.0-alpha.37", + + "csso": "^4.0.2", + + "js-yaml": "^3.13.1", + + "mkdirp": "~0.5.1", + + "object.values": "^1.1.0", + + "sax": "~1.2.4", + + "stable": "^0.1.8", + + "unquote": "~1.1.1", + + "util.promisify": "~1.0.0" + + }, + + "bin": { + + "svgo": "bin/svgo" + + }, + + "engines": { + + "node": ">=4.0.0" + + } + + }, + + "node_modules/svgo/node_modules/ansi-styles": { + + "version": "3.2.1", + + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + + "license": "MIT", + + "dependencies": { + + "color-convert": "^1.9.0" + + }, + + "engines": { + + "node": ">=4" + + } + + }, + + "node_modules/svgo/node_modules/chalk": { + + "version": "2.4.2", + + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + + "license": "MIT", + + "dependencies": { + + "ansi-styles": "^3.2.1", + + "escape-string-regexp": "^1.0.5", + + "supports-color": "^5.3.0" + + }, + + "engines": { + + "node": ">=4" + + } + + }, + + "node_modules/svgo/node_modules/color-convert": { + + "version": "1.9.3", + + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + + "license": "MIT", + + "dependencies": { + + "color-name": "1.1.3" + + } + + }, + + "node_modules/svgo/node_modules/color-name": { + + "version": "1.1.3", + + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + + "license": "MIT" + + }, + + "node_modules/svgo/node_modules/css-select": { + + "version": "2.1.0", + + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + + "license": "BSD-2-Clause", + + "dependencies": { + + "boolbase": "^1.0.0", + + "css-what": "^3.2.1", + + "domutils": "^1.7.0", + + "nth-check": "^1.0.2" + + } + + }, + + "node_modules/svgo/node_modules/css-what": { + + "version": "3.4.2", + + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + + "license": "BSD-2-Clause", + + "engines": { + + "node": ">= 6" + + }, + + "funding": { + + "url": "https://github.com/sponsors/fb55" + + } + + }, + + "node_modules/svgo/node_modules/dom-serializer": { + + "version": "0.2.2", + + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + + "license": "MIT", + + "dependencies": { + + "domelementtype": "^2.0.1", + + "entities": "^2.0.0" + + } + + }, + + "node_modules/svgo/node_modules/domutils": { + + "version": "1.7.0", + + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + + "license": "BSD-2-Clause", + + "dependencies": { + + "dom-serializer": "0", + + "domelementtype": "1" + + } + + }, + + "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": { + + "version": "1.3.1", + + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + + "license": "BSD-2-Clause" + + }, + + "node_modules/svgo/node_modules/escape-string-regexp": { + + "version": "1.0.5", + + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + + "license": "MIT", + + "engines": { + + "node": ">=0.8.0" + + } + + }, + + "node_modules/svgo/node_modules/has-flag": { + + "version": "3.0.0", + + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + + "license": "MIT", + + "engines": { + + "node": ">=4" + + } + + }, + + "node_modules/svgo/node_modules/nth-check": { + + "version": "1.0.2", + + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + + "license": "BSD-2-Clause", + + "dependencies": { + + "boolbase": "~1.0.0" + + } + + }, + + "node_modules/svgo/node_modules/supports-color": { + + "version": "5.5.0", + + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + + "license": "MIT", + + "dependencies": { + + "has-flag": "^3.0.0" + + }, + + "engines": { + + "node": ">=4" + + } + + }, + + "node_modules/symbol-tree": { + + "version": "3.2.4", + + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + + "license": "MIT" + + }, + + "node_modules/tailwindcss": { + + "version": "3.4.17", + + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + + "license": "MIT", + + "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": "^3.1.3", + + "micromatch": "^4.0.8", + + "normalize-path": "^3.0.0", + + "object-hash": "^3.0.0", + + "picocolors": "^1.1.1", + + "postcss": "^8.4.47", + + "postcss-import": "^15.1.0", + + "postcss-js": "^4.0.1", + + "postcss-load-config": "^4.0.2", + + "postcss-nested": "^6.2.0", + + "postcss-selector-parser": "^6.1.2", + + "resolve": "^1.22.8", + + "sucrase": "^3.35.0" + + }, + + "bin": { + + "tailwind": "lib/cli.js", + + "tailwindcss": "lib/cli.js" + + }, + + "engines": { + + "node": ">=14.0.0" + + } + + }, + + "node_modules/tailwindcss/node_modules/lilconfig": { + + "version": "3.1.3", + + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + + "license": "MIT", + + "engines": { + + "node": ">=14" + + }, + + "funding": { + + "url": "https://github.com/sponsors/antonk52" + + } + + }, + + "node_modules/tapable": { + + "version": "2.2.1", + + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + + "license": "MIT", + + "engines": { + + "node": ">=6" + + } + + }, + + "node_modules/temp-dir": { + + "version": "2.0.0", + + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + + "license": "MIT", + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/tempy": { + + "version": "0.6.0", + + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + + "license": "MIT", + + "dependencies": { + + "is-stream": "^2.0.0", + + "temp-dir": "^2.0.0", + + "type-fest": "^0.16.0", + + "unique-string": "^2.0.0" + + }, + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/tempy/node_modules/type-fest": { + + "version": "0.16.0", + + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + + "license": "(MIT OR CC0-1.0)", + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/terminal-link": { + + "version": "2.1.1", + + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + + "license": "MIT", + + "dependencies": { + + "ansi-escapes": "^4.2.1", + + "supports-hyperlinks": "^2.0.0" + + }, + + "engines": { + + "node": ">=8" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/terser": { + + "version": "5.39.0", + + "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", + + "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", + + "license": "BSD-2-Clause", + + "dependencies": { + + "@jridgewell/source-map": "^0.3.3", + + "acorn": "^8.8.2", + + "commander": "^2.20.0", + + "source-map-support": "~0.5.20" + + }, + + "bin": { + + "terser": "bin/terser" + + }, + + "engines": { + + "node": ">=10" + + } + + }, + + "node_modules/terser-webpack-plugin": { + + "version": "5.3.14", + + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + + "license": "MIT", + + "dependencies": { + + "@jridgewell/trace-mapping": "^0.3.25", + + "jest-worker": "^27.4.5", + + "schema-utils": "^4.3.0", + + "serialize-javascript": "^6.0.2", + + "terser": "^5.31.1" + + }, + + "engines": { + + "node": ">= 10.13.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/webpack" + + }, + + "peerDependencies": { + + "webpack": "^5.1.0" + + }, + + "peerDependenciesMeta": { + + "@swc/core": { + + "optional": true + + }, + + "esbuild": { + + "optional": true + + }, + + "uglify-js": { + + "optional": true + + } + + } + + }, + + "node_modules/terser/node_modules/commander": { + + "version": "2.20.3", + + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + + "license": "MIT" + + }, + + "node_modules/test-exclude": { + + "version": "6.0.0", + + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + + "license": "ISC", + + "dependencies": { + + "@istanbuljs/schema": "^0.1.2", + + "glob": "^7.1.4", + + "minimatch": "^3.0.4" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/text-segmentation": { + + "version": "1.0.3", + + "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", + + "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==", + + "license": "MIT", + + "optional": true, + + "dependencies": { + + "utrie": "^1.0.2" + + } + + }, + + "node_modules/text-table": { + + "version": "0.2.0", + + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + + "license": "MIT" + + }, + + "node_modules/thenify": { + + "version": "3.3.1", + + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + + "license": "MIT", + + "dependencies": { + + "any-promise": "^1.0.0" + + } + + }, + + "node_modules/thenify-all": { + + "version": "1.6.0", + + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + + "license": "MIT", + + "dependencies": { + + "thenify": ">= 3.1.0 < 4" + + }, + + "engines": { + + "node": ">=0.8" + + } + + }, + + "node_modules/throat": { + + "version": "6.0.2", + + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", + + "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==", + + "license": "MIT" + + }, + + "node_modules/thunky": { + + "version": "1.1.0", + + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + + "license": "MIT" + + }, + + "node_modules/tiny-invariant": { + + "version": "1.3.3", + + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + + "license": "MIT" + + }, + + "node_modules/tmpl": { + + "version": "1.0.5", + + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + + "license": "BSD-3-Clause" + + }, + + "node_modules/to-regex-range": { + + "version": "5.0.1", + + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + + "license": "MIT", + + "dependencies": { + + "is-number": "^7.0.0" + + }, + + "engines": { + + "node": ">=8.0" + + } + + }, + + "node_modules/toidentifier": { + + "version": "1.0.1", + + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + + "license": "MIT", + + "engines": { + + "node": ">=0.6" + + } + + }, + + "node_modules/tough-cookie": { + + "version": "4.1.4", + + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + + "license": "BSD-3-Clause", + + "dependencies": { + + "psl": "^1.1.33", + + "punycode": "^2.1.1", + + "universalify": "^0.2.0", + + "url-parse": "^1.5.3" + + }, + + "engines": { + + "node": ">=6" + + } + + }, + + "node_modules/tough-cookie/node_modules/universalify": { + + "version": "0.2.0", + + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + + "license": "MIT", + + "engines": { + + "node": ">= 4.0.0" + + } + + }, + + "node_modules/tr46": { + + "version": "2.1.0", + + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + + "license": "MIT", + + "dependencies": { + + "punycode": "^2.1.1" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/tryer": { + + "version": "1.0.1", + + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + + "license": "MIT" + + }, + + "node_modules/ts-interface-checker": { + + "version": "0.1.13", + + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + + "license": "Apache-2.0" + + }, + + "node_modules/tsconfig-paths": { + + "version": "3.15.0", + + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + + "license": "MIT", + + "dependencies": { + + "@types/json5": "^0.0.29", + + "json5": "^1.0.2", + + "minimist": "^1.2.6", + + "strip-bom": "^3.0.0" + + } + + }, + + "node_modules/tsconfig-paths/node_modules/json5": { + + "version": "1.0.2", + + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + + "license": "MIT", + + "dependencies": { + + "minimist": "^1.2.0" + + }, + + "bin": { + + "json5": "lib/cli.js" + + } + + }, + + "node_modules/tsconfig-paths/node_modules/strip-bom": { + + "version": "3.0.0", + + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + + "license": "MIT", + + "engines": { + + "node": ">=4" + + } + + }, + + "node_modules/tslib": { + + "version": "2.8.1", + + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + + "license": "0BSD" + + }, + + "node_modules/tsutils": { + + "version": "3.21.0", + + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + + "license": "MIT", + + "dependencies": { + + "tslib": "^1.8.1" + + }, + + "engines": { + + "node": ">= 6" + + }, + + "peerDependencies": { + + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + + } + + }, + + "node_modules/tsutils/node_modules/tslib": { + + "version": "1.14.1", + + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + + "license": "0BSD" + + }, + + "node_modules/type-check": { + + "version": "0.4.0", + + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + + "license": "MIT", + + "dependencies": { + + "prelude-ls": "^1.2.1" + + }, + + "engines": { + + "node": ">= 0.8.0" + + } + + }, + + "node_modules/type-detect": { + + "version": "4.0.8", + + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + + "license": "MIT", + + "engines": { + + "node": ">=4" + + } + + }, + + "node_modules/type-fest": { + + "version": "0.21.3", + + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + + "license": "(MIT OR CC0-1.0)", + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + }, + + "node_modules/type-is": { + + "version": "1.6.18", + + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + + "license": "MIT", + + "dependencies": { + + "media-typer": "0.3.0", + + "mime-types": "~2.1.24" + + }, + + "engines": { + + "node": ">= 0.6" + + } + + }, + + "node_modules/typed-array-buffer": { + + "version": "1.0.3", + + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + + "license": "MIT", + + "dependencies": { + + "call-bound": "^1.0.3", + + "es-errors": "^1.3.0", + + "is-typed-array": "^1.1.14" + + }, + + "engines": { + + "node": ">= 0.4" + + } + + }, + + "node_modules/typed-array-byte-length": { + + "version": "1.0.3", + + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + + "license": "MIT", + + "dependencies": { + + "call-bind": "^1.0.8", + + "for-each": "^0.3.3", + + "gopd": "^1.2.0", + + "has-proto": "^1.2.0", + + "is-typed-array": "^1.1.14" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/typed-array-byte-offset": { + + "version": "1.0.4", + + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + + "license": "MIT", + + "dependencies": { + + "available-typed-arrays": "^1.0.7", + + "call-bind": "^1.0.8", + + "for-each": "^0.3.3", + + "gopd": "^1.2.0", + + "has-proto": "^1.2.0", + + "is-typed-array": "^1.1.15", + + "reflect.getprototypeof": "^1.0.9" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/typed-array-length": { + + "version": "1.0.7", + + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + + "license": "MIT", + + "dependencies": { + + "call-bind": "^1.0.7", + + "for-each": "^0.3.3", + + "gopd": "^1.0.1", + + "is-typed-array": "^1.1.13", + + "possible-typed-array-names": "^1.0.0", + + "reflect.getprototypeof": "^1.0.6" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/typedarray-to-buffer": { + + "version": "3.1.5", + + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + + "license": "MIT", + + "dependencies": { + + "is-typedarray": "^1.0.0" + + } + + }, + + "node_modules/typescript": { + + "version": "4.9.5", + + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + + "license": "Apache-2.0", + + "peer": true, + + "bin": { + + "tsc": "bin/tsc", + + "tsserver": "bin/tsserver" + + }, + + "engines": { + + "node": ">=4.2.0" + + } + + }, + + "node_modules/unbox-primitive": { + + "version": "1.1.0", + + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + + "license": "MIT", + + "dependencies": { + + "call-bound": "^1.0.3", + + "has-bigints": "^1.0.2", + + "has-symbols": "^1.1.0", + + "which-boxed-primitive": "^1.1.1" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/underscore": { + + "version": "1.12.1", + + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", + + "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==", + + "license": "MIT" + + }, + + "node_modules/undici-types": { + + "version": "6.21.0", + + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + + "license": "MIT" + + }, + + "node_modules/unicode-canonical-property-names-ecmascript": { + + "version": "2.0.1", + + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + + "license": "MIT", + + "engines": { + + "node": ">=4" + + } + + }, + + "node_modules/unicode-match-property-ecmascript": { + + "version": "2.0.0", + + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + + "license": "MIT", + + "dependencies": { + + "unicode-canonical-property-names-ecmascript": "^2.0.0", + + "unicode-property-aliases-ecmascript": "^2.0.0" + + }, + + "engines": { + + "node": ">=4" + + } + + }, + + "node_modules/unicode-match-property-value-ecmascript": { + + "version": "2.2.0", + + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", + + "license": "MIT", + + "engines": { + + "node": ">=4" + + } + + }, + + "node_modules/unicode-property-aliases-ecmascript": { + + "version": "2.1.0", + + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + + "license": "MIT", + + "engines": { + + "node": ">=4" + + } + + }, + + "node_modules/unique-string": { + + "version": "2.0.0", + + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + + "license": "MIT", + + "dependencies": { + + "crypto-random-string": "^2.0.0" + + }, + + "engines": { + + "node": ">=8" + + } + + }, + + "node_modules/universalify": { + + "version": "2.0.1", + + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + + "license": "MIT", + + "engines": { + + "node": ">= 10.0.0" + + } + + }, + + "node_modules/unpipe": { + + "version": "1.0.0", + + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.8" + + } + + }, + + "node_modules/unquote": { + + "version": "1.1.1", + + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", + + "license": "MIT" + + }, + + "node_modules/upath": { + + "version": "1.2.0", + + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + + "license": "MIT", + + "engines": { + + "node": ">=4", + + "yarn": "*" + + } + + }, + + "node_modules/update-browserslist-db": { + + "version": "1.1.3", + + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + + "funding": [ + + { + + "type": "opencollective", + + "url": "https://opencollective.com/browserslist" + + }, + + { + + "type": "tidelift", + + "url": "https://tidelift.com/funding/github/npm/browserslist" + + }, + + { + + "type": "github", + + "url": "https://github.com/sponsors/ai" + + } + + ], + + "license": "MIT", + + "dependencies": { + + "escalade": "^3.2.0", + + "picocolors": "^1.1.1" + + }, + + "bin": { + + "update-browserslist-db": "cli.js" + + }, + + "peerDependencies": { + + "browserslist": ">= 4.21.0" + + } + + }, + + "node_modules/uri-js": { + + "version": "4.4.1", + + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + + "license": "BSD-2-Clause", + + "dependencies": { + + "punycode": "^2.1.0" + + } + + }, + + "node_modules/url-parse": { + + "version": "1.5.10", + + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + + "license": "MIT", + + "dependencies": { + + "querystringify": "^2.1.1", + + "requires-port": "^1.0.0" + + } + + }, + + "node_modules/util-deprecate": { + + "version": "1.0.2", + + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + + "license": "MIT" + + }, + + "node_modules/util.promisify": { + + "version": "1.0.1", + + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + + "license": "MIT", + + "dependencies": { + + "define-properties": "^1.1.3", + + "es-abstract": "^1.17.2", + + "has-symbols": "^1.0.1", + + "object.getownpropertydescriptors": "^2.1.0" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/utila": { + + "version": "0.4.0", + + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + + "license": "MIT" + + }, + + "node_modules/utils-merge": { + + "version": "1.0.1", + + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.4.0" + + } + + }, + + "node_modules/utrie": { + + "version": "1.0.2", + + "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", + + "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==", + + "license": "MIT", + + "optional": true, + + "dependencies": { + + "base64-arraybuffer": "^1.0.2" + + } + + }, + + "node_modules/uuid": { + + "version": "8.3.2", + + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + + "license": "MIT", + + "bin": { + + "uuid": "dist/bin/uuid" + + } + + }, + + "node_modules/v8-to-istanbul": { + + "version": "8.1.1", + + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + + "license": "ISC", + + "dependencies": { + + "@types/istanbul-lib-coverage": "^2.0.1", + + "convert-source-map": "^1.6.0", + + "source-map": "^0.7.3" + + }, + + "engines": { + + "node": ">=10.12.0" + + } + + }, + + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + + "version": "1.9.0", + + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + + "license": "MIT" + + }, + + "node_modules/vary": { + + "version": "1.1.2", + + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + + "license": "MIT", + + "engines": { + + "node": ">= 0.8" + + } + + }, + + "node_modules/victory-vendor": { + + "version": "36.9.2", + + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", + + "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==", + + "license": "MIT AND ISC", + + "dependencies": { + + "@types/d3-array": "^3.0.3", + + "@types/d3-ease": "^3.0.0", + + "@types/d3-interpolate": "^3.0.1", + + "@types/d3-scale": "^4.0.2", + + "@types/d3-shape": "^3.1.0", + + "@types/d3-time": "^3.0.0", + + "@types/d3-timer": "^3.0.0", + + "d3-array": "^3.1.6", + + "d3-ease": "^3.0.1", + + "d3-interpolate": "^3.0.1", + + "d3-scale": "^4.0.2", + + "d3-shape": "^3.1.0", + + "d3-time": "^3.0.0", + + "d3-timer": "^3.0.1" + + } + + }, + + "node_modules/w3c-hr-time": { + + "version": "1.0.2", + + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + + "license": "MIT", + + "dependencies": { + + "browser-process-hrtime": "^1.0.0" + + } + + }, + + "node_modules/w3c-xmlserializer": { + + "version": "2.0.0", + + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + + "license": "MIT", + + "dependencies": { + + "xml-name-validator": "^3.0.0" + + }, + + "engines": { + + "node": ">=10" + + } + + }, + + "node_modules/walker": { + + "version": "1.0.8", + + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + + "license": "Apache-2.0", + + "dependencies": { + + "makeerror": "1.0.12" + + } + + }, + + "node_modules/watchpack": { + + "version": "2.4.2", + + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + + "license": "MIT", + + "dependencies": { + + "glob-to-regexp": "^0.4.1", + + "graceful-fs": "^4.1.2" + + }, + + "engines": { + + "node": ">=10.13.0" + + } + + }, + + "node_modules/wbuf": { + + "version": "1.7.3", + + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + + "license": "MIT", + + "dependencies": { + + "minimalistic-assert": "^1.0.0" + + } + + }, + + "node_modules/web-vitals": { + + "version": "2.1.4", + + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz", + + "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==", + + "license": "Apache-2.0" + + }, + + "node_modules/webidl-conversions": { + + "version": "6.1.0", + + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + + "license": "BSD-2-Clause", + + "engines": { + + "node": ">=10.4" + + } + + }, + + "node_modules/webpack": { + + "version": "5.99.7", + + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.7.tgz", + + "integrity": "sha512-CNqKBRMQjwcmKR0idID5va1qlhrqVUKpovi+Ec79ksW8ux7iS1+A6VqzfZXgVYCFRKl7XL5ap3ZoMpwBJxcg0w==", + + "license": "MIT", + + "dependencies": { + + "@types/eslint-scope": "^3.7.7", + + "@types/estree": "^1.0.6", + + "@types/json-schema": "^7.0.15", + + "@webassemblyjs/ast": "^1.14.1", + + "@webassemblyjs/wasm-edit": "^1.14.1", + + "@webassemblyjs/wasm-parser": "^1.14.1", + + "acorn": "^8.14.0", + + "browserslist": "^4.24.0", + + "chrome-trace-event": "^1.0.2", + + "enhanced-resolve": "^5.17.1", + + "es-module-lexer": "^1.2.1", + + "eslint-scope": "5.1.1", + + "events": "^3.2.0", + + "glob-to-regexp": "^0.4.1", + + "graceful-fs": "^4.2.11", + + "json-parse-even-better-errors": "^2.3.1", + + "loader-runner": "^4.2.0", + + "mime-types": "^2.1.27", + + "neo-async": "^2.6.2", + + "schema-utils": "^4.3.2", + + "tapable": "^2.1.1", + + "terser-webpack-plugin": "^5.3.11", + + "watchpack": "^2.4.1", + + "webpack-sources": "^3.2.3" + + }, + + "bin": { + + "webpack": "bin/webpack.js" + + }, + + "engines": { + + "node": ">=10.13.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/webpack" + + }, + + "peerDependenciesMeta": { + + "webpack-cli": { + + "optional": true + + } + + } + + }, + + "node_modules/webpack-dev-middleware": { + + "version": "5.3.4", + + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + + "license": "MIT", + + "dependencies": { + + "colorette": "^2.0.10", + + "memfs": "^3.4.3", + + "mime-types": "^2.1.31", + + "range-parser": "^1.2.1", + + "schema-utils": "^4.0.0" + + }, + + "engines": { + + "node": ">= 12.13.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/webpack" + + }, + + "peerDependencies": { + + "webpack": "^4.0.0 || ^5.0.0" + + } + + }, + + "node_modules/webpack-dev-server": { + + "version": "4.15.2", + + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", + + "license": "MIT", + + "dependencies": { + + "@types/bonjour": "^3.5.9", + + "@types/connect-history-api-fallback": "^1.3.5", + + "@types/express": "^4.17.13", + + "@types/serve-index": "^1.9.1", + + "@types/serve-static": "^1.13.10", + + "@types/sockjs": "^0.3.33", + + "@types/ws": "^8.5.5", + + "ansi-html-community": "^0.0.8", + + "bonjour-service": "^1.0.11", + + "chokidar": "^3.5.3", + + "colorette": "^2.0.10", + + "compression": "^1.7.4", + + "connect-history-api-fallback": "^2.0.0", + + "default-gateway": "^6.0.3", + + "express": "^4.17.3", + + "graceful-fs": "^4.2.6", + + "html-entities": "^2.3.2", + + "http-proxy-middleware": "^2.0.3", + + "ipaddr.js": "^2.0.1", + + "launch-editor": "^2.6.0", + + "open": "^8.0.9", + + "p-retry": "^4.5.0", + + "rimraf": "^3.0.2", + + "schema-utils": "^4.0.0", + + "selfsigned": "^2.1.1", + + "serve-index": "^1.9.1", + + "sockjs": "^0.3.24", + + "spdy": "^4.0.2", + + "webpack-dev-middleware": "^5.3.4", + + "ws": "^8.13.0" + + }, + + "bin": { + + "webpack-dev-server": "bin/webpack-dev-server.js" + + }, + + "engines": { + + "node": ">= 12.13.0" + + }, + + "funding": { + + "type": "opencollective", + + "url": "https://opencollective.com/webpack" + + }, + + "peerDependencies": { + + "webpack": "^4.37.0 || ^5.0.0" + + }, + + "peerDependenciesMeta": { + + "webpack": { + + "optional": true + + }, + + "webpack-cli": { + + "optional": true + + } + + } + + }, + + "node_modules/webpack-dev-server/node_modules/ws": { + + "version": "8.18.2", + + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", + + "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", + + "license": "MIT", + + "engines": { + + "node": ">=10.0.0" + + }, + + "peerDependencies": { + + "bufferutil": "^4.0.1", + + "utf-8-validate": ">=5.0.2" + + }, + + "peerDependenciesMeta": { + + "bufferutil": { + + "optional": true + + }, + + "utf-8-validate": { + + "optional": true + + } + + } + + }, + + "node_modules/webpack-manifest-plugin": { + + "version": "4.1.1", + + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", + + "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", + + "license": "MIT", + + "dependencies": { + + "tapable": "^2.0.0", + + "webpack-sources": "^2.2.0" + + }, + + "engines": { + + "node": ">=12.22.0" + + }, + + "peerDependencies": { + + "webpack": "^4.44.2 || ^5.47.0" + + } + + }, + + "node_modules/webpack-manifest-plugin/node_modules/source-map": { + + "version": "0.6.1", + + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + + "license": "BSD-3-Clause", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": { + + "version": "2.3.1", + + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", + + "license": "MIT", + + "dependencies": { + + "source-list-map": "^2.0.1", + + "source-map": "^0.6.1" + + }, + + "engines": { + + "node": ">=10.13.0" + + } + + }, + + "node_modules/webpack-sources": { + + "version": "3.2.3", + + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + + "license": "MIT", + + "engines": { + + "node": ">=10.13.0" + + } + + }, + + "node_modules/webpack/node_modules/eslint-scope": { + + "version": "5.1.1", + + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + + "license": "BSD-2-Clause", + + "dependencies": { + + "esrecurse": "^4.3.0", + + "estraverse": "^4.1.1" + + }, + + "engines": { + + "node": ">=8.0.0" + + } + + }, + + "node_modules/webpack/node_modules/estraverse": { + + "version": "4.3.0", + + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + + "license": "BSD-2-Clause", + + "engines": { + + "node": ">=4.0" + + } + + }, + + "node_modules/websocket-driver": { + + "version": "0.7.4", + + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + + "license": "Apache-2.0", + + "dependencies": { + + "http-parser-js": ">=0.5.1", + + "safe-buffer": ">=5.1.0", + + "websocket-extensions": ">=0.1.1" + + }, + + "engines": { + + "node": ">=0.8.0" + + } + + }, + + "node_modules/websocket-extensions": { + + "version": "0.1.4", + + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + + "license": "Apache-2.0", + + "engines": { + + "node": ">=0.8.0" + + } + + }, + + "node_modules/whatwg-encoding": { + + "version": "1.0.5", + + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + + "license": "MIT", + + "dependencies": { + + "iconv-lite": "0.4.24" + + } + + }, + + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + + "version": "0.4.24", + + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + + "license": "MIT", + + "dependencies": { + + "safer-buffer": ">= 2.1.2 < 3" + + }, + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/whatwg-fetch": { + + "version": "3.6.20", + + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + + "license": "MIT" + + }, + + "node_modules/whatwg-mimetype": { + + "version": "2.3.0", + + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + + "license": "MIT" + + }, + + "node_modules/whatwg-url": { + + "version": "8.7.0", + + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + + "license": "MIT", + + "dependencies": { + + "lodash": "^4.7.0", + + "tr46": "^2.1.0", + + "webidl-conversions": "^6.1.0" + + }, + + "engines": { + + "node": ">=10" + + } + + }, + + "node_modules/which": { + + "version": "2.0.2", + + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + + "license": "ISC", + + "dependencies": { + + "isexe": "^2.0.0" + + }, + + "bin": { + + "node-which": "bin/node-which" + + }, + + "engines": { + + "node": ">= 8" + + } + + }, + + "node_modules/which-boxed-primitive": { + + "version": "1.1.1", + + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + + "license": "MIT", + + "dependencies": { + + "is-bigint": "^1.1.0", + + "is-boolean-object": "^1.2.1", + + "is-number-object": "^1.1.1", + + "is-string": "^1.1.1", + + "is-symbol": "^1.1.1" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/which-builtin-type": { + + "version": "1.2.1", + + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + + "license": "MIT", + + "dependencies": { + + "call-bound": "^1.0.2", + + "function.prototype.name": "^1.1.6", + + "has-tostringtag": "^1.0.2", + + "is-async-function": "^2.0.0", + + "is-date-object": "^1.1.0", + + "is-finalizationregistry": "^1.1.0", + + "is-generator-function": "^1.0.10", + + "is-regex": "^1.2.1", + + "is-weakref": "^1.0.2", + + "isarray": "^2.0.5", + + "which-boxed-primitive": "^1.1.0", + + "which-collection": "^1.0.2", + + "which-typed-array": "^1.1.16" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/which-collection": { + + "version": "1.0.2", + + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + + "license": "MIT", + + "dependencies": { + + "is-map": "^2.0.3", + + "is-set": "^2.0.3", + + "is-weakmap": "^2.0.2", + + "is-weakset": "^2.0.3" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/which-typed-array": { + + "version": "1.1.19", + + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + + "license": "MIT", + + "dependencies": { + + "available-typed-arrays": "^1.0.7", + + "call-bind": "^1.0.8", + + "call-bound": "^1.0.4", + + "for-each": "^0.3.5", + + "get-proto": "^1.0.1", + + "gopd": "^1.2.0", + + "has-tostringtag": "^1.0.2" + + }, + + "engines": { + + "node": ">= 0.4" + + }, + + "funding": { + + "url": "https://github.com/sponsors/ljharb" + + } + + }, + + "node_modules/wmf": { + + "version": "1.0.2", + + "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz", + + "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==", + + "license": "Apache-2.0", + + "engines": { + + "node": ">=0.8" + + } + + }, + + "node_modules/word": { + + "version": "0.3.0", + + "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz", + + "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==", + + "license": "Apache-2.0", + + "engines": { + + "node": ">=0.8" + + } + + }, + + "node_modules/word-wrap": { + + "version": "1.2.5", + + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + + "license": "MIT", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/workbox-background-sync": { + + "version": "6.6.0", + + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz", + + "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==", + + "license": "MIT", + + "dependencies": { + + "idb": "^7.0.1", + + "workbox-core": "6.6.0" + + } + + }, + + "node_modules/workbox-broadcast-update": { + + "version": "6.6.0", + + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz", + + "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==", + + "license": "MIT", + + "dependencies": { + + "workbox-core": "6.6.0" + + } + + }, + + "node_modules/workbox-build": { + + "version": "6.6.0", + + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz", + + "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==", + + "license": "MIT", + + "dependencies": { + + "@apideck/better-ajv-errors": "^0.3.1", + + "@babel/core": "^7.11.1", + + "@babel/preset-env": "^7.11.0", + + "@babel/runtime": "^7.11.2", + + "@rollup/plugin-babel": "^5.2.0", + + "@rollup/plugin-node-resolve": "^11.2.1", + + "@rollup/plugin-replace": "^2.4.1", + + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + + "ajv": "^8.6.0", + + "common-tags": "^1.8.0", + + "fast-json-stable-stringify": "^2.1.0", + + "fs-extra": "^9.0.1", + + "glob": "^7.1.6", + + "lodash": "^4.17.20", + + "pretty-bytes": "^5.3.0", + + "rollup": "^2.43.1", + + "rollup-plugin-terser": "^7.0.0", + + "source-map": "^0.8.0-beta.0", + + "stringify-object": "^3.3.0", + + "strip-comments": "^2.0.1", + + "tempy": "^0.6.0", + + "upath": "^1.2.0", + + "workbox-background-sync": "6.6.0", + + "workbox-broadcast-update": "6.6.0", + + "workbox-cacheable-response": "6.6.0", + + "workbox-core": "6.6.0", + + "workbox-expiration": "6.6.0", + + "workbox-google-analytics": "6.6.0", + + "workbox-navigation-preload": "6.6.0", + + "workbox-precaching": "6.6.0", + + "workbox-range-requests": "6.6.0", + + "workbox-recipes": "6.6.0", + + "workbox-routing": "6.6.0", + + "workbox-strategies": "6.6.0", + + "workbox-streams": "6.6.0", + + "workbox-sw": "6.6.0", + + "workbox-window": "6.6.0" + + }, + + "engines": { + + "node": ">=10.0.0" + + } + + }, + + "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { + + "version": "0.3.6", + + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + + "license": "MIT", + + "dependencies": { + + "json-schema": "^0.4.0", + + "jsonpointer": "^5.0.0", + + "leven": "^3.1.0" + + }, + + "engines": { + + "node": ">=10" + + }, + + "peerDependencies": { + + "ajv": ">=8" + + } + + }, + + "node_modules/workbox-build/node_modules/ajv": { + + "version": "8.17.1", + + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + + "license": "MIT", + + "dependencies": { + + "fast-deep-equal": "^3.1.3", + + "fast-uri": "^3.0.1", + + "json-schema-traverse": "^1.0.0", + + "require-from-string": "^2.0.2" + + }, + + "funding": { + + "type": "github", + + "url": "https://github.com/sponsors/epoberezkin" + + } + + }, + + "node_modules/workbox-build/node_modules/fs-extra": { + + "version": "9.1.0", + + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + + "license": "MIT", + + "dependencies": { + + "at-least-node": "^1.0.0", + + "graceful-fs": "^4.2.0", + + "jsonfile": "^6.0.1", + + "universalify": "^2.0.0" + + }, + + "engines": { + + "node": ">=10" + + } + + }, + + "node_modules/workbox-build/node_modules/json-schema-traverse": { + + "version": "1.0.0", + + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + + "license": "MIT" + + }, + + "node_modules/workbox-build/node_modules/source-map": { + + "version": "0.8.0-beta.0", + + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + + "license": "BSD-3-Clause", + + "dependencies": { + + "whatwg-url": "^7.0.0" + + }, + + "engines": { + + "node": ">= 8" + + } + + }, + + "node_modules/workbox-build/node_modules/tr46": { + + "version": "1.0.1", + + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + + "license": "MIT", + + "dependencies": { + + "punycode": "^2.1.0" + + } + + }, + + "node_modules/workbox-build/node_modules/webidl-conversions": { + + "version": "4.0.2", + + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + + "license": "BSD-2-Clause" + + }, + + "node_modules/workbox-build/node_modules/whatwg-url": { + + "version": "7.1.0", + + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + + "license": "MIT", + + "dependencies": { + + "lodash.sortby": "^4.7.0", + + "tr46": "^1.0.1", + + "webidl-conversions": "^4.0.2" + + } + + }, + + "node_modules/workbox-cacheable-response": { + + "version": "6.6.0", + + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz", + + "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==", + + "deprecated": "workbox-background-sync@6.6.0", + + "license": "MIT", + + "dependencies": { + + "workbox-core": "6.6.0" + + } + + }, + + "node_modules/workbox-core": { + + "version": "6.6.0", + + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz", + + "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==", + + "license": "MIT" + + }, + + "node_modules/workbox-expiration": { + + "version": "6.6.0", + + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz", + + "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==", + + "license": "MIT", + + "dependencies": { + + "idb": "^7.0.1", + + "workbox-core": "6.6.0" + + } + + }, + + "node_modules/workbox-google-analytics": { + + "version": "6.6.0", + + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", + + "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", + + "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained", + + "license": "MIT", + + "dependencies": { + + "workbox-background-sync": "6.6.0", + + "workbox-core": "6.6.0", + + "workbox-routing": "6.6.0", + + "workbox-strategies": "6.6.0" + + } + + }, + + "node_modules/workbox-navigation-preload": { + + "version": "6.6.0", + + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz", + + "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==", + + "license": "MIT", + + "dependencies": { + + "workbox-core": "6.6.0" + + } + + }, + + "node_modules/workbox-precaching": { + + "version": "6.6.0", + + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz", + + "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==", + + "license": "MIT", + + "dependencies": { + + "workbox-core": "6.6.0", + + "workbox-routing": "6.6.0", + + "workbox-strategies": "6.6.0" + + } + + }, + + "node_modules/workbox-range-requests": { + + "version": "6.6.0", + + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz", + + "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==", + + "license": "MIT", + + "dependencies": { + + "workbox-core": "6.6.0" + + } + + }, + + "node_modules/workbox-recipes": { + + "version": "6.6.0", + + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz", + + "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==", + + "license": "MIT", + + "dependencies": { + + "workbox-cacheable-response": "6.6.0", + + "workbox-core": "6.6.0", + + "workbox-expiration": "6.6.0", + + "workbox-precaching": "6.6.0", + + "workbox-routing": "6.6.0", + + "workbox-strategies": "6.6.0" + + } + + }, + + "node_modules/workbox-routing": { + + "version": "6.6.0", + + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz", + + "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==", + + "license": "MIT", + + "dependencies": { + + "workbox-core": "6.6.0" + + } + + }, + + "node_modules/workbox-strategies": { + + "version": "6.6.0", + + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz", + + "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==", + + "license": "MIT", + + "dependencies": { + + "workbox-core": "6.6.0" + + } + + }, + + "node_modules/workbox-streams": { + + "version": "6.6.0", + + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz", + + "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==", + + "license": "MIT", + + "dependencies": { + + "workbox-core": "6.6.0", + + "workbox-routing": "6.6.0" + + } + + }, + + "node_modules/workbox-sw": { + + "version": "6.6.0", + + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz", + + "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==", + + "license": "MIT" + + }, + + "node_modules/workbox-webpack-plugin": { + + "version": "6.6.0", + + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz", + + "integrity": "sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==", + + "license": "MIT", + + "dependencies": { + + "fast-json-stable-stringify": "^2.1.0", + + "pretty-bytes": "^5.4.1", + + "upath": "^1.2.0", + + "webpack-sources": "^1.4.3", + + "workbox-build": "6.6.0" + + }, + + "engines": { + + "node": ">=10.0.0" + + }, + + "peerDependencies": { + + "webpack": "^4.4.0 || ^5.9.0" + + } + + }, + + "node_modules/workbox-webpack-plugin/node_modules/source-map": { + + "version": "0.6.1", + + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + + "license": "BSD-3-Clause", + + "engines": { + + "node": ">=0.10.0" + + } + + }, + + "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": { + + "version": "1.4.3", + + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + + "license": "MIT", + + "dependencies": { + + "source-list-map": "^2.0.0", + + "source-map": "~0.6.1" + + } + + }, + + "node_modules/workbox-window": { + + "version": "6.6.0", + + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz", + + "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==", + + "license": "MIT", + + "dependencies": { + + "@types/trusted-types": "^2.0.2", + + "workbox-core": "6.6.0" + + } + + }, + + "node_modules/wrap-ansi": { + + "version": "7.0.0", + + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + + "license": "MIT", + + "dependencies": { + + "ansi-styles": "^4.0.0", + + "string-width": "^4.1.0", + + "strip-ansi": "^6.0.0" + + }, + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + + } + + }, + + "node_modules/wrap-ansi-cjs": { + + "name": "wrap-ansi", + + "version": "7.0.0", + + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + + "license": "MIT", + + "dependencies": { + + "ansi-styles": "^4.0.0", + + "string-width": "^4.1.0", + + "strip-ansi": "^6.0.0" + + }, + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + + } + + }, + + "node_modules/wrappy": { + + "version": "1.0.2", + + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + + "license": "ISC" + + }, + + "node_modules/write-file-atomic": { + + "version": "3.0.3", + + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + + "license": "ISC", + + "dependencies": { + + "imurmurhash": "^0.1.4", + + "is-typedarray": "^1.0.0", + + "signal-exit": "^3.0.2", + + "typedarray-to-buffer": "^3.1.5" + + } + + }, + + "node_modules/ws": { + + "version": "7.5.10", + + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + + "license": "MIT", + + "engines": { + + "node": ">=8.3.0" + + }, + + "peerDependencies": { + + "bufferutil": "^4.0.1", + + "utf-8-validate": "^5.0.2" + + }, + + "peerDependenciesMeta": { + + "bufferutil": { + + "optional": true + + }, + + "utf-8-validate": { + + "optional": true + + } + + } + + }, + + "node_modules/xlsx": { + + "version": "0.18.5", + + "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz", + + "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", + + "license": "Apache-2.0", + + "dependencies": { + + "adler-32": "~1.3.0", + + "cfb": "~1.2.1", + + "codepage": "~1.15.0", + + "crc-32": "~1.2.1", + + "ssf": "~0.11.2", + + "wmf": "~1.0.1", + + "word": "~0.3.0" + + }, + + "bin": { + + "xlsx": "bin/xlsx.njs" + + }, + + "engines": { + + "node": ">=0.8" + + } + + }, + + "node_modules/xml-name-validator": { + + "version": "3.0.0", + + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + + "license": "Apache-2.0" + + }, + + "node_modules/xmlchars": { + + "version": "2.2.0", + + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + + "license": "MIT" + + }, + + "node_modules/y18n": { + + "version": "5.0.8", + + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + + "license": "ISC", + + "engines": { + + "node": ">=10" + + } + + }, + + "node_modules/yallist": { + + "version": "3.1.1", + + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + + "license": "ISC" + + }, + + "node_modules/yaml": { + + "version": "1.10.2", + + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + + "license": "ISC", + + "engines": { + + "node": ">= 6" + + } + + }, + + "node_modules/yargs": { + + "version": "16.2.0", + + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + + "license": "MIT", + + "dependencies": { + + "cliui": "^7.0.2", + + "escalade": "^3.1.1", + + "get-caller-file": "^2.0.5", + + "require-directory": "^2.1.1", + + "string-width": "^4.2.0", + + "y18n": "^5.0.5", + + "yargs-parser": "^20.2.2" + + }, + + "engines": { + + "node": ">=10" + + } + + }, + + "node_modules/yargs-parser": { + + "version": "20.2.9", + + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + + "license": "ISC", + + "engines": { + + "node": ">=10" + + } + + }, + + "node_modules/yocto-queue": { + + "version": "0.1.0", + + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + + "license": "MIT", + + "engines": { + + "node": ">=10" + + }, + + "funding": { + + "url": "https://github.com/sponsors/sindresorhus" + + } + + } + + } + +} + diff --git a/package.json b/package.json new file mode 100644 index 0000000..36a6a65 --- /dev/null +++ b/package.json @@ -0,0 +1,122 @@ +{ + + "name": "resturant-dashbord", + + "version": "0.1.0", + + "private": true, + + "dependencies": { + + "@emotion/react": "^11.14.0", + + "@emotion/styled": "^11.14.0", + + "@mui/icons-material": "^7.0.2", + + "@mui/material": "^7.0.2", + + "@mui/x-date-pickers": "^8.5.2", + + "@react-oauth/google": "^0.12.2", + + "@testing-library/dom": "^10.4.0", + + "@testing-library/jest-dom": "^6.6.3", + + "@testing-library/react": "^16.3.0", + + "@testing-library/user-event": "^13.5.0", + + "axios": "^1.9.0", + + "date-fns": "^4.1.0", + + "dayjs": "^1.11.13", + + "file-saver": "^2.0.5", + + "framer-motion": "^12.23.0", + + "jspdf": "^2.5.1", + + "jspdf-autotable": "^3.5.23", + + "jwt-decode": "^4.0.0", + + "react": "^19.1.0", + + "react-circular-progressbar": "^2.2.0", + + "react-dom": "^19.1.0", + + "react-router-dom": "^7.6.0", + + "react-scripts": "5.0.1", + + "recharts": "^2.15.3", + + "web-vitals": "^2.1.4", + + "xlsx": "^0.18.5" + + }, + + "scripts": { + + "start": "react-scripts start", + + "build": "react-scripts build", + + "test": "react-scripts test", + + "eject": "react-scripts eject" + + }, + + "eslintConfig": { + + "extends": [ + + "react-app", + + "react-app/jest" + + ] + + }, + + "browserslist": { + + "production": [ + + ">0.2%", + + "not dead", + + "not op_mini all" + + ], + + "development": [ + + "last 1 chrome version", + + "last 1 firefox version", + + "last 1 safari version" + + ] + + }, + + "description": "To make it easy for you to get started with GitLab, here's a list of recommended next steps.", + + "main": "restored-file.js", + + "author": "", + + "license": "ISC" + +} + diff --git a/public/fonts/Hind Siliguri/HindSiliguri-Bold.ttf b/public/fonts/Hind Siliguri/HindSiliguri-Bold.ttf new file mode 100644 index 0000000..6b68991 Binary files /dev/null and b/public/fonts/Hind Siliguri/HindSiliguri-Bold.ttf differ diff --git a/public/fonts/Hind Siliguri/HindSiliguri-Light.ttf b/public/fonts/Hind Siliguri/HindSiliguri-Light.ttf new file mode 100644 index 0000000..fed3dd6 Binary files /dev/null and b/public/fonts/Hind Siliguri/HindSiliguri-Light.ttf differ diff --git a/public/fonts/Hind Siliguri/HindSiliguri-Medium.ttf b/public/fonts/Hind Siliguri/HindSiliguri-Medium.ttf new file mode 100644 index 0000000..c953178 Binary files /dev/null and b/public/fonts/Hind Siliguri/HindSiliguri-Medium.ttf differ diff --git a/public/fonts/Hind Siliguri/HindSiliguri-Regular.ttf b/public/fonts/Hind Siliguri/HindSiliguri-Regular.ttf new file mode 100644 index 0000000..864e220 Binary files /dev/null and b/public/fonts/Hind Siliguri/HindSiliguri-Regular.ttf differ diff --git a/public/fonts/Hind Siliguri/HindSiliguri-SemiBold.ttf b/public/fonts/Hind Siliguri/HindSiliguri-SemiBold.ttf new file mode 100644 index 0000000..c0440c1 Binary files /dev/null and b/public/fonts/Hind Siliguri/HindSiliguri-SemiBold.ttf differ diff --git a/public/fonts/PlusJakartaSans/PlusJakartaSans-Medium.ttf b/public/fonts/PlusJakartaSans/PlusJakartaSans-Medium.ttf new file mode 100644 index 0000000..1e58066 Binary files /dev/null and b/public/fonts/PlusJakartaSans/PlusJakartaSans-Medium.ttf differ diff --git a/public/fonts/PlusJakartaSans/PlusJakartaSans-Regular.ttf b/public/fonts/PlusJakartaSans/PlusJakartaSans-Regular.ttf new file mode 100644 index 0000000..1e77059 Binary files /dev/null and b/public/fonts/PlusJakartaSans/PlusJakartaSans-Regular.ttf differ diff --git a/public/fonts/PlusJakartaSans/PlusJakartaSans-SemiBold.ttf b/public/fonts/PlusJakartaSans/PlusJakartaSans-SemiBold.ttf new file mode 100644 index 0000000..49817ef Binary files /dev/null and b/public/fonts/PlusJakartaSans/PlusJakartaSans-SemiBold.ttf differ diff --git a/public/fonts/inter/Inter_18pt-Black.ttf b/public/fonts/inter/Inter_18pt-Black.ttf new file mode 100644 index 0000000..89673de Binary files /dev/null and b/public/fonts/inter/Inter_18pt-Black.ttf differ diff --git a/public/fonts/inter/Inter_18pt-BlackItalic.ttf b/public/fonts/inter/Inter_18pt-BlackItalic.ttf new file mode 100644 index 0000000..b33602f Binary files /dev/null and b/public/fonts/inter/Inter_18pt-BlackItalic.ttf differ diff --git a/public/fonts/inter/Inter_18pt-Bold.ttf b/public/fonts/inter/Inter_18pt-Bold.ttf new file mode 100644 index 0000000..cd13f60 Binary files /dev/null and b/public/fonts/inter/Inter_18pt-Bold.ttf differ diff --git a/public/fonts/inter/Inter_18pt-BoldItalic.ttf b/public/fonts/inter/Inter_18pt-BoldItalic.ttf new file mode 100644 index 0000000..0d19c1a Binary files /dev/null and b/public/fonts/inter/Inter_18pt-BoldItalic.ttf differ diff --git a/public/fonts/inter/Inter_18pt-ExtraBold.ttf b/public/fonts/inter/Inter_18pt-ExtraBold.ttf new file mode 100644 index 0000000..e71c601 Binary files /dev/null and b/public/fonts/inter/Inter_18pt-ExtraBold.ttf differ diff --git a/public/fonts/inter/Inter_18pt-ExtraBoldItalic.ttf b/public/fonts/inter/Inter_18pt-ExtraBoldItalic.ttf new file mode 100644 index 0000000..df45062 Binary files /dev/null and b/public/fonts/inter/Inter_18pt-ExtraBoldItalic.ttf differ diff --git a/public/fonts/inter/Inter_18pt-ExtraLight.ttf b/public/fonts/inter/Inter_18pt-ExtraLight.ttf new file mode 100644 index 0000000..f9c6cfc Binary files /dev/null and b/public/fonts/inter/Inter_18pt-ExtraLight.ttf differ diff --git a/public/fonts/inter/Inter_18pt-ExtraLightItalic.ttf b/public/fonts/inter/Inter_18pt-ExtraLightItalic.ttf new file mode 100644 index 0000000..275f305 Binary files /dev/null and b/public/fonts/inter/Inter_18pt-ExtraLightItalic.ttf differ diff --git a/public/fonts/inter/Inter_18pt-Italic.ttf b/public/fonts/inter/Inter_18pt-Italic.ttf new file mode 100644 index 0000000..14d3595 Binary files /dev/null and b/public/fonts/inter/Inter_18pt-Italic.ttf differ diff --git a/public/fonts/inter/Inter_18pt-Light.ttf b/public/fonts/inter/Inter_18pt-Light.ttf new file mode 100644 index 0000000..acae361 Binary files /dev/null and b/public/fonts/inter/Inter_18pt-Light.ttf differ diff --git a/public/fonts/inter/Inter_18pt-LightItalic.ttf b/public/fonts/inter/Inter_18pt-LightItalic.ttf new file mode 100644 index 0000000..f69e18b Binary files /dev/null and b/public/fonts/inter/Inter_18pt-LightItalic.ttf differ diff --git a/public/fonts/inter/Inter_18pt-Medium.ttf b/public/fonts/inter/Inter_18pt-Medium.ttf new file mode 100644 index 0000000..71d9017 Binary files /dev/null and b/public/fonts/inter/Inter_18pt-Medium.ttf differ diff --git a/public/fonts/inter/Inter_18pt-MediumItalic.ttf b/public/fonts/inter/Inter_18pt-MediumItalic.ttf new file mode 100644 index 0000000..5c8c8b1 Binary files /dev/null and b/public/fonts/inter/Inter_18pt-MediumItalic.ttf differ diff --git a/public/fonts/inter/Inter_18pt-Regular.ttf b/public/fonts/inter/Inter_18pt-Regular.ttf new file mode 100644 index 0000000..ce097c8 Binary files /dev/null and b/public/fonts/inter/Inter_18pt-Regular.ttf differ diff --git a/public/fonts/inter/Inter_18pt-SemiBold.ttf b/public/fonts/inter/Inter_18pt-SemiBold.ttf new file mode 100644 index 0000000..053185e Binary files /dev/null and b/public/fonts/inter/Inter_18pt-SemiBold.ttf differ diff --git a/public/fonts/inter/Inter_18pt-SemiBoldItalic.ttf b/public/fonts/inter/Inter_18pt-SemiBoldItalic.ttf new file mode 100644 index 0000000..d9c9896 Binary files /dev/null and b/public/fonts/inter/Inter_18pt-SemiBoldItalic.ttf differ diff --git a/public/fonts/inter/Inter_18pt-Thin.ttf b/public/fonts/inter/Inter_18pt-Thin.ttf new file mode 100644 index 0000000..e68ec47 Binary files /dev/null and b/public/fonts/inter/Inter_18pt-Thin.ttf differ diff --git a/public/fonts/inter/Inter_18pt-ThinItalic.ttf b/public/fonts/inter/Inter_18pt-ThinItalic.ttf new file mode 100644 index 0000000..134e837 Binary files /dev/null and b/public/fonts/inter/Inter_18pt-ThinItalic.ttf differ diff --git a/public/fonts/inter/Inter_24pt-Black.ttf b/public/fonts/inter/Inter_24pt-Black.ttf new file mode 100644 index 0000000..dbb1b3b Binary files /dev/null and b/public/fonts/inter/Inter_24pt-Black.ttf differ diff --git a/public/fonts/inter/Inter_24pt-BlackItalic.ttf b/public/fonts/inter/Inter_24pt-BlackItalic.ttf new file mode 100644 index 0000000..b89d61c Binary files /dev/null and b/public/fonts/inter/Inter_24pt-BlackItalic.ttf differ diff --git a/public/fonts/inter/Inter_24pt-Bold.ttf b/public/fonts/inter/Inter_24pt-Bold.ttf new file mode 100644 index 0000000..46b3583 Binary files /dev/null and b/public/fonts/inter/Inter_24pt-Bold.ttf differ diff --git a/public/fonts/inter/Inter_24pt-BoldItalic.ttf b/public/fonts/inter/Inter_24pt-BoldItalic.ttf new file mode 100644 index 0000000..d1c0f53 Binary files /dev/null and b/public/fonts/inter/Inter_24pt-BoldItalic.ttf differ diff --git a/public/fonts/inter/Inter_24pt-ExtraBold.ttf b/public/fonts/inter/Inter_24pt-ExtraBold.ttf new file mode 100644 index 0000000..b775c08 Binary files /dev/null and b/public/fonts/inter/Inter_24pt-ExtraBold.ttf differ diff --git a/public/fonts/inter/Inter_24pt-ExtraBoldItalic.ttf b/public/fonts/inter/Inter_24pt-ExtraBoldItalic.ttf new file mode 100644 index 0000000..3461a92 Binary files /dev/null and b/public/fonts/inter/Inter_24pt-ExtraBoldItalic.ttf differ diff --git a/public/fonts/inter/Inter_24pt-ExtraLight.ttf b/public/fonts/inter/Inter_24pt-ExtraLight.ttf new file mode 100644 index 0000000..2ec6ca3 Binary files /dev/null and b/public/fonts/inter/Inter_24pt-ExtraLight.ttf differ diff --git a/public/fonts/inter/Inter_24pt-ExtraLightItalic.ttf b/public/fonts/inter/Inter_24pt-ExtraLightItalic.ttf new file mode 100644 index 0000000..c634a5d Binary files /dev/null and b/public/fonts/inter/Inter_24pt-ExtraLightItalic.ttf differ diff --git a/public/fonts/inter/Inter_24pt-Italic.ttf b/public/fonts/inter/Inter_24pt-Italic.ttf new file mode 100644 index 0000000..1048b07 Binary files /dev/null and b/public/fonts/inter/Inter_24pt-Italic.ttf differ diff --git a/public/fonts/inter/Inter_24pt-Light.ttf b/public/fonts/inter/Inter_24pt-Light.ttf new file mode 100644 index 0000000..1a2a6f2 Binary files /dev/null and b/public/fonts/inter/Inter_24pt-Light.ttf differ diff --git a/public/fonts/inter/Inter_24pt-LightItalic.ttf b/public/fonts/inter/Inter_24pt-LightItalic.ttf new file mode 100644 index 0000000..ded5a75 Binary files /dev/null and b/public/fonts/inter/Inter_24pt-LightItalic.ttf differ diff --git a/public/fonts/inter/Inter_24pt-Medium.ttf b/public/fonts/inter/Inter_24pt-Medium.ttf new file mode 100644 index 0000000..5c88739 Binary files /dev/null and b/public/fonts/inter/Inter_24pt-Medium.ttf differ diff --git a/public/fonts/inter/Inter_24pt-MediumItalic.ttf b/public/fonts/inter/Inter_24pt-MediumItalic.ttf new file mode 100644 index 0000000..be091b1 Binary files /dev/null and b/public/fonts/inter/Inter_24pt-MediumItalic.ttf differ diff --git a/public/fonts/inter/Inter_24pt-Regular.ttf b/public/fonts/inter/Inter_24pt-Regular.ttf new file mode 100644 index 0000000..6b088a7 Binary files /dev/null and b/public/fonts/inter/Inter_24pt-Regular.ttf differ diff --git a/public/fonts/inter/Inter_24pt-SemiBold.ttf b/public/fonts/inter/Inter_24pt-SemiBold.ttf new file mode 100644 index 0000000..ceb8576 Binary files /dev/null and b/public/fonts/inter/Inter_24pt-SemiBold.ttf differ diff --git a/public/fonts/inter/Inter_24pt-SemiBoldItalic.ttf b/public/fonts/inter/Inter_24pt-SemiBoldItalic.ttf new file mode 100644 index 0000000..6921df2 Binary files /dev/null and b/public/fonts/inter/Inter_24pt-SemiBoldItalic.ttf differ diff --git a/public/fonts/inter/Inter_24pt-Thin.ttf b/public/fonts/inter/Inter_24pt-Thin.ttf new file mode 100644 index 0000000..3505b35 Binary files /dev/null and b/public/fonts/inter/Inter_24pt-Thin.ttf differ diff --git a/public/fonts/inter/Inter_24pt-ThinItalic.ttf b/public/fonts/inter/Inter_24pt-ThinItalic.ttf new file mode 100644 index 0000000..a3e6feb Binary files /dev/null and b/public/fonts/inter/Inter_24pt-ThinItalic.ttf differ diff --git a/public/fonts/inter/Inter_28pt-Black.ttf b/public/fonts/inter/Inter_28pt-Black.ttf new file mode 100644 index 0000000..66a252f Binary files /dev/null and b/public/fonts/inter/Inter_28pt-Black.ttf differ diff --git a/public/fonts/inter/Inter_28pt-BlackItalic.ttf b/public/fonts/inter/Inter_28pt-BlackItalic.ttf new file mode 100644 index 0000000..3c8fdf9 Binary files /dev/null and b/public/fonts/inter/Inter_28pt-BlackItalic.ttf differ diff --git a/public/fonts/inter/Inter_28pt-Bold.ttf b/public/fonts/inter/Inter_28pt-Bold.ttf new file mode 100644 index 0000000..d17828b Binary files /dev/null and b/public/fonts/inter/Inter_28pt-Bold.ttf differ diff --git a/public/fonts/inter/Inter_28pt-BoldItalic.ttf b/public/fonts/inter/Inter_28pt-BoldItalic.ttf new file mode 100644 index 0000000..6fce50a Binary files /dev/null and b/public/fonts/inter/Inter_28pt-BoldItalic.ttf differ diff --git a/public/fonts/inter/Inter_28pt-ExtraBold.ttf b/public/fonts/inter/Inter_28pt-ExtraBold.ttf new file mode 100644 index 0000000..6d87cae Binary files /dev/null and b/public/fonts/inter/Inter_28pt-ExtraBold.ttf differ diff --git a/public/fonts/inter/Inter_28pt-ExtraBoldItalic.ttf b/public/fonts/inter/Inter_28pt-ExtraBoldItalic.ttf new file mode 100644 index 0000000..1a56735 Binary files /dev/null and b/public/fonts/inter/Inter_28pt-ExtraBoldItalic.ttf differ diff --git a/public/fonts/inter/Inter_28pt-ExtraLight.ttf b/public/fonts/inter/Inter_28pt-ExtraLight.ttf new file mode 100644 index 0000000..d42b3f5 Binary files /dev/null and b/public/fonts/inter/Inter_28pt-ExtraLight.ttf differ diff --git a/public/fonts/inter/Inter_28pt-ExtraLightItalic.ttf b/public/fonts/inter/Inter_28pt-ExtraLightItalic.ttf new file mode 100644 index 0000000..90e2f20 Binary files /dev/null and b/public/fonts/inter/Inter_28pt-ExtraLightItalic.ttf differ diff --git a/public/fonts/inter/Inter_28pt-Italic.ttf b/public/fonts/inter/Inter_28pt-Italic.ttf new file mode 100644 index 0000000..c2a143a Binary files /dev/null and b/public/fonts/inter/Inter_28pt-Italic.ttf differ diff --git a/public/fonts/inter/Inter_28pt-Light.ttf b/public/fonts/inter/Inter_28pt-Light.ttf new file mode 100644 index 0000000..5eeff3a Binary files /dev/null and b/public/fonts/inter/Inter_28pt-Light.ttf differ diff --git a/public/fonts/inter/Inter_28pt-LightItalic.ttf b/public/fonts/inter/Inter_28pt-LightItalic.ttf new file mode 100644 index 0000000..6b90b76 Binary files /dev/null and b/public/fonts/inter/Inter_28pt-LightItalic.ttf differ diff --git a/public/fonts/inter/Inter_28pt-Medium.ttf b/public/fonts/inter/Inter_28pt-Medium.ttf new file mode 100644 index 0000000..00120fe Binary files /dev/null and b/public/fonts/inter/Inter_28pt-Medium.ttf differ diff --git a/public/fonts/inter/Inter_28pt-MediumItalic.ttf b/public/fonts/inter/Inter_28pt-MediumItalic.ttf new file mode 100644 index 0000000..7481e7b Binary files /dev/null and b/public/fonts/inter/Inter_28pt-MediumItalic.ttf differ diff --git a/public/fonts/inter/Inter_28pt-Regular.ttf b/public/fonts/inter/Inter_28pt-Regular.ttf new file mode 100644 index 0000000..855b6f4 Binary files /dev/null and b/public/fonts/inter/Inter_28pt-Regular.ttf differ diff --git a/public/fonts/inter/Inter_28pt-SemiBold.ttf b/public/fonts/inter/Inter_28pt-SemiBold.ttf new file mode 100644 index 0000000..8b84efc Binary files /dev/null and b/public/fonts/inter/Inter_28pt-SemiBold.ttf differ diff --git a/public/fonts/inter/Inter_28pt-SemiBoldItalic.ttf b/public/fonts/inter/Inter_28pt-SemiBoldItalic.ttf new file mode 100644 index 0000000..2e22c5a Binary files /dev/null and b/public/fonts/inter/Inter_28pt-SemiBoldItalic.ttf differ diff --git a/public/fonts/inter/Inter_28pt-Thin.ttf b/public/fonts/inter/Inter_28pt-Thin.ttf new file mode 100644 index 0000000..94e6108 Binary files /dev/null and b/public/fonts/inter/Inter_28pt-Thin.ttf differ diff --git a/public/fonts/inter/Inter_28pt-ThinItalic.ttf b/public/fonts/inter/Inter_28pt-ThinItalic.ttf new file mode 100644 index 0000000..d3d44cd Binary files /dev/null and b/public/fonts/inter/Inter_28pt-ThinItalic.ttf differ diff --git a/public/icon.ico b/public/icon.ico new file mode 100644 index 0000000..7dcdb85 Binary files /dev/null and b/public/icon.ico differ diff --git a/public/image.png b/public/image.png new file mode 100644 index 0000000..92b6e9e Binary files /dev/null and b/public/image.png differ diff --git a/public/images/compeoter.png b/public/images/compeoter.png new file mode 100644 index 0000000..5ea562d Binary files /dev/null and b/public/images/compeoter.png differ diff --git a/public/images/createProfile/BasicInf.png b/public/images/createProfile/BasicInf.png new file mode 100644 index 0000000..0e84038 Binary files /dev/null and b/public/images/createProfile/BasicInf.png differ diff --git a/public/images/createProfile/BusinessHours.png b/public/images/createProfile/BusinessHours.png new file mode 100644 index 0000000..24b19cf Binary files /dev/null and b/public/images/createProfile/BusinessHours.png differ diff --git a/public/images/createProfile/Confirmation.png b/public/images/createProfile/Confirmation.png new file mode 100644 index 0000000..2ff8948 Binary files /dev/null and b/public/images/createProfile/Confirmation.png differ diff --git a/public/images/createProfile/ContactInf.png b/public/images/createProfile/ContactInf.png new file mode 100644 index 0000000..86d11f8 Binary files /dev/null and b/public/images/createProfile/ContactInf.png differ diff --git a/public/images/createProfile/Equipment.png b/public/images/createProfile/Equipment.png new file mode 100644 index 0000000..d69c6ae Binary files /dev/null and b/public/images/createProfile/Equipment.png differ diff --git a/public/images/createProfile/Expansion.png b/public/images/createProfile/Expansion.png new file mode 100644 index 0000000..db33d8c Binary files /dev/null and b/public/images/createProfile/Expansion.png differ diff --git a/public/images/createProfile/Facilitaion.png b/public/images/createProfile/Facilitaion.png new file mode 100644 index 0000000..3b717ee Binary files /dev/null and b/public/images/createProfile/Facilitaion.png differ diff --git a/public/images/createProfile/Group.png b/public/images/createProfile/Group.png new file mode 100644 index 0000000..4284617 Binary files /dev/null and b/public/images/createProfile/Group.png differ diff --git a/public/images/createProfile/MenuUpload.png b/public/images/createProfile/MenuUpload.png new file mode 100644 index 0000000..e533047 Binary files /dev/null and b/public/images/createProfile/MenuUpload.png differ diff --git a/public/images/createProfile/Successful.png b/public/images/createProfile/Successful.png new file mode 100644 index 0000000..4afe6dd Binary files /dev/null and b/public/images/createProfile/Successful.png differ diff --git a/public/images/createProfile/TypeOfRestaurant.png b/public/images/createProfile/TypeOfRestaurant.png new file mode 100644 index 0000000..2767370 Binary files /dev/null and b/public/images/createProfile/TypeOfRestaurant.png differ diff --git a/public/images/createProfile/UploadPhotos.png b/public/images/createProfile/UploadPhotos.png new file mode 100644 index 0000000..4d27e36 Binary files /dev/null and b/public/images/createProfile/UploadPhotos.png differ diff --git a/public/images/createProfile/Vector.png b/public/images/createProfile/Vector.png new file mode 100644 index 0000000..e533047 Binary files /dev/null and b/public/images/createProfile/Vector.png differ diff --git a/public/images/createProfile/hand.png b/public/images/createProfile/hand.png new file mode 100644 index 0000000..05f1f1f Binary files /dev/null and b/public/images/createProfile/hand.png differ diff --git a/public/images/dash.png b/public/images/dash.png new file mode 100644 index 0000000..384dcbe Binary files /dev/null and b/public/images/dash.png differ diff --git a/public/images/hand.png b/public/images/hand.png new file mode 100644 index 0000000..eb6e5d4 Binary files /dev/null and b/public/images/hand.png differ diff --git a/public/images/icons/email.png b/public/images/icons/email.png new file mode 100644 index 0000000..1ebd9fb Binary files /dev/null and b/public/images/icons/email.png differ diff --git a/public/images/icons/image.png b/public/images/icons/image.png new file mode 100644 index 0000000..2c15c96 Binary files /dev/null and b/public/images/icons/image.png differ diff --git a/public/images/icons/key.png b/public/images/icons/key.png new file mode 100644 index 0000000..cae4f7f Binary files /dev/null and b/public/images/icons/key.png differ diff --git a/public/images/icons/pen.png b/public/images/icons/pen.png new file mode 100644 index 0000000..781073a Binary files /dev/null and b/public/images/icons/pen.png differ diff --git a/public/images/icons/rocket.png b/public/images/icons/rocket.png new file mode 100644 index 0000000..ff31880 Binary files /dev/null and b/public/images/icons/rocket.png differ diff --git a/public/images/image.png b/public/images/image.png new file mode 100644 index 0000000..4682bc5 Binary files /dev/null and b/public/images/image.png differ diff --git a/public/images/waitress1.png b/public/images/waitress1.png new file mode 100644 index 0000000..1ecbbea Binary files /dev/null and b/public/images/waitress1.png differ diff --git a/public/images/waitress2.png b/public/images/waitress2.png new file mode 100644 index 0000000..e1a9fca Binary files /dev/null and b/public/images/waitress2.png differ diff --git a/public/images/waitress3.png b/public/images/waitress3.png new file mode 100644 index 0000000..884e963 Binary files /dev/null and b/public/images/waitress3.png differ diff --git a/public/images/waitress4.png b/public/images/waitress4.png new file mode 100644 index 0000000..5e6faf9 Binary files /dev/null and b/public/images/waitress4.png differ diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..3e2bca0 --- /dev/null +++ b/public/index.html @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + Resturant + + + + +
+ + + + diff --git a/restored-file.js b/restored-file.js new file mode 100644 index 0000000..e40777c Binary files /dev/null and b/restored-file.js differ diff --git a/src/App.css b/src/App.css new file mode 100644 index 0000000..2d8ce00 --- /dev/null +++ b/src/App.css @@ -0,0 +1,147 @@ +.App { + margin: 0; + padding: 0; + text-align: center; +} + +body, +html, +#root { + margin: 0; + padding: 0; + height: 100%; +} + +.App-logo { + height: 40vmin; + pointer-events: none; +} + +@media (prefers-reduced-motion: no-preference) { + .App-logo { + animation: App-logo-spin infinite 20s linear; + } +} + +.App-header { + background-color: #282c34; + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + font-size: calc(10px + 2vmin); + color: white; +} + +.App-link { + color: #61dafb; +} + +@keyframes App-logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +/* CUSTOM FONTS */ + +@font-face { + font-family: INTER; + src: url('/public/fonts/inter/Inter_18pt-Thin.ttf'); + font-weight: 100; +} + +@font-face { + font-family: INTER; + src: url('/public/fonts/inter/Inter_18pt-ExtraLight.ttf'); + font-weight: 200; +} + +@font-face { + font-family: INTER; + src: url('/public/fonts/inter/Inter_18pt-Light.ttf'); + font-weight: 300; +} + +@font-face { + font-family: INTER; + src: url('/public/fonts/inter/Inter_18pt-Regular.ttf'); + font-weight: 400; +} + +@font-face { + font-family: INTER; + src: url('/public/fonts/inter/Inter_18pt-Medium.ttf'); + font-weight: 500; +} + +@font-face { + font-family: INTER; + src: url('/public/fonts/inter/Inter_18pt-SemiBold.ttf'); + font-weight: 600; +} + +@font-face { + font-family: INTER; + src: url('/public/fonts/inter/Inter_18pt-Bold.ttf'); + font-weight: 700; +} + +@font-face { + font-family: INTER; + src: url('/public/fonts/inter/Inter_18pt-ExtraBold.ttf'); + font-weight: 800; +} + +@font-face { + font-family: INTER; + src: url('/public/fonts/inter/Inter_18pt-Black.ttf'); + font-weight: 900; +} + +@font-face { + font-family: PlusJakartaSans; + src: url('/public/fonts/PlusJakartaSans/PlusJakartaSans-Medium.ttf'); + font-weight: 500; +} + +@font-face { + font-family: PlusJakartaSans; + src: url('/public/fonts/PlusJakartaSans/PlusJakartaSans-SemiBold.ttf'); + font-weight: 600; +} + +@font-face { + font-family: PlusJakartaSans; + src: url('/public/fonts/PlusJakartaSans/PlusJakartaSans-Regular.ttf'); + font-weight: 400; +} + +@font-face { + font-family: Hind Siliguri; + src: url('/public/fonts/Hind Siliguri/HindSiliguri-Bold.ttf'); + font-weight: 700; +} + +@font-face { + font-family: Hind Siliguri; + src: url('/public/fonts/Hind Siliguri/HindSiliguri-Medium.ttf'); + font-weight: 500; +} + +@font-face { + font-family: Hind Siliguri; + src: url('/public/fonts/Hind Siliguri/HindSiliguri-SemiBold.ttf'); + font-weight: 600; +} + +@font-face { + font-family: Hind Siliguri; + src: url('/public/fonts/Hind Siliguri/HindSiliguri-Regular.ttf'); + font-weight: 400; +} +/* === CUSTOM FONTS === */ diff --git a/src/App.js b/src/App.js new file mode 100644 index 0000000..6e8d6d5 --- /dev/null +++ b/src/App.js @@ -0,0 +1,62 @@ +import React from 'react'; +import './App.css'; + +import theme from './theme'; +import { ThemeProvider } from '@mui/material/styles'; +import { BrowserRouter as Router, Routes, Route, Navigate } from 'react-router-dom'; +import { GoogleOAuthProvider } from '@react-oauth/google'; +import PrivateRoute from '../src/components/Routes/PrivateRoute'; + +// الصفحات العامة +import LoginForm from './components/Authentication/SignUp_In/LoginForm'; +import RegisterForm from './components/Authentication/SignUp_In/RegisterForm'; +import ForgetPassword from './components/Authentication/ForgetPassword/ForgetFormMain'; +import PublicRoute from './components/Routes/PublicRoute'; + +import { TermsPage, PrivacyPage } from './components/Authentication/Legal/TermsPrivacyComponents'; + +import { RestaurantProvider } from './contexts/RestaurantContext'; +import ProtectedRoutes from './components/Routes/ProtectedRoutes'; +import { SnackbarProvider } from "./contexts/SnackbarContext"; +import { UserProvider } from './contexts/UserContext'; + +function App() { + return ( + + + + + {/* ✅ لفّ كل المشروع بـ SnackbarProvider */} + + + {/* التوجيه التلقائي للصفحة الرئيسية */} + } /> + + } /> + } /> + } /> + + {/* روابط الشروط والخصوصية */} + } /> + } /> + + + + + + + } + /> + + + + + + + ); +} + +export default App; diff --git a/src/components/Authentication/ForgetPassword/Congratulations.js b/src/components/Authentication/ForgetPassword/Congratulations.js new file mode 100644 index 0000000..7f9797a --- /dev/null +++ b/src/components/Authentication/ForgetPassword/Congratulations.js @@ -0,0 +1,132 @@ +import React from 'react'; +import { Box, TextField, Typography, Button, useTheme } from '@mui/material'; +import { useNavigate } from 'react-router-dom'; + +const Congratulations = ({ emailOrPhone, setEmailOrPhone }) => { + const navigate = useNavigate(); + const theme = useTheme(); + return ( + + + + + + + + + + Congratulations! + + + + Your password has been successfully updated. Thank you for choosing our service + + + + {/* زر التنقل إلى صفحة تسجيل الدخول */} + + + ); +}; + +export default Congratulations; + diff --git a/src/components/Authentication/ForgetPassword/EmailInputSection.js b/src/components/Authentication/ForgetPassword/EmailInputSection.js new file mode 100644 index 0000000..4133607 --- /dev/null +++ b/src/components/Authentication/ForgetPassword/EmailInputSection.js @@ -0,0 +1,226 @@ +import React, { useState } from 'react'; +import { Box, Button, TextField, Typography, useTheme, Snackbar, Alert } from '@mui/material'; +import authService from '../../../services/authService'; + +const EmailInputSection = ({ emailOrPhone, setEmailOrPhone, onStepComplete }) => { + const theme = useTheme(); + const [loading, setLoading] = useState(false); + + // حالات Snackbar + const [snackbarOpen, setSnackbarOpen] = useState(false); + const [snackbarMessage, setSnackbarMessage] = useState(''); + const [snackbarSeverity, setSnackbarSeverity] = useState('success'); + const [inputError, setInputError] = useState(''); + + const handleCloseSnackbar = (event, reason) => { + if (reason === 'clickaway') return; + setSnackbarOpen(false); + }; + + const validateEmail = (email) => { + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + return emailRegex.test(email); + }; + + const handleSend = async () => { + setInputError(''); // مسح الأخطاء السابقة + + if (!emailOrPhone) { + setInputError("Please enter your email."); + return; + } + + if (!validateEmail(emailOrPhone)) { + setInputError("Please enter a valid email address."); + return; + } + + setLoading(true); + const response = await authService.resetPassword(emailOrPhone); + setLoading(false); + + if (response.success !== false) { + setSnackbarMessage("A reset code has been sent to your email."); + setSnackbarSeverity('success'); + setSnackbarOpen(true); + + setTimeout(() => { + if (onStepComplete) onStepComplete(); + }, 5000); + + } else { + setInputError(''); + let errorMessage = ""; + if (response.errors) { + const firstError = Object.values(response.errors)[0]; + errorMessage = Array.isArray(firstError) ? firstError[0] : firstError; + } else if (response.message) { + errorMessage = response.message; + } else { + errorMessage = "Failed to send reset code."; + } + + if ( + errorMessage.toLowerCase().includes("not found") || + errorMessage.toLowerCase().includes("not registered") || + errorMessage.toLowerCase().includes("doesn't exist") || + errorMessage.toLowerCase().includes("email") + ) { + setInputError("This email is not registered."); + } else if (errorMessage.toLowerCase().includes("invalid credentials")) { + setInputError("Email or password is incorrect."); + } else { + setSnackbarMessage(errorMessage); + setSnackbarSeverity('error'); + setSnackbarOpen(true); + } + } + }; + + return ( + + + + + + + Forget Password + + + + Enter your email to reset it and regain access to your account. + + + + + Email + + setEmailOrPhone(e.target.value)} + error={!!inputError} + helperText={inputError} + sx={{ + '& input': { fontWeight: 500, fontSize: '15px' }, + '& input::placeholder': { color: '#969BA7' }, + '& .MuiOutlinedInput-root': { + borderRadius: '10px', + transition: '0.3s', + '&.Mui-focused fieldset': { + borderColor: '#FF914D', + boxShadow: '0 0 0 2px rgba(255, 145, 77, 0.2)', + }, + }, + '& .MuiOutlinedInput-root.Mui-focused': { + borderColor: '#3f51b5', + boxShadow: '0 0 0 2px rgba(63,81,181,0.1)', + }, + }} + /> + + + + {/* + + By log in, I agree to the  + + Terms of Service + {' '} + and  + + Privacy Policy + + */} + + {/* Terms */} + + By logging in, I agree to the{' '} + window.open('/terms', 'TermsOfService')} + > + Terms of Service + {' '} + and{' '} + window.open('/privacy', 'PrivacyPolicy')} + > + Privacy Policy + . + + + + + {snackbarMessage} + + + + ); +}; + +export default EmailInputSection; diff --git a/src/components/Authentication/ForgetPassword/ForgetFormMain.js b/src/components/Authentication/ForgetPassword/ForgetFormMain.js new file mode 100644 index 0000000..41a469d --- /dev/null +++ b/src/components/Authentication/ForgetPassword/ForgetFormMain.js @@ -0,0 +1,118 @@ +import React, { useState } from 'react'; +import { Box, Stack, useTheme } from '@mui/material'; +import Side from './Side'; +import EmailInputSection from './EmailInputSection'; +import OtpVerification from './OtpVerification'; +import NewPassword from './NewPassword'; +import Congratulations from './Congratulations'; + +const ForgetForm = () => { + const [emailOrPhone, setEmailOrPhone] = useState(''); + const [currentSlide, setCurrentSlide] = useState(0); + const [stepCompleted, setStepCompleted] = useState(false); + const theme = useTheme(); + + const slides = [ + { component: EmailInputSection, title: "Email Verification" }, + { component: OtpVerification, title: "OTP Verification" }, + { component: NewPassword, title: "New Password" }, + { component: Congratulations, title: "Congratulations" } + ]; + + const handleNext = () => { + if (currentSlide < slides.length - 1) { + setCurrentSlide(prev => prev + 1); + setStepCompleted(false); + } + }; + + const handleBack = () => { + if (currentSlide > 0) { + setCurrentSlide(prev => prev - 1); + setStepCompleted(true); + } + }; + + const CurrentComponent = slides[currentSlide].component; + + return ( + + + + + + + + + { + setStepCompleted(true); + setCurrentSlide(prev => prev + 1); // هنا تنقل مباشرة للصفحة التالية + }} + onBack={handleBack} + /> + + + + + + {slides.map((_, index) => ( + + ))} + + + + ); +}; + + +export default ForgetForm; diff --git a/src/components/Authentication/ForgetPassword/NewPassword.js b/src/components/Authentication/ForgetPassword/NewPassword.js new file mode 100644 index 0000000..595dc0e --- /dev/null +++ b/src/components/Authentication/ForgetPassword/NewPassword.js @@ -0,0 +1,222 @@ +import React, { useState } from 'react'; +import { Box, Button, TextField, Typography, IconButton, InputAdornment } from '@mui/material'; +import { useTheme } from '@mui/material/styles'; +import VisibilityOffOutlinedIcon from '@mui/icons-material/VisibilityOffOutlined'; +import { VisibilityOutlined } from '@mui/icons-material'; +import authService from '../../../services/authService'; + + const NewPassword = ({ emailOrPhone, onStepComplete }) => { + const theme = useTheme(); + const [showPassword, setShowPassword] = useState(false); + const [showConfirmPassword, setShowConfirmPassword] = useState(false); + + const [password, setPassword] = useState(''); + const [passwordConfirm, setPasswordConfirm] = useState(''); + const [loading, setLoading] = useState(false); + const [errors, setErrors] = useState({}); + + const handleTogglePassword = () => setShowPassword(prev => !prev); + const handleToggleConfirmPassword = () => setShowConfirmPassword(prev => !prev); + + const handleSend = async () => { + setErrors({}); + + if (!password || !passwordConfirm) { + alert("Please fill in both password fields."); + return; + } + if (password !== passwordConfirm) { + alert("Passwords do not match."); + return; + } + + setLoading(true); + try { + const response = await authService.updatePassword({ + email: emailOrPhone, + password, + confirmPassword: passwordConfirm + }); + setLoading(false); + + if (response.success) { + alert("Password updated successfully."); + if (onStepComplete) onStepComplete(); + } else { + alert(response.message || "Failed to update password."); + } + } catch (error) { + setLoading(false); + if (error.response && error.response.status === 422) { + setErrors(error.response.data.errors || {}); + } else { + alert("Error: " + (error.message || "Unknown error")); + } + } + }; + + return ( + <> + + + + + + Create a New Password + + + + Enter your new password to regain access to your account. + + + + + Password + + setPassword(e.target.value)} + error={!!errors.password} + helperText={errors.password && errors.password.join(' ')} + sx={{ + '& input': { fontWeight: 500, fontSize: '15px' }, + '& input::placeholder': { color: '#969BA7' }, + '& .MuiOutlinedInput-root': { + borderRadius: '10px', + transition: '0.3s', + '&.Mui-focused fieldset': { + borderColor: theme.palette.primary.main, + boxShadow: '0 0 0 2px rgba(255, 145, 77, 0.2)' + } + }, + '& input::-ms-reveal, & input::-ms-clear': { display: 'none' }, + }} + InputProps={{ + endAdornment: ( + + + {showPassword ? : } + + + ) + }} + /> + + + + + Confirm Password + + setPasswordConfirm(e.target.value)} + error={!!errors.password_confirmation} + helperText={errors.password_confirmation && errors.password_confirmation.join(' ')} + sx={{ + '& input': { fontWeight: 500, fontSize: '15px' }, + '& input::placeholder': { color: '#969BA7' }, + '& .MuiOutlinedInput-root': { + borderRadius: '10px', + transition: '0.3s', + '&.Mui-focused fieldset': { + borderColor: '#FF914D', + boxShadow: '0 0 0 2px rgba(255, 145, 77, 0.2)' + } + }, + '& .MuiOutlinedInput-root.Mui-focused': { + borderColor: '#3f51b5', + boxShadow: '0 0 0 2px rgba(63,81,181,0.1)' + }, + '& input::-ms-reveal, & input::-ms-clear': { display: 'none' }, + }} + InputProps={{ + endAdornment: ( + + + {showConfirmPassword ? : } + + + ) + }} + /> + + + + + {/* Terms */} + + By logging in, I agree to the{' '} + window.open('/terms', 'TermsOfService')} + > + Terms of Service + {' '} + and{' '} + window.open('/privacy', 'PrivacyPolicy')} + > + Privacy Policy + . + + + ); +}; + +export default NewPassword; diff --git a/src/components/Authentication/ForgetPassword/OtpVerification.js b/src/components/Authentication/ForgetPassword/OtpVerification.js new file mode 100644 index 0000000..ea3775b --- /dev/null +++ b/src/components/Authentication/ForgetPassword/OtpVerification.js @@ -0,0 +1,241 @@ +import React, { useState, useRef } from 'react'; +import { + Box, TextField, Typography, Button, Stack, useTheme, + Snackbar, Alert +} from '@mui/material'; +import authService from '../../../services/authService'; + +const OtpVerification = ({ emailOrPhone, onStepComplete }) => { + const [otp, setOtp] = useState(Array(6).fill('')); + const inputRefs = useRef(Array(6).fill().map(() => React.createRef())); + const [loading, setLoading] = useState(false); + + const [snackbarOpen, setSnackbarOpen] = useState(false); + const [snackbarMessage, setSnackbarMessage] = useState(''); + const [snackbarSeverity, setSnackbarSeverity] = useState('success'); + + const theme = useTheme(); + + const handleSnackbarClose = (event, reason) => { + if (reason === 'clickaway') return; + setSnackbarOpen(false); + }; + + const handleSend = async () => { + const otpCode = otp.join(''); + if (otpCode.length < 6) { + setSnackbarMessage("Please enter the complete OTP code."); + setSnackbarSeverity("error"); + setSnackbarOpen(true); + return; + } + setLoading(true); + try { + const response = await authService.verifyCode(emailOrPhone, otpCode); + setLoading(false); + if (response.success !== false) { + setSnackbarMessage("OTP verified successfully."); + setSnackbarSeverity("success"); + setSnackbarOpen(true); + if (onStepComplete) onStepComplete(); // الانتقال للخطوة التالية + } else { + setSnackbarMessage(response.message || "Invalid OTP code."); + setSnackbarSeverity("error"); + setSnackbarOpen(true); + } + } catch (error) { + setLoading(false); + setSnackbarMessage("Failed to verify OTP. Please try again."); + setSnackbarSeverity("error"); + setSnackbarOpen(true); + } + }; + + const handleOtpChange = (e, index) => { + const value = e.target.value; + if (!/^[0-9]?$/.test(value)) return; + + const newOtp = [...otp]; + newOtp[index] = value; + setOtp(newOtp); + + if (value && index < otp.length - 1) { + inputRefs.current[index + 1].current.focus(); + } + }; + + const handleKeyDown = (e, index) => { + if (e.key === 'Backspace' && !otp[index] && index > 0) { + inputRefs.current[index - 1].current.focus(); + } + }; + + return ( + <> + + + + + + Enter OTP Verification + + + + Kindly enter the OTP code sent to your registered email/phone for account verification. + + + + + {otp.map((digit, index) => ( + handleOtpChange(e, index)} + onKeyDown={(e) => handleKeyDown(e, index)} + inputProps={{ + maxLength: 1, + style: { + textAlign: 'center', + fontSize: '20px', + }, + }} + sx={{ + width: { xs: '3rem', sm: '3.25rem', md: '4rem' }, + height: { xs: '3rem', sm: '3.25rem', md: '4rem' }, + '& .MuiOutlinedInput-root': { + borderRadius: '0.5rem', + height: '100%', + '& fieldset': { + borderColor: '#ccc', + }, + '&:hover fieldset': { + borderColor: theme.palette.primary.main, + }, + '&.Mui-focused fieldset': { + borderColor: theme.palette.primary.main, + }, + }, + '& .MuiInputBase-input': { + color: theme.palette.primary.main, + textAlign: 'center', + fontSize: '20px', + padding: 0, + height: '100%', + }, + }} + /> + ))} + + + + + + {/* Terms */} + + By logging in, I agree to the{' '} + window.open('/terms', 'TermsOfService')} + > + Terms of Service + {' '} + and{' '} + window.open('/privacy', 'PrivacyPolicy')} + > + Privacy Policy + . + + + + + {snackbarMessage} + + + + + ); +}; + +export default OtpVerification; diff --git a/src/components/Authentication/ForgetPassword/Side.js b/src/components/Authentication/ForgetPassword/Side.js new file mode 100644 index 0000000..addfd4d --- /dev/null +++ b/src/components/Authentication/ForgetPassword/Side.js @@ -0,0 +1,185 @@ +import React from 'react'; +import { Box, Typography, Stack, Button, useTheme } from '@mui/material'; +import ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos'; +import ArrowForwardIosIcon from '@mui/icons-material/ArrowForwardIos'; + +const steps = [ + { + title: 'Forget Password', + description: 'Provide an email to change your password', + icon: '/images/icons/key.png', + }, + { + title: 'Verify your email', + description: 'Enter your otp verification', + icon: '/images/icons/email.png', + }, + { + title: 'Create a new password', + description: 'Create your a new password', + icon: '/images/icons/pen.png', + }, + { + title: 'Welcome to KitchPlus app', + description: 'Get up and running in 3 minutes', + icon: '/images/icons/rocket.png', + }, +]; + +const Side = ({ currentStepIndex, onNext, onBack }) => { + const theme = useTheme(); + return ( + + + Step for change your password + + + Instructions for secure password modification. Follow simple steps for password change. + + + + {steps.map((step, index) => ( + + {index !== steps.length - 1 && ( + + )} + + + + {step.title} + + + + + + {step.title} + + + {step.description} + + + + ))} + + + {/* أزرار التنقل */} + + + {/* Back */} + + {/* Next */} + + + + ); +}; + +export default Side; \ No newline at end of file diff --git a/src/components/Authentication/Legal/TermsPrivacyComponents.js b/src/components/Authentication/Legal/TermsPrivacyComponents.js new file mode 100644 index 0000000..3e6347d --- /dev/null +++ b/src/components/Authentication/Legal/TermsPrivacyComponents.js @@ -0,0 +1,192 @@ +import React, { useEffect } from 'react'; +import { Button, Typography, Container, Box, Paper } from '@mui/material'; + +/* + File: TermsPrivacyComponents.jsx + Purpose: Two simple standalone pages (Terms and Privacy) and an example LoginCard + which opens them in a new tab/window and listens for the "agree" message. + + How it works: + - The LoginCard opens a new tab using window.open(...). + - The opened page (TermsPage / PrivacyPage) will send a postMessage back to the opener + when the user clicks "Agree & Confirm", then attempt to close itself. + - The LoginCard listens for that postMessage and can react (e.g. show a toast, + update state, or navigate). This keeps the original page in control of what + happens after the user agreed. + + Note: Some browsers may block window.close() on tabs not opened by window.open. + Because LoginCard uses window.open, the close() call should succeed. If the + page is opened directly (no opener) the Agree button will fall back to + navigating back (history.back()). +*/ + +/*********************** + * Terms / Privacy Pages + ***********************/ + +function sendAgreeToOpener(kind = 'terms') { + try { + if (window.opener && !window.opener.closed) { + // Structured message so opener can identify the response + window.opener.postMessage({ type: 'AGREE_CONFIRM', page: kind }, '*'); + // Try to close this tab/window (works when opened by window.open) + window.close(); + } else { + // No opener (user opened directly) — go back in history as a fallback + if (window.history && window.history.length > 1) { + window.history.back(); + } else { + // Last fallback: navigate to the site's root + window.location.href = '/'; + } + } + } catch (e) { + console.error('Failed to send message to opener or close window', e); + // fallback navigation + window.location.href = '/'; + } +} + +export function TermsPage() { + React.useEffect(() => { + document.title = "Resturant-Terms of Service"; + }, []); + + return ( + + + + Terms of Service + + + + Welcome to our Terms of Service. Please read carefully. Lorem ipsum dolor sit amet, + consectetur adipiscing elit. Integer posuere erat a ante. + + + + + + + + ); +} + +export function PrivacyPage() { + React.useEffect(() => { + document.title = "Resturant-Privacy Policy"; + }, []); + + return ( + + + + Privacy Policy + + + + This Privacy Policy explains how we collect and use personal information. Lorem ipsum dolor + sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore. + + + + + + + + ); +} + + +/*********************** + * Example LoginCard + ***********************/ + +export default function LoginCard() { + useEffect(() => { + // Listen to messages from the terms/privacy pages. + const handler = (event) => { + // IMPORTANT: In production, check event.origin to be sure the message comes from + // a trusted origin. For demo purposes we accept any origin. + const data = event.data || {}; + if (data && data.type === 'AGREE_CONFIRM') { + // data.page === 'terms' or 'privacy' + const page = data.page || 'unknown'; + // Do whatever you need when user agreed: update state, show toast, close dialog, etc. + // Example: simple alert (replace with MUI Snackbar or app-level handler) + alert(`User agreed to ${page === 'terms' ? 'Terms of Service' : 'Privacy Policy'}`); + } + }; + + window.addEventListener('message', handler); + return () => window.removeEventListener('message', handler); + }, []); + + // Helper that opens a new tab (ensures opener exists) + function openInNewTab(path, name) { + // If your app uses router paths (e.g. /terms), build a full URL. Here we create + // a URL relative to current origin so the opened page belongs to the same origin + const url = new URL(path, window.location.href).toString(); + // Use window.open (not anchor target="_blank") so the new tab has window.opener + window.open(url, name, 'noopener=false'); + } + + return ( + + + {/* Login title */} + Sign in + + + {/* Your existing Terms text (you provided earlier) */} + + By logging in, I agree to the{' '} + openInNewTab('/terms', 'TermsOfService')}> + Terms of Service + {' '} + and{' '} + openInNewTab('/privacy', 'PrivacyPolicy')}> + Privacy Policy + + . + + + {/* The rest of your login UI goes here (inputs, submit, etc.) */} + + + ); +} + +/* + Usage notes: + - If you're using a router (react-router), create routes for /terms and /privacy + that render and respectively. + + Example (react-router v6): + + import { BrowserRouter, Routes, Route } from 'react-router-dom'; + import LoginCard, { TermsPage, PrivacyPage } from './TermsPrivacyComponents'; + + function App() { + return ( + + + } /> + } /> + } /> + + + ); + } + + export default App; + + Security reminder: validate event.origin in the message handler in production. +*/ diff --git a/src/components/Authentication/SignUp_In/LoginForm.js b/src/components/Authentication/SignUp_In/LoginForm.js new file mode 100644 index 0000000..45d7ef0 --- /dev/null +++ b/src/components/Authentication/SignUp_In/LoginForm.js @@ -0,0 +1,428 @@ +import React, { useState } from 'react'; +import { TextField, Button, Typography, Stack, Box, IconButton, InputAdornment } from '@mui/material'; +import { useTheme } from '@mui/material/styles'; +import VisibilityOffOutlinedIcon from '@mui/icons-material/VisibilityOffOutlined'; +import { VisibilityOutlined } from '@mui/icons-material'; +import SidePanel from './SidePanel'; +import { useNavigate, Link } from 'react-router-dom'; +import authService from '../../../services/authService'; + +import { GoogleLogin, useGoogleLogin } from '@react-oauth/google'; +import { jwtDecode } from "jwt-decode"; + +const LoginForm = () => { + const navigate = useNavigate(); + const theme = useTheme(); + const [showPassword, setShowPassword] = useState(false); + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(''); + + const handleTogglePassword = () => { + setShowPassword(prev => !prev); + }; + + const handleLogin = async () => { + setLoading(true); + setError(''); + + const result = await authService.login(email, password); + + if (!result.success) { + // 🔹 أولًا: نتحقق إن كانت الرسالة تشير إلى أن الحساب غير موجود + if (result.message && result.message.includes('Account not found')) { + setError('This account is not registered.'); + } + // 🔹 ثانيًا: نتحقق من "Invalid credentials" + else if (result.message && result.message.includes('Invalid credentials')) { + setError('Email or password is incorrect.'); + } + // 🔹 ثالثًا: نعرض أول خطأ موجود في كائن errors + else if (result.errors) { + const firstError = Object.values(result.errors)[0][0]; + setError(firstError); + } + // 🔹 أخيرًا: fallback لأي رسالة أخرى + else { + setError(result.message || 'Login failed'); + } + + setLoading(false); + return; + } + + localStorage.setItem('token', result.data.token); + localStorage.setItem('refresh_token', result.data.refresh_token); + setLoading(false); + navigate('/restaurant', { replace: true }); + }; + + const handleGoogleSuccess = async (tokenResponse) => { + try { + const res = await fetch('https://www.googleapis.com/oauth2/v3/userinfo', { + headers: { + Authorization: `Bearer ${tokenResponse.access_token}`, + }, + }); + + const userInfo = await res.json(); + console.log('Google User Info:', userInfo); + + if (userInfo.email) { + setEmail(userInfo.email); + } + + setPassword(''); + localStorage.setItem("google_user", JSON.stringify(userInfo)); + } catch (e) { + console.error("Google login failed:", e); + setError("Google login failed"); + } + }; + + const handleGoogleError = () => { + setError("Google login failed"); + }; + + const loginWithGoogle = useGoogleLogin({ + onSuccess: handleGoogleSuccess, + onError: handleGoogleError, + }); + + return ( + + + + + + + + {/* الشعار */} + + logo + + + + {/* عنوان تسجيل الدخول */} + + Login + + + + Enter your username and password to access your account securely. Welcome back to our service! + + + + {/* إدخال البريد */} + + + Email + + setEmail(e.target.value)} + sx={{ + '& input': { fontWeight: 500, fontSize: '15px' }, + '& input::placeholder': { color: '#969BA7' }, + '& .MuiOutlinedInput-root': { + borderRadius: '10px', + transition: '0.3s', + '&.Mui-focused fieldset': { + borderColor: theme.palette.primary.main, + boxShadow: '0 0 0 2px rgba(255, 145, 77, 0.2)' + } + }, + '& .MuiOutlinedInput-root.Mui-focused': { + borderColor: '#3f51b5', + boxShadow: '0 0 0 2px rgba(63,81,181,0.1)' + } + }} + /> + + + {/* إدخال كلمة السر */} + + + Password + + setPassword(e.target.value)} + sx={{ + '& input': { fontWeight: 500, fontSize: '15px' }, + '& input::placeholder': { color: '#969BA7' }, + '& .MuiOutlinedInput-root': { + borderRadius: '10px', + transition: '0.3s', + '&.Mui-focused fieldset': { + borderColor: theme.palette.primary.main, + boxShadow: '0 0 0 2px rgba(255, 145, 77, 0.2)' + } + }, + '& .MuiOutlinedInput-root.Mui-focused': { + borderColor: '#3f51b5', + boxShadow: '0 0 0 2px rgba(63,81,181,0.1)' + }, + '& input::-ms-reveal, & input::-ms-clear': { + display: 'none', + }, + }} + InputProps={{ + endAdornment: ( + + + {showPassword ? : } + + + ) + }} + /> + + + {/* عرض الخطأ */} + {error && ( + + {error} + + )} + + {/* زر تسجيل الدخول */} + + + + + {/* Divider */} + + + + Or + + + + + {/* */} + + {/* Facebook Button */} + {/* */} + + {/* Register Link */} + + Don’t have an account?{' '} + + Register + + + + {/* ForgetPassword Link */} + + Did you forget the password?{' '} + + Forget Password + + + + {/* Terms */} + + + By logging in, I agree to the{' '} + window.open('/terms', 'TermsOfService')} + > + Terms of Service + {' '} + and{' '} + window.open('/privacy', 'PrivacyPolicy')} + > + Privacy Policy + . + + + + + + + + + + ); +}; + +export default LoginForm; + diff --git a/src/components/Authentication/SignUp_In/RegisterForm.js b/src/components/Authentication/SignUp_In/RegisterForm.js new file mode 100644 index 0000000..cca293c --- /dev/null +++ b/src/components/Authentication/SignUp_In/RegisterForm.js @@ -0,0 +1,501 @@ +import React, { useState ,useContext } from 'react'; +import { TextField, Button, Typography, Stack, Box, IconButton, InputAdornment } from '@mui/material'; +import { useTheme } from '@mui/material/styles'; +import VisibilityOffOutlinedIcon from '@mui/icons-material/VisibilityOffOutlined'; +import { VisibilityOutlined } from '@mui/icons-material'; +import SidePanel from './SidePanel'; +import { Link, useNavigate } from 'react-router-dom'; +import authService from '../../../services/authService'; +import { UserContext } from '../../../contexts/UserContext'; + + +// import { useGoogleRegister } from '@react-oauth/google'; +const generateStrongPassword = () => { + const length = 12; + const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+"; + let password = ""; + for (let i = 0, n = charset.length; i < length; ++i) { + password += charset.charAt(Math.floor(Math.random() * n)); + } + return password; +}; + +const Register = () => { + const theme = useTheme(); + const navigate = useNavigate(); + const [showPassword, setShowPassword] = useState(false); + const [showConfirmPassword, setShowConfirmPassword] = useState(false); + + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [confirmPassword, setConfirmPassword] = useState(''); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(''); + const [successMessage, setSuccessMessage] = useState(''); + const [snackbarOpen, setSnackbarOpen] = useState(false); + + const { setUser } = useContext(UserContext); + + // تفعيل/تعطيل إظهار كلمة السر + const handleTogglePassword = () => { + setShowPassword((prev) => !prev); + }; + + const handleToggleConfirmPassword = () => { + setShowConfirmPassword((prev) => !prev); + }; + + +const handleRegister = async () => { + setLoading(true); + setError(''); + setSuccessMessage(''); + + const result = await authService.register(email, password, confirmPassword); + + if (!result.success) { + if (result.errors) { + const firstError = Object.values(result.errors)[0][0]; + setError(firstError); + } else if (result.message && result.message.includes('Duplicate entry')) { + setError('The email has already been taken.'); + } else { + setError(result.message || 'Registration failed'); + } + setLoading(false); + return; + } + + // تسجيل ناجح + localStorage.setItem('token', result.data.token); + localStorage.setItem('refresh_token', result.data.refresh_token); + + // ✅ تحديث الـ User Context مباشرة بعد التسجيل + setUser({ + email: email, + token: result.data.token, + refresh_token: result.data.refresh_token, + adminData: result.data.Admin || null, + }); + + setTimeout(() => { + navigate('/restaurant', { replace: true }); + setLoading(false); + }, 500); +}; + + + const handleGoogleSuccess = async (tokenResponse) => { + try { + const res = await fetch('https://www.googleapis.com/oauth2/v3/userinfo', { + headers: { + Authorization: `Bearer ${tokenResponse.access_token}`, + }, + }); + + const userInfo = await res.json(); + console.log('Google User Info:', userInfo); + + if (userInfo.email) { + const generatedPassword = generateStrongPassword(); // كلمة مرور مقترحة + + setEmail(userInfo.email); + setPassword(generatedPassword); + setConfirmPassword(generatedPassword); + + setError(''); + + setTimeout(() => { + setSuccessMessage(''); + }, 5000); + } else { + setError('Google Register failed: No email found'); + } + } catch (e) { + console.error('Google Register failed:', e); + setError('Google Register failed'); + } + }; + + const handleGoogleError = () => { + setError('Google Register failed'); + }; + + const handleSnackbarClose = (event, reason) => { + if (reason === 'clickaway') { + return; + } + setSnackbarOpen(false); + }; + + // // تهيئة تسجيل الدخول عبر جوجل باستخدام useGoogleRegister + // const RegisterWithGoogle = useGoogleRegister({ + // onSuccess: handleGoogleSuccess, + // onError: handleGoogleError, + // }); + + return ( + + + + + + + + {/* logo */} + + logo + + + + Register + + + + Please fill out the registration form with accurate information to create your account successfully. + + + + {/* حقل الايميل */} + + + Email + + setEmail(e.target.value)} + sx={{ + '& input': { fontWeight: 500, fontSize: '15px' }, + '& input::placeholder': { color: '#969BA7' }, + '& .MuiOutlinedInput-root': { + borderRadius: '10px', + transition: '0.3s', + '&.Mui-focused fieldset': { + borderColor: theme.palette.primary.main, + boxShadow: '0 0 0 2px rgba(255, 145, 77, 0.2)', + }, + }, + '& .MuiOutlinedInput-root.Mui-focused': { + borderColor: '#3f51b5', + boxShadow: '0 0 0 2px rgba(63,81,181,0.1)', + }, + }} + /> + + + {/* حقل كلمة المرور */} + + + Password + + setPassword(e.target.value)} + sx={{ + '& input': { fontWeight: 500, fontSize: '15px' }, + '& input::placeholder': { color: '#969BA7' }, + '& .MuiOutlinedInput-root': { + borderRadius: '10px', + transition: '0.3s', + '&.Mui-focused fieldset': { + borderColor: theme.palette.primary.main, + boxShadow: '0 0 0 2px rgba(255, 145, 77, 0.2)', + }, + }, + '& .MuiOutlinedInput-root.Mui-focused': { + borderColor: '#3f51b5', + boxShadow: '0 0 0 2px rgba(63,81,181,0.1)', + }, + '& input::-ms-reveal, & input::-ms-clear': { + display: 'none', + }, + }} + InputProps={{ + endAdornment: ( + + + {showPassword ? : } + + + ), + }} + /> + + + {/* حقل التاكيد لكلمة المرور */} + + + Confirm Password + + setConfirmPassword(e.target.value)} + sx={{ + '& input': { fontWeight: 500, fontSize: '15px' }, + '& input::placeholder': { color: '#969BA7' }, + '& .MuiOutlinedInput-root': { + borderRadius: '10px', + transition: '0.3s', + '&.Mui-focused fieldset': { + borderColor: '#FF914D', + boxShadow: '0 0 0 2px rgba(255, 145, 77, 0.2)', + }, + }, + '& .MuiOutlinedInput-root.Mui-focused': { + borderColor: '#3f51b5', + boxShadow: '0 0 0 2px rgba(63,81,181,0.1)', + }, + '& input::-ms-reveal, & input::-ms-clear': { + display: 'none', + }, + }} + InputProps={{ + endAdornment: ( + + + {showConfirmPassword ? : } + + + ), + }} + /> + + + {/* Error & Success Message */} + {error && ( + + {error} + + )} + {successMessage && ( + + {successMessage} + + )} + + {/* زر التسجيل */} + + + + + + {/* Divider */} + + + + Or + + + + + {/* زر التسجيل عبر جوجل */} + {/* */} + + {/* زر فيسبوك - فقط للعرض (لم تُضاف وظيفة) */} + {/* */} + + + Already have an account?{' '} + + Login + + + + + By logging in, I agree to the{' '} + window.open('/terms', 'TermsOfService')} + > + Terms of Service + {' '} + and{' '} + window.open('/privacy', 'PrivacyPolicy')} + > + Privacy Policy + . + + + + + + + + + ); +}; + +export default Register; diff --git a/src/components/Authentication/SignUp_In/SidePanel.js b/src/components/Authentication/SignUp_In/SidePanel.js new file mode 100644 index 0000000..7735f8e --- /dev/null +++ b/src/components/Authentication/SignUp_In/SidePanel.js @@ -0,0 +1,191 @@ +import React, { useState, useEffect } from 'react'; +import { + Button, + Typography, + Stack, + Box +} from '@mui/material'; +import ArrowForwardIcon from '@mui/icons-material/ArrowForward'; + +const SidePanel = ({ setMode, mode }) => { + const [currentSlide, setCurrentSlide] = useState(0); + + const slides = [ + { + image: '/images/waitress1.png', + title: "Welcome to our cutting-edge postal application,", + description: "Welcome to our cutting-edge postal application, where sending and receiving mail has never been more convenient and efficient." + }, + { + image: '/images/waitress2.png', + title: "Second Slide Title", + description: "Welcome to our cutting-edge postal application, where sending and receiving mail has never been more convenient and efficient." + }, + { + image: '/images/waitress3.png', + title: "Third Slide Title", + description: "Welcome to our cutting-edge postal application, where sending and receiving mail has never been more convenient and efficient." + }, + { + image: '/images/waitress4.png', + title: "Fourth Slide Title", + description: "Welcome to our cutting-edge postal application, where sending and receiving mail has never been more convenient and efficient." + } + ]; + + useEffect(() => { + const interval = setInterval(() => { + setCurrentSlide((prev) => (prev + 1) % slides.length); + }, 5000); + return () => clearInterval(interval); + }, [slides.length]); + + return ( + + + + + + {/* الصورة الحالية */} + {`Slide + + {/* مربع النص في الأسفل */} + + + + + {slides[currentSlide].description} + + + + {/* مؤشرات الشرائح */} + + {slides.map((_, index) => ( + setCurrentSlide(index)} + /> + ))} + + + + + + + + + ) +} + +export default SidePanel; \ No newline at end of file diff --git a/src/components/Home/Analytics&Reporting/Analytics.js b/src/components/Home/Analytics&Reporting/Analytics.js new file mode 100644 index 0000000..a4dd4f0 --- /dev/null +++ b/src/components/Home/Analytics&Reporting/Analytics.js @@ -0,0 +1,104 @@ +import React, { useState, useEffect } from 'react'; +import { Box, useTheme, useMediaQuery } from '@mui/material'; +import KitchPlusAppBar from '../AppBar'; +import Sidebar from '../SideHome'; +import AnalyticsContect from './AnalyticsContect'; + +const drawerWidth = 230; + +const AnalyticsPage = () => { + const [timeFrame, setTimeFrame] = useState('month'); + + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('sm')); + const [hasProducts, setHasProducts] = useState(false); + const [isLoading, setIsLoading] = useState(true); + const [sidebarOpen, setSidebarOpen] = useState(!isMobile); + + + useEffect(() => { + const checkProducts = async () => { + setIsLoading(true); + const productsExist = await checkIfProductsExist(); + setHasProducts(productsExist); + setIsLoading(false); + }; + + checkProducts(); + }, []); + + const checkIfProductsExist = async () => { + return new Promise((resolve) => setTimeout(() => resolve(true), 1500)); + }; + + useEffect(() => { + if (window.innerWidth >= theme.breakpoints.values.md) { + setSidebarOpen(true); + } else { + setSidebarOpen(false); + } + }, [theme.breakpoints.values.md]); + + useEffect(() => { + const handleResize = () => { + if (window.innerWidth >= theme.breakpoints.values.md) { + setSidebarOpen(true); + } else { + setSidebarOpen(false); + } + }; + + handleResize(); + window.addEventListener('resize', handleResize); + return () => window.removeEventListener('resize', handleResize); + }, [theme.breakpoints.values.md]); + + const handleDrawerToggle = () => { + setSidebarOpen(!sidebarOpen); + }; + return ( + + + + + + + + + + + + + + + ); +}; + +export default AnalyticsPage; diff --git a/src/components/Home/Analytics&Reporting/AnalyticsContect.js b/src/components/Home/Analytics&Reporting/AnalyticsContect.js new file mode 100644 index 0000000..acd06c1 --- /dev/null +++ b/src/components/Home/Analytics&Reporting/AnalyticsContect.js @@ -0,0 +1,245 @@ +import React, { useState, useEffect } from 'react'; +import { useRestaurant } from '../../../contexts/RestaurantContext'; +import StatisticsCard from './StatisticsCard'; +import TablesManager from './TablesManager'; +import { + Box, + useTheme, + useMediaQuery, + Button, + ButtonGroup, + TextField +} from '@mui/material'; +import authService from '../../../services/authService'; +import dayjs from 'dayjs'; + +const AnalyticsPage = () => { + const { restaurantId } = useRestaurant(); + const [timeFrame, setTimeFrame] = useState('12m'); // '12m', '30d', '24h' + const [customDate, setCustomDate] = useState(dayjs().format('YYYY-MM-DD')); + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('sm')); + const [chartData, setChartData] = useState([]); + + const handleTimeFrameChange = (newTimeFrame) => { + setTimeFrame(newTimeFrame); + }; + + const handleCustomDateChange = (event) => { + setCustomDate(event.target.value); + }; + + const fetchStatistics = async () => { + if (!restaurantId) return; + + let period = 'daily'; + let labels = []; + let mappedData = []; + + switch (timeFrame) { + case '24h': // يومي + period = 'daily'; + labels = Array.from({ length: 24 }, (_, i) => `${i.toString().padStart(2, '0')}:00`); + try { + const response = await authService.getReservationStatistics(restaurantId, period, customDate); + if (response.success && response.data.length > 0) { + mappedData = response.data.map(item => ({ + label: item.label || item.date || '', + reservations_total: item.reservations_total || 0, + number_of_people_total: item.number_of_people_total || 0 + })); + } else { + mappedData = labels.map(label => ({ + label, + reservations_total: 0, + number_of_people_total: 0 + })); + } + } catch (error) { + console.error(error); + mappedData = labels.map(label => ({ + label, + reservations_total: 0, + number_of_people_total: 0 + })); + } + break; + + case '30d': // شهري + period = 'monthly'; + labels = Array.from({ length: 30 }, (_, i) => dayjs().startOf('month').add(i, 'day').format('MM-DD')); + try { + const response = await authService.getReservationStatistics(restaurantId, period, customDate); + if (response.success && response.data.length > 0) { + mappedData = response.data.map(item => ({ + label: item.label ? dayjs(item.label).format('MM-DD') : item.date ? dayjs(item.date).format('MM-DD') : '', + reservations_total: item.reservations_total || 0, + number_of_people_total: item.number_of_people_total || 0 + })); + } else { + mappedData = labels.map(label => ({ + label, + reservations_total: 0, + number_of_people_total: 0 + })); + } + } catch (error) { + console.error(error); + mappedData = labels.map(label => ({ + label, + reservations_total: 0, + number_of_people_total: 0 + })); + } + break; + + case '12m': // سنوي + default: + period = 'yearly'; + labels = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']; + try { + const response = await authService.getReservationStatistics(restaurantId, period, customDate); + if (response.success && response.data.length > 0) { + mappedData = response.data.map(item => ({ + label: item.label || item.date || '', + reservations_total: item.reservations_total || 0, + number_of_people_total: item.number_of_people_total || 0 + })); + } else { + mappedData = labels.map(label => ({ + label, + reservations_total: 0, + number_of_people_total: 0 + })); + } + } catch (error) { + console.error(error); + mappedData = labels.map(label => ({ + label, + reservations_total: 0, + number_of_people_total: 0 + })); + } + break; + } + + setChartData(mappedData); +}; + + + useEffect(() => { + fetchStatistics(); + }, [timeFrame, restaurantId, customDate]); + + return ( + + {/* Tables Manager */} + + {restaurantId && } + + + {/* Header Buttons */} + + + {[{ label: '12 Months', value: '12m' }, { label: '30 Days', value: '30d' }, { label: '24 Hours', value: '24h' }].map(({ label, value }) => ( + + ))} + + + {/* Date Picker + Today Button */} + + + + + + + {/* StatisticsCard */} + + value} + timeFrame={timeFrame} + onTimeFrameChange={handleTimeFrameChange} + /> + + + ); +}; + +export default AnalyticsPage; diff --git a/src/components/Home/Analytics&Reporting/SalesByLocation.js b/src/components/Home/Analytics&Reporting/SalesByLocation.js new file mode 100644 index 0000000..1959365 --- /dev/null +++ b/src/components/Home/Analytics&Reporting/SalesByLocation.js @@ -0,0 +1,124 @@ +import React from 'react'; +import { + Box, + Typography, + Paper, + List, + ListItem, + ListItemText, + ListItemSecondaryAction, + Chip, + IconButton, + useTheme, + useMediaQuery +} from '@mui/material'; +import MoreVertIcon from '@mui/icons-material/MoreVert'; +const SalesByLocation = ({ data }) => { + const theme = useTheme(); + const isSmallScreen = useMediaQuery(theme.breakpoints.down('sm')); + + return ( + + + + + Sales by Location + + + Sales performance by location + + + + + + + + + {data.map((item, i) => ( + + + {item.country} + + } + secondary={ + + {item.sales} Sales + + } + sx={{ my: 0 }} + /> + + + ${item.amount.toLocaleString()} + + 0 ? '+' : ''}${item.change}%`} + color={item.change > 0 ? 'success' : item.change < 0 ? 'error' : 'default'} + size={isSmallScreen ? 'small' : 'medium'} + sx={{ + fontSize: { xs: '11px', sm: '12px' }, + height: { xs: '24px', sm: '28px' }, + '& .MuiChip-label': { + px: { xs: 0.5, sm: 1 } + } + }} + /> + + + ))} + + + ); +}; + +export default SalesByLocation; \ No newline at end of file diff --git a/src/components/Home/Analytics&Reporting/StatisticsCard.js b/src/components/Home/Analytics&Reporting/StatisticsCard.js new file mode 100644 index 0000000..e4758cf --- /dev/null +++ b/src/components/Home/Analytics&Reporting/StatisticsCard.js @@ -0,0 +1,225 @@ +import React, { useState } from 'react'; +import PropTypes from 'prop-types'; +import { + Box, + IconButton, + Paper, + Typography, + useTheme, + useMediaQuery, + Menu, + MenuItem, + TextField, + Button +} from '@mui/material'; +import { + AreaChart, + Area, + XAxis, + YAxis, + Tooltip, + Legend, + ResponsiveContainer, + CartesianGrid +} from 'recharts'; +// import MoreVertIcon from '@mui/icons-material/MoreVert'; + +const StatisticsCard = ({ + title = "Statistics", + subtitle = "Delivery Times", + data = [], + dataKeys = [ + { key: 'revenue', name: 'Revenue', color: '#E46A11' }, + { key: 'sales', name: 'Sales', color: '#0182FC' } + ], + xDataKey = 'month', + valueFormatter = (value) => value, + timeFrame = 'month', + onTimeFrameChange +}) => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('sm')); + const isTablet = useMediaQuery(theme.breakpoints.between('sm', 'md')); + const [selectedDate, setSelectedDate] = useState(''); + const [anchorEl, setAnchorEl] = useState(null); + + const handleMenuOpen = (event) => { + setAnchorEl(event.currentTarget); + }; + const handleMenuClose = () => { + setAnchorEl(null); + }; + + const handleDateChange = (event) => { + setSelectedDate(event.target.value); + if (onTimeFrameChange) onTimeFrameChange(timeFrame, event.target.value); + handleMenuClose(); + }; + + const handleTodayClick = () => { + const today = new Date().toISOString().split('T')[0]; + setSelectedDate(today); + if (onTimeFrameChange) onTimeFrameChange(timeFrame, today); + handleMenuClose(); + }; + + // حساب العلامات الديناميكية للمحور الشاقولي + const ticksArray = (() => { + if (!data || data.length === 0) return []; + const maxValue = Math.max( + ...data.flatMap(d => dataKeys.map(k => d[k.key] || 0)) + ); + const desiredTicks = 8; // عدد العلامات المطلوب + const step = Math.ceil(maxValue / desiredTicks) || 1; + const arr = []; + for (let i = 0; i <= maxValue; i += step) { + arr.push(i); + } + return arr; + })(); + + return ( + + + + {/* */} + + + + + + + + + + + + {/* Header */} + + + + {title} + + + {subtitle} + + + + + {/* Chart */} + + + + {dataKeys.map(({ key, color }) => ( + + + + + ))} + + + + + + + + + {dataKeys.map(({ key, name, color }) => ( + + ))} + + + + + ); +}; + +StatisticsCard.propTypes = { + title: PropTypes.string, + subtitle: PropTypes.string, + data: PropTypes.arrayOf(PropTypes.object), + dataKeys: PropTypes.arrayOf(PropTypes.shape({ + key: PropTypes.string.isRequired, + name: PropTypes.string.isRequired, + color: PropTypes.string.isRequired + })), + xDataKey: PropTypes.string, + valueFormatter: PropTypes.func, + timeFrame: PropTypes.oneOf(['day', 'week', 'month', 'year']), + onTimeFrameChange: PropTypes.func +}; + +export default StatisticsCard; diff --git a/src/components/Home/Analytics&Reporting/TablesManager.js b/src/components/Home/Analytics&Reporting/TablesManager.js new file mode 100644 index 0000000..5c5f5f8 --- /dev/null +++ b/src/components/Home/Analytics&Reporting/TablesManager.js @@ -0,0 +1,456 @@ +import React, { useState, useEffect } from "react"; +import { + useMediaQuery, + Box, + Typography, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + Paper, + IconButton, + Skeleton, + Button, + TextField, + MenuItem, + Dialog, + DialogTitle, + DialogContent, + DialogActions, + Menu, + Chip, +} from "@mui/material"; +import { useTheme } from "@mui/material/styles"; +import ArrowBackIosNewIcon from "@mui/icons-material/ArrowBackIosNew"; +import ArrowForwardIosIcon from "@mui/icons-material/ArrowForwardIos"; +import AddIcon from "@mui/icons-material/Add"; +import SaveIcon from "@mui/icons-material/Save"; +import DeleteOutlineIcon from "@mui/icons-material/DeleteOutline"; +import TuneIcon from "@mui/icons-material/Tune"; +import authService from "../../../services/authService"; + +const SimplePagination = ({ currentPage, pageCount, onChange }) => { + const theme = useTheme(); + const handlePrev = () => currentPage > 1 && onChange(currentPage - 1); + const handleNext = () => currentPage < pageCount && onChange(currentPage + 1); + + return ( + + + + + + + {currentPage} + + + = pageCount} + sx={{ + borderRadius: "8px", + backgroundColor: "#FFECE0", + // "&:hover": { backgroundColor: "#FFD6B5" }, + color: theme.palette.primary.main, + // "&.Mui-disabled": { color: "#ccc", backgroundColor: "#FFF5E6" }, + }} + > + + + + ); +}; + +const statusOptions = ["available", "unavailable"]; + +const TablesManager = ({ restaurantId }) => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down("sm")); + const itemsPerPage = 4; + + const [rows, setRows] = useState([]); + const [currentPage, setCurrentPage] = useState(1); + const [loading, setLoading] = useState(false); + + const [addingRow, setAddingRow] = useState(false); + const [newRow, setNewRow] = useState({ + restaurant_id: restaurantId, + table_number: "", + capacity: "", + status: "available", + }); + + const [confirmDeleteOpen, setConfirmDeleteOpen] = useState(false); + const [rowToDelete, setRowToDelete] = useState(null); + const [isSaving, setIsSaving] = useState(false); + + // فلتر + const [filterAnchorEl, setFilterAnchorEl] = useState(null); + const [statusFilter, setStatusFilter] = useState("all"); + + const fetchTables = async () => { + setLoading(true); + try { + const result = await authService.getTablesByRestaurant(restaurantId); + if (result.success) setRows(result.data); + } catch (err) { + console.error("❌ Error fetching tables:", err); + } finally { + setLoading(false); + } + }; + + useEffect(() => { + if (restaurantId) fetchTables(); + }, [restaurantId]); + + const handleSaveRow = async () => { + if (!newRow.table_number || !newRow.capacity) return; + try { + const result = await authService.addTable(newRow); + if (result.success) { + setRows((prev) => [result.data, ...prev]); + setAddingRow(false); + setNewRow({ + restaurant_id: restaurantId, + table_number: "", + capacity: "", + status: "available", + }); + } + } catch (err) { + console.error("❌ Error adding table:", err); + } + }; + + const handleDeleteRow = (row) => { + setRowToDelete(row); + setConfirmDeleteOpen(true); + }; + + const handleConfirmDelete = async () => { + if (!rowToDelete) return; + setIsSaving(true); + try { + const result = await authService.deleteTable(rowToDelete.id); + if (result.success) setRows((prev) => prev.filter((r) => r.id !== rowToDelete.id)); + } catch (err) { + console.error(err); + } finally { + setIsSaving(false); + setConfirmDeleteOpen(false); + } + }; + + const handleFilterClick = (event) => setFilterAnchorEl(event.currentTarget); + const handleFilterClose = () => setFilterAnchorEl(null); + const handleFilterSelect = (value) => { + setStatusFilter(value); + setFilterAnchorEl(null); + }; + + const filteredRows = + (statusFilter === "all" ? rows : rows.filter((r) => r.status === statusFilter)) + .sort((a, b) => parseInt(a.table_number) - parseInt(b.table_number)); + + const pageCount = Math.ceil(filteredRows.length / itemsPerPage); + const paginatedRows = filteredRows.slice( + (currentPage - 1) * itemsPerPage, + currentPage * itemsPerPage + ); + + const getStatusChipProps = (status) => { + switch (status?.toLowerCase()) { + case "available": + return { + label: "Available", + sx: { + backgroundColor: "#E7F4EE", + color: "#0D894F", + fontWeight: 600, + fontSize: "13px", + minWidth: 90, + }, + }; + case "unavailable": + return { + label: "Unavailable", + sx: { + backgroundColor: "#fde8e8ff", + color: "#e41111ff", + fontWeight: 600, + fontSize: "13px", + minWidth: 100, + }, + }; + default: + return { + label: status, + sx: { + backgroundColor: "#FDF1E8", + color: "#E46A11", + fontWeight: 600, + fontSize: "13px", + minWidth: 80, + }, + }; + } + }; + + return ( + + {/* Header */} + + + Tables + + + + {/* فلتر */} + + + + + + + {/* Menu الفلاتر */} + + {["all", "available", "unavailable"].map((status) => ( + handleFilterSelect(status)} + sx={{ + color: statusFilter === status ? "#FF914D" : "#4F5867", + fontWeight: statusFilter === status ? 700 : 500, + }} + > + {status.charAt(0).toUpperCase() + status.slice(1)} + + ))} + + + {/* جدول */} + + + + + Table Number + Capacity + Status + Actions + + + + {loading + ? Array.from({ length: itemsPerPage }).map((_, idx) => ( + + + + + + + )) + : ( + <> + {addingRow && ( + + + setNewRow({ ...newRow, table_number: e.target.value })} + /> + + + setNewRow({ ...newRow, capacity: e.target.value })} + /> + + + + + + + + + + + )} + + + {paginatedRows.map((row) => ( + + {row.table_number} + {row.capacity} + + + + + handleDeleteRow(row)}> + + + + + ))} + + )} + +
+
+ + {/* Pagination Footer */} + + + Showing {(currentPage - 1) * itemsPerPage + 1} -{" "} + {Math.min(currentPage * itemsPerPage, filteredRows.length)} of {filteredRows.length} + + + + + {/* Dialog الحذف */} + setConfirmDeleteOpen(false)}> + Confirm Delete + + + Are you sure you want to delete table "{rowToDelete?.table_number}"? + + + + + + + +
+ ); +}; + +export default TablesManager; diff --git a/src/components/Home/Analytics&Reporting/TimeFrameSelector.js b/src/components/Home/Analytics&Reporting/TimeFrameSelector.js new file mode 100644 index 0000000..e106c30 --- /dev/null +++ b/src/components/Home/Analytics&Reporting/TimeFrameSelector.js @@ -0,0 +1,22 @@ +import React from 'react'; +import { Button, Stack } from '@mui/material'; + +const options = ['All Time', '12 Months', '30 Days', '7 Days', '24 Hour']; + +const TimeFrameSelector = ({ selected, onChange }) => ( + + {options.map(option => ( + + ))} + +); + +export default TimeFrameSelector; diff --git a/src/components/Home/AppBar.js b/src/components/Home/AppBar.js new file mode 100644 index 0000000..ea4fc38 --- /dev/null +++ b/src/components/Home/AppBar.js @@ -0,0 +1,126 @@ +// src/components/AppBar/KitchPlusAppBar.jsx +import React, { useEffect, useState, useContext } from 'react'; +import { + AppBar, + Toolbar, + Typography, + Box, + IconButton, + Divider, + Avatar, + useTheme, + useMediaQuery, +} from '@mui/material'; +import { useLocation, useNavigate } from 'react-router-dom'; +import MenuIcon from '@mui/icons-material/Menu'; +import HomeIcon from '@mui/icons-material/Home'; +import { useRestaurant } from '../../contexts/RestaurantContext'; +import authService from '../../services/authService'; +import { UserContext } from '../../contexts/UserContext'; // ✅ استدعاء UserContext + +const KitchPlusAppBar = ({ onDrawerToggle, sidebarOpen, isMobile }) => { + const location = useLocation(); + const navigate = useNavigate(); + const theme = useTheme(); + const isSmallScreen = useMediaQuery(theme.breakpoints.down('sm')); + const isMediumScreen = useMediaQuery(theme.breakpoints.between('sm', 'md')); + const { restaurantId } = useRestaurant(); + + const { user } = useContext(UserContext); // ✅ استخدم الـ Context بدلاً من localStorage + const [restaurantLogo, setRestaurantLogo] = useState('/images/default-restaurant.png'); + + useEffect(() => { + const fetchRestaurantLogo = async () => { + if (!restaurantId) return; + const res = await authService.getRestaurantById(restaurantId); + if (res.success && res.data) { + setRestaurantLogo(res.data.image_url); + } + }; + fetchRestaurantLogo(); + }, [restaurantId]); + + return ( + + + {/* Left side */} + + {(isMobile || isMediumScreen) && ( + + + + )} + + + Welcome to KitchPlus + + + + {/* Right side */} + + {location.pathname === '/dashboard' && } + + navigate('/restaurant')} + > + + + + + + + + {!isSmallScreen && ( + + {user?.email || 'Admin@gmail.com'} + + )} + + + + ); +}; + +export default KitchPlusAppBar; diff --git a/src/components/Home/Cart/Cart.js b/src/components/Home/Cart/Cart.js new file mode 100644 index 0000000..8a39298 --- /dev/null +++ b/src/components/Home/Cart/Cart.js @@ -0,0 +1,74 @@ +import React, { useState, useEffect } from 'react'; +import { Box, useTheme, useMediaQuery } from '@mui/material'; +import KitchPlusAppBar from '../AppBar'; +import Sidebar from '../SideHome'; +import Orders from './contect/Orders'; +import authService from '../../../services/authService'; + +const drawerWidth = 230; + +const Cart = () => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('sm')); + const [sidebarOpen, setSidebarOpen] = useState(!isMobile); + + useEffect(() => { + const handleResize = () => { + setSidebarOpen(window.innerWidth >= theme.breakpoints.values.md); + }; + + handleResize(); + window.addEventListener('resize', handleResize); + return () => window.removeEventListener('resize', handleResize); + }, [theme.breakpoints.values.md]); + + useEffect(() => { + const admin = authService.getAdminData(); + // console.log('Admin Info:', admin); + + const adminId = authService.getAdminId(); + // console.log('Admin ID:', adminId); + }, []); + +const admin = authService.getAdminData(); +const adminId = authService.getAdminId(); + const handleDrawerToggle = () => setSidebarOpen(!sidebarOpen); + + return ( + + + + + + + + + + + + ); +}; + +export default Cart; diff --git a/src/components/Home/Cart/contect/CartDetails.js b/src/components/Home/Cart/contect/CartDetails.js new file mode 100644 index 0000000..04c6395 --- /dev/null +++ b/src/components/Home/Cart/contect/CartDetails.js @@ -0,0 +1,223 @@ +import React, { useState } from 'react'; +import { + Box, + Typography, + Paper, + List, + ListItem, + ListItemText, + Button, + TextField, + Dialog, + DialogActions, + DialogContent, + DialogContentText, + DialogTitle, + CircularProgress +} from '@mui/material'; +import authService from '../../../../services/authService'; +import { useSnackbar } from "../../../../contexts/SnackbarContext"; + +const CartDetails = ({ cart, onClose, onUpdated, onDeleted }) => { + const [editMode, setEditMode] = useState(false); + const [totalPrice, setTotalPrice] = useState(cart?.attributes?.total_price || ""); + const [cartItems, setCartItems] = useState(cart.relationships?.cartItems || cart.relationships?.cart_items || []); + const [loading, setLoading] = useState(false); + const [deleteLoading, setDeleteLoading] = useState(false); + const [openDeleteDialog, setOpenDeleteDialog] = useState(false); + const { showSnackbar } = useSnackbar(); + if (!cart) return null; + + const handleSaveAll = async () => { + setLoading(true); + const payload = { + data: { + type: "cart", + attributes: { + totalPrice: Number(totalPrice), + }, + relationships: { + cartItems: cartItems.map(item => ({ + attributes: { + quantity: Number(item.attributes.quantity), + }, + relationships: { + product: { + data: { + id: item.relationships?.supplier_product?.id || + item.relationships?.product?.data?.id + } + } + } + })), + }, + }, + }; + + try { + const result = await authService.updateCart(cart.id, payload); + if (result.success) { + onUpdated(result.data); + setEditMode(false); + } else { + // alert(result.message || 'Failed to update cart'); + showSnackbar(result.message || "Failed to update cart", "error"); + } + } catch (error) { + // alert('An error occurred while updating the cart'); + showSnackbar("An error occurred while updating the cart", "error"); + } finally { + setLoading(false); + } + }; + + const handleDeleteCart = async () => { + setDeleteLoading(true); + try { + const result = await authService.deleteCart(cart.id); + if (result.success) { + onDeleted(cart.id); + onClose(); + } else { + // alert(result.message || 'Failed to delete cart'); + showSnackbar(result.message || "Failed to update cart", "error"); + } + } catch (error) { + // alert('An error occurred while deleting the cart'); + showSnackbar("An error occurred while deleting the cart", "error"); + } finally { + setDeleteLoading(false); + setOpenDeleteDialog(false); + } + }; + + const handleChangeQuantity = (itemId, newQuantity) => { + setCartItems(prev => + prev.map(item => + item.id === itemId + ? { ...item, attributes: { ...item.attributes, quantity: newQuantity } } + : item + ) + ); + }; + + return ( + <> + + + Cart #{cart.id} Details + + + {editMode ? ( + <> + setTotalPrice(e.target.value)} + fullWidth + sx={{ mb: 2 }} + /> + + Items: + + {cartItems.map(item => ( + + handleChangeQuantity(item.id, Number(e.target.value))} + sx={{ width: '120px' }} + /> + } + /> + + ))} + + + + + + + + ) : ( + <> + Total Price: {cart.attributes.total_price || cart.attributes.totalPrice} + + Created At: {new Date(cart.attributes.createdAt).toLocaleString()} + + Items: + + {cartItems.map(item => ( + + + + ))} + + + + + + + + + )} + + + {/* Delete Confirmation Dialog */} + setOpenDeleteDialog(false)} + > + Confirm Delete + + + Are you sure you want to delete this cart? This action cannot be undone. + + + + + + + + + ); +}; + +export default CartDetails; \ No newline at end of file diff --git a/src/components/Home/Cart/contect/CartView.js b/src/components/Home/Cart/contect/CartView.js new file mode 100644 index 0000000..de7a7f8 --- /dev/null +++ b/src/components/Home/Cart/contect/CartView.js @@ -0,0 +1,170 @@ +import React, { useContext, useState, useEffect } from "react"; +import { Box, Typography, Button, LinearProgress, IconButton } from "@mui/material"; +import ArrowBackIcon from '@mui/icons-material/ArrowBack'; +import { CartContext } from "../../../../contexts/CartContextR"; +import { useSnackbar } from "../../../../contexts/SnackbarContext"; + +const CartView = ({ onClose, onCartCreated, adminId }) => { + const { cart, clearCart, createNewCart } = useContext(CartContext); + const [loading, setLoading] = useState(false); + const { showSnackbar } = useSnackbar(); + + useEffect(() => { + console.log('Admin ID from props in:CartView', adminId); + }, [adminId]); + + const totalPrice = cart.reduce((sum, item) => sum + (item.totalPrice || 0), 0); + +const handleSendCart = async () => { + if (!cart.length) return; + setLoading(true); + + try { + // تحقق من أن adminId موجود ضمن قائمة صالحة (يمكنك تعديلها حسب بياناتك) + const validAdminIds = [1, 2]; // IDs موجودة في DB + if (!validAdminIds.includes(adminId)) { + console.error("Invalid admin ID"); + showSnackbar("Selected admin is not valid.", "error"); + + setLoading(false); + return; + } + + // تحقق من أن جميع المنتجات موجودة في قاعدة البيانات + const validProductIds = [1, 2, 3, 4]; // IDs المنتجات الموجودة + for (let item of cart) { + if (!validProductIds.includes(item.id)) { + console.error(`Invalid product ID: ${item.id}`); + // alert(`Product with ID ${item.id} does not exist.`); + showSnackbar(`Product with ID ${item.id} does not exist.`, "error"); + + setLoading(false); + return; + } + } + + // تجهيز البيانات حسب شكل الـ backend + const cartData = { + data: { + type: "cart", + attributes: { + totalPrice: cart.reduce((sum, item) => sum + (item.totalPrice || 0), 0), + }, + relationships: { + admin: { + data: { id: adminId }, + }, + cartItems: cart.map(item => ({ + attributes: { quantity: item.quantity }, + relationships: { product: { data: { id: item.id } } }, + })), + }, + }, + }; + + const newCart = await createNewCart(cartData); + + if (newCart && newCart.success) { + onCartCreated(newCart.data); + clearCart(); + onClose(); + showSnackbar("Cart sent successfully!", "success"); + } else { + console.error("Failed to create cart:", newCart.message); + } + } catch (error) { + // console.error("Error sending cart:", error); + showSnackbar("Failed to create cart.", "error"); + } finally { + setLoading(false); + } +}; + + + + if (loading) return ; + + return ( + + {/* السهم للعودة */} + + + + + + Current Cart + + + + {cart.length === 0 ? ( + No items in cart. + ) : ( + <> + {cart.map(item => ( + + + {item.name} + Unit: {item.unit} + + + Quantity: {item.quantity} + Total: ${item.totalPrice} + + + ))} + + + + Total Price: ${totalPrice.toFixed(2)} + + + + )} + + {cart.length > 0 && ( + + + + + )} + + ); +}; + +export default CartView; diff --git a/src/components/Home/Cart/contect/Orders.js b/src/components/Home/Cart/contect/Orders.js new file mode 100644 index 0000000..e705972 --- /dev/null +++ b/src/components/Home/Cart/contect/Orders.js @@ -0,0 +1,389 @@ +import React, { useState, useEffect } from 'react'; +import { + useMediaQuery, + Box, + Typography, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + Paper, + IconButton, + Skeleton, + CircularProgress, + Button +} from '@mui/material'; +import { useTheme } from '@mui/material/styles'; +import ArrowBackIosNewIcon from '@mui/icons-material/ArrowBackIosNew'; +import ArrowForwardIosIcon from '@mui/icons-material/ArrowForwardIos'; +import authService from '../../../../services/authService'; +import { useRestaurant } from "../../../../contexts/RestaurantContext"; +import CartDetails from './CartDetails'; +import CartView from './CartView'; + + + + +const SimplePagination = ({ currentPage, pageCount, onChange }) => { + const theme = useTheme(); + const handlePrev = () => { if (currentPage > 1) onChange(currentPage - 1); }; + const handleNext = () => { if (currentPage < pageCount) onChange(currentPage + 1); }; + const { restaurantId } = useRestaurant(); + return ( + + + + + + + {currentPage} + + + = pageCount} + sx={{ + borderRadius: '8px', + backgroundColor: '#FFECE0', + '&:hover': { backgroundColor: '#FFD6B5' }, + color: theme.palette.primary.main, + '&.Mui-disabled': { color: '#ccc', backgroundColor: '#FFF5E6' }, + }} + > + + + + ); +}; + +const Orders = ({ adminId }) => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('sm')); + const { restaurantId } = useRestaurant(); + const [ordersData, setOrdersData] = useState([]); + const [loading, setLoading] = useState(true); + const [selectedCart, setSelectedCart] = useState(null); + const [cartLoading, setCartLoading] = useState(false); + const [showCartView, setShowCartView] = useState(false); + + const [currentPage, setCurrentPage] = useState(1); + const itemsPerPage = 6; + + // ────────────── Fetch Orders ────────────── + useEffect(() => { + const fetchOrders = async () => { + setLoading(true); + try { + const result = await authService.getCart(); + if (result.success) { + console.log(Array.isArray(result.data) ? result.data : []); + setOrdersData(Array.isArray(result.data) ? result.data : []); + } else { + console.error(result.message); + setOrdersData([]); + } + } catch (error) { + console.error('Failed to fetch orders:', error); + setOrdersData([]); + } + setLoading(false); + }; + fetchOrders(); + }, []); + + // ────────────── Row Click ────────────── + const handleRowClick = async (cartId) => { + setCartLoading(true); + try { + const result = await authService.getCartById(cartId); + if (result.success) setSelectedCart(result.data); + else console.error(result.message); + } catch (error) { + console.error('Failed to fetch cart details:', error); + } + setCartLoading(false); + }; + + const handleCartUpdated = (updatedCart) => { + setOrdersData(prev => + prev.map(cart => cart.id === updatedCart.id ? updatedCart : cart) + ); + setSelectedCart(null); + }; + + const handleCloseCartDetails = () => { setSelectedCart(null); }; + + const handleAddOrder = (newOrder) => { + setOrdersData(prev => [newOrder, ...prev]); + }; + + const pageCount = Math.ceil(ordersData.length / itemsPerPage); + const paginatedOrders = ordersData.slice( + (currentPage - 1) * itemsPerPage, + currentPage * itemsPerPage + ); + + if (cartLoading) { + return ( + + + + ); + } + + if (selectedCart) { + return ( + + ); + } + + if (showCartView) { + return ( + setShowCartView(false)} + onSend={handleAddOrder} + onCartCreated={(newCart) => { + setOrdersData(prev => [newCart, ...prev]); + setShowCartView(false); + }} + adminId={adminId} + /> + ); + } + + // ────────────── Main Orders Table ────────────── + return ( + + + + Cart + + + + + + + + + + Cart ID + Total Price + Created At + Items Count + Action + + + + {loading + ? Array.from({ length: itemsPerPage }).map((_, idx) => ( + + + + + + + + )) + : ( + <> + {paginatedOrders.map(order => { + const attributes = order?.attributes || {}; + const relationships = order?.relationships || {}; + const cartItems = relationships?.cartItems || relationships?.cart_items || []; + return ( + handleRowClick(order.id)} + > + {order?.id || '--'} + {attributes?.totalPrice ?? attributes?.total_price ?? '0.00'} + {attributes?.createdAt ? new Date(attributes.createdAt).toLocaleString() : '--'} + {cartItems.length} + + + + + ); + })} + + {paginatedOrders.length < itemsPerPage && + Array.from({ length: itemsPerPage - paginatedOrders.length }).map((_, idx) => ( + + + + )) + } + + )} + +
+
+ + + + Showing {(currentPage - 1) * itemsPerPage + 1} - {Math.min(currentPage * itemsPerPage, ordersData.length)} of {ordersData.length} + + + + +
+ ); +}; + +export default Orders; diff --git a/src/components/Home/Cashier/Cashier.js b/src/components/Home/Cashier/Cashier.js new file mode 100644 index 0000000..c294836 --- /dev/null +++ b/src/components/Home/Cashier/Cashier.js @@ -0,0 +1,103 @@ +import React, { useState, useEffect } from 'react'; +import { Box, useTheme, useMediaQuery, Typography } from '@mui/material'; +import KitchPlusAppBar from '../AppBar'; +import Sidebar from '../SideHome'; + +const drawerWidth = 230; + +const Cashier = () => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('sm')); + const [hasProducts, setHasProducts] = useState(false); + const [sidebarOpen, setSidebarOpen] = useState(!isMobile); + + + useEffect(() => { + + const checkProducts = async () => { + + const productsExist = await checkIfProductsExist(); + setHasProducts(productsExist); + }; + + checkProducts(); + }, []); + + + const checkIfProductsExist = async () => { + + return false; + }; + + useEffect(() => { + if (window.innerWidth >= theme.breakpoints.values.md) { + setSidebarOpen(true); + } else { + setSidebarOpen(false); + } + }, [theme.breakpoints.values.md]); + + useEffect(() => { + const handleResize = () => { + if (window.innerWidth >= theme.breakpoints.values.md) { + setSidebarOpen(true); + } else { + setSidebarOpen(false); + } + }; + + handleResize(); + window.addEventListener('resize', handleResize); + + return () => window.removeEventListener('resize', handleResize); + }, [theme.breakpoints.values.md]); + + const handleDrawerToggle = () => { + setSidebarOpen(!sidebarOpen); + }; + + return ( + + + + + + Cashier + + + ); +}; + +export default Cashier; \ No newline at end of file diff --git a/src/components/Home/CreateNewRestaurant/AppBar.js b/src/components/Home/CreateNewRestaurant/AppBar.js new file mode 100644 index 0000000..c825086 --- /dev/null +++ b/src/components/Home/CreateNewRestaurant/AppBar.js @@ -0,0 +1,136 @@ +import React from 'react'; +import { + AppBar, + Toolbar, + Box, + ListItemIcon, + ListItemText, + Typography, + useTheme, + useMediaQuery, +} from '@mui/material'; +import { useNavigate } from 'react-router-dom'; +import LogoutIcon from '@mui/icons-material/Logout'; +import authService from '../../../services/authService'; + +const KitchPlusAppBar = ({ onDrawerToggle, sidebarOpen, isMobile }) => { + const theme = useTheme(); + const navigate = useNavigate(); + const isSmallScreen = useMediaQuery(theme.breakpoints.down('sm')); + + + const handleLogout = async () => { + try { + const result = await authService.logout(); + + if (result.success) { + localStorage.removeItem('token'); + navigate('/login'); + } else { + console.error('Logout failed:', result.message); + } + } catch (error) { + console.error('Logout error:', error); + } + }; + + return ( + + + {/* Left: Logo */} + + + + KITCH + + + PLUS + + + + {/* Right: Log Out Button */} + + + + + + + + + + + ); +}; + +export default KitchPlusAppBar; diff --git a/src/components/Home/CreateNewRestaurant/CreateRestaurant.js b/src/components/Home/CreateNewRestaurant/CreateRestaurant.js new file mode 100644 index 0000000..d6ec97c --- /dev/null +++ b/src/components/Home/CreateNewRestaurant/CreateRestaurant.js @@ -0,0 +1,228 @@ +import React, { useState, useEffect } from 'react'; +import { Box, useTheme, useMediaQuery, Snackbar, Alert } from '@mui/material'; +import AppBar from './AppBar'; + +import CloudKitchenProject from '../CreateYourRestaurant/contcet/CloudKitchenProject'; +import OperationalDetails from '../CreateYourRestaurant/contcet/OperationalDetails'; +import RequiredEquipments from '../CreateYourRestaurant/contcet/RequiredEquipments'; +import VisualIdentity from '../CreateYourRestaurant/contcet/VisualIdentity'; +import Budget from '../CreateYourRestaurant/contcet/Budget'; +import AdditionalNotes from '../CreateYourRestaurant/contcet/AdditionalNotes'; +import SideProfile from './SideProfile'; +import authService from '../../../services/authService'; + +const { createNewRestaurant } = authService; +const drawerWidth = 230; + +const CreateRestaurant = () => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('sm')); + const [sidebarOpen, setSidebarOpen] = useState(!isMobile); + const [currentStep, setCurrentStep] = useState(0); + const [formData, setFormData] = useState({}); + const [snackbar, setSnackbar] = useState({ open: false, message: '', severity: 'success' }); + + const updateFormData = (newData) => { + setFormData(prev => { + const updated = { ...prev, ...newData }; + console.log('Updated formData:', updated); + return updated; + }); + }; + + const handleCloseSnackbar = (event, reason) => { + if (reason === 'clickaway') return; + setSnackbar(prev => ({ ...prev, open: false })); + }; + + const handleSubmit = async () => { + const result = await createNewRestaurant(formData); + if (result.success) { + setSnackbar({ open: true, message: 'Restaurant created successfully!', severity: 'success' }); + } else { + setSnackbar({ open: true, message: `Error: ${result.message}`, severity: 'error' }); + } + console.log("Form Data being submitted:", formData); + }; + + const steps = [ + setCurrentStep(prev => Math.min(prev + 1, steps.length - 1))} + onBack={() => setCurrentStep(prev => Math.max(prev - 1, 0))} + />, + setCurrentStep(prev => Math.min(prev + 1, steps.length - 1))} + onBack={() => setCurrentStep(prev => Math.max(prev - 1, 0))} + />, + setCurrentStep(prev => Math.min(prev + 1, steps.length - 1))} + onBack={() => setCurrentStep(prev => Math.max(prev - 1, 0))} + />, + setCurrentStep(prev => Math.min(prev + 1, steps.length - 1))} + onBack={() => setCurrentStep(prev => Math.max(prev - 1, 0))} + />, + setCurrentStep(prev => Math.min(prev + 1, steps.length - 1))} + onBack={() => setCurrentStep(prev => Math.max(prev - 1, 0))} + />, + setCurrentStep(prev => Math.max(prev - 1, 0))} + onSubmit={handleSubmit} + /> + + ]; + + useEffect(() => { + const handleResize = () => { + if (window.innerWidth >= theme.breakpoints.values.md) { + setSidebarOpen(true); + } else { + setSidebarOpen(false); + } + }; + + handleResize(); + window.addEventListener('resize', handleResize); + return () => window.removeEventListener('resize', handleResize); + }, [theme.breakpoints.values.md]); + + const handleDrawerToggle = () => { + setSidebarOpen(!sidebarOpen); + }; + + return ( + + + + + + + + + {/* Sidebar profile for desktop */} + + + setCurrentStep(prev => Math.max(prev - 1, 0))} + /> + + + + {/* Step content */} + + + {steps[currentStep]} + + + + + + + + + + {snackbar.message} + + + + ); +}; + +export default CreateRestaurant; diff --git a/src/components/Home/CreateNewRestaurant/SideProfile.js b/src/components/Home/CreateNewRestaurant/SideProfile.js new file mode 100644 index 0000000..5ef8e16 --- /dev/null +++ b/src/components/Home/CreateNewRestaurant/SideProfile.js @@ -0,0 +1,160 @@ +import React from 'react'; +import { Box, Typography, Stack, Button, useTheme } from '@mui/material'; +import ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos'; + +const steps = [ + { title: 'Cloud Kitchen Project', icon: '/images/createProfile/BasicInf.png' }, + { title: 'OperationalDetails', icon: '/images/icons/rocket.png' }, + { title: 'Required Equipments', icon: '/images/createProfile/equipment.png'}, + { title: 'Visual Identity', icon: '/images/createProfile/Vector.png' }, + { title: 'Budget & Expansion', icon: '/images/createProfile/Expansion.png' }, + { title: 'Additional Notes & Concerns', icon: '/images/createProfile/Group.png' }, + { title: 'Submit & Confirmation', icon: '/images/createProfile/Confirmation.png' }, +]; + +const SideProfile = ({ currentStepIndex = 0, onBack }) => { + const theme = useTheme(); + + return ( + + {/* العنوان الرئيسي */} + + Create Your Restaurant + + + Complete this process to register your restaurant on our amazing food platform. + + + {/* الخطوات */} + + {steps.map((step, index) => ( + + {/* الخط الرأسي بين الدوائر */} + {index !== steps.length - 1 && ( + + )} + + {/* محتوى كل خطوة */} + + {/* الدائرة بالأيقونة */} + + {/* الدائرة الخلفية - تظهر دائمًا */} + + + + {step.title} + + + + {/* العنوان */} + + {step.title} + + + + ))} + + + {/* زر الرجوع */} + + + + + ); +}; + +export default SideProfile; diff --git a/src/components/Home/CreateYourRestaurant/CreateRestaurant.js b/src/components/Home/CreateYourRestaurant/CreateRestaurant.js new file mode 100644 index 0000000..d3fd53f --- /dev/null +++ b/src/components/Home/CreateYourRestaurant/CreateRestaurant.js @@ -0,0 +1,257 @@ +import React, { useState, useEffect } from 'react'; +import { Box, useTheme, useMediaQuery, Snackbar, Alert } from '@mui/material'; +import KitchPlusAppBar from '../AppBar'; +import Sidebar from '../SideHome'; +import CloudKitchenProject from './contcet/CloudKitchenProject'; +import OperationalDetails from './contcet/OperationalDetails'; +import RequiredEquipments from './contcet/RequiredEquipments'; +import VisualIdentity from './contcet/VisualIdentity'; +import Budget from './contcet/Budget'; +import AdditionalSupport from './contcet/AdditionalSupport'; +import AdditionalNotes from './contcet/AdditionalNotes'; +import SideProfile from './SideProfile'; +import authService from '../../../services/authService'; + +const { createNewRestaurant } = authService; +const drawerWidth = 230; + +const CreateRestaurant = () => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('sm')); + const [hasProducts, setHasProducts] = useState(false); + const [sidebarOpen, setSidebarOpen] = useState(!isMobile); + + const [snackbarOpen, setSnackbarOpen] = useState(false); + const [currentStep, setCurrentStep] = useState(0); + + // إدارة بيانات النموذج لجميع الخطوات (مشاركة البيانات بين الخطوات) + const [formData, setFormData] = useState({ + + }); + + // دالة لتحديث بيانات النموذج بشكل مرن (دمج الجديد مع القديم) + const updateFormData = (newData) => { + setFormData(prev => ({ + ...prev, + ...newData, + })); + }; + + + // دالة لإغلاق السناك بار + const handleSnackbarClose = (event, reason) => { + if (reason === 'clickaway') return; + setSnackbarOpen(false); + }; + + const handleSubmit = async () => { + try { + await createNewRestaurant(formData); + setSnackbarOpen(true); + } catch (error) { + console.error(error); + + } + }; + + const steps = [ + setCurrentStep(prev => Math.min(prev + 1, steps.length - 1))} + onBack={() => setCurrentStep(prev => Math.max(prev - 1, 0))} + />, + setCurrentStep(prev => Math.min(prev + 1, steps.length - 1))} + onBack={() => setCurrentStep(prev => Math.max(prev - 1, 0))} + />, + setCurrentStep(prev => Math.min(prev + 1, steps.length - 1))} + onBack={() => setCurrentStep(prev => Math.max(prev - 1, 0))} + />, + setCurrentStep(prev => Math.min(prev + 1, steps.length - 1))} + onBack={() => setCurrentStep(prev => Math.max(prev - 1, 0))} + />, + setCurrentStep(prev => Math.min(prev + 1, steps.length - 1))} + onBack={() => setCurrentStep(prev => Math.max(prev - 1, 0))} + />, + setCurrentStep(prev => Math.max(prev - 1, 0))} + onSubmit={handleSubmit} + /> + + ]; + + + // useEffect(() => { + // const checkProducts = async () => { + // const productsExist = await checkIfProductsExist(); + // setHasProducts(productsExist); + // }; + // checkProducts(); + // }, []); + + // const checkIfProductsExist = async () => { + // return false; + // }; + + + useEffect(() => { + if (window.innerWidth >= theme.breakpoints.values.md) { + setSidebarOpen(true); + } else { + setSidebarOpen(false); + } + }, [theme.breakpoints.values.md]); + + useEffect(() => { + const handleResize = () => { + if (window.innerWidth >= theme.breakpoints.values.md) { + setSidebarOpen(true); + } else { + setSidebarOpen(false); + } + }; + + handleResize(); + window.addEventListener('resize', handleResize); + return () => window.removeEventListener('resize', handleResize); + }, [theme.breakpoints.values.md]); + + const handleDrawerToggle = () => { + setSidebarOpen(!sidebarOpen); + }; + + return ( + + + + + + + + + + setCurrentStep(prev => Math.max(prev - 1, 0))} + /> + + + + + + {steps[currentStep]} + + + + + + + + + + عملية إنشاء المطعم تمت بنجاح + + + + ); +}; + +export default CreateRestaurant; diff --git a/src/components/Home/CreateYourRestaurant/SideProfile.js b/src/components/Home/CreateYourRestaurant/SideProfile.js new file mode 100644 index 0000000..41c274f --- /dev/null +++ b/src/components/Home/CreateYourRestaurant/SideProfile.js @@ -0,0 +1,161 @@ +import React from 'react'; +import { Box, Typography, Stack, Button, useTheme } from '@mui/material'; +import ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos'; + +const steps = [ + { title: 'Cloud Kitchen Project', icon: '/images/createProfile/BasicInf.png' }, + { title: 'OperationalDetails', icon: '/images/icons/rocket.png' }, + { title: 'Required Equipments', icon: '/images/createProfile/equipment.png'}, + { title: 'Visual Identity', icon: '/images/createProfile/Vector.png' }, + { title: 'Budget & Expansion', icon: '/images/createProfile/Expansion.png' }, + { title: 'Additional Notes & Concerns', icon: '/images/createProfile/Group.png' }, + { title: 'Submit & Confirmation', icon: '/images/createProfile/Confirmation.png' }, +]; + +const SideProfile = ({ currentStepIndex = 0, onBack }) => { + const theme = useTheme(); + + return ( + + {/* العنوان الرئيسي */} + + Create Your Restaurant + + + Complete this process to register your restaurant on our amazing food platform. + + + {/* الخطوات */} + + {steps.map((step, index) => ( + + {/* الخط الرأسي بين الدوائر */} + {index !== steps.length - 1 && ( + + )} + + {/* محتوى كل خطوة */} + + {/* الدائرة بالأيقونة */} + + {/* الدائرة الخلفية - تظهر دائمًا */} + + + {/* الدائرة الأمامية بالأيقونة */} + + {step.title} + + + + {/* العنوان */} + + {step.title} + + + + ))} + + + {/* زر الرجوع */} + + + + + ); +}; + +export default SideProfile; diff --git a/src/components/Home/CreateYourRestaurant/contcet/AdditionalNotes.js b/src/components/Home/CreateYourRestaurant/contcet/AdditionalNotes.js new file mode 100644 index 0000000..cffcfb4 --- /dev/null +++ b/src/components/Home/CreateYourRestaurant/contcet/AdditionalNotes.js @@ -0,0 +1,171 @@ +import React, { useState } from 'react'; +import { + Box, + Typography, + Stack, + Button, + useTheme, + TextField +} from '@mui/material'; +import ConfirmationDialog from './ConfirmationDialog'; +import { useLocation, useNavigate } from 'react-router-dom'; + +const AdditionalNotes = ({ currentStepIndex = 0, onNext, onBack, formData, updateFormData, onSubmit }) => { + const theme = useTheme(); + const [openModal, setOpenModal] = useState(false); + const [loading, setLoading] = useState(false); + + const navigate = useNavigate(); + const location = useLocation(); + + const handleOpenModal = () => setOpenModal(true); + const handleCloseModal = () => setOpenModal(false); + + const handleNotesChange = (e) => { + updateFormData({ need_help: e.target.value }); + }; + + const handleConfirmSubmit = async () => { + setLoading(true); + try { + if (onSubmit) { + await onSubmit(); + } + setOpenModal(false); + + // التوجيه فقط إذا كانت الصفحة هي /create-restaurant + if (location.pathname === '/create-restaurant') { + navigate('/restaurant'); + } + // إذا كانت من رابط آخر مثل /create-kitchen لا نفعل شيئًا + } catch (error) { + console.error(error); + } finally { + setLoading(false); + } + }; + + return ( + + + + Additional Notes + + + + + Enter your basic information to proceed to registration of your own restaurant on this platform + + + + + + Notes / Concerns + + + + + + + + + + + + + + ); +}; + +export default AdditionalNotes; diff --git a/src/components/Home/CreateYourRestaurant/contcet/AdditionalSupport.js b/src/components/Home/CreateYourRestaurant/contcet/AdditionalSupport.js new file mode 100644 index 0000000..5fd7b9b --- /dev/null +++ b/src/components/Home/CreateYourRestaurant/contcet/AdditionalSupport.js @@ -0,0 +1,175 @@ +import React, { useState } from 'react'; +import { + Box, + Typography, + Stack, + Button, + useTheme, + FormGroup, + FormControlLabel, + Checkbox, +} from '@mui/material'; + +const AdditionalSupport = ({ currentStepIndex = 0, onNext, onBack }) => { + const theme = useTheme(); + const [selectedOptions, setSelectedOptions] = useState([]); + + const handleCheckboxChange = (option) => { + setSelectedOptions((prev) => + prev.includes(option) + ? prev.filter((o) => o !== option) + : [...prev, option] + ); + }; + + const options = ['Supplier Assistance', 'Staff Training']; + + return ( + + + + Additional Support + + + + Enter your basic information to proceed to registration of your own + restaurant on this platform + + + + {/* Checkboxes for Additional Support Options */} + + + Select Additional Support Options + + + {options.map((option) => { + const isChecked = selectedOptions.includes(option); + return ( + handleCheckboxChange(option)} + sx={{ + transform: 'scale(1.5)', + color: '#F0EDED', + '&.Mui-checked': { + color: '#FF914D', + }, + }} + /> + } + label={ + + {option} + + } + sx={{ + m: 0, + width: { xs: '100%', sm: '48%', md: '40%' }, + }} + /> + ); + })} + + + + {/* Buttons */} + + + + + + + + ); +}; + +export default AdditionalSupport; diff --git a/src/components/Home/CreateYourRestaurant/contcet/Budget.js b/src/components/Home/CreateYourRestaurant/contcet/Budget.js new file mode 100644 index 0000000..a2ea84c --- /dev/null +++ b/src/components/Home/CreateYourRestaurant/contcet/Budget.js @@ -0,0 +1,150 @@ +import React from 'react'; +import { Box, Typography, Stack, Button, useTheme, TextField } from '@mui/material'; +import { useNavigate } from 'react-router-dom'; + +const Budget = ({ currentStepIndex = 0, onNext, onBack, formData, updateFormData }) => { + const theme = useTheme(); + const navigate = useNavigate(); + + const handleNext = () => { + if (onNext) onNext(); + else navigate('/dashboard'); + }; + + const handleInputChange = (field) => (e) => { + updateFormData({ [field]: e.target.value }); + }; + + return ( + + + + Budget & Expansion + + + + + Enter your basic information to proceed to registration of your own restaurant on this platform + + + + {/* Estimated Budget Input */} + + + {/* Expansion Plans Through Cloud Kitchen (No of Branches) Input */} + + + {/* Next Button */} + + + + + + + + ); +}; + +const InputField = ({ label, placeholder, theme, value, onChange }) => ( + + + {label} + + + +); + +export default Budget; diff --git a/src/components/Home/CreateYourRestaurant/contcet/CloudKitchenProject.js b/src/components/Home/CreateYourRestaurant/contcet/CloudKitchenProject.js new file mode 100644 index 0000000..939dacb --- /dev/null +++ b/src/components/Home/CreateYourRestaurant/contcet/CloudKitchenProject.js @@ -0,0 +1,438 @@ +import React, { useState, useEffect } from 'react'; +import { + Box, + Typography, + Stack, + Button, + useTheme, + TextField, + Radio, + RadioGroup, + FormControlLabel, + MenuItem, + FormControl, + FormHelperText +} from '@mui/material'; + +import authService from '../../../../services/authService'; // تأكد من المسار الصحيح + +const CloudKitchenProject = ({ + currentStepIndex = 0, + onNext, + formData, + updateFormData, +}) => { + const theme = useTheme(); + const [cuisineTypes, setCuisineTypes] = useState([]); + const [errors, setErrors] = useState({}); + + //cuisineTypes + useEffect(() => { + const fetchCuisineTypes = async () => { + const data = await authService.cuisineTypes(); + setCuisineTypes(data); + }; + fetchCuisineTypes(); + }, []); + + useEffect(() => { + if (formData.menu_status === undefined) { + updateFormData({ menu_status: false }); + } + if (formData.is_existing_brand === undefined) { + updateFormData({ is_existing_brand: false }); + } + }, []); + +const handleChange = (e) => { + const { name, value } = e.target; + if (name === 'is_existing_brand' || name === 'menu_status') { + updateFormData({ [name]: value === 'yes' }); + } else { + updateFormData({ [name]: value }); + } +}; + + + const validate = () => { + let tempErrors = {}; + if (!formData.name || formData.name.trim() === '') { + tempErrors.name = 'Restaurant Name is required'; + } + if (!formData.cuisine_type_id) { + tempErrors.cuisine_type_id = 'Cuisine Type is required'; + } + if (typeof formData.is_existing_brand !== 'boolean') { + tempErrors.is_existing_brand = 'Existing Brand selection is required'; + } + if (!formData.location || formData.location.trim() === '') { + tempErrors.location = 'Location is required'; + } + if (typeof formData.menu_status !== 'boolean') { + tempErrors.menu_status = 'Menu Status selection is required'; + } + setErrors(tempErrors); + return Object.keys(tempErrors).length === 0; + }; + + const handleNext = () => { + if (validate()) { + onNext(); + } + }; + + return ( + + + + Cloud Kitchen Project + + + + Enter your basic information to proceed to registration of your own restaurant on this platform + + + + {/* Restaurant Name */} + + + Restaurant Name + + + + + {/* Cuisine Type */} + + + Cuisine Type + + + {cuisineTypes.length > 0 ? ( + cuisineTypes.map((type) => ( + + {type.name} + + )) + ) : ( + No Cuisine Types Found + )} + + + + {/* Existing Brand */} + + + Existing Brand + + + + + } + label="Yes" + /> + + } + label="No" + /> + + {errors.is_existing_brand && ( + {errors.is_existing_brand} + )} + + + + {/* Further Brand Details */} + + + Further Brand Details + + + + + {/* Age Group */} + + + Age Group + + + + + {/* Location */} + + + Location + + + + + {/* Menu Status */} + + + Menu Status + + + + + } + label="Yes" + /> + + } + label="No" + /> + + {errors.menu_status && ( + {errors.menu_status} + )} + + + + {/* زر Next */} + + + + + + ); +}; + +export default CloudKitchenProject; diff --git a/src/components/Home/CreateYourRestaurant/contcet/ConfirmationDialog.js b/src/components/Home/CreateYourRestaurant/contcet/ConfirmationDialog.js new file mode 100644 index 0000000..296eae3 --- /dev/null +++ b/src/components/Home/CreateYourRestaurant/contcet/ConfirmationDialog.js @@ -0,0 +1,182 @@ +import React from 'react'; +import { + Dialog, + DialogTitle, + DialogContent, + DialogContentText, + DialogActions, + Button, + Box, + Typography, + useTheme, + CircularProgress +} from '@mui/material'; +const ConfirmationDialog = ({ open, onClose, onConfirm, loading }) => { + + const theme = useTheme(); + return ( + + + + {/* الدوائر */} + + {/* الدائرة الخلفية */} + + + + + Success icon + + + + + + Register successful! + + + + + + Congratulations! you well register your restaurant successfully on our platform + + + + + + + + {/* الزر الأول - Filled */} + + + + + ); +}; + +export default ConfirmationDialog; \ No newline at end of file diff --git a/src/components/Home/CreateYourRestaurant/contcet/OperationalDetails.js b/src/components/Home/CreateYourRestaurant/contcet/OperationalDetails.js new file mode 100644 index 0000000..ab59167 --- /dev/null +++ b/src/components/Home/CreateYourRestaurant/contcet/OperationalDetails.js @@ -0,0 +1,292 @@ +import React, { useEffect, useState } from 'react'; +import { + Box, + Typography, + Stack, + Button, + useTheme, + TextField, + MenuItem, +} from '@mui/material'; +import authService from '../../../../services/authService'; // ← عدّل المسار حسب مكانك + +const OperationalDetails = ({ + currentStepIndex = 0, + onNext, + onBack, + formData, + updateFormData, +}) => { + const theme = useTheme(); + const [countries, setCountries] = useState([]); + const [loadingCountries, setLoadingCountries] = useState(false); + const [errors, setErrors] = useState({}); // <-- حالة الأخطاء + + useEffect(() => { + const fetchCountries = async () => { + setLoadingCountries(true); + const result = await authService.getCountries(); + if (result.success) { + setCountries(result.data); + } else { + console.error(result.message); + } + setLoadingCountries(false); + }; + + fetchCountries(); + }, []); + + const handleChange = (e) => { + const { name, value } = e.target; + updateFormData({ [name]: value }); + }; + + // التحقق من صحة الحقول + const validate = () => { + let tempErrors = {}; + + // التحقق من أن الحقل غير فارغ + if (!formData.staff_members || formData.staff_members.trim() === '') { + tempErrors.staff_members = 'Staff Members is required'; + } + // التحقق من أن القيمة رقمية + else if (isNaN(formData.staff_members)) { + tempErrors.staff_members = 'Staff Members must be a number'; + } + + if (!formData.country_id || formData.country_id === '') { + tempErrors.country_id = 'Country selection is required'; + } + + setErrors(tempErrors); + return Object.keys(tempErrors).length === 0; +}; + + + const handleNext = () => { + if (validate()) { + onNext(); + } + }; + + return ( + + + + Operational Details + + + + + Enter your basic information to proceed to registration of your + own restaurant on this platform + + + + {/* Staff Members Input */} + + + Staff Members + + + + + {/* Country Selector */} + + + Country + + + + {countries.map((country) => ( + + {country.name} + + ))} + + + + {/* Expansion Plan Cities Input */} + + + Expansion Plan Cities + + + + + + {/* Next Button */} + + + + {/* Back Button */} + + + + + ); +}; + +export default OperationalDetails; diff --git a/src/components/Home/CreateYourRestaurant/contcet/RequiredEquipments.js b/src/components/Home/CreateYourRestaurant/contcet/RequiredEquipments.js new file mode 100644 index 0000000..12d4028 --- /dev/null +++ b/src/components/Home/CreateYourRestaurant/contcet/RequiredEquipments.js @@ -0,0 +1,285 @@ +import React, { useState, useEffect } from 'react'; +import { + Box, + Typography, + Stack, + Button, + useTheme, + TextField, + FormControlLabel, + RadioGroup, + Radio +} from '@mui/material'; + +const RequiredEquipments = ({ currentStepIndex = 0, onNext, onBack, formData, updateFormData }) => { + const theme = useTheme(); + const [errors, setErrors] = useState({}); + + // تعيين القيمة الافتراضية لـ needSpecializedEquipment إذا غير موجودة + useEffect(() => { + if (!formData.needSpecializedEquipment) { + updateFormData({ needSpecializedEquipment: 'no' }); + } + }, [formData.needSpecializedEquipment, updateFormData]); + + // التعامل مع تغير القيمة النصية للمعدات العامة + const handleEquipmentChange = (e) => { + updateFormData({ equipment: e.target.value }); + }; + + + const handleNeedSpecializedChange = (e) => { + updateFormData({ needSpecializedEquipment: e.target.value }); + }; + + // التعامل مع القيمة النصية للمعدات المتخصصة + const handleSpecializedEquipmentChange = (e) => { + updateFormData({ specialized_equipment: e.target.value }); + }; + + // دالة التحقق من صحة الحقول + const validate = () => { + let tempErrors = {}; + + // if (!formData.equipment || formData.equipment.trim() === '') { + // tempErrors.equipment = 'Equipment is required'; + // } + // if (!formData.needSpecializedEquipment || (formData.needSpecializedEquipment !== 'yes' && formData.needSpecializedEquipment !== 'no')) { + // tempErrors.needSpecializedEquipment = 'Please select Yes or No'; + // } + if (formData.needSpecializedEquipment === 'yes' && (!formData.specialized_equipment || formData.specialized_equipment.trim() === '')) { + tempErrors.specialized_equipment = 'Please specify specialized equipments'; + } + + setErrors(tempErrors); + return Object.keys(tempErrors).length === 0; + }; + + // دالة معالجة الضغط على زر Next مع تحقق الفالديشن + const handleNext = () => { + if (validate()) { + onNext(); + } + }; + + return ( + + + + Required Equipments + + + + + Enter your basic information to proceed to registration of your own restaurant on this platform + + + + {/* Equipment Input */} + + + Equipment + + + + + {/* Need Specialized Equipment */} + + + Need Specialized Equipment + + + + } + label="Yes" + /> + + } + label="No" + /> + + {errors.needSpecializedEquipment && ( + + {errors.needSpecializedEquipment} + + )} + + + {/* Specialized Equipments For Food Preparation */} + {formData.needSpecializedEquipment === 'yes' && ( + + + Specialized Equipments For Food Preparation + + + + )} + + {/* Buttons */} + + + + + + + + ); +}; + +export default RequiredEquipments; diff --git a/src/components/Home/CreateYourRestaurant/contcet/VisualIdentity.js b/src/components/Home/CreateYourRestaurant/contcet/VisualIdentity.js new file mode 100644 index 0000000..ef55b04 --- /dev/null +++ b/src/components/Home/CreateYourRestaurant/contcet/VisualIdentity.js @@ -0,0 +1,256 @@ +import React, { useState, useEffect } from 'react'; +import { + Box, + Typography, + Stack, + Button, + useTheme, + RadioGroup, + FormControlLabel, + Radio, + Typography as MuiTypography +} from '@mui/material'; + +const VisualIdentity = ({ currentStepIndex = 0, onNext, onBack, formData, updateFormData }) => { + const theme = useTheme(); + const [errors, setErrors] = useState({}); + + // تأكد من وجود قيمة افتراضية + useEffect(() => { + if (!formData.visualIdentity) { + updateFormData({ visualIdentity: 'no' }); + } + }, [formData.visualIdentity, updateFormData]); + + const handleVisualIdentityChange = (e) => { + updateFormData({ visualIdentity: e.target.value }); + }; + + const handleFileChange = (e) => { + const file = e.target.files[0]; + if (file) { + updateFormData({ logo: file }); + } + + }; + + const validate = () => { + let tempErrors = {}; + + if (!formData.visualIdentity || (formData.visualIdentity !== 'yes' && formData.visualIdentity !== 'no')) { + tempErrors.visualIdentity = 'Please select Yes or No'; + } + + /* + if (!formData.logo) { + tempErrors.logo = 'Please upload a logo or color scheme image'; + } + */ + + setErrors(tempErrors); + return Object.keys(tempErrors).length === 0; + }; + + const handleNext = () => { + if (validate()) { + onNext(); + } + }; + + return ( + + + + Visual Identity + + + + + Enter your basic information to proceed to registration of your own restaurant on this platform + + + + + + Visual Identity + + + + } + label="Yes" + /> + + } + label="No" + /> + + {errors.visualIdentity && ( + + {errors.visualIdentity} + + )} + + + {/* Upload Logo / Color Scheme */} + + + Upload Logo / Color Scheme If Any + + + + {formData.logo ? (formData.logo.name || 'Uploaded Image') : 'Upload Picture'} + + + {errors.logo && ( + + {errors.logo} + + )} + + + {/* Buttons */} + + + + + + + + ); +}; + +export default VisualIdentity; diff --git a/src/components/Home/Dashboard/AnalyticsPage.js b/src/components/Home/Dashboard/AnalyticsPage.js new file mode 100644 index 0000000..18e8bd0 --- /dev/null +++ b/src/components/Home/Dashboard/AnalyticsPage.js @@ -0,0 +1,244 @@ +import React, { useState, useEffect } from 'react'; +import { useRestaurant } from '../../../contexts/RestaurantContext'; +import StatisticsCard from './StatisticsCard'; +// import TablesManager from './TablesManager'; +import { + Box, + useTheme, + useMediaQuery, + Button, + ButtonGroup, + TextField +} from '@mui/material'; +import authService from '../../../services/authService'; +import dayjs from 'dayjs'; + +const AnalyticsPage = () => { + const { restaurantId } = useRestaurant(); + const [timeFrame, setTimeFrame] = useState('12m'); // '12m', '30d', '24h' + const [customDate, setCustomDate] = useState(dayjs().format('YYYY-MM-DD')); + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('sm')); + const [chartData, setChartData] = useState([]); + + const handleTimeFrameChange = (newTimeFrame) => { + setTimeFrame(newTimeFrame); + }; + + const handleCustomDateChange = (event) => { + setCustomDate(event.target.value); + }; + + const fetchStatistics = async () => { + if (!restaurantId) return; + + let period = 'yearly'; + let labels = []; + let mappedData = []; + + switch (timeFrame) { + case '24h': // يومي + period = 'daily'; + labels = Array.from({ length: 24 }, (_, i) => `${i.toString().padStart(2, '0')}:00`); + try { + const response = await authService.getOrderStatistics(restaurantId, period, customDate); + if (response.success && response.data.length > 0) { + mappedData = response.data.map(item => ({ + label: item.label || item.date || '', + orders_total: item.orders_total || 0, + items_total: item.items_total || 0 + })); + } else { + mappedData = labels.map(label => ({ + label, + orders_total: 0, + items_total: 0 + })); + } + } catch (error) { + console.error(error); + mappedData = labels.map(label => ({ + label, + orders_total: 0, + items_total: 0 + })); + } + break; + + case '30d': // شهري + period = 'monthly'; + labels = Array.from({ length: 30 }, (_, i) => dayjs().startOf('month').add(i, 'day').format('DD')); + try { + const response = await authService.getOrderStatistics(restaurantId, period, customDate); + if (response.success && response.data.length > 0) { + mappedData = response.data.map(item => ({ + label: item.label ? dayjs(item.label).format('DD') : item.date ? dayjs(item.date).format('DD') : '', + orders_total: item.orders_total || 0, + items_total: item.items_total || 0 + })); + } else { + mappedData = labels.map(label => ({ + label, + orders_total: 0, + items_total: 0 + })); + } + } catch (error) { + console.error(error); + mappedData = labels.map(label => ({ + label, + orders_total: 0, + items_total: 0 + })); + } + break; + + case '12m': // سنوي + default: + period = 'yearly'; + labels = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec']; + try { + const response = await authService.getOrderStatistics(restaurantId, period, customDate); + if (response.success && response.data.length > 0) { + mappedData = response.data.map(item => ({ + label: item.label || item.date || '', + orders_total: item.orders_total || 0, + items_total: item.items_total || 0 + })); + } else { + mappedData = labels.map(label => ({ + label, + orders_total: 0, + items_total: 0 + })); + } + } catch (error) { + console.error(error); + mappedData = labels.map(label => ({ + label, + orders_total: 0, + items_total: 0 + })); + } + break; + } + + setChartData(mappedData); +}; + + + useEffect(() => { + fetchStatistics(); + }, [timeFrame, restaurantId, customDate]); + + return ( + + {/* Header Buttons */} + + + {[{ label: '12 Months', value: '12m' }, { label: '30 Days', value: '30d' }, { label: '24 Hours', value: '24h' }].map(({ label, value }) => ( + + ))} + + + {/* Date Picker + Today Button */} + + + + + + + {/* StatisticsCard */} + + value} + timeFrame={timeFrame} + onTimeFrameChange={handleTimeFrameChange} + height={320} + /> + + + ); +}; + +export default AnalyticsPage; diff --git a/src/components/Home/Dashboard/AnalyticsPageOccupancy.js b/src/components/Home/Dashboard/AnalyticsPageOccupancy.js new file mode 100644 index 0000000..8ab787f --- /dev/null +++ b/src/components/Home/Dashboard/AnalyticsPageOccupancy.js @@ -0,0 +1,82 @@ +import React, { useState, useEffect } from 'react'; +import { useRestaurant } from '../../../contexts/RestaurantContext'; +import OrderStatusCard from './OrderStatusCard'; +import { Box, useTheme, useMediaQuery } from '@mui/material'; +import authService from '../../../services/authService'; +import dayjs from 'dayjs'; + +const AnalyticsPageOccupancy = () => { + const { restaurantId } = useRestaurant(); + const [timeFrame, setTimeFrame] = useState('12m'); // '12m', '30d', '24h' + const [customDate, setCustomDate] = useState(dayjs().format('YYYY-MM-DD')); + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('sm')); + const [occupancyRate, setOccupancyRate] = useState(0); + + const fetchOccupancyRate = async () => { + if (!restaurantId) return; + + let period = 'yearly'; + switch (timeFrame) { + case '24h': + period = 'daily'; + break; + case '30d': + period = 'monthly'; + break; + case '12m': + default: + period = 'yearly'; + break; + } + + try { + const response = await authService.getOccupancyRate( + restaurantId, + period, + customDate + ); + + if (response.success) { + // occupancy_rate جايه كنص مثل "11.83%" → نحولها لرقم + const rateValue = parseFloat(response.data.replace('%', '').trim()); + setOccupancyRate(rateValue); + } else { + setOccupancyRate(0); + } + } catch (error) { + console.error(error); + setOccupancyRate(0); + } + }; + + useEffect(() => { + fetchOccupancyRate(); + }, [timeFrame, restaurantId, customDate]); + + return ( + + {/* Occupancy Card */} + + + + + ); +}; + +export default AnalyticsPageOccupancy; diff --git a/src/components/Home/Dashboard/AnalyticsPagebill.js b/src/components/Home/Dashboard/AnalyticsPagebill.js new file mode 100644 index 0000000..8e0ee10 --- /dev/null +++ b/src/components/Home/Dashboard/AnalyticsPagebill.js @@ -0,0 +1,241 @@ +import React, { useState, useEffect } from 'react'; +import { useRestaurant } from '../../../contexts/RestaurantContext'; +import StatisticsCard from './StatisticsCard'; +// import TablesManager from './TablesManager'; +import { + Box, + useTheme, + useMediaQuery, + Button, + ButtonGroup, + TextField +} from '@mui/material'; +import authService from '../../../services/authService'; +import dayjs from 'dayjs'; + +const AnalyticsPagebill = () => { + const { restaurantId } = useRestaurant(); + const [timeFrame, setTimeFrame] = useState('12m'); // '12m', '30d', '24h' + const [customDate, setCustomDate] = useState(dayjs().format('YYYY-MM-DD')); + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('sm')); + const [chartData, setChartData] = useState([]); + + const handleTimeFrameChange = (newTimeFrame) => { + setTimeFrame(newTimeFrame); + }; + + const handleCustomDateChange = (event) => { + setCustomDate(event.target.value); + }; + + const fetchStatistics = async () => { + if (!restaurantId) return; + + let period = 'yearly'; + let labels = []; + let mappedData = []; + + switch (timeFrame) { + case '24h': // يومي + period = 'daily'; + labels = Array.from({ length: 24 }, (_, i) => `${i.toString().padStart(2, '0')}:00`); + try { + const response = await authService.getBillStatistics(restaurantId, period, customDate); + if (response.success && response.data.length > 0) { + mappedData = response.data.map(item => ({ + label: item.label || item.date || '', + bills_total: item.bills_total || 0, + total_price: item.total_price || 0 + })); + } else { + mappedData = labels.map(label => ({ + label, + bills_total: 0, + total_price: 0 + })); + } + } catch (error) { + console.error(error); + mappedData = labels.map(label => ({ + label, + bills_total: 0, + total_price: 0 + })); + } + break; + + case '30d': // شهري + period = 'monthly'; + labels = Array.from({ length: 30 }, (_, i) => dayjs().startOf('month').add(i, 'day').format('DD')); + try { + const response = await authService.getBillStatistics(restaurantId, period, customDate); + if (response.success && response.data.length > 0) { + mappedData = response.data.map(item => ({ + label: item.label ? dayjs(item.label).format('DD') : item.date ? dayjs(item.date).format('DD') : '', + bills_total: item.bills_total || 0, + total_price: item.total_price || 0 + })); + } else { + mappedData = labels.map(label => ({ + label, + bills_total: 0, + total_price: 0 + })); + } + } catch (error) { + console.error(error); + mappedData = labels.map(label => ({ + label, + bills_total: 0, + total_price: 0 + })); + } + break; + + case '12m': // سنوي + default: + period = 'yearly'; + labels = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; + try { + const response = await authService.getBillStatistics(restaurantId, period, customDate); + if (response.success && response.data.length > 0) { + mappedData = response.data.map(item => ({ + label: item.label || item.date || '', + bills_total: item.bills_total || 0, + total_price: item.total_price || 0 + })); + } else { + mappedData = labels.map(label => ({ + label, + bills_total: 0, + total_price: 0 + })); + } + } catch (error) { + console.error(error); + mappedData = labels.map(label => ({ + label, + bills_total: 0, + total_price: 0 + })); + } + break; + } + + setChartData(mappedData); + }; + + + useEffect(() => { + fetchStatistics(); + }, [timeFrame, restaurantId, customDate]); + + return ( + + {/* Header Buttons */} + + + {[{ label: '12 Months', value: '12m' }, { label: '30 Days', value: '30d' }, { label: '24 Hours', value: '24h' }].map(({ label, value }) => ( + + ))} + + + {/* Date Picker + Today Button */} + + + + + + + {/* StatisticsCard */} + + value} + timeFrame={timeFrame} + onTimeFrameChange={handleTimeFrameChange} + height={420} + /> + + + ); +}; + +export default AnalyticsPagebill; diff --git a/src/components/Home/Dashboard/Dashboard.js b/src/components/Home/Dashboard/Dashboard.js new file mode 100644 index 0000000..6001f9d --- /dev/null +++ b/src/components/Home/Dashboard/Dashboard.js @@ -0,0 +1,110 @@ +import React, { useState, useEffect } from 'react'; +import { Box, useTheme, useMediaQuery, Skeleton } from '@mui/material'; +import KitchPlusAppBar from '../AppBar'; +import Sidebar from '../SideHome'; +import DashbordContect from './DashboardContcet'; +import NoProdectDash from './NoProdectDash'; + +const drawerWidth = 230; + +const Dashboard = () => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('sm')); + const [hasProducts, setHasProducts] = useState(false); + // const [isLoading, setIsLoading] = useState(true); + const [sidebarOpen, setSidebarOpen] = useState(!isMobile); + + + useEffect(() => { + const checkProducts = async () => { + // setIsLoading(true); + const productsExist = await checkIfProductsExist(); + setHasProducts(productsExist); + // setIsLoading(false); + }; + + checkProducts(); + }, []); + + const checkIfProductsExist = async () => { + return new Promise((resolve) => setTimeout(() => resolve(true), 1500)); + }; + + useEffect(() => { + if (window.innerWidth >= theme.breakpoints.values.md) { + setSidebarOpen(true); + } else { + setSidebarOpen(false); + } + }, [theme.breakpoints.values.md]); + + useEffect(() => { + const handleResize = () => { + if (window.innerWidth >= theme.breakpoints.values.md) { + setSidebarOpen(true); + } else { + setSidebarOpen(false); + } + }; + + handleResize(); + window.addEventListener('resize', handleResize); + return () => window.removeEventListener('resize', handleResize); + }, [theme.breakpoints.values.md]); + + const handleDrawerToggle = () => { + setSidebarOpen(!sidebarOpen); + }; + + return ( + + + + + + + + {/* {isLoading ? ( + <> + + + + + ) : ( + hasProducts ? + + : + )} */} + + + + + ); +}; + +export default Dashboard; diff --git a/src/components/Home/Dashboard/DashboardContcet.js b/src/components/Home/Dashboard/DashboardContcet.js new file mode 100644 index 0000000..7455f82 --- /dev/null +++ b/src/components/Home/Dashboard/DashboardContcet.js @@ -0,0 +1,287 @@ +import React from 'react'; +import { Box, Button, Card, CardContent, Stack, Typography, useMediaQuery } from '@mui/material'; +import AirportShuttleIcon from '@mui/icons-material/AirportShuttle'; +import CampaignIcon from '@mui/icons-material/Campaign'; +import Inventory2Icon from '@mui/icons-material/Inventory2'; +import DeveloperBoardIcon from '@mui/icons-material/DeveloperBoard'; +import ArrowOutwardIcon from '@mui/icons-material/ArrowOutward'; +import { useTheme } from '@mui/material/styles'; +import AddIcon from '@mui/icons-material/Add'; +import AnalyticsPage from './AnalyticsPage'; +import AnalyticsPageOccupancy from './AnalyticsPageOccupancy'; +import AnalyticsPagebill from './AnalyticsPagebill'; + +const IconCircle = ({ children, bgColor = '#DEDEFA', outerColor = '#EFEFFD' }) => ( + + + + {children} + + +); + + +const DashboardContect = () => { + const theme = useTheme(); + const isSmallScreen = useMediaQuery(theme.breakpoints.down('sm')); + const isMediumScreen = useMediaQuery(theme.breakpoints.between('sm', 'md')); + + return ( + <> + {/* Header Section */} + + {/* Title */} + + Dashboard + + + {/* Buttons */} + {/* + + + + */} + + + {/* Status Cards */} + {/* + } + statusText="Active" + statusColor="#0D894F" + iconColor="#057DEC" + innerColor="#DEDEFA" + outerColor="#EFEFFD" + iconSpacing={{ xs: 6, sm: 8, md: 12 }} + extraButton={ + + } + /> + } + statusText="Active" + statusColor="#0D894F" + iconColor="#34B405" + innerColor="#E1F6DF" + outerColor="#EDFBE9" + iconSpacing={{ xs: 6, sm: 8, md: 12 }} + title="Inventory" + /> + } + statusText="Pending" + statusColor="#BBB50F" + iconColor="#990463" + innerColor="#FEC8EA" + outerColor="#FFE3F5" + iconSpacing={{ xs: 6, sm: 8, md: 12 }} + title="Marketing" + /> + } + statusText="Action Need" + statusColor="#EF0A0A" + iconColor="#069797" + outerColor="#DBFBFB" + innerColor="#B5F5F5" + iconSpacing={{ xs: 3, sm: 5, md: 7 }} + title="Delivery" + /> + */} + + {/* OrderStatusCard/ StatisticsCard */} + + {/* OrderStatusCard */} + + + + + {/* StatisticsCard */} + + + + + + + {/* RecentActivity */} + + + + + ); +}; + +export default DashboardContect; diff --git a/src/components/Home/Dashboard/NoProdectDash.js b/src/components/Home/Dashboard/NoProdectDash.js new file mode 100644 index 0000000..8298865 --- /dev/null +++ b/src/components/Home/Dashboard/NoProdectDash.js @@ -0,0 +1,101 @@ +import React from 'react'; +import { + Box, + Button, + Card, + CardContent, + Typography, + useMediaQuery +} from '@mui/material'; +import { useTheme } from '@mui/material/styles'; +import AddIcon from '@mui/icons-material/Add'; + +const NoProdectDash = () => { + const theme = useTheme(); + const isSmallScreen = useMediaQuery(theme.breakpoints.down('sm')); + + return ( + <> + {/* Header Section */} + + + + + {/* Empty State Content */} + + + {/* Image Placeholder */} + + + {/* Title with colored "Sorry!" */} + + Sorry!{' '} + There is no campaign available. + Please initiate the {'\n'}creation of a new campaign. + + + {/* Action Button */} + {/* */} + + + + ); +}; + +export default NoProdectDash; \ No newline at end of file diff --git a/src/components/Home/Dashboard/OrderStatusCard.js b/src/components/Home/Dashboard/OrderStatusCard.js new file mode 100644 index 0000000..ffce155 --- /dev/null +++ b/src/components/Home/Dashboard/OrderStatusCard.js @@ -0,0 +1,241 @@ +import React, { useState } from 'react'; +import { + Box, + Typography, + Card, + CardContent, + useTheme, + IconButton, + useMediaQuery, + Menu, + MenuItem, + Button, + ButtonGroup, + TextField +} from '@mui/material'; +import { + TrendingUp as TrendingUpIcon, + TrendingDown as TrendingDownIcon, +} from '@mui/icons-material'; +import MoreVertIcon from '@mui/icons-material/MoreVert'; +import { + CircularProgressbar, + buildStyles +} from 'react-circular-progressbar'; +import 'react-circular-progressbar/dist/styles.css'; +import { ResponsiveContainer } from 'recharts'; +import dayjs from 'dayjs'; + +const OrderStatusCard = ({ + title = 'Order Status', + period = 'This Quarter', + progress = 70.5, + description = 'You succeeded in earning $240 today, it’s higher than yesterday', + timeFrame, + setTimeFrame, + customDate, + setCustomDate +}) => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('sm')); + const isTablet = useMediaQuery(theme.breakpoints.between('sm', 'md')); + const [anchorEl, setAnchorEl] = useState(null); + + const open = Boolean(anchorEl); + const handleMenuOpen = (event) => { + setAnchorEl(event.currentTarget); + }; + const handleMenuClose = () => { + setAnchorEl(null); + }; + + return ( + + + + {/* زر القائمة العلوية */} + + + + + {/* القائمة المنسدلة */} + + + {/* Header Buttons (Timeframe) */} + + {[{ label: '12 Months', value: '12m' }, { label: '30 Days', value: '30d' }, { label: '24 Hours', value: '24h' }].map(({ label, value }) => ( + + ))} + + + {/* Date Picker + Today Button */} + + setCustomDate(e.target.value)} + size="small" + sx={{ + width: isMobile ? '100%' : 150, + '& .MuiInputBase-input': { fontSize: isMobile ? 12 : 13, padding: '6px 8px' }, + '& .MuiOutlinedInput-notchedOutline': { border: 'none' } + }} + /> + + + + + + {/* المحتوى الأساسي للكارت */} + + + + {title} + + + {period} + + + + {/* دائرة التقدم */} + + + + + + + + {/* النص داخل الدائرة */} + + {`${progress}%`} + + + + + {/* الوصف */} + + {description} + + + + + ); +}; + +export default OrderStatusCard; diff --git a/src/components/Home/Dashboard/RecentActivity.js b/src/components/Home/Dashboard/RecentActivity.js new file mode 100644 index 0000000..6f16218 --- /dev/null +++ b/src/components/Home/Dashboard/RecentActivity.js @@ -0,0 +1,104 @@ +import React from 'react'; +import { + Box, + Typography, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + Paper, + Button, + Chip +} from '@mui/material'; + +const RecentActivity = () => { + // Sample data + const activities = [ + { + id: 1, + order: 'Order #1234 completed', + delivery: 'Delivery en route', + inventory: 'Low stock on item #567' + }, + { + id: 2, + order: 'Order #1235 completed', + delivery: 'Delivery delayed', + inventory: 'Low stock on item #890' + }, + { + id: 3, + order: 'Order #1236 completed', + delivery: 'Delivery arrived', + inventory: 'Out of stock on item #123' + } + ]; + + return ( + + + Recent Activity + + + + + + + + New Orders + Delivery Updates + Inventory Alerts + Actions + + + + {activities.map((activity) => ( + + + + {activity.order} + + + + + + {activity.delivery} + + + + + + {activity.inventory} + + + + + + + + + + + ))} + +
+
+
+ ); +}; + +export default RecentActivity; \ No newline at end of file diff --git a/src/components/Home/Dashboard/StatisticsCard.js b/src/components/Home/Dashboard/StatisticsCard.js new file mode 100644 index 0000000..fcaa5e6 --- /dev/null +++ b/src/components/Home/Dashboard/StatisticsCard.js @@ -0,0 +1,230 @@ +import React, { useState } from 'react'; +import PropTypes from 'prop-types'; +import { + Box, + IconButton, + Paper, + Typography, + useTheme, + useMediaQuery, + Menu, + MenuItem, + TextField, + Button +} from '@mui/material'; +import { + AreaChart, + Area, + XAxis, + YAxis, + Tooltip, + Legend, + ResponsiveContainer, + CartesianGrid +} from 'recharts'; +// import MoreVertIcon from '@mui/icons-material/MoreVert'; + +const StatisticsCard = ({ + title = "Statistics", + subtitle = "Delivery Times", + data = [], + dataKeys = [ + { key: 'revenue', name: 'Revenue', color: '#E46A11' }, + { key: 'sales', name: 'Sales', color: '#0182FC' } + ], + xDataKey = 'month', + valueFormatter = (value) => value, + timeFrame = 'month', + onTimeFrameChange, + height // 👈 جديد +}) => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('sm')); + const isTablet = useMediaQuery(theme.breakpoints.between('sm', 'md')); + const [selectedDate, setSelectedDate] = useState(''); + const [anchorEl, setAnchorEl] = useState(null); + + const handleMenuOpen = (event) => { + setAnchorEl(event.currentTarget); + }; + const handleMenuClose = () => { + setAnchorEl(null); + }; + + const handleDateChange = (event) => { + setSelectedDate(event.target.value); + if (onTimeFrameChange) onTimeFrameChange(timeFrame, event.target.value); + handleMenuClose(); + }; + + const handleTodayClick = () => { + const today = new Date().toISOString().split('T')[0]; + setSelectedDate(today); + if (onTimeFrameChange) onTimeFrameChange(timeFrame, today); + handleMenuClose(); + }; + + // حساب العلامات الديناميكية للمحور الشاقولي + const ticksArray = (() => { + if (!data || data.length === 0) return []; + const maxValue = Math.max( + ...data.flatMap(d => dataKeys.map(k => d[k.key] || 0)) + ); + const desiredTicks = 8; // عدد العلامات المطلوب + const step = Math.ceil(maxValue / desiredTicks) || 1; + const arr = []; + for (let i = 0; i <= maxValue; i += step) { + arr.push(i); + } + return arr; + })(); + + return ( + + + + {/* */} + + + + + + + + + + + + {/* Header */} + + + + {title} + + + {subtitle} + + + + + {/* Chart */} + + + + + {dataKeys.map(({ key, color }) => ( + + + + + ))} + + + + + + + + + {dataKeys.map(({ key, name, color }) => ( + + ))} + + + + + ); +}; + +StatisticsCard.propTypes = { + title: PropTypes.string, + subtitle: PropTypes.string, + data: PropTypes.arrayOf(PropTypes.object), + dataKeys: PropTypes.arrayOf(PropTypes.shape({ + key: PropTypes.string.isRequired, + name: PropTypes.string.isRequired, + color: PropTypes.string.isRequired + })), + xDataKey: PropTypes.string, + valueFormatter: PropTypes.func, + timeFrame: PropTypes.oneOf(['day', 'week', 'month', 'year']), + onTimeFrameChange: PropTypes.func +}; + +export default StatisticsCard; diff --git a/src/components/Home/Employ/Employ.js b/src/components/Home/Employ/Employ.js new file mode 100644 index 0000000..f7c49e3 --- /dev/null +++ b/src/components/Home/Employ/Employ.js @@ -0,0 +1,114 @@ +import React, { useState, useEffect } from 'react'; +import { Box, useTheme, useMediaQuery } from '@mui/material'; +import KitchPlusAppBar from '../AppBar'; +import Sidebar from '../SideHome'; +import Waiter from './contcet/waiter'; +import Cooker from './contcet/cooker'; +import Accountant from './contcet/Accountant'; +import { useRestaurant } from '../../../contexts/RestaurantContext'; + +const drawerWidth = 230; + +const Employ = () => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('sm')); + const isMdUp = useMediaQuery(theme.breakpoints.up('md')); + + const [sidebarOpen, setSidebarOpen] = useState(!isMobile); + const { restaurantId } = useRestaurant(); + + useEffect(() => { + const handleResize = () => { + if (window.innerWidth >= theme.breakpoints.values.md) { + setSidebarOpen(true); + } else { + setSidebarOpen(false); + } + }; + + handleResize(); + window.addEventListener('resize', handleResize); + return () => window.removeEventListener('resize', handleResize); + }, [theme.breakpoints.values.md]); + + return ( + + setSidebarOpen(!sidebarOpen)} + isMobile={isMobile} + drawerWidth={drawerWidth} + /> + + + setSidebarOpen(!sidebarOpen)} + sidebarOpen={sidebarOpen} + isMobile={isMobile} + /> + + + {/* المحتوى: Waiter و Cooker */} + + + + + + + + + ); +}; + +export default Employ; diff --git a/src/components/Home/Employ/contcet/Accountant.js b/src/components/Home/Employ/contcet/Accountant.js new file mode 100644 index 0000000..cb7ea9c --- /dev/null +++ b/src/components/Home/Employ/contcet/Accountant.js @@ -0,0 +1,526 @@ +import React, { useState, useEffect } from 'react'; +import { + useMediaQuery, + Box, + Typography, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + Paper, + Button, + Chip, + Menu, + MenuItem, + Dialog, + DialogTitle, + DialogContent, + DialogActions, +} from '@mui/material'; +import TuneIcon from '@mui/icons-material/Tune'; +import AddEmployModal from './AddEmployModal'; +import authService from '../../../../services/authService'; +import IOSSwitch from './IOSSwitch'; +import { useTheme } from '@mui/material/styles'; +import DeleteForeverIcon from '@mui/icons-material/DeleteForever'; +import EmployeeDetailsModal from './EmployeeDetailsModal'; + +const Accountant = ({ restaurantId }) => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('sm')); + const [modalOpen, setModalOpen] = useState(false); + const [showAll, setShowAll] = useState(false); + const [switchStates, setSwitchStates] = useState({}); + const [shiftFilter, setShiftFilter] = useState('all'); + const [filterAnchorEl, setFilterAnchorEl] = useState(null); + const [Accountants, setAccountants] = useState([]); + const [loading, setLoading] = useState(true); + + const [detailsModalOpen, setDetailsModalOpen] = useState(false); + const [AccountantDetails, setAccountantDetails] = useState(null); + + + // حالات الحذف + const [confirmDeleteOpen, setConfirmDeleteOpen] = useState(false); + const [selectedAccountant, setSelectedAccountant] = useState(null); + const [isDeleting, setIsDeleting] = useState(false); + + useEffect(() => { + const fetchAccountants = async () => { + setLoading(true); + try { + const response = await authService.getAllAccountants(restaurantId); + if (response.accountants) { + setAccountants(response.accountants); + + // تهيئة switchStates حسب قيمة active + const initialStates = {}; + response.accountants.forEach(accountants => { + initialStates[accountants.id] = accountants.active === 1; // أو Boolean(waiter.active) + }); + setSwitchStates(initialStates); + } else { + setAccountants([]); + } + } catch (error) { + console.error("Failed to fetch waiters:", error); + setAccountants([]); + } finally { + setLoading(false); + } + }; + + fetchAccountants(); + }, [restaurantId]); + + const handleSwitchChange = async (id, email) => { + try { + const response = await authService.toggleAccountStatus(email, "Accountant"); + + if (response.success) { + setSwitchStates((prev) => ({ + ...prev, + [id]: response.data, + })); + // alert(response.message); + } else { + alert("Failed: " + response.message); + } + } catch (error) { + alert("Error: " + error.message); + } + }; + + + const handleOpenModal = () => setModalOpen(true); + const handleCloseModal = () => setModalOpen(false); + + const handleConfirm = async (formData) => { + try { + const AccountantData = { + ...formData, + restaurant_id: restaurantId, + }; + + const response = await authService.registerAccountant(AccountantData); + + if (response.success) { + alert('Accountant registered successfully!'); + setModalOpen(false); + + // تحديث الحالة مباشرة بدل إعادة جلب كل البيانات + const newAccountant = response.Accountant || AccountantData; + // تأكد أن الـ API يعيد الـ Accountant المضاف، أو استخدم البيانات المحلية + setAccountants((prev) => [newAccountant, ...prev]); + + } else { + if (response.errors) { + const errorsList = Object.entries(response.errors) + .map(([field, msgs]) => { + if (Array.isArray(msgs)) { + return `${field}: ${msgs.join(', ')}`; + } else { + return `${field}: ${msgs}`; + } + }) + .join('\n'); + alert(`Failed to register Accountant due to validation errors:\n${errorsList}`); + } else { + alert('Failed to register Accountant: ' + response.message); + } + } + } catch (error) { + alert('An error occurred: ' + error.message); + } +}; + + + const getShiftChipProps = (shiftType) => { + switch (shiftType?.toLowerCase()) { + case 'morning': + return { + label: 'Morning', + sx: { + backgroundColor: '#E7F4EE', + color: '#0D894F', + fontWeight: 600, + fontSize: '14px', + minWidth: 80, + textTransform: 'capitalize', + }, + }; + case 'evening': + return { + label: 'Evening', + sx: { + backgroundColor: '#FDF1E8', + color: '#E46A11', + fontWeight: 600, + fontSize: '14px', + minWidth: 80, + textTransform: 'capitalize', + }, + }; + default: + return { + label: shiftType, + sx: { + backgroundColor: '#E0E0E0', + color: '#424242', + fontWeight: 600, + fontSize: '14px', + minWidth: 80, + textTransform: 'capitalize', + }, + }; + } + }; + + const filteredAccountants = + shiftFilter === 'all' + ? Accountants + : Accountants.filter((w) => w.shift_type.toLowerCase() === shiftFilter); + + const displayedAccountants = showAll ? filteredAccountants : filteredAccountants.slice(0, 3); + + const handleFilterClick = (event) => { + setFilterAnchorEl(event.currentTarget); + }; + + const handleFilterClose = () => { + setFilterAnchorEl(null); + }; + + const handleFilterSelect = (value) => { + setShiftFilter(value); + setFilterAnchorEl(null); + }; + + // فتح مودال الحذف + const handleDeleteClick = (Accountant) => { + setSelectedAccountant(Accountant); + setConfirmDeleteOpen(true); + }; + + // تأكيد الحذف + const handleDeleteConfirm = async () => { + if (!selectedAccountant) return; + setIsDeleting(true); + try { + const response = await authService.deleteAccountant(selectedAccountant.id); + + // هنا تحقق من وجود message بدل success + if (response.message && response.message.toLowerCase().includes("successfully")) { + // alert(response.message); + setAccountants((prev) => prev.filter((w) => w.id !== selectedAccountant.id)); + } else { + alert("Failed to delete Accountant: " + (response.message || "Unknown error")); + } + } catch (error) { + alert("An error occurred: " + error.message); + } finally { + setIsDeleting(false); + setConfirmDeleteOpen(false); + setSelectedAccountant(null); + } + }; + + const handleOpenDetails = async (id) => { + try { + const response = await authService.getAccountantById(id); + if (response.accountant) { + setAccountantDetails(response.accountant); + setDetailsModalOpen(true); + } else { + alert("Failed to fetch Accountant details"); + } + } catch (error) { + alert("Error: " + error.message); + } + }; + + + return ( + + + + Accountant + + + {Accountants.length > 3 && ( + + )} + + + + + + + + + + + + + Name + + + Email + + + Shift Type + + + Actions + + + + + {loading ? ( + + + Loading... + + + ) : displayedAccountants.length === 0 ? ( + + + No activities found. + + + ) : ( + displayedAccountants.map((Accountant) => ( + + + handleOpenDetails(Accountant.id)} + > + {Accountant.name} + + + + + + {Accountant.email} + + + + + + + + + + handleSwitchChange(Accountant.id, Accountant.email)} + inputProps={{ 'aria-label': 'accountant switch' }} + /> + handleDeleteClick(Accountant)} + /> + + + + )) + )} + +
+
+ + + + + {['all', 'morning', 'evening'].map((shift) => ( + handleFilterSelect(shift)} + sx={{ + color: shiftFilter === shift ? '#FF914D' : '#4F5867', + backgroundColor: shiftFilter === shift ? '#fffcf9d5' : 'transparent', + '&:hover': { + backgroundColor: '#f0f0f0ff', + transition: 'background-color 150ms ease-in-out', + }, + }} + > + {shift.charAt(0).toUpperCase() + shift.slice(1)} + + ))} + + + {/* مودال تأكيد الحذف */} + setConfirmDeleteOpen(false)}> + Confirm Delete + + + Are you sure you want to delete "{selectedAccountant?.name}"? This action cannot be undone. + + + + + + + + + setDetailsModalOpen(false)} + employee={AccountantDetails} + type="Accountant" + /> + + +
+ ); +}; + +export default Accountant; diff --git a/src/components/Home/Employ/contcet/AddEmployModal.js b/src/components/Home/Employ/contcet/AddEmployModal.js new file mode 100644 index 0000000..e008dde --- /dev/null +++ b/src/components/Home/Employ/contcet/AddEmployModal.js @@ -0,0 +1,330 @@ +import React, { useState } from 'react'; +import { + Dialog, + DialogTitle, + DialogContent, + DialogActions, + TextField, + Typography, + Box, + Button, + useTheme, + IconButton, + InputAdornment, + MenuItem, +} from '@mui/material'; +import VisibilityOutlined from '@mui/icons-material/VisibilityOutlined'; +import VisibilityOffOutlinedIcon from '@mui/icons-material/VisibilityOffOutlined'; + +const AddUserModal = ({ + open, + onClose, + onConfirm, + title = 'Add User', + buttonText = 'Add User', +}) => { + const theme = useTheme(); + + const [formValues, setFormValues] = useState({ + name: '', + email: '', + password: '', + password_confirmation: '', + shift_type: '', + working_hours: '', + monthly_salary: '', + }); + + const [errors, setErrors] = useState({}); + + const [showPassword, setShowPassword] = useState(false); + const [showConfirmPassword, setShowConfirmPassword] = useState(false); + + const handleTogglePassword = () => setShowPassword((prev) => !prev); + const handleToggleConfirmPassword = () => setShowConfirmPassword((prev) => !prev); + + const handleChange = (key, value) => { + setFormValues((prev) => ({ ...prev, [key]: value })); + setErrors((prev) => ({ ...prev, [key]: null })); // مسح الخطأ عند التعديل + }; + + const validate = () => { + let tempErrors = {}; + + if (!formValues.name.trim()) tempErrors.name = 'Name is required'; + + if (!formValues.email.trim()) tempErrors.email = 'Email is required'; + else { + // Regex بسيط للتحقق من صحة الإيميل + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + if (!emailRegex.test(formValues.email)) + tempErrors.email = 'Invalid email format'; + } + + if (!formValues.password) { + tempErrors.password = 'Password is required'; + } else if (formValues.password.length < 6) { + tempErrors.password = 'Password must be at least 6 characters long'; + } + + if (!formValues.password_confirmation) + tempErrors.password_confirmation = 'Confirm password is required'; + + if ( + formValues.password && + formValues.password_confirmation && + formValues.password !== formValues.password_confirmation + ) + tempErrors.password_confirmation = 'Passwords do not match'; + + if (!formValues.shift_type) tempErrors.shift_type = 'Shift type is required'; + + if (!formValues.working_hours) tempErrors.working_hours = 'Working hours is required'; + + if (!formValues.monthly_salary) tempErrors.monthly_salary = 'Monthly salary is required'; + + setErrors(tempErrors); + + return Object.keys(tempErrors).length === 0; + }; + + const handleSubmit = () => { + if (validate()) { + onConfirm(formValues); + + // إعادة تعيين الحقول بعد النجاح + setFormValues({ + name: '', + email: '', + password: '', + password_confirmation: '', + shift_type: '', + working_hours: '', + monthly_salary: '', + }); + + setErrors({}); // تصفير الأخطاء أيضًا + } +}; + + + return ( + + {title} + + {/* Name */} + + + Name + + handleChange('name', e.target.value)} + sx={fieldStyle(theme)} + error={!!errors.name} + helperText={errors.name} + /> + + + {/* Email */} + + + Email + + handleChange('email', e.target.value)} + sx={fieldStyle(theme)} + error={!!errors.email} + helperText={errors.email} + /> + + + {/* Password */} + + + Password + + handleChange('password', e.target.value)} + sx={fieldStyle(theme)} + error={!!errors.password} + helperText={errors.password} + InputProps={{ + endAdornment: ( + + + {showPassword ? : } + + + ), + }} + /> + + + {/* Confirm Password */} + + + Confirm Password + + handleChange('password_confirmation', e.target.value)} + sx={fieldStyle(theme)} + error={!!errors.password_confirmation} + helperText={errors.password_confirmation} + InputProps={{ + endAdornment: ( + + + {showConfirmPassword ? : } + + + ), + }} + /> + + + {/* Shift Type */} + + + Shift Type + + handleChange('shift_type', e.target.value)} + sx={fieldStyle(theme)} + error={!!errors.shift_type} + helperText={errors.shift_type} + placeholder="Select shift type" + > + Morning + Evening + + + + {/* Working Hours */} + + + Working Hours + + handleChange('working_hours', e.target.value)} + sx={fieldStyle(theme)} + error={!!errors.working_hours} + helperText={errors.working_hours} + /> + + + {/* Monthly Salary */} + + + Monthly Salary + + handleChange('monthly_salary', e.target.value)} + sx={fieldStyle(theme)} + error={!!errors.monthly_salary} + helperText={errors.monthly_salary} + /> + + + + + + + + + + ); +}; + +const fieldStyle = (theme) => ({ + '& input': { fontWeight: 500, fontSize: '15px' }, + '& label': { fontWeight: 600, fontSize: '15px', color: 'black' }, + '& .MuiOutlinedInput-root': { + borderRadius: '8px', + }, + '& .MuiOutlinedInput-notchedOutline': { + borderColor: theme.palette.grey[400], + }, + '& .MuiOutlinedInput-root.Mui-focused .MuiOutlinedInput-notchedOutline': { + borderColor: theme.palette.primary.main, + }, + '& input::-ms-reveal, & input::-ms-clear': { + display: 'none', + }, +}); + +export default AddUserModal; diff --git a/src/components/Home/Employ/contcet/ConfirmationDialog.js b/src/components/Home/Employ/contcet/ConfirmationDialog.js new file mode 100644 index 0000000..6cf94a1 --- /dev/null +++ b/src/components/Home/Employ/contcet/ConfirmationDialog.js @@ -0,0 +1,158 @@ +import React from 'react'; +import { + Dialog, + DialogTitle, + DialogContent, + DialogContentText, + DialogActions, + Button, + Box, + Typography, + useTheme, + Divider +} from '@mui/material'; +import EditIcon from '@mui/icons-material/Edit'; +const ConfirmationDialog = ({ open, onClose, onConfirm }) => { + const theme = useTheme(); + return ( + + + + {/* الدوائر */} + + {/* الدائرة الخلفية */} + + + {/* الدائرة الأمامية مع الأيقونة */} + + Success icon + + + + {/* العنوان بجانب الدائرة */} + + + Register successful! + + + + + + Congratulations! you have registered your restaurant successfully on our platform + + + + + {/* الزر الأول - Filled */} + + + + + + ); +}; + +export default ConfirmationDialog; \ No newline at end of file diff --git a/src/components/Home/Employ/contcet/EmployeeDetailsModal.js b/src/components/Home/Employ/contcet/EmployeeDetailsModal.js new file mode 100644 index 0000000..988eaf0 --- /dev/null +++ b/src/components/Home/Employ/contcet/EmployeeDetailsModal.js @@ -0,0 +1,66 @@ +import React from "react"; +import { + Dialog, + DialogTitle, + DialogContent, + DialogActions, + Typography, + Button, + Box, +} from "@mui/material"; + +const EmployeeDetailsModal = ({ open, onClose, employee, type }) => { + if (!employee) return null; + + // دالة لتحويل الحالة الرقمية إلى نصية + const getStatusText = (active) => (active ? "Active" : "Inactive"); + + // عنوان المودال حسب نوع الموظف + const getTitle = () => { + switch (type?.toLowerCase()) { + case "waiter": + return "Waiter Details"; + case "cooker": + return "Cooker Details"; + case "accountant": + return "Accountant Details"; + default: + return "Employee Details"; + } + }; + + return ( + + {getTitle()} + + + {employee.name && Name: {employee.name}} + {employee.email && Email: {employee.email}} + {employee.shift_type && Shift: {employee.shift_type}} + {employee.working_hours !== undefined && ( + Working Hours: {employee.working_hours} + )} + {employee.monthly_salary !== undefined && ( + Monthly Salary: {employee.monthly_salary} + )} + {employee.active !== undefined && ( + Status: {getStatusText(employee.active)} + )} + {employee.code && Code: {employee.code}} + {employee.expires_at && Expires At: {employee.expires_at}} + + + + + + + ); +}; + +export default EmployeeDetailsModal; diff --git a/src/components/Home/Employ/contcet/IOSSwitch.js b/src/components/Home/Employ/contcet/IOSSwitch.js new file mode 100644 index 0000000..be34356 --- /dev/null +++ b/src/components/Home/Employ/contcet/IOSSwitch.js @@ -0,0 +1,57 @@ +import { styled } from '@mui/material/styles'; +import Switch from '@mui/material/Switch'; + +const IOSSwitch = styled((props) => ( + +))(({ theme }) => ({ + width: 42, + height: 26, + padding: 0, + '& .MuiSwitch-switchBase': { + padding: 0, + margin: 2, + transitionDuration: '300ms', + '&.Mui-checked': { + transform: 'translateX(16px)', + color: '#fff', + '& + .MuiSwitch-track': { + backgroundColor: theme.palette.primary.main, + opacity: 1, + border: 0, + }, + '&.Mui-disabled + .MuiSwitch-track': { + opacity: 0.5, + }, + }, + '&.Mui-focusVisible .MuiSwitch-thumb': { + color: theme.palette.primary.main, + border: '6px solid #fff', + }, + '&.Mui-disabled .MuiSwitch-thumb': { + color: + theme.palette.mode === 'light' + ? theme.palette.grey[100] + : theme.palette.grey[600], + }, + '&.Mui-disabled + .MuiSwitch-track': { + opacity: theme.palette.mode === 'light' ? 0.7 : 0.3, + }, + }, + '& .MuiSwitch-thumb': { + boxSizing: 'border-box', + width: 22, + height: 22, + borderRadius: 11, + }, + '& .MuiSwitch-track': { + borderRadius: 26 / 2, + backgroundColor: + theme.palette.mode === 'light' ? '#E9E9EA' : 'rgba(255,255,255,0.35)', + opacity: 1, + transition: theme.transitions.create(['background-color'], { + duration: 500, + }), + }, +})); + +export default IOSSwitch; diff --git a/src/components/Home/Employ/contcet/cooker.js b/src/components/Home/Employ/contcet/cooker.js new file mode 100644 index 0000000..398758b --- /dev/null +++ b/src/components/Home/Employ/contcet/cooker.js @@ -0,0 +1,526 @@ +import React, { useState, useEffect } from 'react'; +import { + useMediaQuery, + Box, + Typography, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + Paper, + Button, + Chip, + Menu, + MenuItem, + Dialog, + DialogTitle, + DialogContent, + DialogActions, +} from '@mui/material'; +import TuneIcon from '@mui/icons-material/Tune'; +import AddEmployModal from './AddEmployModal'; +import authService from '../../../../services/authService'; +import IOSSwitch from './IOSSwitch'; +import { useTheme } from '@mui/material/styles'; +import DeleteForeverIcon from '@mui/icons-material/DeleteForever'; +import EmployeeDetailsModal from './EmployeeDetailsModal'; + +const Cooker = ({ restaurantId }) => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('sm')); + const [modalOpen, setModalOpen] = useState(false); + const [showAll, setShowAll] = useState(false); + const [switchStates, setSwitchStates] = useState({}); + const [shiftFilter, setShiftFilter] = useState('all'); + const [filterAnchorEl, setFilterAnchorEl] = useState(null); + const [Cookers, setCookers] = useState([]); + const [loading, setLoading] = useState(true); + + const [detailsModalOpen, setDetailsModalOpen] = useState(false); + const [CookerDetails, setCookerDetails] = useState(null); + + + // حالات الحذف + const [confirmDeleteOpen, setConfirmDeleteOpen] = useState(false); + const [selectedCooker, setSelectedCooker] = useState(null); + const [isDeleting, setIsDeleting] = useState(false); + + // استدعاء API + useEffect(() => { + const fetchCookers = async () => { + setLoading(true); + try { + const response = await authService.getAllCookers(restaurantId); + if (response.cookers) { + setCookers(response.cookers); + + const initialStates = {}; + response.cookers.forEach(cookers => { + initialStates[cookers.id] = cookers.active === 1; // أو Boolean(waiter.active) + }); + setSwitchStates(initialStates); + } else { + setCookers([]); + } + } catch (error) { + console.error("Failed to fetch Cookers:", error); + setCookers([]); + } finally { + setLoading(false); + } + }; + + fetchCookers(); + }, [restaurantId]); + + const handleSwitchChange = async (id, email) => { + try { + const response = await authService.toggleAccountStatus(email, "Cooker"); + + if (response.success) { + setSwitchStates((prev) => ({ + ...prev, + [id]: response.data, + })); + // alert(response.message); + } else { + alert("Failed: " + response.message); + } + } catch (error) { + alert("Error: " + error.message); + } + }; + + const handleOpenModal = () => setModalOpen(true); + const handleCloseModal = () => setModalOpen(false); + + const handleConfirm = async (formData) => { + try { + const CookerData = { + ...formData, + restaurant_id: restaurantId, + }; + + const response = await authService.registerCooker(CookerData); + + if (response.success) { + alert('Cooker registered successfully!'); + setModalOpen(false); + + // تحديث الحالة مباشرة بدل إعادة جلب كل البيانات + const newCooker = response.Cooker || CookerData; + // تأكد أن الـ API يعيد الـ Cooker المضاف، أو استخدم البيانات المحلية + setCookers((prev) => [newCooker, ...prev]); + + } else { + if (response.errors) { + const errorsList = Object.entries(response.errors) + .map(([field, msgs]) => { + if (Array.isArray(msgs)) { + return `${field}: ${msgs.join(', ')}`; + } else { + return `${field}: ${msgs}`; + } + }) + .join('\n'); + alert(`Failed to register Cooker due to validation errors:\n${errorsList}`); + } else { + alert('Failed to register Cooker: ' + response.message); + } + } + } catch (error) { + alert('An error occurred: ' + error.message); + } +}; + + + const getShiftChipProps = (shiftType) => { + switch (shiftType?.toLowerCase()) { + case 'morning': + return { + label: 'Morning', + sx: { + backgroundColor: '#E7F4EE', + color: '#0D894F', + fontWeight: 600, + fontSize: '14px', + minWidth: 80, + textTransform: 'capitalize', + }, + }; + case 'evening': + return { + label: 'Evening', + sx: { + backgroundColor: '#FDF1E8', + color: '#E46A11', + fontWeight: 600, + fontSize: '14px', + minWidth: 80, + textTransform: 'capitalize', + }, + }; + default: + return { + label: shiftType, + sx: { + backgroundColor: '#E0E0E0', + color: '#424242', + fontWeight: 600, + fontSize: '14px', + minWidth: 80, + textTransform: 'capitalize', + }, + }; + } + }; + + const filteredCookers = + shiftFilter === 'all' + ? Cookers + : Cookers.filter((w) => w.shift_type.toLowerCase() === shiftFilter); + + const displayedCookers = showAll ? filteredCookers : filteredCookers.slice(0, 3); + + const handleFilterClick = (event) => { + setFilterAnchorEl(event.currentTarget); + }; + + const handleFilterClose = () => { + setFilterAnchorEl(null); + }; + + const handleFilterSelect = (value) => { + setShiftFilter(value); + setFilterAnchorEl(null); + }; + + // فتح مودال الحذف + const handleDeleteClick = (Cooker) => { + setSelectedCooker(Cooker); + setConfirmDeleteOpen(true); + }; + + // تأكيد الحذف + const handleDeleteConfirm = async () => { + if (!selectedCooker) return; + setIsDeleting(true); + try { + const response = await authService.deleteCooker(selectedCooker.id); + + // هنا تحقق من وجود message بدل success + if (response.message && response.message.toLowerCase().includes("successfully")) { + // alert(response.message); + setCookers((prev) => prev.filter((w) => w.id !== selectedCooker.id)); + } else { + alert("Failed to delete Cooker: " + (response.message || "Unknown error")); + } + } catch (error) { + alert("An error occurred: " + error.message); + } finally { + setIsDeleting(false); + setConfirmDeleteOpen(false); + setSelectedCooker(null); + } + }; + + const handleOpenDetails = async (id) => { + try { + const response = await authService.getCookerById(id); + if (response.cooker) { + setCookerDetails(response.cooker); + setDetailsModalOpen(true); + } else { + alert("Failed to fetch Cooker details"); + } + } catch (error) { + alert("Error: " + error.message); + } + }; + + + return ( + + + + Cooker + + + {Cookers.length > 3 && ( + + )} + + + + + + + + + + + + + Name + + + Email + + + Shift Type + + + Actions + + + + + {loading ? ( + + + Loading... + + + ) : displayedCookers.length === 0 ? ( + + + No activities found. + + + ) : ( + displayedCookers.map((Cooker) => ( + + + handleOpenDetails(Cooker.id)} + > + {Cooker.name} + + + + + + {Cooker.email} + + + + + + + + + + handleSwitchChange(Cooker.id, Cooker.email)} + inputProps={{ 'aria-label': 'accountant switch' }} + /> + + handleDeleteClick(Cooker)} + /> + + + + )) + )} + +
+
+ + + + + {['all', 'morning', 'evening'].map((shift) => ( + handleFilterSelect(shift)} + sx={{ + color: shiftFilter === shift ? '#FF914D' : '#4F5867', + backgroundColor: shiftFilter === shift ? '#fffcf9d5' : 'transparent', + '&:hover': { + backgroundColor: '#f0f0f0ff', + transition: 'background-color 150ms ease-in-out', + }, + }} + > + {shift.charAt(0).toUpperCase() + shift.slice(1)} + + ))} + + + {/* مودال تأكيد الحذف */} + setConfirmDeleteOpen(false)}> + Confirm Delete + + + Are you sure you want to delete "{selectedCooker?.name}"? This action cannot be undone. + + + + + + + + + setDetailsModalOpen(false)} + employee={CookerDetails} + type="Cooker" + /> + + +
+ ); +}; + +export default Cooker; diff --git a/src/components/Home/Employ/contcet/waiter.js b/src/components/Home/Employ/contcet/waiter.js new file mode 100644 index 0000000..a62c5be --- /dev/null +++ b/src/components/Home/Employ/contcet/waiter.js @@ -0,0 +1,519 @@ +import React, { useState, useEffect } from 'react'; +import { + useMediaQuery, + Box, + Typography, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + Paper, + Button, + Chip, + Menu, + MenuItem, + Dialog, + DialogTitle, + DialogContent, + DialogActions, +} from '@mui/material'; +import TuneIcon from '@mui/icons-material/Tune'; +import AddEmployModal from './AddEmployModal'; +import authService from '../../../../services/authService'; +import IOSSwitch from './IOSSwitch'; +import { useTheme } from '@mui/material/styles'; +import DeleteForeverIcon from '@mui/icons-material/DeleteForever'; +import EmployeeDetailsModal from './EmployeeDetailsModal'; + +const Waiter = ({ restaurantId }) => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('sm')); + const [modalOpen, setModalOpen] = useState(false); + const [showAll, setShowAll] = useState(false); + const [switchStates, setSwitchStates] = useState({}); + const [shiftFilter, setShiftFilter] = useState('all'); + const [filterAnchorEl, setFilterAnchorEl] = useState(null); + const [waiters, setWaiters] = useState([]); + const [loading, setLoading] = useState(true); + + const [detailsModalOpen, setDetailsModalOpen] = useState(false); + const [waiterDetails, setWaiterDetails] = useState(null); + + + // حالات الحذف + const [confirmDeleteOpen, setConfirmDeleteOpen] = useState(false); + const [selectedWaiter, setSelectedWaiter] = useState(null); + const [isDeleting, setIsDeleting] = useState(false); + + // استدعاء API + useEffect(() => { + const fetchWaiters = async () => { + setLoading(true); + try { + const response = await authService.getAllWaiters(restaurantId); + if (response.waiters) { + setWaiters(response.waiters); + + // تهيئة switchStates حسب قيمة active + const initialStates = {}; + response.waiters.forEach(waiter => { + initialStates[waiter.id] = waiter.active === 1; // أو Boolean(waiter.active) + }); + setSwitchStates(initialStates); + } else { + setWaiters([]); + } + } catch (error) { + console.error("Failed to fetch waiters:", error); + setWaiters([]); + } finally { + setLoading(false); + } + }; + + fetchWaiters(); +}, [restaurantId]); + + + const handleSwitchChange = async (id, email) => { + try { + const response = await authService.toggleAccountStatus(email, "Waiter"); + + if (response.success) { + setSwitchStates((prev) => ({ + ...prev, + [id]: response.data, + })); + // alert(response.message); + } else { + alert("Failed: " + response.message); + } + } catch (error) { + alert("Error: " + error.message); + } + }; + + + const handleOpenModal = () => setModalOpen(true); + const handleCloseModal = () => setModalOpen(false); + + const handleConfirm = async (formData) => { + try { + const waiterData = { + ...formData, + restaurant_id: restaurantId, + }; + + const response = await authService.registerWaiter(waiterData); + + if (response.success) { + alert('Waiter registered successfully!'); + setModalOpen(false); + // إعادة التحميل بعد الإضافة + const updated = await authService.getAllWaiters(restaurantId); + if (updated.waiters) setWaiters(updated.waiters); + } else { + if (response.errors) { + const errorsList = Object.entries(response.errors) + .map(([field, msgs]) => `${field}: ${msgs.join(', ')}`) + .join('\n'); + alert(`Failed to register waiter due to validation errors:\n${errorsList}`); + } else { + alert('Failed to register waiter: ' + response.message); + } + } + } catch (error) { + alert('An error occurred: ' + error.message); + } + }; + + const getShiftChipProps = (shiftType) => { + switch (shiftType?.toLowerCase()) { + case 'morning': + return { + label: 'Morning', + sx: { + backgroundColor: '#E7F4EE', + color: '#0D894F', + fontWeight: 600, + fontSize: '14px', + minWidth: 80, + textTransform: 'capitalize', + }, + }; + case 'evening': + return { + label: 'Evening', + sx: { + backgroundColor: '#FDF1E8', + color: '#E46A11', + fontWeight: 600, + fontSize: '14px', + minWidth: 80, + textTransform: 'capitalize', + }, + }; + default: + return { + label: shiftType, + sx: { + backgroundColor: '#E0E0E0', + color: '#424242', + fontWeight: 600, + fontSize: '14px', + minWidth: 80, + textTransform: 'capitalize', + }, + }; + } + }; + + const filteredWaiters = + shiftFilter === 'all' + ? waiters + : waiters.filter((w) => w.shift_type.toLowerCase() === shiftFilter); + + const displayedWaiters = showAll ? filteredWaiters : filteredWaiters.slice(0, 3); + + const handleFilterClick = (event) => { + setFilterAnchorEl(event.currentTarget); + }; + + const handleFilterClose = () => { + setFilterAnchorEl(null); + }; + + const handleFilterSelect = (value) => { + setShiftFilter(value); + setFilterAnchorEl(null); + }; + + // فتح مودال الحذف + const handleDeleteClick = (waiter) => { + setSelectedWaiter(waiter); + setConfirmDeleteOpen(true); + }; + + // تأكيد الحذف + const handleDeleteConfirm = async () => { + if (!selectedWaiter) return; + setIsDeleting(true); + try { + const response = await authService.deleteWaiter(selectedWaiter.id); + + // هنا تحقق من وجود message بدل success + if (response.message && response.message.toLowerCase().includes("successfully")) { + // alert(response.message); + setWaiters((prev) => prev.filter((w) => w.id !== selectedWaiter.id)); + } else { + alert("Failed to delete waiter: " + (response.message || "Unknown error")); + } + } catch (error) { + alert("An error occurred: " + error.message); + } finally { + setIsDeleting(false); + setConfirmDeleteOpen(false); + setSelectedWaiter(null); + } + }; + + const handleOpenDetails = async (id) => { + try { + const response = await authService.getWaiterById(id); + if (response.waiter) { + setWaiterDetails(response.waiter); + setDetailsModalOpen(true); + } else { + alert("Failed to fetch waiter details"); + } + } catch (error) { + alert("Error: " + error.message); + } + }; + + + return ( + + + + Waiter + + + {waiters.length > 3 && ( + + )} + + + + + + + + + + + + + Name + + + Email + + + Shift Type + + + Actions + + + + + {loading ? ( + + + Loading... + + + ) : displayedWaiters.length === 0 ? ( + + + No activities found. + + + ) : ( + displayedWaiters.map((waiter) => ( + + + handleOpenDetails(waiter.id)} + > + {waiter.name} + + + + + + {waiter.email} + + + + + + + + + + handleSwitchChange(waiter.id, waiter.email)} + inputProps={{ 'aria-label': 'accountant switch' }} + /> + + handleDeleteClick(waiter)} + /> + + + + )) + )} + +
+
+ + + + + {['all', 'morning', 'evening'].map((shift) => ( + handleFilterSelect(shift)} + sx={{ + color: shiftFilter === shift ? '#FF914D' : '#4F5867', + backgroundColor: shiftFilter === shift ? '#fffcf9d5' : 'transparent', + '&:hover': { + backgroundColor: '#f0f0f0ff', + transition: 'background-color 150ms ease-in-out', + }, + }} + > + {shift.charAt(0).toUpperCase() + shift.slice(1)} + + ))} + + + {/* مودال تأكيد الحذف */} + setConfirmDeleteOpen(false)}> + Confirm Delete + + + Are you sure you want to delete "{selectedWaiter?.name}"? This action cannot be undone. + + + + + + + + + setDetailsModalOpen(false)} + employee={waiterDetails} // بدل waiter + type="waiter" + /> + + +
+ ); +}; + +export default Waiter; diff --git a/src/components/Home/Inventory/Inventory.js b/src/components/Home/Inventory/Inventory.js new file mode 100644 index 0000000..376e029 --- /dev/null +++ b/src/components/Home/Inventory/Inventory.js @@ -0,0 +1,142 @@ +import React, { useState, useEffect } from 'react'; +import { Box, useTheme, useMediaQuery } from '@mui/material'; +import KitchPlusAppBar from '../AppBar'; +import Sidebar from '../SideHome'; +import ProductEntry from './contect/ProductEntry'; +import TableView from './contect/TableView'; + +const drawerWidth = 230; + +const initialProducts = [ + { + product: 'Apple Watch', + sales: 150, + amount: 45000, + price: 299, + status: 'Published', + expiration: '30 Days Left', + }, + { + product: 'Samsung Galaxy', + sales: 90, + amount: 36000, + price: 400, + status: 'Low Stock', + expiration: '12 Days Left', + }, + { + product: 'Sony Headphones', + sales: 60, + amount: 18000, + price: 299, + status: 'Draft', + expiration: '5 Days Left', + }, +]; + +const Inventory = () => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('sm')); + const [sidebarOpen, setSidebarOpen] = useState(!isMobile); + + const [products, setProducts] = useState(initialProducts); + const [showProductEntry, setShowProductEntry] = useState(true); + + const addProduct = (newProduct) => { + const formattedProduct = { + product: newProduct.fullName || 'Unnamed Product', + sales: newProduct.stocksLevel ? Number(newProduct.stocksLevel) : 0, + amount: newProduct.productPrice + ? Number(newProduct.productPrice) * (newProduct.stocksLevel || 1) + : 0, + price: newProduct.productPrice ? Number(newProduct.productPrice) : 0, + status: newProduct.consumptionStatus ? 'Published' : 'Draft', + expiration: newProduct.expirationDate + ? `${Math.ceil( + (new Date(newProduct.expirationDate) - new Date()) / + (1000 * 60 * 60 * 24) + )} Days Left` + : 'N/A', + }; + + setProducts((prev) => [...prev, formattedProduct]); + + setShowProductEntry(false); + }; + + const handleAddNewProduct = () => { + setShowProductEntry(true); + }; + + const handleShowTable = () => { + setShowProductEntry(false); + }; + + return ( + + setSidebarOpen(!sidebarOpen)} + isMobile={isMobile} + drawerWidth={drawerWidth} + /> + + + setSidebarOpen(!sidebarOpen)} + sidebarOpen={sidebarOpen} + isMobile={isMobile} + /> + + + {showProductEntry ? ( + + ) : ( + + )} + + + + ); +}; + +export default Inventory; diff --git a/src/components/Home/Inventory/contect/InventoryTablePage.js b/src/components/Home/Inventory/contect/InventoryTablePage.js new file mode 100644 index 0000000..a0c2e77 --- /dev/null +++ b/src/components/Home/Inventory/contect/InventoryTablePage.js @@ -0,0 +1,41 @@ +import React, { useState } from 'react'; +import TableView from './TableView'; + +const initialProducts = [ + { + product: 'Apple Watch', + sales: 150, + amount: 45000, + price: 299, + status: 'Published', + expiration: '30 Days Left', + }, + { + product: 'Samsung Galaxy', + sales: 90, + amount: 36000, + price: 400, + status: 'Low Stock', + expiration: '12 Days Left', + }, + { + product: 'Sony Headphones', + sales: 60, + amount: 18000, + price: 299, + status: 'Draft', + expiration: '5 Days Left', + }, +]; + +const InventoryTablePage = () => { + const [products, setProducts] = useState(initialProducts); + + const handleAddNewProduct = () => { + alert('Navigate to Add Product page or open form here'); + }; + + return ; +}; + +export default InventoryTablePage; diff --git a/src/components/Home/Inventory/contect/NoProdectDash.js b/src/components/Home/Inventory/contect/NoProdectDash.js new file mode 100644 index 0000000..55b2e16 --- /dev/null +++ b/src/components/Home/Inventory/contect/NoProdectDash.js @@ -0,0 +1,101 @@ +import React from 'react'; +import { + Box, + Button, + Card, + CardContent, + Typography, + useMediaQuery +} from '@mui/material'; +import { useTheme } from '@mui/material/styles'; +import AddIcon from '@mui/icons-material/Add'; + +const NoProdectDash = () => { + const theme = useTheme(); + const isSmallScreen = useMediaQuery(theme.breakpoints.down('sm')); + + return ( + <> + {/* Header Section */} + + + + {/* Empty State Content */} + + + {/* Image Placeholder */} + + + {/* Title with colored "Sorry!" */} + + Sorry!{' '} + There is no campaign available. + Please initiate the {'\n'}creation of a new campaign. + + + {/* Action Button */} + + + + + ); +}; + +export default NoProdectDash; \ No newline at end of file diff --git a/src/components/Home/Inventory/contect/ProductEntry.js b/src/components/Home/Inventory/contect/ProductEntry.js new file mode 100644 index 0000000..7f0779f --- /dev/null +++ b/src/components/Home/Inventory/contect/ProductEntry.js @@ -0,0 +1,434 @@ +import React, { useState, useEffect } from 'react'; +import { + Box, + Typography, + TextField, + Button, + styled, + useTheme, + MenuItem, + Radio, + RadioGroup, + FormControlLabel, + Radio as MuiRadio +} from '@mui/material'; +import axios from 'axios'; +import { DatePicker } from '@mui/x-date-pickers/DatePicker'; +import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; +import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns'; +import TableView from './TableView'; + +const ProductEntry = ({ onAdd, onShowTable }) => { + const theme = useTheme(); + const [profileImage, setProfileImage] = useState(null); + const [fullName, setFullName] = useState(''); + const [username, setUsername] = useState(''); + const [bio, setBio] = useState(''); + const [email, setEmail] = useState(''); + const [phone, setPhone] = useState(''); + const [selectedBranch, setSelectedBranch] = useState('default'); + const [branches, setBranches] = useState([ + { label: 'Damascus Branch', value: 'damascus' }, + { label: 'Aleppo Branch', value: 'aleppo' }, + { label: 'Homs Branch', value: 'homs' } + ]); + const [expirationDate, setExpirationDate] = useState(null); + const [consumptionStatus, setConsumptionStatus] = useState(false); + const [showTable, setShowTable] = useState(false); + const [products, setProducts] = useState([]); + + // حالات جديدة للحفظ + const [stocksLevel, setStocksLevel] = useState(''); + const [productCategory, setProductCategory] = useState('default'); + const [supplierName, setSupplierName] = useState(''); + const [supplierNumber, setSupplierNumber] = useState(''); + const [productPrice, setProductPrice] = useState(''); + const [phoneNumber, setPhoneNumber] = useState(''); + const [productCost, setProductCost] = useState(''); + + // قائمة فئات المنتجات + const productCategories = [ + { label: 'Food', value: 'food' }, + { label: 'Beverages', value: 'beverages' }, + { label: 'Electronics', value: 'electronics' }, + { label: 'Clothing', value: 'clothing' }, + ]; + const handleShowTable = () => { + setShowTable(true); + }; + useEffect(() => { + axios.get('https://mocki.io/v1/0b9d4121-d7e7-42f4-b1d5-b14f82e35b69') + .then((response) => { + setBranches(response.data); + }) + .catch((error) => { + console.error('Error fetching branches:', error); + }); + + const savedData = localStorage.getItem('productEntryData'); + if (savedData) { + const data = JSON.parse(savedData); + setFullName(data.fullName || ''); + setUsername(data.username || ''); + setEmail(data.email || ''); + setSelectedBranch(data.selectedBranch || 'default'); + setExpirationDate(data.expirationDate ? new Date(data.expirationDate) : null); + setConsumptionStatus(data.consumptionStatus || false); + setStocksLevel(data.stocksLevel || ''); + setProductCategory(data.productCategory || 'default'); + setSupplierName(data.supplierName || ''); + setSupplierNumber(data.supplierNumber || ''); + setProductPrice(data.productPrice || ''); + setPhoneNumber(data.phoneNumber || ''); + } + }, []); + + useEffect(() => { + const dataToSave = { + fullName, + username, + email, + selectedBranch, + expirationDate: expirationDate ? expirationDate.toISOString() : null, + consumptionStatus, + stocksLevel, + productCategory, + supplierName, + supplierNumber, + productPrice, + phoneNumber, + }; + localStorage.setItem('productEntryData', JSON.stringify(dataToSave)); + }, [ + fullName, + username, + email, + selectedBranch, + expirationDate, + consumptionStatus, + stocksLevel, + productCategory, + supplierName, + supplierNumber, + productPrice, + phoneNumber, + ]); + + const handleImageUpload = (event) => { + if (event.target.files && event.target.files[0]) { + setProfileImage(URL.createObjectURL(event.target.files[0])); + } + }; + + const Input = styled('input')({ + display: 'none', + }); + + const customInputStyle = { + '& input': { fontWeight: 500, fontSize: '15px' }, + '& input::placeholder': { color: '#969BA7' }, + '& .MuiOutlinedInput-root': { + borderRadius: '10px', + transition: '0.3s', + '&.Mui-focused fieldset': { + borderColor: theme.palette.primary.main, + boxShadow: '0 0 0 2px rgba(255, 145, 77, 0.2)', + }, + }, + '& .MuiOutlinedInput-root.Mui-focused': { + borderColor: '#3f51b5', + boxShadow: '0 0 0 2px rgba(63,81,181,0.1)', + }, + }; + + + + const renderField = (label, value, onChange, type = 'text', placeholder = '') => ( + + + {label} + + + + ); + + const renderSelectField = (label, value, onChange, options = []) => ( + + + {label} + + + + Select {label}... + + {options.map((option) => ( + + {option.label} + + ))} + + + ); + + const handleSave = () => { + // احصل على أكبر رقم منتج موجود في القائمة + const maxProductNumber = products.length > 0 + ? Math.max(...products.map(p => Number(p.username) || 0)) + : 0; + + const newProductNumber = maxProductNumber + 1; + + const newProduct = { + fullName, + username: newProductNumber.toString(), // هنا رقم المنتج يتزاد تلقائياً + email, + selectedBranch, + expirationDate: expirationDate ? expirationDate.toISOString().split('T')[0] : '', + consumptionStatus, + stocksLevel, + productCategory, + supplierName, + supplierNumber, + productPrice, + phoneNumber, + productCost, + }; + + // أضف المنتج الجديد لقائمة المنتجات + setProducts(prev => [...prev, newProduct]); + + // استدعي دالة onAdd إن كانت موجودة + if (onAdd) { + onAdd(newProduct); + } + + // إعادة تعيين الحقول (يمكنك إزالة إعادة تعيين username لأنه أصبح تلقائي) + setFullName(''); + setEmail(''); + setSelectedBranch('default'); + setExpirationDate(null); + setConsumptionStatus(false); + setStocksLevel(''); + setProductCategory('default'); + setSupplierName(''); + setSupplierNumber(''); + setProductPrice(''); + setPhoneNumber(''); + setProductCost(''); +}; + + + return ( + + {/* الحقول النصية */} + + {/* السطر الأول: Product Name + Barcode Maker */} + + {renderField('Product Name', fullName, (e) => setFullName(e.target.value), 'text', 'Pizza')} + {renderField('Barcode Maker', email, (e) => setEmail(e.target.value), 'text', '12344')} + + + {/* السطر الثاني: Branch Select + Product Number */} + + {renderField('Product Number', username, (e) => setUsername(e.target.value), 'text', '#123')} + {renderSelectField('Branch Select', selectedBranch, (e) => setSelectedBranch(e.target.value), branches)} + + + {/* السطر الثالث: Expiration Date + Consumption Status */} + + + + + Expiration Date + + setExpirationDate(newValue)} + renderInput={(params) => ( + + )} + /> + + + + + + Consumption Status + + setConsumptionStatus(e.target.value === 'yes')} + > + } + label="Yes" + /> + } + label="No" + /> + + + + + {/* السطر الرابع: Stocks Level + Product Category */} + + {renderField('Stocks Level', stocksLevel, (e) => setStocksLevel(e.target.value), 'number', 'Enter level')} + {renderSelectField('Product Category', productCategory, (e) => setProductCategory(e.target.value), productCategories)} + + + {/* السطر الخامس: Supplier Name + Supplier Number */} + + {renderField('Supplier Name', supplierName, (e) => setSupplierName(e.target.value), 'text', 'Supplier XYZ')} + {renderField('Supplier Number', supplierNumber, (e) => setSupplierNumber(e.target.value), 'text', '0900-78601')} + + + {/* السطر السادس: Product Price + Phone Number */} + + {renderField('Product Price', productPrice, (e) => setProductPrice(e.target.value), 'number', '$200')} + {renderField('Product Cost', productCost, (e) => setProductCost(e.target.value), 'number', '$230')} + + + {/* زر الحفظ */} + + + + + + + + + ); +}; + +export default ProductEntry; diff --git a/src/components/Home/Inventory/contect/TableView.js b/src/components/Home/Inventory/contect/TableView.js new file mode 100644 index 0000000..1c85468 --- /dev/null +++ b/src/components/Home/Inventory/contect/TableView.js @@ -0,0 +1,498 @@ +import React, { useState } from 'react'; +import { useTheme } from '@mui/material/styles'; +import { + useMediaQuery, + Box, + Typography, + Paper, + Table, + TableBody, + TableCell, + TableHead, + TableRow, + Chip, + Pagination, + Button, + Avatar, + TableContainer, + TextField, + IconButton, +} from '@mui/material'; + +import AssignmentIcon from '@mui/icons-material/Assignment'; +import DriveFileRenameOutlineSharpIcon from '@mui/icons-material/DriveFileRenameOutlineSharp'; +import ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown'; +import CloseIcon from '@mui/icons-material/Close'; +import { green } from '@mui/material/colors'; +import jsPDF from 'jspdf'; +import autoTable from 'jspdf-autotable'; +import * as XLSX from 'xlsx'; +import { saveAs } from 'file-saver'; +import TuneIcon from '@mui/icons-material/Tune'; + + +const TableView = ({ data = [], onAddNewProduct }) => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('sm')); + const itemsPerPage = 5; + + const [currentPage, setCurrentPage] = useState(1); + const [showSearch, setShowSearch] = useState(false); + const [searchTerm, setSearchTerm] = useState(''); + + // فلترة البيانات بناءً على نص البحث (غير حساس لحالة الأحرف) + const filteredData = data.filter((item) => + item.product.toLowerCase().includes(searchTerm.toLowerCase()) + ); + + const pageCount = Math.ceil(filteredData.length / itemsPerPage); + + const paginatedData = filteredData.slice( + (currentPage - 1) * itemsPerPage, + currentPage * itemsPerPage + ); + + const handleSearchChange = (e) => { + setSearchTerm(e.target.value); + setCurrentPage(1); // العودة للصفحة الأولى عند تغيير البحث + }; + + const handleExportPDF = () => { + const doc = new jsPDF(); + doc.setFontSize(14); + doc.text('Top Selling Products', 14, 20); + + const tableColumn = ['No.', 'Product', 'Sales', 'Amount', 'Price', 'Expiration', 'Status']; + const tableRows = data.map((row, i) => ([ + i + 1, + row.product, + row.sales, + `$${row.amount}`, + `$${row.price}`, + row.expiration, + row.status + ])); + + autoTable(doc, { + startY: 30, + head: [tableColumn], + body: tableRows, + styles: { fontSize: 10 }, + headStyles: { fillColor: [240, 240, 240] } + }); + + doc.save('top_selling_products.pdf'); + }; + + const handleExportSpreadsheet = () => { + const wsData = [ + ['No.', 'Product', 'Sales', 'Amount', 'Price', 'Expiration', 'Status'], + ...data.map((row, i) => [ + i + 1, + row.product, + row.sales, + `$${row.amount}`, + `$${row.price}`, + row.expiration, + row.status + ]) + ]; + + const worksheet = XLSX.utils.aoa_to_sheet(wsData); + const workbook = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(workbook, worksheet, "Top Selling"); + + const wbout = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' }); + const blob = new Blob([wbout], { type: 'application/octet-stream' }); + saveAs(blob, 'top_selling_products.xlsx'); + }; + + + return ( + + {/* Header */} + + + Table View + + + + {/* زر إضافة منتج جديد */} + + {/* زر تصدير جدول (Spreadsheet) */} + + + {/* زر PDF */} + + + {/* زر الفلاتر */} + + + + + + {/* جدول البيانات */} + + + + + No. + + + setShowSearch(prev => !prev)} + > + Product Name + + + {showSearch && ( + setSearchTerm('')} + aria-label="Clear search" + > + + + ), + }} + /> + )} + + + + {!isMobile && Barcode} + Branch + {!isMobile && Expiration} + {!isMobile && Stock Quantity } + Consumption Status + + Action + + + + + + {paginatedData.length > 0 ? ( + paginatedData.map((row, i) => ( + + + {(currentPage - 1) * itemsPerPage + i + 1} + + + + + + + + + {row.product} + + + + + {!isMobile && ( + + {row.sales} + + )} + + + ${row.amount.toLocaleString()} + + + {!isMobile && ( + + ${row.price} + + )} + + {!isMobile && ( + + {row.expiration} + + )} + + + + + + + + + + )) + ) : ( + + + No products found. + + + )} + +
+
+ + {/* Pagination Footer */} + + + Showing{' '} + {(currentPage - 1) * itemsPerPage + 1} to{' '} + {Math.min(currentPage * itemsPerPage, filteredData.length)} of{' '} + {filteredData.length} + + + setCurrentPage(value)} + size={isMobile ? 'small' : 'medium'} + sx={{ + '& .MuiPaginationItem-root': { + fontSize: { xs: '12px', sm: '14px' }, + minWidth: { xs: 24, sm: 32 }, + height: { xs: 24, sm: 32 }, + backgroundColor: '#FFECE0', + color: theme.palette.primary.main, + borderRadius: '8px', + '&.Mui-selected': { + backgroundColor: theme.palette.primary.main, + color: '#fff', + }, + '&:hover': { + backgroundColor: '#FFD6B5', + }, + }, + }} + /> + +
+ ); +}; + +export default TableView; diff --git a/src/components/Home/Meal/Meal.js b/src/components/Home/Meal/Meal.js new file mode 100644 index 0000000..04f5292 --- /dev/null +++ b/src/components/Home/Meal/Meal.js @@ -0,0 +1,206 @@ +import React, { useState, useEffect } from 'react'; +import { Box, useTheme, useMediaQuery, Typography } from '@mui/material'; +import KitchPlusAppBar from '../AppBar'; +import Sidebar from '../SideHome'; +import AccountSettings from './contect/AccountSettings'; +import MealsByCateg from './contect/MealsByCateg'; +import AllMeals from './contect/AllMeals'; +import ProductDetail from './contect/ProductDetail'; +import authService from '../../../services/authService'; +import { useRestaurant } from '../../../contexts/RestaurantContext'; + +const drawerWidth = 230; + +const Meal = () => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('sm')); + const [sidebarOpen, setSidebarOpen] = useState(!isMobile); + const { restaurantId } = useRestaurant(); + + const [showAllPopular, setShowAllPopular] = useState(false); + const [categories, setCategories] = useState([]); + const [selectedCategoryId, setSelectedCategoryId] = useState(null); + const [categoryName, setCategoryName] = useState(''); + const [selectedProduct, setSelectedProduct] = useState(null); + const [meals, setMeals] = useState([]); + const [loadingMeals, setLoadingMeals] = useState(false); + + // جلب الفئات عند التحميل + useEffect(() => { + const fetchCategories = async () => { + if (!restaurantId) return; + const result = await authService.getCategoriesByRestaurant(restaurantId); + if (result.success) setCategories(result.data); + else setCategories([]); + }; + fetchCategories(); + }, [restaurantId]); + + // تحديث اسم الفئة عند تغيير selectedCategoryId أو categories + useEffect(() => { + if (selectedCategoryId && categories.length > 0) { + const selected = categories.find(c => c.id === selectedCategoryId); + setCategoryName(selected ? selected.name : ''); + } else { + setCategoryName(''); + } + }, [selectedCategoryId, categories]); + + // جلب الوجبات عند اختيار الفئة + useEffect(() => { + const fetchMeals = async () => { + if (selectedCategoryId && restaurantId) { + setLoadingMeals(true); + try { + const result = await authService.getMealsByCategory(restaurantId, selectedCategoryId); + if (result.success) { + const selectedCategory = categories.find(c => c.id === selectedCategoryId); + const mealsWithImages = result.data.map(meal => ({ + id: meal.id, + name: meal.name, + price: meal.price, + unit: meal.unit || '/pcs', + image: meal.photo || '/images/default-product.png', + category: selectedCategory ? selectedCategory.name : '', // اسم الفئة + category_id: meal.category_id, + restaurant_id: meal.restaurant_id, + description: meal.description || [], + additions: meal.additions || [] + })); + setMeals(mealsWithImages); + } else setMeals([]); + } catch (err) { + console.error(err); + setMeals([]); + } finally { + setLoadingMeals(false); + } + } else setMeals([]); + }; + fetchMeals(); + }, [selectedCategoryId, restaurantId, categories]); + + const handleDrawerToggle = () => setSidebarOpen(!sidebarOpen); + const toggleShowAllPopular = () => setShowAllPopular(prev => !prev); + + return ( + + + + + + + + {selectedProduct ? ( + setSelectedProduct(null)} + /> + ) : ( + <> + + + {selectedCategoryId ? ( + + + setSelectedCategoryId(null)} + onProductClick={(meal) => { + const category = categories.find(c => c.id === meal.category_id); + setSelectedProduct({ + ...meal, + category: category ? category.name : '', + category_id: meal.category_id, + restaurant_id: restaurantId + }); + }} + /> + + + ) : !showAllPopular ? ( + + + { + const category = categories.find(c => c.id === meal.category_id); + setSelectedProduct({ + ...meal, + category: category ? category.name : '', + category_id: meal.category_id, + restaurant_id: restaurantId + }); + }} + /> + + + ) : null} + + )} + + + + ); +}; + +export default Meal; \ No newline at end of file diff --git a/src/components/Home/Meal/contect/AccountSettings.js b/src/components/Home/Meal/contect/AccountSettings.js new file mode 100644 index 0000000..42db264 --- /dev/null +++ b/src/components/Home/Meal/contect/AccountSettings.js @@ -0,0 +1,330 @@ +import React, { useState, useEffect, useRef } from 'react'; +import { + Box, + Typography, + Button, + IconButton, + Menu, + MenuItem, + Modal, + Dialog, + DialogTitle, + DialogContent, + DialogActions, + useTheme, + useMediaQuery, + Skeleton, +} from '@mui/material'; +import ArrowBackIosNewIcon from '@mui/icons-material/ArrowBackIosNew'; +import ArrowForwardIosIcon from '@mui/icons-material/ArrowForwardIos'; +import CategoryScrollList from './CategoryScrollList'; +import AddCategory from './AddCategory'; +import authService from '../../../../services/authService'; + +const AccountSettings = ({ selectedCategory, setSelectedCategory, restaurantId }) => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('sm')); + + const [categories, setCategories] = useState([]); + const [loading, setLoading] = useState(true); // <-- حالة التحميل + const [selectedCategoryForEdit, setSelectedCategoryForEdit] = useState(null); + const [contextMenu, setContextMenu] = useState(null); + const [openAddModal, setOpenAddModal] = useState(false); + const [confirmDeleteOpen, setConfirmDeleteOpen] = useState(false); + + const scrollRef = useRef(); + + // تحميل الفئات عند فتح الصفحة + useEffect(() => { + const fetchCategories = async () => { + setLoading(true); // بدء التحميل + const result = await authService.getCategoriesByRestaurant(restaurantId); + if (result.success) setCategories(result.data); + else console.error(result.message); + setLoading(false); // انتهاء التحميل + }; + if (restaurantId) fetchCategories(); + }, [restaurantId]); + + useEffect(() => { + if (selectedCategory) localStorage.setItem('selectedCategoryId', selectedCategory); + }, [selectedCategory]); + + const scroll = (offset) => { + if (scrollRef.current) scrollRef.current.scrollLeft += offset; + }; + + const handleAddCategory = async (payload) => { + try { + const response = await authService.addCategory(payload); + setCategories((prev) => [...prev, response.category]); + setOpenAddModal(false); + } catch (error) { + console.error('خطأ أثناء الإضافة:', error); + } + }; + + const handleUpdateCategory = async (payload) => { + try { + const response = await authService.updateCategory(selectedCategoryForEdit.id, payload); + setCategories((prev) => + prev.map((cat) => (cat.id === selectedCategoryForEdit.id ? response.category : cat)) + ); + setOpenAddModal(false); + } catch (error) { + console.error('خطأ أثناء التعديل:', error); + } + }; + + const handleDeleteCategory = async () => { + try { + await authService.deleteCategory(selectedCategoryForEdit.id); + setCategories((prev) => + prev.filter((cat) => cat.id !== selectedCategoryForEdit.id) + ); + setConfirmDeleteOpen(false); + setSelectedCategoryForEdit(null); + + if (selectedCategory === selectedCategoryForEdit?.id) { + setSelectedCategory(null); + localStorage.removeItem('selectedCategoryId'); + } + } catch (error) { + console.error('خطأ أثناء الحذف:', error); + } + }; + + useEffect(() => { + if (!openAddModal) setSelectedCategoryForEdit(null); + }, [openAddModal]); + + return ( + + {/* رأس القسم */} + + + Categories + + + + + + scroll(-200)} + sx={{ + backgroundColor: theme.palette.primary.main, + color: '#fff', + width: 40, + height: 40, + '&:hover': { backgroundColor: '#ffddbfff' }, + }} + > + + + + scroll(200)} + sx={{ + backgroundColor: theme.palette.primary.main, + color: '#fff', + width: 40, + height: 40, + '&:hover': { backgroundColor: '#ffddbfff' }, + }} + > + + + + + + {/* قائمة الفئات */} + {/* قائمة الفئات */} + + {loading ? ( + // Skeleton Loader + Array.from({ length: 5 }).map((_, index) => ( + + )) + ) : categories.length === 0 ? ( + + + No categories available + + + ) : ( + + )} + + + + {/* مودال الإضافة / التعديل */} + setOpenAddModal(false)} + aria-labelledby="add-category-modal" + sx={{ + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + p: 2, + }} + > + + + + + + {/* قائمة السياق */} + setContextMenu(null)} + anchorReference="anchorPosition" + anchorPosition={ + contextMenu !== null + ? { top: contextMenu.mouseY, left: contextMenu.mouseX } + : undefined + } + sx={{ zIndex: 2000 }} + > + { + setOpenAddModal(true); + setContextMenu(null); + }} + > + Edit Category + + { + setConfirmDeleteOpen(true); + setContextMenu(null); + }} + sx={{ color: 'red' }} + > + Delete Category + + + + {/* تأكيد الحذف */} + setConfirmDeleteOpen(false)}> + Confirm Delete + + Are you sure you want to delete this category? + + + + + + + + ); +}; + +export default AccountSettings; diff --git a/src/components/Home/Meal/contect/AddCategory.js b/src/components/Home/Meal/contect/AddCategory.js new file mode 100644 index 0000000..30d487a --- /dev/null +++ b/src/components/Home/Meal/contect/AddCategory.js @@ -0,0 +1,102 @@ +import React, { useState, useEffect } from 'react'; +import { Box, Button, TextField, Typography } from '@mui/material'; +import { useRestaurant } from '../../../../contexts/RestaurantContext'; + +const AddCategory = ({ onAdd, editingCategory }) => { + const { restaurantId } = useRestaurant(); + const [productName, setProductName] = useState(''); + const [description, setDescription] = useState(''); + const [price, setPrice] = useState(''); + const [discount, setDiscount] = useState(''); + const [productImage, setProductImage] = useState(null); + + useEffect(() => { + if (editingCategory) { + setProductName(editingCategory.name || ''); + setDescription(editingCategory.description || ''); + setPrice(editingCategory.price || ''); + setDiscount(editingCategory.discount || ''); + setProductImage(editingCategory.icon || null); + } + }, [editingCategory]); + + const handleImageUpload = (e) => { + const file = e.target.files[0]; + if (file) { + const reader = new FileReader(); + reader.onloadend = () => setProductImage(reader.result); + reader.readAsDataURL(file); + } + }; + + const handleSubmit = () => { + if (!productName) { + alert("Please enter category name"); + return; + } + + if (!restaurantId) { + alert("Restaurant ID not set"); + return; + } + + const payload = { + name: productName, + restaurant_id: restaurantId, + description, + price, + discount, + icon: productImage, + }; + + // فقط أرسل البيانات للمكون الأب + if (onAdd) onAdd(payload); + }; + + return ( + + + Category Name + + setProductName(e.target.value)} + margin="normal" + sx={{ + '& input': { fontWeight: 500, fontSize: '15px' }, + '& input::placeholder': { color: '#969BA7' }, + '& .MuiOutlinedInput-root': { + borderRadius: '10px', + transition: '0.3s', + '&.Mui-focused fieldset': { + borderColor: '#FF914D', + boxShadow: '0 0 0 2px rgba(255,145,77,0.2)', + }, + }, + }} + /> + + + + ); +}; + +export default AddCategory; diff --git a/src/components/Home/Meal/contect/AddMeal.js b/src/components/Home/Meal/contect/AddMeal.js new file mode 100644 index 0000000..d998e24 --- /dev/null +++ b/src/components/Home/Meal/contect/AddMeal.js @@ -0,0 +1,251 @@ +import React, { useState, useEffect } from 'react'; +import { + Dialog, + DialogTitle, + DialogContent, + DialogActions, + TextField, + Typography, + Box, + Button, + IconButton, + InputAdornment, +} from '@mui/material'; +import AddAPhotoOutlinedIcon from '@mui/icons-material/AddAPhotoOutlined'; +import DeleteIcon from '@mui/icons-material/Delete'; +import authService from '../../../../services/authService'; +import AddIcon from '@mui/icons-material/Add'; + +const MAX_FILE_SIZE_MB = 2; +const ALLOWED_TYPES = ['image/jpeg', 'image/png', 'image/jpg']; + +const AddMeal = ({ open, onClose, onAdd, selectedCategory, restaurantId }) => { + const [mealName, setMealName] = useState(''); + const [description, setDescription] = useState(''); + const [additions, setAdditions] = useState(['']); + const [price, setPrice] = useState(''); + const [mealImage, setMealImage] = useState(null); + const [errors, setErrors] = useState({}); + const [isSubmitting, setIsSubmitting] = useState(false); + + useEffect(() => { + if (!open) { + setMealName(''); + setDescription(''); + setAdditions(['']); + setPrice(''); + setMealImage(null); + setErrors({}); + } + }, [open]); + + const handleImageUpload = (e) => { + const file = e.target.files[0]; + if (!file) return; + + if (!ALLOWED_TYPES.includes(file.type)) { + setErrors(prev => ({ ...prev, image: 'Allowed types: jpg, jpeg, png' })); + return; + } + if (file.size > MAX_FILE_SIZE_MB * 1024 * 1024) { + setErrors(prev => ({ ...prev, image: `Image must be smaller than ${MAX_FILE_SIZE_MB} MB` })); + return; + } + + setMealImage(file); + setErrors(prev => ({ ...prev, image: '' })); + }; + + const handleAddAddition = () => setAdditions([...additions, '']); + const handleRemoveAddition = (index) => setAdditions(additions.filter((_, i) => i !== index)); + const handleChangeAddition = (index, value) => { + const newAdditions = [...additions]; + newAdditions[index] = value; + setAdditions(newAdditions); + }; + + const validate = () => { + const newErrors = {}; + if (!mealName.trim()) newErrors.name = 'Meal name is required'; + if (!description.trim()) newErrors.description = 'Description is required'; + if (!price || isNaN(price) || Number(price) <= 0) newErrors.price = 'Valid price is required'; + if (!mealImage) newErrors.image = 'Meal image is required'; + if (!selectedCategory) newErrors.category = 'Category must be selected'; + additions.forEach((add, i) => { + if (!add.trim()) newErrors[`addition_${i}`] = 'Cannot be empty'; + }); + setErrors(newErrors); + return Object.keys(newErrors).length === 0; + }; + +const handleSubmit = async () => { + if (!validate()) return; + setIsSubmitting(true); + + const mealData = { + name: mealName.trim(), + category_id: selectedCategory, + price, + restaurant_id: restaurantId, + photo: mealImage, + description: [description.trim()], + additions: additions.filter(a => a.trim() !== ''), + }; + + try { + const result = await authService.addMeal(mealData); + + // عرض رسالة Snackbar أو alert + alert(result.message); + + // تمرير الوجبة الجديدة للمكون الأب لتحديث القائمة + if (result.data && onAdd) { + const newMeal = { + id: result.data.id, + name: result.data.name, + price: result.data.price, + description: result.data.description || [], + additions: result.data.additions || [], + unit: result.data.unit || "/pcs", + photo: result.data.photo || "/images/default-product.png", + category_id: result.data.category_id || selectedCategory, + }; + onAdd(newMeal); + } + + // إغلاق المودال بعد الإضافة + onClose(); + + } catch (error) { + console.error('Add meal error:', error); + alert(error.message || "Something went wrong"); + } finally { + setIsSubmitting(false); + } +}; + + + + return ( + + Add Meal + + + + {/* Meal Image */} + Meal Image + + {mealImage ? ( + + Preview + + + ) : ( + <> + Upload Meal Picture + + + )} + + + {errors.image && {errors.image}} + + {/* Meal Name */} + Meal Name + setMealName(e.target.value)} error={!!errors.name} helperText={errors.name} sx={{ mb: 2 }} /> + + {/* Description */} + Description + setDescription(e.target.value)} error={!!errors.description} helperText={errors.description} sx={{ mb: 2 }} /> + + {/* Additions */} + Additions + {additions.map((add, i) => ( + + handleChangeAddition(i, e.target.value)} + error={!!errors[`addition_${i}`]} + helperText={errors[`addition_${i}`]} + /> + handleRemoveAddition(i)} color="error"> + + ))} + + + {/* Price */} + Price + setPrice(e.target.value)} error={!!errors.price} helperText={errors.price} sx={{ mb: 2 }} /> + + + + + + + + ); +}; + +export default AddMeal; diff --git a/src/components/Home/Meal/contect/AllMeals.js b/src/components/Home/Meal/contect/AllMeals.js new file mode 100644 index 0000000..d31ec3b --- /dev/null +++ b/src/components/Home/Meal/contect/AllMeals.js @@ -0,0 +1,131 @@ +import React, { useState, useEffect } from "react"; +import { Box, Typography, Skeleton, useTheme } from "@mui/material"; +import MealCard from "./MealCard"; +import authService from "../../../../services/authService"; +import SimplePagination from "../../SimplePagination"; + +const AllMeals = ({ restaurantId, categories = [], onProductClick }) => { + const theme = useTheme(); + const [products, setProducts] = useState([]); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + const [page, setPage] = useState(1); + const [pagination, setPagination] = useState(null); + + const itemsPerPage = 6; + + useEffect(() => { + if (!restaurantId) return; + + const fetchMeals = async () => { + setLoading(true); + setError(null); + try { + const result = await authService.getAllMealsByRestaurant(restaurantId, page); + + if (result.success) { + const mealsWithImages = result.data.map(meal => { + const category = categories.find(c => c.id === meal.category_id); + return { + id: meal.id, + name: meal.name, + price: meal.price, + description: meal.description || [], + additions: meal.additions || [], + unit: meal.unit || "/pcs", + photo: meal.photo || meal.photo_url || "/images/default-product.png", + category_id: meal.category_id, + category: category ? category.name : null, + }; + }); + + setProducts(mealsWithImages); + setPagination(result.pagination); + } else { + setProducts([]); + setPagination(null); + } + } catch (err) { + console.error(err); + setError("Failed to fetch meals."); + } finally { + setLoading(false); + } + }; + + fetchMeals(); + }, [restaurantId, page, categories]); + + return ( + + + All Meals + + + {loading ? ( + + {Array.from({ length: itemsPerPage }).map((_, index) => ( + + + + + + ))} + + ) : error ? ( + + {error} + + ) : products.length === 0 ? ( + + There is no meal available + + ) : ( + + {products.map(product => ( + onProductClick(product)} > + onProductClick(product)} + /> + + ))} + + )} + + {/* Pagination Footer */} + {pagination && !loading && ( + + + Showing {(page - 1) * itemsPerPage + 1} to {Math.min(page * itemsPerPage, products.length)} of {pagination.total} meals + + + setPage(newPage)} + /> + + )} + + ); +}; + +export default AllMeals; diff --git a/src/components/Home/Meal/contect/CategoryScrollList.js b/src/components/Home/Meal/contect/CategoryScrollList.js new file mode 100644 index 0000000..827b42e --- /dev/null +++ b/src/components/Home/Meal/contect/CategoryScrollList.js @@ -0,0 +1,76 @@ +import React from 'react'; +import { Box, Typography } from '@mui/material'; +import { useTheme } from '@mui/material/styles'; + +const CategoryScrollList = ({ + categories, + selectedCategory, + setSelectedCategory, + setSelectedCategoryForEdit, + setContextMenu, + scrollRef, +}) => { + const theme = useTheme(); + + return ( + + {categories.map((cat) => { + const isSelected = selectedCategory === cat.id; + + return ( + setSelectedCategory(cat.id)} + onContextMenu={(e) => { + e.preventDefault(); + setSelectedCategoryForEdit(cat); + setContextMenu({ mouseX: e.clientX + 2, mouseY: e.clientY - 6 }); + }} + sx={{ + p: 1, + borderRadius: '12px', + backgroundColor: isSelected ? theme.palette.primary.main : '#F9F9FC', + border: isSelected ? `0px solid ${theme.palette.primary.main}` : '0px solid #ddd', + textAlign: 'center', + minWidth: '70px', + cursor: 'pointer', + flexShrink: 0, + transition: '0.3s', + '&:hover': { + backgroundColor: isSelected ? theme.palette.primary.dark : '#EDEDED', + }, + }} + > + + {cat.name} + + + ); + })} + + ); +}; + +export default CategoryScrollList; diff --git a/src/components/Home/Meal/contect/MealCard.js b/src/components/Home/Meal/contect/MealCard.js new file mode 100644 index 0000000..5871767 --- /dev/null +++ b/src/components/Home/Meal/contect/MealCard.js @@ -0,0 +1,138 @@ +import React from "react"; +import { + Box, + Typography, + Card, + CardContent, + CardMedia, + IconButton, + Chip, +} from "@mui/material"; +import AddIcon from "@mui/icons-material/Add"; + +const MealCard = ({ meal, onClick, onAdd }) => { + const { name, price, unit, photo, image, description, additions } = meal; + + + + return ( + + {/* صورة الوجبة */} + + + {/* تفاصيل الوجبة */} + + + {name} + + + {/* السعر */} + + ${price}{" "} + + {unit || "/pcs"} + + + + {/* الوصف (أول عنصر فقط للتصغير) */} + {description && description.length > 0 && ( + + {description[0]} + + )} + + {/* الإضافات (أول 2 فقط) */} + {/* {additions && additions.length > 0 && ( + + {additions.slice(0, 2).map((add, i) => ( + + ))} + + )} */} + + {/* زر الإضافة */} + {/* { + e.stopPropagation(); + if (onAdd) onAdd(meal); + }} + sx={{ + backgroundColor: "#FF8551", + color: "#fff", + mt: 1, + width: 28, + height: 28, + "&:hover": { backgroundColor: "#ff7043" }, + }} + > + + */} + + + + ); +}; + +export default MealCard; diff --git a/src/components/Home/Meal/contect/MealsByCateg.js b/src/components/Home/Meal/contect/MealsByCateg.js new file mode 100644 index 0000000..53a59de --- /dev/null +++ b/src/components/Home/Meal/contect/MealsByCateg.js @@ -0,0 +1,202 @@ +import React, { useState, useEffect, useCallback } from "react"; +import { Box, Typography, Skeleton, useTheme, Button } from "@mui/material"; +import MealCard from "./MealCard"; +import authService from "../../../../services/authService"; +import AddMeal from "./AddMeal"; +import SimplePagination from "../../SimplePagination"; + +const MealsByCateg = ({ + restaurantId, + categoryId, + onProductClick, + onAddMeal, + categoryName, + onBack, +}) => { + const theme = useTheme(); + + const [products, setProducts] = useState([]); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + const [openModal, setOpenModal] = useState(false); + const [page, setPage] = useState(1); + const [pagination, setPagination] = useState(null); + + const itemsPerPage = 6; + + // استخدام useCallback لمنع إنشاء الدالة عند كل إعادة render + const fetchMeals = useCallback(async () => { + if (!restaurantId || !categoryId) return; + setLoading(true); + setError(null); + try { + const result = await authService.getMealsByCategory( + restaurantId, + categoryId, + page + ); + + if (result.success) { + const mealsWithImages = result.data.map((meal) => ({ + id: meal.id, + name: meal.name, + price: meal.price, + description: meal.description || [], + additions: meal.additions || [], + unit: meal.unit || "/pcs", + photo: meal.photo || "/images/default-product.png", + category_id: meal.category_id || categoryId, + })); + setProducts(mealsWithImages); + setPagination(result.pagination); + } else { + setProducts([]); + setPagination(null); + } + } catch (err) { + console.error(err); + setError("Failed to fetch meals."); + setProducts([]); + setPagination(null); + } finally { + setLoading(false); + } + }, [restaurantId, categoryId, page]); + + // جلب البيانات عند تغيير restaurantId أو categoryId أو page + useEffect(() => { + fetchMeals(); + }, [fetchMeals]); + + // إضافة وجبة جديدة وتحديث القائمة فورًا +// في MealsByCateg +const handleAddProduct = async (meal) => { + setOpenModal(false); // اغلاق مودال الإضافة + setPage(1); // العودة للصفحة الأولى + const result = await fetchMeals(); // جلب الوجبات بعد الإضافة + if (onAddMeal) onAddMeal(meal); // تمرير الوجبة للمكون الأب +}; + + return ( + + {/* العنوان + أزرار */} + + + {categoryName || "Meals"} + + + + + + + + {/* حالة التحميل أو الخطأ */} + {loading ? ( + + {Array.from({ length: itemsPerPage }).map((_, index) => ( + + + + + + ))} + + ) : error ? ( + + {error} + + ) : products.length === 0 ? ( + + + There is no meal available + + + ) : ( + + {products.map((product) => ( + + onProductClick({ + ...product, + category: categoryName, + category_id: categoryId, + }) + } + > + + onProductClick({ + ...product, + category: categoryName, + category_id: categoryId, + }) + } + onAdd={onAddMeal} + /> + + ))} + + )} + + {/* Pagination Footer */} + {pagination && !loading && pagination.last_page > 1 && ( + + + Showing {(page - 1) * itemsPerPage + 1} to{" "} + {Math.min(page * itemsPerPage, pagination.total)} of {pagination.total} meals + + + setPage(newPage)} + /> + + )} + + {/* Add Meal Modal */} + setOpenModal(false)} + onAdd={handleAddProduct} + selectedCategory={categoryId} + restaurantId={restaurantId} + /> + + ); +}; + +export default MealsByCateg; diff --git a/src/components/Home/Meal/contect/ProductDetail.js b/src/components/Home/Meal/contect/ProductDetail.js new file mode 100644 index 0000000..b09ce98 --- /dev/null +++ b/src/components/Home/Meal/contect/ProductDetail.js @@ -0,0 +1,551 @@ +import React, { useState, useEffect } from "react"; +import { + Box, + Typography, + Button, + TextField, + Chip, + LinearProgress, + useTheme, + IconButton, + Dialog, + DialogTitle, + DialogContent, + DialogActions, + FormControl, + Select, + MenuItem, + FormHelperText, +} from "@mui/material"; +import AddIcon from "@mui/icons-material/Add"; +import ClearIcon from "@mui/icons-material/Clear"; +import ArrowBackIcon from "@mui/icons-material/ArrowBack"; +import CloudUploadIcon from "@mui/icons-material/CloudUpload"; +import authService from "../../../../services/authService"; + +const ProductDetail = ({ product, onBack }) => { + const theme = useTheme(); + const [isEditing, setIsEditing] = useState(false); + const [confirmDeleteOpen, setConfirmDeleteOpen] = useState(false); + const [formData, setFormData] = useState({ + name: "", + category_id: "", + restaurant_id: "", + description: [], + additions: [], + price: "", + photoFile: null, + }); + + const [newDescription, setNewDescription] = useState(""); + const [newAddition, setNewAddition] = useState(""); + const [isSaving, setIsSaving] = useState(false); + const [errors, setErrors] = useState({}); + const [categories, setCategories] = useState([]); + + useEffect(() => { + if (product) { + setFormData({ + name: product.name || "", + category_id: product.category_id || "", + restaurant_id: product.restaurant_id || "", + description: product.description || [], + additions: product.additions || [], + price: product.price || "", + photoFile: null, + }); + } + + const fetchCategories = async () => { + try { + const result = await authService.getCategoriesByRestaurant(product?.restaurant_id); + if (result.success) setCategories(result.data); + } catch (error) { + console.error("Error fetching categories:", error); + } + }; + + if (product?.restaurant_id) fetchCategories(); + }, [product]); + + const validateForm = () => { + const newErrors = {}; + if (!formData.name.trim()) newErrors.name = "Name is required"; + if (!formData.category_id) newErrors.category_id = "Category is required"; + if (!formData.price || isNaN(formData.price) || formData.price <= 0) { + newErrors.price = "Valid price is required"; + } + if (formData.description.length === 0) newErrors.description = "At least one description is required"; + if (formData.additions.length === 0) newErrors.additions = "At least one addition is required"; + + setErrors(newErrors); + return Object.keys(newErrors).length === 0; + }; + + const handleInputChange = (e) => { + const { name, value } = e.target; + setFormData((prev) => ({ ...prev, [name]: value })); + if (errors[name]) setErrors((prev) => ({ ...prev, [name]: "" })); + }; + + const handleFileChange = (e) => { + const file = e.target.files[0]; + if (!file) return; + + if (!file.type.startsWith('image/')) { + setErrors((prev) => ({ ...prev, photoFile: "Please select an image file" })); + return; + } + + if (file.size > 5 * 1024 * 1024) { + setErrors((prev) => ({ ...prev, photoFile: "File size should be less than 5MB" })); + return; + } + + setFormData((prev) => ({ ...prev, photoFile: file })); + setErrors((prev) => ({ ...prev, photoFile: "" })); + }; + + const handleAddDescription = () => { + if (newDescription.trim() !== "") { + setFormData((prev) => ({ + ...prev, + description: [...prev.description, newDescription.trim()], + })); + setNewDescription(""); + setErrors((prev) => ({ ...prev, description: "" })); + } + }; + + const handleRemoveDescription = (idx) => { + const newDesc = formData.description.filter((_, i) => i !== idx); + setFormData((prev) => ({ ...prev, description: newDesc })); + if (newDesc.length === 0) setErrors((prev) => ({ ...prev, description: "At least one description is required" })); + }; + + const handleAddAddition = () => { + if (newAddition.trim() !== "") { + setFormData((prev) => ({ + ...prev, + additions: [...prev.additions, newAddition.trim()], + })); + setNewAddition(""); + setErrors((prev) => ({ ...prev, additions: "" })); + } + }; + + const handleRemoveAddition = (idx) => { + const newAdds = formData.additions.filter((_, i) => i !== idx); + setFormData((prev) => ({ ...prev, additions: newAdds })); + if (newAdds.length === 0) setErrors((prev) => ({ ...prev, additions: "At least one addition is required" })); + }; + + const handleEditDescription = (idx, value) => { + const newDesc = [...formData.description]; + newDesc[idx] = value; + setFormData((prev) => ({ ...prev, description: newDesc })); + }; + + const handleEditAddition = (idx, value) => { + const newAdds = [...formData.additions]; + newAdds[idx] = value; + setFormData((prev) => ({ ...prev, additions: newAdds })); + }; + + const handleSave = async () => { + if (!validateForm()) return; + + try { + setIsSaving(true); + const updateData = { + name: formData.name.trim(), + category_id: formData.category_id, + restaurant_id: formData.restaurant_id, + description: formData.description, + additions: formData.additions, + price: formData.price, + photo: formData.photoFile ? [formData.photoFile] : [], + }; + + const res = await authService.updateMeal(product.id, updateData); + + // ✅ حدّث state بآخر نسخة من السيرفر + setFormData({ + name: res.meal.name || "", + category_id: res.meal.category_id || "", + restaurant_id: res.meal.restaurant_id || "", + description: res.meal.description || [], + additions: res.meal.additions || [], + price: res.meal.price || "", + photoFile: null, + }); + + setIsEditing(false); + alert("Meal updated successfully!"); + + // ✅ إغلاق المكون بعد النجاح + if (onBack) { + onBack(); + } + + } catch (err) { + console.error(err); + alert("Error updating meal: " + (err.message || "Something went wrong")); + } finally { + setIsSaving(false); + } + }; + + const handleDeleteMeal = async () => { + try { + setIsSaving(true); + await authService.deleteMeal(product.id, product.restaurant_id, product.category_id); + onBack(); + // alert("Meal deleted successfully!"); + } catch (err) { + console.error(err); + alert("Error deleting meal: " + (err.message || "Something went wrong")); + } finally { + setIsSaving(false); + setConfirmDeleteOpen(false); + } + }; + + return ( + + {/* صندوق الصورة */} + + + + + + + + + + {isEditing && ( + + + {errors.photoFile && {errors.photoFile}} + {formData.photoFile && Selected: {formData.photoFile.name}} + + )} + + + {/* التفاصيل */} + + {/* الاسم */} + + {isEditing ? ( + + ) : ( + {product.name} + )} + + + {/* الفئة */} + + {isEditing ? ( + + + {errors.category_id && ( + {errors.category_id} + )} + + ) : ( + + {product.category || + categories.find((c) => c.id === (product.category_id || formData.category_id))?.name || + `Category #${product.category_id || formData.category_id}`} + + )} + + + + {/* السعر */} + + Price + {isEditing ? ( + + ) : ( + + ${Number(product.price).toFixed(2)} {product.unit || "/pcs"} + + )} + + + {/* الوصف */} + + + Description {isEditing && "*"} + + {isEditing ? ( + + {formData.description.map((desc, idx) => ( + + handleEditDescription(idx, e.target.value)} + placeholder={`Description ${idx + 1}`} + size="small" + /> + + ))} + {errors.description && {errors.description}} + + ) : ( + + {formData.description.map((desc, idx) => • {desc})} + + )} + + + {/* الإضافات */} + + + Additions {isEditing && "*"} + + {isEditing ? ( + + {formData.additions.map((add, idx) => ( + + handleEditAddition(idx, e.target.value)} + placeholder={`Addition ${idx + 1}`} + size="small" + /> + handleRemoveAddition(idx)} size="small"> + + + + ))} + + setNewAddition(e.target.value)} + size="small" + /> + + + + + {errors.additions && {errors.additions}} + + ) : ( + + {formData.additions.map((add, idx) => )} + + )} + + + {/* شريط تقدم */} + + + + {/* أزرار التحكم */} + + {isEditing ? ( + <> + + + + + ) : ( + <> + + + + + )} + + + + + {/* مودال تأكيد الحذف */} + setConfirmDeleteOpen(false)}> + Confirm Delete + + + Are you sure you want to delete "{product.name}"? This action cannot be undone. + + + + + + + + + ); +}; + +export default ProductDetail; diff --git a/src/components/Home/Order/Order.js b/src/components/Home/Order/Order.js new file mode 100644 index 0000000..1d67eb4 --- /dev/null +++ b/src/components/Home/Order/Order.js @@ -0,0 +1,74 @@ +import React, { useState, useEffect } from 'react'; +import { Box, useTheme, useMediaQuery } from '@mui/material'; +import KitchPlusAppBar from '../AppBar'; +import Sidebar from '../SideHome'; +import Orders from './contect/Orders'; +import authService from '../../../services/authService'; + +const drawerWidth = 230; + +const Order = () => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('sm')); + const [sidebarOpen, setSidebarOpen] = useState(!isMobile); + + useEffect(() => { + const handleResize = () => { + setSidebarOpen(window.innerWidth >= theme.breakpoints.values.md); + }; + + handleResize(); + window.addEventListener('resize', handleResize); + return () => window.removeEventListener('resize', handleResize); + }, [theme.breakpoints.values.md]); + + useEffect(() => { + const admin = authService.getAdminData(); + console.log('Admin Info:', admin); + + const adminId = authService.getAdminId(); + console.log('Admin ID:', adminId); + }, []); + +const admin = authService.getAdminData(); +const adminId = authService.getAdminId(); + const handleDrawerToggle = () => setSidebarOpen(!sidebarOpen); + + return ( + + + + + + + + + + + + ); +}; + +export default Order; diff --git a/src/components/Home/Order/contect/CartView.js b/src/components/Home/Order/contect/CartView.js new file mode 100644 index 0000000..de7a7f8 --- /dev/null +++ b/src/components/Home/Order/contect/CartView.js @@ -0,0 +1,170 @@ +import React, { useContext, useState, useEffect } from "react"; +import { Box, Typography, Button, LinearProgress, IconButton } from "@mui/material"; +import ArrowBackIcon from '@mui/icons-material/ArrowBack'; +import { CartContext } from "../../../../contexts/CartContextR"; +import { useSnackbar } from "../../../../contexts/SnackbarContext"; + +const CartView = ({ onClose, onCartCreated, adminId }) => { + const { cart, clearCart, createNewCart } = useContext(CartContext); + const [loading, setLoading] = useState(false); + const { showSnackbar } = useSnackbar(); + + useEffect(() => { + console.log('Admin ID from props in:CartView', adminId); + }, [adminId]); + + const totalPrice = cart.reduce((sum, item) => sum + (item.totalPrice || 0), 0); + +const handleSendCart = async () => { + if (!cart.length) return; + setLoading(true); + + try { + // تحقق من أن adminId موجود ضمن قائمة صالحة (يمكنك تعديلها حسب بياناتك) + const validAdminIds = [1, 2]; // IDs موجودة في DB + if (!validAdminIds.includes(adminId)) { + console.error("Invalid admin ID"); + showSnackbar("Selected admin is not valid.", "error"); + + setLoading(false); + return; + } + + // تحقق من أن جميع المنتجات موجودة في قاعدة البيانات + const validProductIds = [1, 2, 3, 4]; // IDs المنتجات الموجودة + for (let item of cart) { + if (!validProductIds.includes(item.id)) { + console.error(`Invalid product ID: ${item.id}`); + // alert(`Product with ID ${item.id} does not exist.`); + showSnackbar(`Product with ID ${item.id} does not exist.`, "error"); + + setLoading(false); + return; + } + } + + // تجهيز البيانات حسب شكل الـ backend + const cartData = { + data: { + type: "cart", + attributes: { + totalPrice: cart.reduce((sum, item) => sum + (item.totalPrice || 0), 0), + }, + relationships: { + admin: { + data: { id: adminId }, + }, + cartItems: cart.map(item => ({ + attributes: { quantity: item.quantity }, + relationships: { product: { data: { id: item.id } } }, + })), + }, + }, + }; + + const newCart = await createNewCart(cartData); + + if (newCart && newCart.success) { + onCartCreated(newCart.data); + clearCart(); + onClose(); + showSnackbar("Cart sent successfully!", "success"); + } else { + console.error("Failed to create cart:", newCart.message); + } + } catch (error) { + // console.error("Error sending cart:", error); + showSnackbar("Failed to create cart.", "error"); + } finally { + setLoading(false); + } +}; + + + + if (loading) return ; + + return ( + + {/* السهم للعودة */} + + + + + + Current Cart + + + + {cart.length === 0 ? ( + No items in cart. + ) : ( + <> + {cart.map(item => ( + + + {item.name} + Unit: {item.unit} + + + Quantity: {item.quantity} + Total: ${item.totalPrice} + + + ))} + + + + Total Price: ${totalPrice.toFixed(2)} + + + + )} + + {cart.length > 0 && ( + + + + + )} + + ); +}; + +export default CartView; diff --git a/src/components/Home/Order/contect/OrderDetails.js b/src/components/Home/Order/contect/OrderDetails.js new file mode 100644 index 0000000..04c6395 --- /dev/null +++ b/src/components/Home/Order/contect/OrderDetails.js @@ -0,0 +1,223 @@ +import React, { useState } from 'react'; +import { + Box, + Typography, + Paper, + List, + ListItem, + ListItemText, + Button, + TextField, + Dialog, + DialogActions, + DialogContent, + DialogContentText, + DialogTitle, + CircularProgress +} from '@mui/material'; +import authService from '../../../../services/authService'; +import { useSnackbar } from "../../../../contexts/SnackbarContext"; + +const CartDetails = ({ cart, onClose, onUpdated, onDeleted }) => { + const [editMode, setEditMode] = useState(false); + const [totalPrice, setTotalPrice] = useState(cart?.attributes?.total_price || ""); + const [cartItems, setCartItems] = useState(cart.relationships?.cartItems || cart.relationships?.cart_items || []); + const [loading, setLoading] = useState(false); + const [deleteLoading, setDeleteLoading] = useState(false); + const [openDeleteDialog, setOpenDeleteDialog] = useState(false); + const { showSnackbar } = useSnackbar(); + if (!cart) return null; + + const handleSaveAll = async () => { + setLoading(true); + const payload = { + data: { + type: "cart", + attributes: { + totalPrice: Number(totalPrice), + }, + relationships: { + cartItems: cartItems.map(item => ({ + attributes: { + quantity: Number(item.attributes.quantity), + }, + relationships: { + product: { + data: { + id: item.relationships?.supplier_product?.id || + item.relationships?.product?.data?.id + } + } + } + })), + }, + }, + }; + + try { + const result = await authService.updateCart(cart.id, payload); + if (result.success) { + onUpdated(result.data); + setEditMode(false); + } else { + // alert(result.message || 'Failed to update cart'); + showSnackbar(result.message || "Failed to update cart", "error"); + } + } catch (error) { + // alert('An error occurred while updating the cart'); + showSnackbar("An error occurred while updating the cart", "error"); + } finally { + setLoading(false); + } + }; + + const handleDeleteCart = async () => { + setDeleteLoading(true); + try { + const result = await authService.deleteCart(cart.id); + if (result.success) { + onDeleted(cart.id); + onClose(); + } else { + // alert(result.message || 'Failed to delete cart'); + showSnackbar(result.message || "Failed to update cart", "error"); + } + } catch (error) { + // alert('An error occurred while deleting the cart'); + showSnackbar("An error occurred while deleting the cart", "error"); + } finally { + setDeleteLoading(false); + setOpenDeleteDialog(false); + } + }; + + const handleChangeQuantity = (itemId, newQuantity) => { + setCartItems(prev => + prev.map(item => + item.id === itemId + ? { ...item, attributes: { ...item.attributes, quantity: newQuantity } } + : item + ) + ); + }; + + return ( + <> + + + Cart #{cart.id} Details + + + {editMode ? ( + <> + setTotalPrice(e.target.value)} + fullWidth + sx={{ mb: 2 }} + /> + + Items: + + {cartItems.map(item => ( + + handleChangeQuantity(item.id, Number(e.target.value))} + sx={{ width: '120px' }} + /> + } + /> + + ))} + + + + + + + + ) : ( + <> + Total Price: {cart.attributes.total_price || cart.attributes.totalPrice} + + Created At: {new Date(cart.attributes.createdAt).toLocaleString()} + + Items: + + {cartItems.map(item => ( + + + + ))} + + + + + + + + + )} + + + {/* Delete Confirmation Dialog */} + setOpenDeleteDialog(false)} + > + Confirm Delete + + + Are you sure you want to delete this cart? This action cannot be undone. + + + + + + + + + ); +}; + +export default CartDetails; \ No newline at end of file diff --git a/src/components/Home/Order/contect/Orders.js b/src/components/Home/Order/contect/Orders.js new file mode 100644 index 0000000..e82ea5a --- /dev/null +++ b/src/components/Home/Order/contect/Orders.js @@ -0,0 +1,326 @@ +import React, { useState, useEffect } from 'react'; +import { + useMediaQuery, + Box, + Typography, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, + Paper, + IconButton, + Skeleton, + CircularProgress, + Button +} from '@mui/material'; +import { useTheme } from '@mui/material/styles'; +import ArrowBackIosNewIcon from '@mui/icons-material/ArrowBackIosNew'; +import ArrowForwardIosIcon from '@mui/icons-material/ArrowForwardIos'; +import authService from '../../../../services/authService'; +import CartDetails from './OrderDetails'; +import CartView from './CartView'; + +const SimplePagination = ({ currentPage, pageCount, onChange }) => { + const theme = useTheme(); + const handlePrev = () => { if (currentPage > 1) onChange(currentPage - 1); }; + const handleNext = () => { if (currentPage < pageCount) onChange(currentPage + 1); }; + + return ( + + + + + + + {currentPage} + + + = pageCount} + sx={{ + borderRadius: '8px', + backgroundColor: '#FFECE0', + '&:hover': { backgroundColor: '#FFD6B5' }, + color: theme.palette.primary.main, + '&.Mui-disabled': { color: '#ccc', backgroundColor: '#FFF5E6' }, + }} + > + + + + ); +}; + +const Orders = ({ adminId }) => { + useEffect(() => { + console.log('Admin ID from props:', adminId); + }, [adminId]); + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('sm')); + const [ordersData, setOrdersData] = useState([]); + const [loading, setLoading] = useState(true); + const [selectedCart, setSelectedCart] = useState(null); + const [cartLoading, setCartLoading] = useState(false); + const [showCartView, setShowCartView] = useState(false); // ← التحكم بعرض CartView هنا + + const [currentPage, setCurrentPage] = useState(1); + const itemsPerPage = 6; + const [orders, setOrders] = useState([]); + + const handleAddOrder = (newOrder) => { + setOrders((prevOrders) => [...prevOrders, newOrder]); + }; + + useEffect(() => { + const fetchOrders = async () => { + setLoading(true); + try { + const result = await authService.getCart(); + if (result.success) { + setOrdersData(Array.isArray(result.data) ? result.data : []); + } else { + console.error(result.message); + setOrdersData([]); + } + } catch (error) { + console.error('Failed to fetch orders:', error); + setOrdersData([]); + } + setLoading(false); + }; + fetchOrders(); + }, []); + + const handleRowClick = async (cartId) => { + setCartLoading(true); + try { + const result = await authService.getCartById(cartId); + if (result.success) setSelectedCart(result.data); + else console.error(result.message); + } catch (error) { + console.error('Failed to fetch cart details:', error); + } + setCartLoading(false); + }; + + const handleCartUpdated = (updatedCart) => { + setOrdersData(prev => + prev.map(cart => cart.id === updatedCart.id ? updatedCart : cart) + ); + setSelectedCart(null); + }; + + const handleCloseCartDetails = () => { setSelectedCart(null); }; + + const pageCount = Math.ceil(ordersData.length / itemsPerPage); + const paginatedOrders = ordersData.slice( + (currentPage - 1) * itemsPerPage, + currentPage * itemsPerPage + ); + + if (cartLoading) { + return ( + + + + ); + } + + if (selectedCart) { + return ( + + ); + } + + // عرض CartView بدل الطلبات إذا تم الضغط على الزر + // داخل Orders.js +if (showCartView) { + return ( + setShowCartView(false)} + onSend={handleAddOrder} + onCartCreated={(newCart) => { + setOrdersData(prev => [newCart, ...prev]); // ضف الكارت الجديد مباشرة + setShowCartView(false); + }} + adminId={adminId} // ← أرسل الـ adminId هنا + /> + ); +} + + + + return ( + + + + Order + + + + + + + {/* جدول الطلبات */} + + + + + Cart ID + Total Price + Created At + Items Count + + + + {loading + ? Array.from({ length: itemsPerPage }).map((_, idx) => ( + + + + + + + )) + : ( + <> + {paginatedOrders.map(order => { + const attributes = order?.attributes || {}; + const relationships = order?.relationships || {}; + const cartItems = relationships?.cartItems || relationships?.cart_items || []; + return ( + handleRowClick(order.id)} + > + {order?.id || '--'} + {attributes?.totalPrice ?? attributes?.total_price ?? '0.00'} + {attributes?.createdAt ? new Date(attributes.createdAt).toLocaleString() : '--'} + {cartItems.length} + + ); + })} + + {paginatedOrders.length < itemsPerPage && + Array.from({ length: itemsPerPage - paginatedOrders.length }).map((_, idx) => ( + + + + )) + } + + + + ) + } + +
+
+ + + + Showing {(currentPage - 1) * itemsPerPage + 1} - {Math.min(currentPage * itemsPerPage, ordersData.length)} of {ordersData.length} + + + + +
+ ); +}; + +export default Orders; diff --git a/src/components/Home/ResList/AppBar.js b/src/components/Home/ResList/AppBar.js new file mode 100644 index 0000000..bf65dd5 --- /dev/null +++ b/src/components/Home/ResList/AppBar.js @@ -0,0 +1,136 @@ +import React from 'react'; +import { + AppBar, + Toolbar, + Box, + ListItemIcon, + ListItemText, + Typography, + useTheme, + useMediaQuery, +} from '@mui/material'; +import { useNavigate } from 'react-router-dom'; +import LogoutIcon from '@mui/icons-material/Logout'; +import authService from '../../../services/authService'; + +const KitchPlusAppBar = ({ onDrawerToggle, sidebarOpen, isMobile }) => { + const theme = useTheme(); + const navigate = useNavigate(); + const isSmallScreen = useMediaQuery(theme.breakpoints.down('sm')); + + // دالة تسجيل الخروج المعدلة + const handleLogout = async () => { + try { + const result = await authService.logout(); + + if (result.success) { + localStorage.removeItem('token'); + navigate('/login'); + } else { + console.error('Logout failed:', result.message); + } + } catch (error) { + console.error('Logout error:', error); + } + }; + + return ( + + + {/* Left: Logo */} + + + + KITCH + + + PLUS + + + + {/* Right: Log Out Button */} + + + + + + + + + + + ); +}; + +export default KitchPlusAppBar; diff --git a/src/components/Home/ResList/RestaurantDetailsModal.js b/src/components/Home/ResList/RestaurantDetailsModal.js new file mode 100644 index 0000000..c8a1f32 --- /dev/null +++ b/src/components/Home/ResList/RestaurantDetailsModal.js @@ -0,0 +1,60 @@ +import React from "react"; +import { + Dialog, + DialogTitle, + DialogContent, + DialogActions, + Typography, + Button, + Box, +} from "@mui/material"; + +const RestaurantDetailsModal = ({ open, onClose, restaurant }) => { + if (!restaurant) return null; + + return ( + + {restaurant.name} + + + {restaurant.cuisine_type && ( + Cuisine Type: {restaurant.cuisine_type.name} + )} + Location: {restaurant.location} + Brand Details: {restaurant.brand_details || 'N/A'} + Age Group: {restaurant.age_group} + Menu Status: {restaurant.menu_status ? 'Active' : 'Inactive'} + Need Help: {restaurant.need_help || 'N/A'} + {restaurant.operational_details && ( + <> + Staff Members: {restaurant.operational_details.staff_members} + Equipment: {restaurant.operational_details.equipment} + Specialized Equipment: {restaurant.operational_details.specialized_equipment} + Expansion Cities: {restaurant.operational_details.expansion_plan_cities} + + )} + {restaurant.budget_expansion && ( + <> + Estimated Budget: {restaurant.budget_expansion.estimated_budget} + Expansion Branches: {restaurant.budget_expansion.expansion_branches} + + )} + {restaurant.created_by && ( + Created By: {restaurant.created_by.name} + )} + + + + + + + ); +}; + +export default RestaurantDetailsModal; diff --git a/src/components/Home/ResList/RestaurantProfile.js b/src/components/Home/ResList/RestaurantProfile.js new file mode 100644 index 0000000..a7052b3 --- /dev/null +++ b/src/components/Home/ResList/RestaurantProfile.js @@ -0,0 +1,76 @@ +import React, { useState, useEffect } from 'react'; +import { Box, useTheme, useMediaQuery } from '@mui/material'; +import KitchPlusAppBar from './AppBar'; +import RestaurantSelection from './RestaurantSelection'; +import authService from '../../../services/authService'; + +const RestaurantProfile = () => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('sm')); + const [restaurants, setRestaurants] = useState([]); + const [loading, setLoading] = useState(false); + + useEffect(() => { + const fetchRestaurants = async () => { + setLoading(true); + const result = await authService.getRestaurants(); + if (result.success) { + const mappedRestaurants = result.data.map((res) => ({ + id: res.id, + name: res.name, + location: res.location || '', + image: res.image_url, + address: res.address || '', + })); + setRestaurants(mappedRestaurants); + } else { + alert(result.message || 'خطأ في جلب المطاعم'); + } + setLoading(false); + }; + + fetchRestaurants(); + }, []); + + const handleDrawerToggle = () => {}; + const handleCreateRestaurant = () => { + alert('Redirect to restaurant creation page or open a form!'); + }; + + return ( + + + + + + + + + + ); +}; + +export default RestaurantProfile; diff --git a/src/components/Home/ResList/RestaurantSelection.js b/src/components/Home/ResList/RestaurantSelection.js new file mode 100644 index 0000000..79522fc --- /dev/null +++ b/src/components/Home/ResList/RestaurantSelection.js @@ -0,0 +1,186 @@ +import React, { useState } from 'react'; +import { + Box, + Typography, + Grid, + useTheme, + useMediaQuery, + IconButton, + Skeleton +} from '@mui/material'; +import { useNavigate } from 'react-router-dom'; +import AddToPhotosIcon from '@mui/icons-material/AddToPhotos'; +import InfoIcon from '@mui/icons-material/Info'; +import { useRestaurant } from '../../../contexts/RestaurantContext'; +import RestaurantDetailsModal from './RestaurantDetailsModal'; +import authService from '../../../services/authService'; +const RestaurantSelection = ({ restaurants = [], loading = false }) => { + const theme = useTheme(); + const isSmall = useMediaQuery(theme.breakpoints.down('sm')); + const navigate = useNavigate(); // استخدم navigate للتوجيه + const { setRestaurantId } = useRestaurant(); + + const [selectedRestaurant, setSelectedRestaurant] = useState(null); + const [modalOpen, setModalOpen] = useState(false); + + const handleSelectRestaurant = (id) => { + setRestaurantId(id); + navigate('/dashboard'); + }; + + const fetchRestaurantDetails = async (id) => { + try { + const result = await authService.getRestaurantById(id); + if (result.success) { + setSelectedRestaurant(result.data); + setModalOpen(true); + } else { + alert(result.message || 'Failed to fetch restaurant details'); + } + } catch (error) { + console.error('Error fetching restaurant details:', error); + } + }; + + // ✅ دالة التوجيه عند الضغط على زر الإنشاء + const handleCreateClick = () => { + navigate('/create-restaurant'); // توجه مباشرة إلى صفحة الإنشاء + }; + return ( + + {/* زر إنشاء مطعم */} + + + + + + + + Create New Restaurant + + + Start from scratch and build your restaurant profile + + + + + {/* قائمة المطاعم */} + + + Existing Restaurants + + + {restaurants.length === 0 && !loading ? ( + + No restaurants found. Create one to get started. + + ) : ( + + {(loading ? Array.from(new Array(3)) : restaurants).map((restaurant, index) => ( + + {loading ? ( + + ) : ( + handleSelectRestaurant(restaurant.id)} + > + {/* أيقونة فتح المودال */} + { + e.stopPropagation(); + fetchRestaurantDetails(restaurant.id); + }} + sx={{ + position: 'absolute', + top: 8, + right: 8, + backgroundColor: 'rgba(255,255,255,0.8)', + '&:hover': { + backgroundColor: 'rgba(255,255,255,1)', + transform: 'scale(1.1)', + transition: 'transform 0.2s' + }, + zIndex: 2, + padding: 0.5 + }} + size="small" + > + + + + {/* صورة المطعم */} + + + + + {/* باقي الكارت */} + + + {restaurant.name} + + + + {restaurant.location || ' '} + + + + )} + + ))} + + )} + + + {/* مودال المطعم */} + setModalOpen(false)} + restaurant={selectedRestaurant} + /> + + ); +}; + +export default RestaurantSelection; diff --git a/src/components/Home/RestaurantProfile/RestaurantProfile.js b/src/components/Home/RestaurantProfile/RestaurantProfile.js new file mode 100644 index 0000000..f67ad6b --- /dev/null +++ b/src/components/Home/RestaurantProfile/RestaurantProfile.js @@ -0,0 +1,161 @@ +import React, { useState } from 'react'; +import { Box } from '@mui/material'; +import BasicInformation from './contcet/BasicInformation'; +import ContactInformation from './contcet/ContactInformation'; +import BusinessHours from './contcet/BusinessHours'; +import Equipment from './contcet/Equipment'; +import TypeOfRestaurant from './contcet/TypeOfRestaurant'; +import OperationalCapacity from './contcet/OperationalCapacity'; +import SideProfile from './SideProfile'; +import AccountProfile from '../Settings/AccountProfile'; +import authService from '../../../services/authService'; +import { useRestaurant } from '../../../contexts/RestaurantContext'; +import ConfirmationDialog from './contcet/ConfirmationDialog'; + +const RestaurantProfile = () => { + const { restaurantId } = useRestaurant(); + const [currentStep, setCurrentStep] = useState(0); + const [formData, setFormData] = useState({}); + const [modalOpen, setModalOpen] = useState(false); + const [showSetting, setShowSetting] = useState(false); + + const updateFormData = (newData) => + setFormData((prev) => ({ ...prev, ...newData })); + + const handleSubmit = async () => { + if (!restaurantId) return; + + const payload = { + restaurant_name: formData.restaurant_name || '', + restaurant_type: formData.restaurant_type || '', + Address: formData.Address || '', + City: formData.City || '', + Postal_code: formData.Postal_code || '', + Phone: formData.Phone || '', + Email: formData.Email || '', + Operation_hour: formData.Operation_hour || '', + closed_days: formData.closed_days || [], + equipment: { + ...formData.equipment // ✅ أخذ جميع المعدات من Equipment مباشرة + }, + Maximum_orders_per_day: formData.Maximum_orders_per_day || 0, + Number_of_Cheff: formData.Number_of_Cheff || 0, + Number_of_Waiters: formData.Number_of_Waiters || 0, + Number_of_Cookers: formData.Number_of_Cookers || 0, + host_type: formData.ownRestaurantType || '', + collaboration_type: formData.collaborateRestaurantType || '' + }; + + try { + const res = await authService.createRestaurantProfile(restaurantId, payload); + if (res.success) { + setModalOpen(true); + + // بعد 10 ثواني يغلق المودال ويظهر الـ AccountProfile + setTimeout(() => { + setModalOpen(false); + setShowSetting(true); + }, 10000); // ✅ صار 10 ثواني بدل 5 + } else { + console.error("Profile creation failed:", res.message, res.errors); + } + } catch (error) { + console.error(error); + } + }; + + const steps = [ + setCurrentStep((p) => p + 1)} + />, + setCurrentStep((p) => p + 1)} + onBack={() => setCurrentStep((p) => p - 1)} + />, + setCurrentStep((p) => p + 1)} + onBack={() => setCurrentStep((p) => p - 1)} + />, + setCurrentStep((p) => p + 1)} + onBack={() => setCurrentStep((p) => p - 1)} + />, + setCurrentStep((p) => p + 1)} + onBack={() => setCurrentStep((p) => p - 1)} + />, + setCurrentStep((p) => p - 1)} + onRegister={handleSubmit} + /> + ]; + + return ( + + + {/* إظهار SideProfile فقط إذا لم يتم التحويل إلى AccountProfile */} + {!showSetting && ( + + + setCurrentStep((prev) => Math.max(prev - 1, 0))} + /> + + + )} + + + + {showSetting ? : steps[currentStep]} + + + + {/* مودال بدون أزرار */} + {}} hideButtons={true} /> + + ); +}; + +export default RestaurantProfile; diff --git a/src/components/Home/RestaurantProfile/SideProfile.js b/src/components/Home/RestaurantProfile/SideProfile.js new file mode 100644 index 0000000..c63f45c --- /dev/null +++ b/src/components/Home/RestaurantProfile/SideProfile.js @@ -0,0 +1,163 @@ +import React from 'react'; +import { Box, Typography, Stack, Button, useTheme } from '@mui/material'; +import ArrowBackIosIcon from '@mui/icons-material/ArrowBackIos'; + +const steps = [ + { title: 'Basic Information', icon: '/images/createProfile/BasicInf.png' }, + { title: 'Contact Information', icon: '/images/createProfile/ContactInf.png' }, + { title: 'Business Hours', icon: '/images/createProfile/BusinessHours.png' }, + // { title: 'Menu Upload', icon: '/images/createProfile/MenuUpload.png' }, + { title: 'Available Equipment', icon: '/images/createProfile/equipment.png' }, + { title: 'Operational Capacity', icon: '/images/icons/rocket.png' }, + { title: 'Type of Restaurant', icon: '/images/createProfile/TypeOfRestaurant.png' }, + // { title: 'Upload Photos', icon: '/images/createProfile/UploadPhotos.png' }, + { title: 'Submit & Confirmation', icon: '/images/createProfile/Confirmation.png' }, +]; + +const SideProfile = ({ currentStepIndex = 0, onBack }) => { + const theme = useTheme(); + + return ( + + {/* العنوان الرئيسي */} + + Restaurant Registration Flow + + + Complete this process to register your restaurant on our amazing food platform. + + + {/* الخطوات */} + + {steps.map((step, index) => ( + + {/* الخط الرأسي بين الدوائر */} + {index !== steps.length - 1 && ( + + )} + + {/* محتوى كل خطوة */} + + {/* الدائرة بالأيقونة */} + + {/* الدائرة الخلفية - تظهر دائمًا */} + + + {/* الدائرة الأمامية بالأيقونة */} + + {step.title} + + + + {/* العنوان */} + + {step.title} + + + + ))} + + + {/* زر الرجوع */} + + + + + ); +}; + +export default SideProfile; diff --git a/src/components/Home/RestaurantProfile/all.js b/src/components/Home/RestaurantProfile/all.js new file mode 100644 index 0000000..b5ab999 --- /dev/null +++ b/src/components/Home/RestaurantProfile/all.js @@ -0,0 +1,124 @@ +import React, { useEffect, useState, useCallback } from "react"; +import { CircularProgress, Box, useTheme, useMediaQuery, Skeleton } from "@mui/material"; +import RestaurantProfile from "./RestaurantProfile"; +import Setting from "../Settings/AccountProfile"; +import authService from "../../../services/authService"; +import { useRestaurant } from "../../../contexts/RestaurantContext"; +import KitchPlusAppBar from "../AppBar"; +import Sidebar from "../SideHome" +const drawerWidth = 230; + +const RestaurantWrapper = () => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down("sm")); + const { restaurantId } = useRestaurant(); + + const [loading, setLoading] = useState(true); + const [hasProfile, setHasProfile] = useState(false); + const [sidebarOpen, setSidebarOpen] = useState(!isMobile); + + const fetchProfile = useCallback(async () => { + if (!restaurantId) { + setLoading(false); + return; + } + setLoading(true); + try { + const profile = await authService.getRestaurantProfile(restaurantId); + setHasProfile(profile && Object.keys(profile).length > 0); + } catch (error) { + console.error("Error checking restaurant profile:", error); + setHasProfile(false); + } finally { + setLoading(false); + } + }, [restaurantId]); + + useEffect(() => { + fetchProfile(); + }, [fetchProfile]); + + useEffect(() => { + const handleResize = () => + setSidebarOpen(window.innerWidth >= theme.breakpoints.values.md); + handleResize(); + window.addEventListener("resize", handleResize); + return () => window.removeEventListener("resize", handleResize); + }, [theme.breakpoints.values.md]); + + const handleDrawerToggle = () => setSidebarOpen(!sidebarOpen); + + return ( + + {/* البار الجانبي */} + + + {/* المحتوى الرئيسي */} + + {/* البار العلوي */} + + + {/* المحتوى حسب وجود البروفايل */} + + {loading ? ( + // Skeleton placeholder + + + + + + + ) : hasProfile ? ( + + ) : ( + + )} + + + + ); +}; + +export default RestaurantWrapper; diff --git a/src/components/Home/RestaurantProfile/contcet/BasicInformation.js b/src/components/Home/RestaurantProfile/contcet/BasicInformation.js new file mode 100644 index 0000000..d531179 --- /dev/null +++ b/src/components/Home/RestaurantProfile/contcet/BasicInformation.js @@ -0,0 +1,161 @@ +import React, { useState } from 'react'; +import { Box, Typography, Stack, Button, useTheme, TextField } from '@mui/material'; + +const BasicInformation = ({ formData, updateFormData, onNext, onBack }) => { + const theme = useTheme(); + + const [errors, setErrors] = useState({}); + + const handleChange = (field, value) => { + updateFormData({ [field]: value }); + // إزالة رسالة الخطأ عند التعديل + setErrors(prev => ({ ...prev, [field]: '' })); + }; + + const validateFields = () => { + const newErrors = {}; + if (!formData.restaurant_name || formData.restaurant_name.trim() === '') newErrors.restaurant_name = 'Restaurant Name is required'; + if (!formData.restaurant_type || formData.restaurant_type.trim() === '') newErrors.restaurant_type = 'Restaurant Type is required'; + if (!formData.Address || formData.Address.trim() === '') newErrors.Address = 'Address is required'; + if (!formData.City || formData.City.trim() === '') newErrors.City = 'City is required'; + if (!formData.Postal_code || formData.Postal_code.trim() === '') newErrors.Postal_code = 'Postal Code is required'; + setErrors(newErrors); + return Object.keys(newErrors).length === 0; + }; + + const handleNextClick = () => { + if (validateFields()) { + onNext(); + } + }; + + const fields = [ + { label: 'Restaurant Name', placeholder: 'Al-Baik Foods', field: 'restaurant_name' }, + { label: 'Restaurant Type', placeholder: 'Fast Food', field: 'restaurant_type' }, + { label: 'Address', placeholder: 'Ward # 13', field: 'Address' }, + { label: 'City', placeholder: 'Jordan', field: 'City' }, + { label: 'Postal Code', placeholder: '31200', field: 'Postal_code' }, + ]; + + return ( + + + + Basic Information + + + + + Enter your basic information to proceed to registration of your own restaurant on this platform + + + + {fields.map((fieldObj, index) => ( + + + {fieldObj.label} + + handleChange(fieldObj.field, e.target.value)} + error={!!errors[fieldObj.field]} + helperText={errors[fieldObj.field] || ' '} + sx={{ + pb:-1, + '& input': { fontWeight: 500, fontSize: '15px' }, + '& input::placeholder': { color: '#969BA7' }, + '& .MuiOutlinedInput-root': { + borderRadius: '10px', + transition: '0.3s', + '&.Mui-focused fieldset': { + borderColor: theme.palette.primary.main, + boxShadow: '0 0 0 2px rgba(255, 145, 77, 0.2)' + } + }, + '& .MuiOutlinedInput-root.Mui-focused': { + borderColor: '#3f51b5', + boxShadow: '0 0 0 2px rgba(63,81,181,0.1)' + } + }} + /> + + ))} + + + + + + + + + ); +}; + +export default BasicInformation; diff --git a/src/components/Home/RestaurantProfile/contcet/BusinessHours.js b/src/components/Home/RestaurantProfile/contcet/BusinessHours.js new file mode 100644 index 0000000..aa64844 --- /dev/null +++ b/src/components/Home/RestaurantProfile/contcet/BusinessHours.js @@ -0,0 +1,207 @@ +import React, { useState, useEffect } from 'react'; +import { + Box, + Typography, + Stack, + Button, + useTheme, + TextField, + Checkbox, + FormGroup, + FormControlLabel +} from '@mui/material'; + +const BusinessHours = ({ formData, updateFormData, onNext, onBack }) => { + const theme = useTheme(); + + const [selectedDays, setSelectedDays] = useState(formData.closed_days || []); + const [operationHours, setOperationHours] = useState(formData.Operation_hour || ''); + const [errors, setErrors] = useState({}); + + const days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']; + + useEffect(() => { + updateFormData({ + Operation_hour: operationHours, // الاسم الآن مطابق للـ API + closed_days: selectedDays + }); + }, [operationHours, selectedDays]); + + const handleCheckboxChange = (day) => { + const updatedDays = selectedDays.includes(day) + ? selectedDays.filter(d => d !== day) + : [...selectedDays, day]; + setSelectedDays(updatedDays); + }; + + const validateFields = () => { + const newErrors = {}; + if (!operationHours || operationHours.trim() === '') { + newErrors.operationHours = 'Operational hours are required'; + } else { + // Regex للتحقق من الصيغة hh:mm AM/PM - hh:mm AM/PM + const regex = /^([0]?[1-9]|1[0-2]):([0-5][0-9])\s?(AM|PM)\s?-\s?([0]?[1-9]|1[0-2]):([0-5][0-9])\s?(AM|PM)$/i; + if (!regex.test(operationHours.trim())) { + newErrors.operationHours = 'Invalid format (e.g., "9:00 AM - 11:00 PM")'; + } + } + + if (selectedDays.length === 7) { + newErrors.closedDays = 'Restaurant cannot be closed all week'; + } + + setErrors(newErrors); + return Object.keys(newErrors).length === 0; + }; + + const handleNextClick = () => { + if (validateFields()) { + onNext(); + } + }; + + return ( + + + + Business Hours + + + + + Enter your business hours to proceed to registration of your own restaurant on this platform + + + + {/* Operational Hours Input */} + + + Operational Hours + + setOperationHours(e.target.value)} + error={!!errors.operationHours} + helperText={errors.operationHours || ' '} + sx={{ + '& input': { fontWeight: 500, fontSize: '15px' }, + '& input::placeholder': { color: '#969BA7' }, + '& .MuiOutlinedInput-root': { + borderRadius: '10px', + transition: '0.3s', + '&.Mui-focused fieldset': { + borderColor: theme.palette.primary.main, + boxShadow: '0 0 0 2px rgba(255, 145, 77, 0.2)' + } + }, + '& .MuiOutlinedInput-root.Mui-focused': { + borderColor: '#3f51b5', + boxShadow: '0 0 0 2px rgba(63,81,181,0.1)' + } + }} + /> + + + {/* Checkboxes for Days of the Week */} + + + Closed Days + + + {days.map(day => { + const isChecked = selectedDays.includes(day); + return ( + handleCheckboxChange(day)} + sx={{ + transform: 'scale(1.5)', + color: '#F0EDED', + '&.Mui-checked': { color: '#FF914D' }, + }} + /> + } + label={ + + {day} + + } + sx={{ m: 0, width: { xs: '45%', sm: '30%', md: '22%' } }} + /> + ); + })} + + {errors.closedDays && ( + + {errors.closedDays} + + )} + + + {/* Next & Back Buttons */} + + + + + + + + ); +}; + +export default BusinessHours; diff --git a/src/components/Home/RestaurantProfile/contcet/ConfirmationDialog.js b/src/components/Home/RestaurantProfile/contcet/ConfirmationDialog.js new file mode 100644 index 0000000..b92b113 --- /dev/null +++ b/src/components/Home/RestaurantProfile/contcet/ConfirmationDialog.js @@ -0,0 +1,109 @@ +import React from 'react'; +import { + Dialog, + DialogTitle, + DialogContent, + DialogContentText, + Box, + Typography, + useTheme, +} from '@mui/material'; + +const ConfirmationDialog = ({ open, onClose }) => { + const theme = useTheme(); + + return ( + + + + + + Success icon + + + + + + Register successful! + + + + + + Congratulations! You have registered your restaurant successfully on our platform + + + + + ); +}; + +export default ConfirmationDialog; diff --git a/src/components/Home/RestaurantProfile/contcet/ContactInformation.js b/src/components/Home/RestaurantProfile/contcet/ContactInformation.js new file mode 100644 index 0000000..a2cece0 --- /dev/null +++ b/src/components/Home/RestaurantProfile/contcet/ContactInformation.js @@ -0,0 +1,175 @@ +import React, { useState } from 'react'; +import { Box, Typography, Stack, Button, useTheme, TextField } from '@mui/material'; + +const ContactInformation = ({ formData, updateFormData, onNext, onBack }) => { + const theme = useTheme(); + const [errors, setErrors] = useState({}); + + const handleChange = (field, value) => { + updateFormData({ [field]: value }); + setErrors(prev => ({ ...prev, [field]: '' })); // إزالة الخطأ عند التعديل + }; + + const validateFields = () => { + const newErrors = {}; + if (!formData.Phone || formData.Phone.trim() === '') { + newErrors.Phone = 'Phone number is required'; + } else if (!/^\+?\d{7,15}$/.test(formData.Phone.trim())) { + newErrors.Phone = 'Invalid phone number'; + } + + if (!formData.Email || formData.Email.trim() === '') { + newErrors.Email = 'Email is required'; + } else if (!/^[\w-.]+@([\w-]+\.)+[\w-]{2,4}$/.test(formData.Email.trim())) { + newErrors.Email = 'Invalid Email address'; + } + + setErrors(newErrors); + return Object.keys(newErrors).length === 0; + }; + + const handleNextClick = () => { + if (validateFields()) { + onNext(); + } + }; + + return ( + + + + Contact Information + + + + + Enter your contact information to proceed to registration of your own restaurant on this platform + + + + {/* Phone Number Input */} + + + Phone Number + + handleChange('Phone', e.target.value)} + error={!!errors.Phone} + helperText={errors.Phone || ' '} + sx={{ + '& input': { fontWeight: 500, fontSize: '15px' }, + '& input::placeholder': { color: '#969BA7' }, + '& .MuiOutlinedInput-root': { + borderRadius: '10px', + transition: '0.3s', + '&.Mui-focused fieldset': { + borderColor: theme.palette.primary.main, + boxShadow: '0 0 0 2px rgba(255, 145, 77, 0.2)' + } + }, + '& .MuiOutlinedInput-root.Mui-focused': { + borderColor: '#3f51b5', + boxShadow: '0 0 0 2px rgba(63,81,181,0.1)' + } + }} + /> + + + {/* Email Input */} + + + Email + + handleChange('Email', e.target.value)} + error={!!errors.Email} + helperText={errors.Email || ' '} + sx={{ + '& input': { fontWeight: 500, fontSize: '15px' }, + '& input::placeholder': { color: '#969BA7' }, + '& .MuiOutlinedInput-root': { + borderRadius: '10px', + transition: '0.3s', + '&.Mui-focused fieldset': { + borderColor: theme.palette.primary.main, + boxShadow: '0 0 0 2px rgba(255, 145, 77, 0.2)' + } + }, + '& .MuiOutlinedInput-root.Mui-focused': { + borderColor: '#3f51b5', + boxShadow: '0 0 0 2px rgba(63,81,181,0.1)' + } + }} + /> + + + {/* Next & Back Buttons */} + + + + + + + + ); +}; + +export default ContactInformation; diff --git a/src/components/Home/RestaurantProfile/contcet/Equipment.js b/src/components/Home/RestaurantProfile/contcet/Equipment.js new file mode 100644 index 0000000..2473e32 --- /dev/null +++ b/src/components/Home/RestaurantProfile/contcet/Equipment.js @@ -0,0 +1,258 @@ +import React, { useState, useEffect } from 'react'; +import { + Box, + Typography, + Stack, + Button, + useTheme, + TextField, + Modal, +} from '@mui/material'; +import AddIcon from '@mui/icons-material/Add'; +import { useNavigate } from 'react-router-dom'; + +const Equipment = ({ formData, updateFormData, onNext, onBack }) => { + const theme = useTheme(); + const navigate = useNavigate(); + + const [equipment, setEquipment] = useState(formData.equipment || { + oven: '', + grill: '', + freezer: '', + }); + + const [errors, setErrors] = useState({}); + const [modalOpen, setModalOpen] = useState(false); + const [newEquipment, setNewEquipment] = useState({ name: '', quantity: '' }); + + useEffect(() => { + updateFormData({ equipment }); + }, [equipment]); + + const handleInputChange = (key, value) => { + setEquipment(prev => ({ ...prev, [key]: value })); + }; + + const validateFields = () => { + const newErrors = {}; + Object.entries(equipment).forEach(([key, value]) => { + if (!value || isNaN(value) || Number(value) < 0) { + newErrors[key] = `${key} must be a positive number`; + } + }); + setErrors(newErrors); + return Object.keys(newErrors).length === 0; + }; + + const handleNextClick = () => { + if (validateFields()) { + if (onNext) onNext(); + else navigate('/dashboard'); + } + }; + + const handleAddEquipment = () => { + if (!newEquipment.name.trim() || !newEquipment.quantity || isNaN(newEquipment.quantity)) { + return; + } + setEquipment(prev => ({ + ...prev, + [newEquipment.name.toLowerCase()]: newEquipment.quantity, + })); + setNewEquipment({ name: '', quantity: '' }); + setModalOpen(false); + }; + + return ( + + + + Equipment + + + + + Enter your kitchen equipment details to complete your restaurant registration. + + + + {/* Dynamic Equipment Fields */} + {Object.keys(equipment).map((key) => ( + handleInputChange(key, val)} + error={errors[key]} + /> + ))} + + {/* Add More Equipment Button */} + + + + + {/* Next Button */} + + + + + + + + {/* Modal for Adding Equipment */} + setModalOpen(false)}> + + + Add New Equipment + + setNewEquipment({ ...newEquipment, name: e.target.value })} + sx={{ mb: 2 }} + /> + setNewEquipment({ ...newEquipment, quantity: e.target.value })} + sx={{ mb: 2 }} + /> + + + + + ); +}; + +const InputField = ({ label, placeholder, theme, value, onChange, error }) => ( + + + {label} + + onChange(e.target.value)} + error={!!error} + helperText={error || ' '} + sx={{ + '& input': { fontWeight: 500, fontSize: '15px' }, + '& input::placeholder': { color: '#969BA7' }, + '& .MuiOutlinedInput-root': { + borderRadius: '10px', + transition: '0.3s', + '&.Mui-focused fieldset': { + borderColor: theme.palette.primary.main, + boxShadow: '0 0 0 2px rgba(255, 145, 77, 0.2)', + } + }, + '& .MuiOutlinedInput-root.Mui-focused': { + borderColor: theme.palette.primary.main, + boxShadow: '0 0 0 2px rgba(255,145,77,0.1)', + } + }} + /> + +); + +export default Equipment; diff --git a/src/components/Home/RestaurantProfile/contcet/OperationalCapacity.js b/src/components/Home/RestaurantProfile/contcet/OperationalCapacity.js new file mode 100644 index 0000000..5547b5f --- /dev/null +++ b/src/components/Home/RestaurantProfile/contcet/OperationalCapacity.js @@ -0,0 +1,182 @@ +import React, { useState } from 'react'; +import { Box, Typography, Stack, Button, useTheme, TextField } from '@mui/material'; + +const OperationalCapacity = ({ formData, updateFormData, onNext, onBack }) => { + const theme = useTheme(); + + const [capacity, setCapacity] = useState({ + Maximum_orders_per_day: formData.Maximum_orders_per_day || '', + Number_of_Cheff: formData.Number_of_Cheff || '', + Number_of_Waiters: formData.Number_of_Waiters || '', + Number_of_Cookers: formData.Number_of_Cookers || '', + }); + + const [errors, setErrors] = useState({}); + + const handleChange = (field, value) => { + if (/^\d*$/.test(value)) { // السماح فقط بالأرقام + setCapacity(prev => ({ ...prev, [field]: value })); + } + }; + + const validateFields = () => { + const newErrors = {}; + Object.entries(capacity).forEach(([key, value]) => { + if (!value || isNaN(Number(value)) || Number(value) < 0) { + newErrors[key] = 'Please enter a positive number'; + } + }); + setErrors(newErrors); + return Object.keys(newErrors).length === 0; + }; + + const handleNextClick = () => { + if (validateFields()) { + updateFormData(capacity); // تحديث الأب عند الضغط على Next فقط + if (onNext) onNext(); + } + }; + + const InputField = ({ label, value, onChange, placeholder, error }) => ( + + + {label} + + onChange(e.target.value)} + error={!!error} + helperText={error || ' '} + sx={{ + '& input': { fontWeight: 500, fontSize: '15px' }, + '& input::placeholder': { color: '#969BA7' }, + '& .MuiOutlinedInput-root': { + borderRadius: '10px', + transition: '0.3s', + '&.Mui-focused fieldset': { + borderColor: theme.palette.primary.main, + boxShadow: '0 0 0 2px rgba(255, 145, 77, 0.2)' + } + }, + '& .MuiOutlinedInput-root.Mui-focused': { + borderColor: theme.palette.primary.main, + boxShadow: '0 0 0 2px rgba(63,81,181,0.1)' + } + }} + /> + + ); + + return ( + + + + Operational Capacity + + + + + Enter your basic information to proceed to registration of your own restaurant on this platform + + + + handleChange('Maximum_orders_per_day', val)} + placeholder="5000" + error={errors.Maximum_orders_per_day} + /> + + handleChange('Number_of_Cheff', val)} + placeholder="20" + error={errors.Number_of_Cheff} + /> + + handleChange('Number_of_Waiters', val)} + placeholder="200" + error={errors.Number_of_Waiters} + /> + + handleChange('Number_of_Cookers', val)} + placeholder="200" + error={errors.Number_of_Cookers} + /> + + {/* Buttons */} + + + + + + + + ); +}; + +export default OperationalCapacity; diff --git a/src/components/Home/RestaurantProfile/contcet/TypeOfRestaurant.js b/src/components/Home/RestaurantProfile/contcet/TypeOfRestaurant.js new file mode 100644 index 0000000..1b1e69b --- /dev/null +++ b/src/components/Home/RestaurantProfile/contcet/TypeOfRestaurant.js @@ -0,0 +1,157 @@ +import React, { useState, useEffect } from 'react'; +import { Box, Typography, Stack, Button, useTheme, FormHelperText, TextField, Select, MenuItem } from '@mui/material'; + +const TypeOfRestaurant = ({ formData, updateFormData, onBack, onRegister }) => { + const theme = useTheme(); + const [typeData, setTypeData] = useState({ + ownRestaurantType: formData.ownRestaurantType || '', + collaborateRestaurantType: formData.collaborateRestaurantType || '' + }); + const [errors, setErrors] = useState({}); + const [isSubmitting, setIsSubmitting] = useState(false); + + const collaborationOptions = [ + { value: 'fine_dining', label: 'Fine Dining' }, + { value: 'catering_services', label: 'Catering Services' }, + { value: 'fast_food', label: 'Fast Food' }, + { value: 'cloud_kitchen', label: 'Cloud Kitchen' } + ]; + + useEffect(() => { + updateFormData(typeData); + }, [typeData]); + + const handleChange = (field, value) => setTypeData(prev => ({ ...prev, [field]: value })); + + const validateFields = () => { + const newErrors = {}; + if (!typeData.ownRestaurantType) newErrors.ownRestaurantType = 'This field is required'; + if (!typeData.collaborateRestaurantType) newErrors.collaborateRestaurantType = 'This field is required'; + setErrors(newErrors); + return Object.keys(newErrors).length === 0; + }; + + const handleRegister = async () => { + if (!validateFields()) return; + + setIsSubmitting(true); + try { + // استدعاء الدالة المرسلة من الأب لتسجيل المطعم + await onRegister(); + } catch (error) { + console.error('Registration failed:', error); + } finally { + setIsSubmitting(false); + } + }; + + return ( + + + + Type of Restaurant + + + + + Enter your restaurant type you want to collaborate to proceed to registration of your own restaurant on this platform + + + + + + Open to Host Restaurant/Cousin type* + + handleChange('ownRestaurantType', e.target.value)} + error={!!errors.ownRestaurantType} + helperText={errors.ownRestaurantType || ' '} + sx={{ + '& input': { fontWeight: 500, fontSize: '15px' }, + '& input::placeholder': { color: '#969BA7' }, + '& .MuiOutlinedInput-root': { + borderRadius: '10px', + '&.Mui-focused fieldset': { borderColor: theme.palette.primary.main } + } + }} + /> + + + + + Select Restaurant type Willing to Collaborate With* + + + {errors.collaborateRestaurantType || ' '} + + + + + + + + + + ); +}; + +export default TypeOfRestaurant; diff --git a/src/components/Home/Settings/AccountProfile.js b/src/components/Home/Settings/AccountProfile.js new file mode 100644 index 0000000..1ce714c --- /dev/null +++ b/src/components/Home/Settings/AccountProfile.js @@ -0,0 +1,403 @@ +import React, { useState, useEffect } from 'react'; +import { + Box, + Typography, + TextField, + Button, + Select, + MenuItem, + Checkbox, + ListItemText, + OutlinedInput, + styled, + useTheme, + LinearProgress +} from '@mui/material'; +import AddAPhotoOutlinedIcon from '@mui/icons-material/AddAPhotoOutlined'; +import authService from '../../../services/authService'; +import { useRestaurant } from '../../../contexts/RestaurantContext'; +import AddIcon from "@mui/icons-material/Add"; +const AccountProfile = () => { + const theme = useTheme(); + const { restaurantId } = useRestaurant(); + const [editMode, setEditMode] = useState(false); + const [profileImage, setProfileImage] = useState(null); + const [form, setForm] = useState({ + restaurant_name: '', + restaurant_type: '', + Address: '', + City: '', + Postal_code: '', + Phone: '', + Email: '', + Operation_hour: '', + host_type: '', + collaboration_type: '', + closed_days: [], + equipment: [], // array of {name, quantity} + Maximum_orders_per_day: 0, + Number_of_Cheff: 0, + Number_of_Waiters: 0, + Number_of_Cookers: 0, + }); + + const daysOfWeek = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday']; + + const Input = styled('input')({ display: 'none' }); + + useEffect(() => { + const fetchProfile = async () => { + if (!restaurantId) return; + const data = await authService.getRestaurantProfile(restaurantId); + console.log("PROFILE DATA ===>", data); // 👈 يوضح الأسماء الحقيقية + if (data) { + setForm({ + restaurant_name: data.restaurant_name, + restaurant_type: data.restaurant_type, + Address: data.Address, + City: data.City, + Postal_code: data.Postal_code, + Phone: data.Phone, + Email: data.Email, + Operation_hour: data.Operation_hour, + host_type: data.host_type, + collaboration_type: data.collaboration_type, + closed_days: data.closed_days || [], + equipment: Object.entries(data.equipment || {}).map(([name, quantity]) => ({ name, quantity })), + Maximum_orders_per_day: data.Maximum_orders_per_day ?? data.maximum_orders_per_day ?? 0, + Number_of_Cheff: data.Number_of_Cheff ?? data.number_of_cheff ?? 0, + Number_of_Waiters: data.Number_of_Waiters ?? data.number_of_waiters ?? 0, + Number_of_Cookers: data.Number_of_Cookers ?? data.number_of_cookers ?? 0, + }); + } + }; + fetchProfile(); + }, [restaurantId]); + + + const handleImageUpload = (event) => { + if (event.target.files && event.target.files[0]) { + setProfileImage(event.target.files[0]); + } + }; + + const handleChange = (field, value) => setForm(prev => ({ ...prev, [field]: value })); + + const handleEquipmentChange = (index, key, value) => { + const newEquipment = [...form.equipment]; + newEquipment[index][key] = value; + setForm(prev => ({ ...prev, equipment: newEquipment })); + }; + + const addEquipment = () => { + setForm(prev => ({ + ...prev, + equipment: [...prev.equipment, { name: '', quantity: 0 }] + })); + }; + + const removeEquipment = (index) => { + const newEquipment = [...form.equipment]; + newEquipment.splice(index, 1); + setForm(prev => ({ ...prev, equipment: newEquipment })); + }; + + const renderField = (label, value, fieldKey, options = null) => ( + + + {label} + + + {editMode ? ( + options ? ( + + ) : ( + handleChange(fieldKey, e.target.value)} + fullWidth + variant="outlined" + sx={{ + '& input': { fontWeight: 500, fontSize: '16px', color: 'black' }, + '& input::placeholder': { color: '#969BA7' }, + '& .MuiOutlinedInput-root': { + borderRadius: '10px', + transition: '0.3s', + '&.Mui-focused fieldset': { + borderColor: theme.palette.primary.main, + boxShadow: '0 0 0 2px rgba(255, 145, 77, 0.2)', + }, + }, + }} + /> + ) + ) : ( + + {Array.isArray(value) ? value.join(', ') : value} + + )} + +); + + + + const handleSave = async () => { + if (!restaurantId) return; + + const equipmentObj = {}; + form.equipment.forEach(eq => { + if (eq.name) equipmentObj[eq.name] = eq.quantity; + }); + + const payload = { + ...form, + equipment: equipmentObj + }; + + if (profileImage) payload.logo = profileImage; + + const result = await authService.updateRestaurantProfile(restaurantId, payload); + + if (result.success) { + alert("Profile updated successfully!"); + setEditMode(false); + + const updated = await authService.getRestaurantProfile(restaurantId); + if (updated) setForm({ + ...updated, + equipment: Object.entries(updated.equipment || {}).map(([name, quantity]) => ({ name, quantity })), + }); + } else { + alert(`Update failed: ${result.message}`); + } + }; + + + // داخل AccountProfile + + const collaborationOptions = [ + { value: 'fine_dining', label: 'Fine Dining' }, + { value: 'catering_services', label: 'Catering Services' }, + { value: 'fast_food', label: 'Fast Food' }, + { value: 'cloud_kitchen', label: 'Cloud Kitchen' } + ]; + + + return ( + + Restaurant Profile + + {/* صورة البروفايل */} + {/* + + */} + + + + {/* الحقول */} + + + {renderField('Restaurant Name', form.restaurant_name, 'restaurant_name')} + + {renderField('Restaurant Type', form.restaurant_type, 'restaurant_type')} + + + {renderField('Address', form.Address, 'Address')} + {renderField('City', form.City, 'City')} + + + {renderField('Postal Code', form.Postal_code, 'Postal_code')} + {renderField('Phone', form.Phone, 'Phone')} + + + {renderField('Email', form.Email, 'Email')} + {renderField('Operation Hours', form.Operation_hour, 'Operation_hour')} + + + {renderField('Host Type', form.host_type, 'host_type')} + + Collaboration Type + {editMode ? ( + + ) : ( + + {form.collaboration_type ? collaborationOptions.find(opt => opt.value === form.collaboration_type)?.label : 'None'} + + )} + + + + + {renderField('Closed Days', form.closed_days, 'closed_days', daysOfWeek)} + + + {/* القدرة التشغيلية */} + + {renderField('Maximum Orders per Day', form.Maximum_orders_per_day, 'Maximum_orders_per_day')} + {renderField('Number of Chefs', form.Number_of_Cheff, 'Number_of_Cheff')} + + + {renderField('Number of Waiters', form.Number_of_Waiters, 'Number_of_Waiters')} + {renderField('Number of Cookers', form.Number_of_Cookers, 'Number_of_Cookers')} + + + {/* المعدات */} + + Equipment Name + {form.equipment.map((eq, index) => ( + + handleEquipmentChange(index, 'name', e.target.value)} + fullWidth + variant="outlined" + disabled={!editMode} + sx={{ '& input': { fontWeight: 500, fontSize: '16px' } }} + /> + handleEquipmentChange(index, 'quantity', Number(e.target.value))} + fullWidth + variant="outlined" + disabled={!editMode} + sx={{ '& input': { fontWeight: 500, fontSize: '16px' } ,borderRadius:20}} + /> + {editMode && ( + + )} + + ))} + {editMode && ( + + )} + + + + {/* أزرار التحكم */} + + {editMode ? ( + <> + + + + ) : ( + + )} + + + ); +}; + +export default AccountProfile; diff --git a/src/components/Home/Settings/Setting.js b/src/components/Home/Settings/Setting.js new file mode 100644 index 0000000..3c121e3 --- /dev/null +++ b/src/components/Home/Settings/Setting.js @@ -0,0 +1,101 @@ +import React, { useState, useEffect } from 'react'; +import { Box, useTheme, useMediaQuery } from '@mui/material'; +import KitchPlusAppBar from '../AppBar'; +import Sidebar from '../SideHome'; +import AccountSettings from './AccountProfile'; + +const drawerWidth = 230; + +const Setting = () => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('sm')); + const [sidebarOpen, setSidebarOpen] = useState(!isMobile); + + useEffect(() => { + if (window.innerWidth >= theme.breakpoints.values.md) { + setSidebarOpen(true); + } else { + setSidebarOpen(false); + } + }, [theme.breakpoints.values.md]); + + useEffect(() => { + const handleResize = () => { + if (window.innerWidth >= theme.breakpoints.values.md) { + setSidebarOpen(true); + } else { + setSidebarOpen(false); + } + }; + + handleResize(); + window.addEventListener('resize', handleResize); + + return () => window.removeEventListener('resize', handleResize); + }, [theme.breakpoints.values.md]); + + const handleDrawerToggle = () => { + setSidebarOpen(!sidebarOpen); + }; + + return ( + + + + + + + + + + + + ); +}; + +export default Setting; diff --git a/src/components/Home/SideHome.js b/src/components/Home/SideHome.js new file mode 100644 index 0000000..daa5c08 --- /dev/null +++ b/src/components/Home/SideHome.js @@ -0,0 +1,214 @@ +import React from 'react'; +import { useNavigate, useLocation } from 'react-router-dom'; +import { + Drawer, + List, + ListItem, + ListItemIcon, + ListItemText, + Box, + useTheme, + Typography +} from '@mui/material'; +import DashboardIcon from '@mui/icons-material/DashboardRounded'; +import AnalyticsIcon from '@mui/icons-material/AutoGraph'; +import RestaurantIcon from '@mui/icons-material/Restaurant'; +import Employ from '@mui/icons-material/CountertopsTwoTone'; +import CreateKitchenIcon from '@mui/icons-material/Queue'; +import LogoutIcon from '@mui/icons-material/Logout'; +import CategoryIcon from '@mui/icons-material/Category'; +import authService from '../../services/authService'; + + +const menuItems = [ + { text: 'Order & Occupancy', icon: , path: '/dashboard' }, + { text: 'Tabels & Reservations', icon: , path: '/analytics' }, + { text: 'Restaurant Profile', icon: , path: '/profile' }, + { text: 'Employ', icon: , path: '/employ' }, + { text: 'Create Kitchen', icon: , path: '/create-kitchen' }, + { text: 'Catigores & Meals', icon: , path: '/categori-meal' }, +]; + +const bottomItems = [ + { text: 'Log Out', icon: , path: '/login' }, +]; +const Sidebar = ({ open, onClose, isMobile, drawerWidth }) => { + const theme = useTheme(); + const navigate = useNavigate(); + const location = useLocation(); + + const handleLogout = async () => { + const result = await authService.logout(); + + localStorage.removeItem('token'); + localStorage.removeItem('refresh_token'); + + navigate('/login', { replace: true }); + + if (isMobile) onClose(); + }; + + const renderListItems = (items) => + items.map((item, index) => { + const isActive = location.pathname === item.path; + + return ( + + { + if (item.text === 'Log Out') { + handleLogout(); + } else { + navigate(item.path); + if (isMobile) onClose(); + } + }} + sx={{ + display: 'flex', + alignItems: 'center', + width: '100%', + borderRadius: '5px', + backgroundColor: isActive ? '#F8F6F8' : 'transparent', + px: 2, + py: 1, + cursor: 'pointer', + transition: 'background-color 0.2s', + '&:hover': { + backgroundColor: '#fffcf9d5', + }, + }} + > + + {item.icon} + + + + + ); + }); + + const drawer = ( + + + + + + + KITCH + + + PLUS + + + + + + + {renderListItems(menuItems)} + + + + {renderListItems(bottomItems)} + + + ); + + return ( + + + {drawer} + + + ); +}; + +export default Sidebar; diff --git a/src/components/Home/SimplePagination.js b/src/components/Home/SimplePagination.js new file mode 100644 index 0000000..3cd4628 --- /dev/null +++ b/src/components/Home/SimplePagination.js @@ -0,0 +1,71 @@ +// SimplePagination.jsx +import React from 'react'; +import { Box, IconButton, useTheme } from '@mui/material'; +import ArrowBackIosNewIcon from '@mui/icons-material/ArrowBackIosNew'; +import ArrowForwardIosIcon from '@mui/icons-material/ArrowForwardIos'; + +const SimplePagination = ({ currentPage, pageCount, onChange }) => { + const theme = useTheme(); + + const handlePrev = () => { + if (currentPage > 1) onChange(currentPage - 1); + }; + + const handleNext = () => { + if (currentPage < pageCount) onChange(currentPage + 1); + }; + + return ( + + + + + + + {currentPage} + + + = pageCount} + sx={{ + borderRadius: '8px', + backgroundColor: '#FFECE0', + '&:hover': { backgroundColor: '#FFD6B5' }, + color: theme.palette.primary.main, + '&.Mui-disabled': { color: '#ccc', backgroundColor: '#FFF5E6' }, + }} + > + + + + ); +}; + +export default SimplePagination; diff --git a/src/components/Home/Supplier/Supplier.js b/src/components/Home/Supplier/Supplier.js new file mode 100644 index 0000000..e305554 --- /dev/null +++ b/src/components/Home/Supplier/Supplier.js @@ -0,0 +1,230 @@ +import React, { useState, useEffect } from "react"; +import { Box, useTheme, useMediaQuery } from "@mui/material"; +import KitchPlusAppBar from "../AppBar"; +import Sidebar from "../SideHome"; + + +import AccountSettings from "./contect/AccountSettings"; +import AllProducts from "./contect/AllProducts"; +import PopularProductSection from "./contect/PopularProductSection"; +import ProductDetail from "./contect/ProductDetail"; + +import api from "../../../services/authService"; + +const IMAGE_URL = "http://127.0.0.1:8000/storage/"; +const drawerWidth = 230; + +const Supplier = () => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down("sm")); + const [sidebarOpen, setSidebarOpen] = useState(!isMobile); + + const [categories, setCategories] = useState([]); + const [products, setProducts] = useState([]); + const [selectedCategory, setSelectedCategory] = useState(null); + const [selectedCategoryName, setSelectedCategoryName] = useState(null); + + const [selectedProduct, setSelectedProduct] = useState(null); + + const [showAllPopular, setShowAllPopular] = useState(false); + const [showAllTopItems, setShowAllTopItems] = useState(false); + + useEffect(() => { + setSidebarOpen(window.innerWidth >= theme.breakpoints.values.md); + }, [theme.breakpoints.values.md]); + + useEffect(() => { + const handleResize = () => { + setSidebarOpen(window.innerWidth >= theme.breakpoints.values.md); + }; + handleResize(); + window.addEventListener("resize", handleResize); + return () => window.removeEventListener("resize", handleResize); + }, [theme.breakpoints.values.md]); + + useEffect(() => { + const fetchCategories = async () => { + try { + const res = await api.getAllCategory(); + if (res.success) { + const formatted = res.data.map((category) => ({ + id: category.id, + name: category.name, + icon: category.image + ? IMAGE_URL + category.image + : "/images/default-product.png", + })); + setCategories(formatted); + } + } catch (err) { + console.error("❌ Error fetching categories:", err); + } + }; + + fetchCategories(); + }, []); + + useEffect(() => { + const fetchProducts = async () => { + if (!selectedCategory) return; + + try { + const res = await api.getProductsByCategory(selectedCategory, 1); + if (res.success) { + const formatted = res.data.map((product) => ({ + id: product.id, + name: product.name, + category: product.supplier_category_id, + price: product.price, + unit: "Kg", + image: product.image + ? IMAGE_URL + product.image + : "/images/default-product.png", + })); + setProducts(formatted); + + const categoryName = categories.find( + (cat) => cat.id === selectedCategory + )?.name; + setSelectedCategoryName(categoryName || ""); + } + } catch (err) { + console.error("Error fetching products:", err); + } + }; + + fetchProducts(); + }, [selectedCategory, categories]); + + const handleDrawerToggle = () => { + setSidebarOpen(!sidebarOpen); + }; + + const toggleShowAllPopular = () => { + setShowAllPopular((prev) => !prev); + }; + + const toggleShowAllTopItems = () => { + setShowAllTopItems((prev) => !prev); + }; + + return ( + + + + + + + + {selectedProduct ? ( + setSelectedProduct(null)} + /> + ) : ( + <> + + + {selectedCategory ? ( + + setSelectedCategory(null)} + onProductClick={setSelectedProduct} + categoryName={selectedCategoryName} + /> + + ) : !showAllPopular && !showAllTopItems ? ( + + + + + + ) : showAllPopular ? ( + + + + ) : showAllTopItems ? ( + + + ) : null} + + )} + + + + ); +}; + +export default Supplier; diff --git a/src/components/Home/Supplier/Supplieree.js b/src/components/Home/Supplier/Supplieree.js new file mode 100644 index 0000000..593ab8c --- /dev/null +++ b/src/components/Home/Supplier/Supplieree.js @@ -0,0 +1,247 @@ +import React, { useState, useEffect } from 'react'; +import { Box, useTheme, useMediaQuery } from '@mui/material'; +import KitchPlusAppBar from '../AppBar'; +import Sidebar from '../SideHome'; + +// بدل هذه المكونات عند عرض التفاصيل +import AccountSettings from './contect/AccountSettings'; +import AllProducts from './contect/AllProducts'; +import PopularProductSection from './contect/PopularProductSection'; +import TopItems from './contect/TopItems'; +import OrderList from './contect/OrderList'; +import ProductDetail from './contect/ProductDetail'; // 👈 مكون التفاصيل +//import auth servise +import api from '../../../services/authService'; +const IMAGE_URL = 'http://127.0.0.1:8000/storage/' ; + + +const categoriesInit0 = await api.getAllCategory(); +const categoriesInit = categoriesInit0.data.map(category => ({ + id: category.id, + name: category.name, + icon: category.image || "/images/default-product.png", +})); + + +const productList0 = await api.getAllProduct(); +const productList = productList0.data.map(product => ({ + id: product.id, + name: product.name, + category: product.supplier_category_id, + price: product.price, + unit: "Kg", + image: IMAGE_URL + product.image || "/images/default-product.png", +})); + +// const productList = [ +// { id: 1, name: 'Cabbage 1', category: 'Vegetable', price: '15.10', unit: '/kg', image: '/images/waitress2.png' }, +// { id: 2, name: 'vegetables 2', category: 'Vegetable', price: '8.34', unit: '/kg', image: '/images/waitress2.png' }, +// { id: 3, name: 'Brocoly 3', category: 'Vegetable', price: '5.60', unit: '/kg', image: '/images/waitress2.png' }, +// { id: 4, name: 'Onion 4', category: 'Vegetable', price: '6.45', unit: '/kg', image: '/images/waitress2.png' }, +// { id: 5, name: 'Bread 5', category: 'Bread', price: '3.50', unit: '/pcs', image: '/images/waitress2.png' }, +// { id: 6, name: 'Meat 6', category: 'Meat', price: '20.00', unit: '/kg', image: '/images/waitress2.png' }, +// { id: 7, name: 'Cabbage', category: 'Vegetable', price: '15.10', unit: '/kg', image: '/images/waitress2.png' }, +// { id: 8, name: 'vegetables', category: 'Vegetable', price: '8.34', unit: '/kg', image: '/images/waitress2.png' }, +// { id: 9, name: 'Brocoly', category: 'Vegetable', price: '5.60', unit: '/kg', image: '/images/waitress2.png' }, +// { id: 10, name: 'Onion', category: 'Vegetable', price: '6.45', unit: '/kg', image: '/images/waitress2.png' }, +// { id: 11, name: 'Bread', category: 'Bread', price: '3.50', unit: '/pcs', image: '/images/waitress2.png' }, +// { id: 12, name: 'Meat', category: 'Meat', price: '20.00', unit: '/kg', image: '/images/waitress2.png' }, +// { id: 13, name: 'Cabbage', category: 'Vegetable', price: '15.10', unit: '/kg', image: '/images/waitress2.png' }, +// { id: 14, name: 'vegetables', category: 'Vegetable', price: '8.34', unit: '/kg', image: '/images/waitress2.png' }, +// { id: 15, name: 'Brocoly', category: 'Vegetable', price: '5.60', unit: '/kg', image: '/images/waitress2.png' }, +// { id: 16, name: 'Onion', category: 'Vegetable', price: '6.45', unit: '/kg', image: '/images/waitress2.png' }, +// { id: 17, name: 'Bread', category: 'Bread', price: '3.50', unit: '/pcs', image: '/images/waitress2.png' }, +// { id: 18, name: 'Meat', category: 'Meat', price: '20.00', unit: '/kg', image: '/images/waitress2.png' }, +// ]; + +const item = [ + { name: 'Cabbage', price: '15.10', unit: '/kg', image: '/images/cabbage.png' }, + { name: 'Kale vegetables', price: '8.34', unit: '/kg', image: '/images/kale.png' }, + { name: 'Brocoly', price: '5.60', unit: '/kg', image: '/images/broccoli.png' }, + { name: 'Celery', price: '4.80', unit: '/kg', image: '/images/celery.png' }, + { name: 'Onion', price: '6.45', unit: '/kg', image: '/images/onion.png' }, + { name: 'Garlic', price: '9.90', unit: '/kg', image: '/images/garlic.png' }, +]; + +const drawerWidth = 230; + +const Supplier = () => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('sm')); + const [sidebarOpen, setSidebarOpen] = useState(!isMobile); + + // حالات العرض + const [showAllPopular, setShowAllPopular] = useState(false); + const [showAllTopItems, setShowAllTopItems] = useState(false); + const [selectedCategory, setSelectedCategory] = useState(null); + + // ✅ المنتج المختار + const [selectedProduct, setSelectedProduct] = useState(null); + + useEffect(() => { + setSidebarOpen(window.innerWidth >= theme.breakpoints.values.md); + }, [theme.breakpoints.values.md]); + + useEffect(() => { + const handleResize = () => { + setSidebarOpen(window.innerWidth >= theme.breakpoints.values.md); + }; + handleResize(); + window.addEventListener('resize', handleResize); + return () => window.removeEventListener('resize', handleResize); + }, [theme.breakpoints.values.md]); + + const handleDrawerToggle = () => { + setSidebarOpen(!sidebarOpen); + }; + + const toggleShowAllPopular = () => { + setShowAllPopular(prev => !prev); + }; + + const toggleShowAllTopItems = () => { + setShowAllTopItems(prev => !prev); + }; + + // اسم الفئة + const selectedCategoryName = selectedCategory + ? categoriesInit.find(cat => cat.id === selectedCategory)?.name + : null; + + return ( + + + + + + + + {/* ✅ إذا تم اختيار منتج نظهر تفاصيله فقط */} + {selectedProduct ? ( + setSelectedProduct(null)} /> + ) : ( + <> + + + {selectedCategory ? ( + + p.category.toLowerCase() === selectedCategoryName?.toLowerCase() + )} + showAll={true} + onToggleShowAll={() => setSelectedCategory(null)} + onProductClick={setSelectedProduct} + categoryName={selectedCategoryName} // ✅ بدل القيمة الثابتة + /> + + + ) : !showAllPopular && !showAllTopItems ? ( + + + + {/* + + */} + + + {/* + + + + */} + + ) : showAllPopular ? ( + + + + ) : showAllTopItems ? ( + + {/* */} + + ) : null} + + )} + + + + ); +}; + +export default Supplier; diff --git a/src/components/Home/Supplier/contect/AccountSettings.js b/src/components/Home/Supplier/contect/AccountSettings.js new file mode 100644 index 0000000..a00e5d0 --- /dev/null +++ b/src/components/Home/Supplier/contect/AccountSettings.js @@ -0,0 +1,307 @@ +import React, { useState, useRef, useEffect } from 'react'; +import { + Menu, + MenuItem, + Modal, + Dialog, + DialogTitle, + DialogContent, + DialogActions, + useMediaQuery, + Box, + Typography, + Button, + useTheme, + IconButton, +} from '@mui/material'; +import AddCategory from './AddCategory'; // مكون لإضافة/تعديل الفئة (يفترض موجود) +import AddIcon from '@mui/icons-material/Add'; +import ArrowBackIosNewIcon from '@mui/icons-material/ArrowBackIosNew'; +import ArrowForwardIosIcon from '@mui/icons-material/ArrowForwardIos'; +import TuneIcon from '@mui/icons-material/Tune'; +import CategoryScrollList from './CategoryScrollList'; // مكون لعرض الفئات بشكل أفقي مع تمرير +//import auth servise +import api from '../../../../services/authService'; + +const IMAGE_URL = 'http://127.0.0.1:8000/storage/' ; + +const categoriesInit0 = await api.getAllCategory(); +const categoriesInit = categoriesInit0.data.map(category => ( + { + id: category.id, + name: category.name, + icon: IMAGE_URL + category.icon || "/images/default-product.png", +})); + + +const AccountSettings = ({ selectedCategory, setSelectedCategory }) => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('sm')); + + const [categories, setCategories] = useState(categoriesInit); + const [selectedCategoryForEdit, setSelectedCategoryForEdit] = useState(null); + const [contextMenu, setContextMenu] = useState(null); + const [openAddModal, setOpenAddModal] = useState(false); + const [confirmDeleteOpen, setConfirmDeleteOpen] = useState(false); + + const scrollRef = useRef(); + + const scroll = (offset) => { + if (scrollRef.current) { + scrollRef.current.scrollLeft += offset; + } + }; + + const handleAddCategory = (newCategory) => { + setCategories((prev) => [...prev, { ...newCategory, id: Date.now() }]); + setOpenAddModal(false); + }; + + const handleUpdateCategory = (updatedCategory) => { + setCategories((prev) => + prev.map((cat) => + cat.id === selectedCategoryForEdit.id ? { ...cat, ...updatedCategory } : cat + ) + ); + setOpenAddModal(false); + }; + + const handleDeleteCategory = () => { + setCategories((prev) => prev.filter((cat) => cat.id !== selectedCategoryForEdit.id)); + setConfirmDeleteOpen(false); + setSelectedCategoryForEdit(null); + + if (selectedCategory === selectedCategoryForEdit?.id) { + setSelectedCategory(null); // أبطل اختيار الفئة + } + }; + + + useEffect(() => { + if (!openAddModal) { + setSelectedCategoryForEdit(null); + } + }, [openAddModal]); + + return ( + + {/* رأس القسم */} + + + Categories + + + + {/* */} + + + + scroll(-200)} + sx={{ + backgroundColor: theme.palette.primary.main, + color: '#fff', + width: 40, + height: 40, + '&:hover': { backgroundColor: '#e96b00' }, + }} + > + + + + scroll(200)} + sx={{ + backgroundColor: theme.palette.primary.main, + color: '#fff', + width: 40, + height: 40, + '&:hover': { backgroundColor: '#e96b00' }, + }} + > + + + + + + {/* قائمة التمرير للفئات */} + + + + + + + {/* مودال الإضافة / التعديل */} + setOpenAddModal(false)} + aria-labelledby="add-category-modal" + sx={{ + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + p: 2, + }} + > + + + + + + {/* قائمة السياق (الزر الأيمن) */} + setContextMenu(null)} + anchorReference="anchorPosition" + anchorPosition={ + contextMenu !== null + ? { top: contextMenu.mouseY, left: contextMenu.mouseX } + : undefined + } + sx={{ zIndex: 2000 }} + > + { + setOpenAddModal(true); + setContextMenu(null); + }} + > + Edit Category + + { + setConfirmDeleteOpen(true); + setContextMenu(null); + }} + sx={{ color: 'red' }} + > + Delete Category + + + + {/* تأكيد الحذف */} + setConfirmDeleteOpen(false)}> + Confirm Delete + + Are you sure you want to delete this category? + + + + + + + + ); +}; + +export default AccountSettings; diff --git a/src/components/Home/Supplier/contect/AddCategory.js b/src/components/Home/Supplier/contect/AddCategory.js new file mode 100644 index 0000000..8244f62 --- /dev/null +++ b/src/components/Home/Supplier/contect/AddCategory.js @@ -0,0 +1,186 @@ +import React, { useState, useEffect } from 'react'; +import { Box, Button, TextField, Typography, IconButton } from '@mui/material'; +import CloseIcon from '@mui/icons-material/Close'; +import AddAPhotoOutlinedIcon from '@mui/icons-material/AddAPhotoOutlined'; + +const AddCategory = ({ onAdd, editingCategory }) => { + const [productName, setProductName] = useState(''); + const [description, setDescription] = useState(''); + const [price, setPrice] = useState(''); + const [discount, setDiscount] = useState(''); + const [productImage, setProductImage] = useState(null); + + useEffect(() => { + if (editingCategory) { + setProductName(editingCategory.name || ''); + setDescription(editingCategory.description || ''); + setPrice(editingCategory.price || ''); + setDiscount(editingCategory.discount || ''); + setProductImage(editingCategory.icon || null); + } + }, [editingCategory]); + + const handleImageUpload = (e) => { + const file = e.target.files[0]; + if (file) { + const reader = new FileReader(); + reader.onloadend = () => { + setProductImage(reader.result); + }; + reader.readAsDataURL(file); + } + }; + + const handleRemoveImage = () => { + setProductImage(null); + }; + + const handleSubmit = () => { + const newCategory = { + name: productName, + description, + price, + discount, + icon: productImage, + }; + + if (onAdd) { + onAdd(newCategory); + } + + // إعادة تعيين الحقول فقط عند الإضافة الجديدة + if (!editingCategory) { + setProductName(''); + setDescription(''); + setPrice(''); + setDiscount(''); + setProductImage(null); + } + }; + + return ( + + {/* ✅ صورة التصنيف */} + {productImage ? ( + + Preview + + + + + ) : ( + + Upload Menu Picture + + + + )} + + + + Categories name + + setProductName(e.target.value)} + margin="normal" + sx={{ + '& input': { fontWeight: 500, fontSize: '15px' }, + '& input::placeholder': { color: '#969BA7' }, + '& .MuiOutlinedInput-root': { + borderRadius: '10px', + transition: '0.3s', + '&.Mui-focused fieldset': { + borderColor: '#FF914D', + boxShadow: '0 0 0 2px rgba(255, 145, 77, 0.2)' + } + }, + '& .MuiOutlinedInput-root.Mui-focused': { + borderColor: '#FF914D', + boxShadow: '0 0 0 2px rgba(255,145,77,0.15)' + } + }} + /> + + + + + ); +}; + +export default AddCategory; diff --git a/src/components/Home/Supplier/contect/AllProducts.js b/src/components/Home/Supplier/contect/AllProducts.js new file mode 100644 index 0000000..d0c66c0 --- /dev/null +++ b/src/components/Home/Supplier/contect/AllProducts.js @@ -0,0 +1,93 @@ +import React from "react"; +import { Box, Typography } from "@mui/material"; +import ProductCard from "./ProductCard"; + +const AllProducts = ({ products, showAll, onToggleShowAll, onProductClick, categoryName }) => { + const visibleProducts = showAll ? products : products.slice(0, 6); + + return ( + + {/* العنوان */} + + + {categoryName ? categoryName : "All Products"} + + + + + + + {showAll ? "Show Less" : "See All"} + + + + {/* عرض المنتجات أو رسالة لا يوجد منتجات */} + {visibleProducts.length === 0 ? ( + + + {categoryName + ? `There is no product in ${categoryName}` + : "There is no product"} + + + ) : ( + + {visibleProducts.map((product, index) => ( + onProductClick(product)} + > + + + ))} + + )} + + ); +}; + +export default AllProducts; diff --git a/src/components/Home/Supplier/contect/CategoryScrollList.js b/src/components/Home/Supplier/contect/CategoryScrollList.js new file mode 100644 index 0000000..7319a02 --- /dev/null +++ b/src/components/Home/Supplier/contect/CategoryScrollList.js @@ -0,0 +1,88 @@ +import React from 'react'; +import { Box, Avatar, Typography } from '@mui/material'; +import { useTheme } from '@mui/material/styles'; + +const CategoryScrollList = ({ + categories, + selectedCategory, + setSelectedCategory, + setSelectedCategoryForEdit, + setContextMenu, + scrollRef, +}) => { + const theme = useTheme(); + + return ( + + + {categories.map((cat) => ( + setSelectedCategory(cat.id)} + onContextMenu={(e) => { + e.preventDefault(); + setSelectedCategoryForEdit(cat); + setContextMenu({ mouseX: e.clientX + 2, mouseY: e.clientY - 6 }); + }} + > + + + + {cat.name} + + + ))} + + + ); +}; + +export default CategoryScrollList; diff --git a/src/components/Home/Supplier/contect/OrderList.js b/src/components/Home/Supplier/contect/OrderList.js new file mode 100644 index 0000000..10d4446 --- /dev/null +++ b/src/components/Home/Supplier/contect/OrderList.js @@ -0,0 +1,359 @@ +import React, { useState } from 'react'; +import { + Box, + Typography, + Paper, + Table, + TableBody, + TableCell, + TableHead, + TableRow, + Chip, + IconButton, + TableContainer, + Button, + Menu, + MenuItem, +} from '@mui/material'; +import TuneIcon from '@mui/icons-material/Tune'; +import ReplayIcon from '@mui/icons-material/Replay'; +import VisibilityIcon from '@mui/icons-material/Visibility'; +import ArrowBackIosNewIcon from '@mui/icons-material/ArrowBackIosNew'; +import ArrowForwardIosIcon from '@mui/icons-material/ArrowForwardIos'; +import { useTheme } from '@mui/material/styles'; +import { useMediaQuery } from '@mui/material'; + +const SimplePagination = ({ currentPage, pageCount, onChange }) => { + const theme = useTheme(); + + const handlePrev = () => { + if (currentPage > 1) onChange(currentPage - 1); + }; + + const handleNext = () => { + if (currentPage < pageCount) onChange(currentPage + 1); + }; + + return ( + + + + + + + {currentPage} + + + = pageCount} + sx={{ + borderRadius: '8px', + backgroundColor: '#FFECE0', + '&:hover': { backgroundColor: '#FFD6B5' }, + color: theme.palette.primary.main, + '&.Mui-disabled': { + color: '#ccc', + backgroundColor: '#FFF5E6', + }, + }} + > + + + + ); +}; + +const OrderList = () => { + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down('sm')); + + const initialOrders = [ + { restaurant: 'المطعم الاول المطعم الاول ', time: '5:00 Pm', status: 'Pending' }, + { restaurant: 'Al-Baik', time: '5:00 Pm', status: 'Delivered' }, + { restaurant: 'Al-Baik', time: '5:00 Pm', status: 'Completed' }, + { restaurant: 'Al-Baik', time: '5:00 Pm', status: 'In-Progress' }, + { restaurant: 'Al-Baik', time: '5:00 Pm', status: 'Delivered' }, + { restaurant: 'Al-Baik', time: '5:00 Pm', status: 'Pending' }, + { restaurant: 'Al-Baik', time: '5:00 Pm', status: 'Completed' }, + { restaurant: 'Al-Baik', time: '5:00 Pm', status: 'Delivered' }, + { restaurant: 'Al-Baik', time: '5:00 Pm', status: 'Pending' }, + { restaurant: 'Al-Baik', time: '5:00 Pm', status: 'Delivered' }, + { restaurant: 'Al-Baik', time: '5:00 Pm', status: 'Completed' }, + ]; + + const [currentPage, setCurrentPage] = useState(1); + const [filterAnchorEl, setFilterAnchorEl] = useState(null); + const [statusFilter, setStatusFilter] = useState('all'); // 'all' يعني بدون فلتر + + const itemsPerPage = 5; + + // افتح قائمة الفلتر + const handleFilterClick = (event) => { + setFilterAnchorEl(event.currentTarget); + }; + + // اغلق قائمة الفلتر + const handleFilterClose = () => { + setFilterAnchorEl(null); + }; + + // عند اختيار فلتر جديد + const handleFilterSelect = (filter) => { + setStatusFilter(filter); + setCurrentPage(1); // العودة للصفحة الأولى بعد تغيير الفلتر + handleFilterClose(); + }; + + // تصفية البيانات حسب الفلتر + const filteredOrders = + statusFilter === 'all' + ? initialOrders + : initialOrders.filter( + (order) => order.status.toLowerCase() === statusFilter.toLowerCase() + ); + + const pageCount = Math.ceil(filteredOrders.length / itemsPerPage); + + const paginatedData = filteredOrders.slice( + (currentPage - 1) * itemsPerPage, + currentPage * itemsPerPage + ); + + const getStatusColor = (status) => { + switch (status) { + case 'Pending': + return { bg: '#FFF3E0', color: '#E65100' }; + case 'Delivered': + return { bg: '#E8F5E9', color: '#2E7D32' }; + case 'Completed': + return { bg: '#F3E5F5', color: '#6A1B9A' }; + case 'In-Progress': + return { bg: '#F1F8E9', color: '#9E9D24' }; + default: + return { bg: '#E0E0E0', color: '#424242' }; + } + }; + + const rowHeight = 73; // ارتفاع الصف الواحد تقريبي + const emptyRowsCount = itemsPerPage - paginatedData.length; + + return ( + + {/* Header */} + + + Order List + + + + {/* قائمة الفلاتر */} + + {['all', 'Pending', 'Delivered', 'Completed', 'In-Progress'].map((status) => ( + handleFilterSelect(status)} + sx={{ + color: statusFilter.toLowerCase() === status.toLowerCase() ? '#FF914D' : '#4F5867', + backgroundColor: + statusFilter.toLowerCase() === status.toLowerCase() ? '#fffcf9d5' : 'transparent', + '&:hover': { + backgroundColor: '#f0f0f0ff', + transition: 'background-color 150ms ease-in-out', + }, + }} + > + {status.charAt(0).toUpperCase() + status.slice(1)} + + ))} + + + + {/* Table */} + + + + + Restaurant + Time + Status + Action + + + + + {paginatedData.length > 0 ? ( + paginatedData.map((row, i) => { + const colors = getStatusColor(row.status); + return ( + + + {row.restaurant} + + + {row.time} + + + + + + + + + + + + + + + ); + }) + ) : ( + + + No orders found. + + + )} + + {/* صفوف تعويضية فارغة لتثبيت ارتفاع الجدول */} + {emptyRowsCount > 0 && + [...Array(emptyRowsCount)].map((_, idx) => ( + + + + ))} + +
+
+ + {/* Pagination */} + + + Showing {(currentPage - 1) * itemsPerPage + 1} -{' '} + {Math.min(currentPage * itemsPerPage, filteredOrders.length)} of {filteredOrders.length} + + + + +
+ ); +}; + +export default OrderList; diff --git a/src/components/Home/Supplier/contect/PopularProductSection.js b/src/components/Home/Supplier/contect/PopularProductSection.js new file mode 100644 index 0000000..8196a94 --- /dev/null +++ b/src/components/Home/Supplier/contect/PopularProductSection.js @@ -0,0 +1,154 @@ +import React, { useState } from 'react'; +import { Box, Typography, Grid, useTheme, IconButton } from '@mui/material'; +import ArrowBackIosNewIcon from '@mui/icons-material/ArrowBackIosNew'; +import ArrowForwardIosIcon from '@mui/icons-material/ArrowForwardIos'; +import ProductCard from './ProductCard'; + +const ITEMS_PER_PAGE = 10; + +/* مكوّن الباجينيشن */ +const SimplePagination = ({ currentPage, pageCount, onChange }) => { + const theme = useTheme(); + + const handlePrev = () => { + if (currentPage > 1) onChange(currentPage - 1); + }; + + const handleNext = () => { + if (currentPage < pageCount) onChange(currentPage + 1); + }; + + return ( + + + + + + + {currentPage} + + + = pageCount} + sx={{ + borderRadius: '8px', + backgroundColor: '#FFECE0', + '&:hover': { backgroundColor: '#FFD6B5' }, + color: theme.palette.primary.main, + '&.Mui-disabled': { color: '#ccc', backgroundColor: '#FFF5E6' }, + }} + > + + + + ); +}; + +/* قسم المنتجات */ +const PopularProductSection = ({ products = [], onProductClick }) => { + const theme = useTheme(); + const [currentPage, setCurrentPage] = useState(1); + + const totalPages = Math.ceil(products.length / ITEMS_PER_PAGE); + const startIdx = (currentPage - 1) * ITEMS_PER_PAGE; + const visibleProducts = products.slice(startIdx, startIdx + ITEMS_PER_PAGE); + + return ( + + {/* الهيدر */} + + All Products + + + {/* المنتجات */} + + {visibleProducts.length > 0 ? ( + visibleProducts.map((product, index) => ( + + onProductClick && onProductClick(product)} + /> + + )) + ) : ( + There is no Product + )} + + + {/* الباجينيشن */} + {totalPages > 1 && ( + + + Showing {startIdx + 1} - {Math.min(startIdx + ITEMS_PER_PAGE, products.length)} of {products.length} + + + + + )} + + ); +}; + +export default PopularProductSection; diff --git a/src/components/Home/Supplier/contect/ProductCard.js b/src/components/Home/Supplier/contect/ProductCard.js new file mode 100644 index 0000000..5a1cada --- /dev/null +++ b/src/components/Home/Supplier/contect/ProductCard.js @@ -0,0 +1,117 @@ +import React from 'react'; +import { Box, Typography, Card, CardContent, CardMedia, IconButton } from '@mui/material'; +import AddIcon from '@mui/icons-material/Add'; + +const ProductCard = ({ name, price, discountedPrice, unit, image, onClick, onAdd }) => { + return ( + + {/* صورة المنتج */} + + + {/* تفاصيل المنتج */} + + + {name} + + + + {discountedPrice ? ( + <> + + ${price} + + + ${discountedPrice}{' '} + + {unit} + + + + ) : ( + + ${price}{' '} + + {unit} + + + )} + + {/* زر الإضافة */} + { + e.stopPropagation(); // يمنع فتح التفاصيل عند الضغط على الزر + if (onAdd) onAdd(); + }} + sx={{ + backgroundColor: '#FF8551', + color: '#fff', + ml: 3, + width: 28, + height: 28, + '&:hover': { backgroundColor: '#ff7043' }, + }} + > + + + + + + ); +}; + +export default ProductCard; diff --git a/src/components/Home/Supplier/contect/ProductDetail.js b/src/components/Home/Supplier/contect/ProductDetail.js new file mode 100644 index 0000000..318a155 --- /dev/null +++ b/src/components/Home/Supplier/contect/ProductDetail.js @@ -0,0 +1,94 @@ +import React, { useState, useContext, useEffect } from "react"; +import { Box, Typography, Button, IconButton, LinearProgress, useTheme } from "@mui/material"; +import RemoveIcon from "@mui/icons-material/Remove"; +import AddIcon from "@mui/icons-material/Add"; +import ShoppingCartOutlinedIcon from "@mui/icons-material/ShoppingCartOutlined"; +import { CartContext } from "../../../../contexts/CartContextR"; +// import { useRestaurant } from '../../../contexts/RestaurantContext'; +import api from '../../../../services/authService'; + +const ProductDetail = ({ product, onBack }) => { + const theme = useTheme(); + const { addToCart , createNewCart } = useContext(CartContext); + const [quantity, setQuantity] = useState(1); + const [totalPrice, setTotalPrice] = useState(Number(product?.price) || 0); + + useEffect(() => { + if (product) { + setTotalPrice(Number(product.price) * quantity); + } + }, [quantity, product]); + + if (!product) return null; + + const handleIncrease = () => quantity < 9 && setQuantity(q => q + 1); + const handleDecrease = () => quantity > 1 && setQuantity(q => q - 1); + + const handleAddToCart = () => { + addToCart(product, quantity); + createNewCart(); + alert(`${product.name} added to cart! Quantity: ${quantity}, Total: $${totalPrice.toFixed(2)}`); + }; + + return ( + + + + + {product.name} + {product.category} + + ${Number(product.price).toFixed(2)} {product.unit} + + + {/* 20 Item left */} + + + Quantity + + + {quantity} + + + Maximum purchase 9 + + + Total: ${totalPrice.toFixed(2)} + + + + + + + + + ); +}; + +export default ProductDetail; diff --git a/src/components/Home/Supplier/contect/TopItems.js b/src/components/Home/Supplier/contect/TopItems.js new file mode 100644 index 0000000..5d06d3e --- /dev/null +++ b/src/components/Home/Supplier/contect/TopItems.js @@ -0,0 +1,140 @@ +import React from 'react'; +import { + Box, + Typography, + Card, + CardContent, + CardMedia, + IconButton, + Grid, + useTheme, + useMediaQuery, +} from '@mui/material'; +import AddIcon from '@mui/icons-material/Add'; + +const ProductCard = ({ name, price, unit, image }) => { + return ( + + + + + {name} + + + + ${price}{' '} + + {unit} + + + + + + + + + ); +}; + +const TopItems = ({ item, showAll, onToggleShowAll }) => { + const theme = useTheme(); + const isXs = useMediaQuery(theme.breakpoints.down('sm')); + + const visibleProducts = showAll ? item : item.slice(0, 6); + + const maxHeight = showAll ? 'auto' : isXs ? '340px' : '335px'; + const maxWidth = showAll ? { xs: '90%', sm: '100%' } : undefined; + + return ( + + + + Top Items + + + {showAll ? 'Show Less' : 'See All'} + + + + + {visibleProducts.map((product, index) => ( + + + + ))} + + + ); +}; + +export default TopItems; diff --git a/src/components/Routes/PrivateRoute.js b/src/components/Routes/PrivateRoute.js new file mode 100644 index 0000000..3e5c59d --- /dev/null +++ b/src/components/Routes/PrivateRoute.js @@ -0,0 +1,14 @@ +import React from 'react'; +import { Navigate } from 'react-router-dom'; + +const PrivateRoute = ({ children }) => { + const token = localStorage.getItem('token'); + + if (!token) { + return ; + } + + return children; +}; + +export default PrivateRoute; diff --git a/src/components/Routes/ProtectedRoutes.js b/src/components/Routes/ProtectedRoutes.js new file mode 100644 index 0000000..863f0a6 --- /dev/null +++ b/src/components/Routes/ProtectedRoutes.js @@ -0,0 +1,46 @@ + +import React from 'react'; +import { Routes, Route } from 'react-router-dom'; +import PrivateRoute from './PrivateRoute'; + +import Dashboard from '../Home/Dashboard/Dashboard'; +import Inventory from '../Home/Inventory/Inventory'; +import Analytics from '../Home/Analytics&Reporting/Analytics'; +import Supplier from '../Home/Supplier/Supplier'; +import Cashier from '../Home/Cashier/Cashier'; +import Cart from '../Home/Cart/Cart'; +import Order from '../Home/Order/Order'; +// import Training from '../Home/Training/Training'; +import RestaurantProfile from '../Home/RestaurantProfile/all'; +import Employ from '../Home/Employ/Employ'; +import Settings from '../Home/Settings/Setting'; +import RestaurantSelection from '../Home/ResList/RestaurantProfile'; +import Meal from '../Home/Meal/Meal'; +import CreateYourRestaurant from '../Home/CreateYourRestaurant/CreateRestaurant'; +import CreateNewRestaurant from '../Home/CreateNewRestaurant/CreateRestaurant'; +import { CartProvider } from "../../contexts/CartContextR"; + +const ProtectedRoutes = () => { + return ( + + + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + + ); +}; + +export default ProtectedRoutes; diff --git a/src/components/Routes/PublicRoute.js b/src/components/Routes/PublicRoute.js new file mode 100644 index 0000000..ecba7f1 --- /dev/null +++ b/src/components/Routes/PublicRoute.js @@ -0,0 +1,14 @@ +import React from 'react'; +import { Navigate } from 'react-router-dom'; + +const PublicRoute = ({ children }) => { + const token = localStorage.getItem('token'); + + if (token) { + return ; + } + + return children; +}; + +export default PublicRoute; diff --git a/src/components/common/CustomSnackbar.js b/src/components/common/CustomSnackbar.js new file mode 100644 index 0000000..4f7d96d --- /dev/null +++ b/src/components/common/CustomSnackbar.js @@ -0,0 +1,32 @@ +import React from "react"; +import { Snackbar, Alert } from "@mui/material"; + +const CustomSnackbar = ({ open, message, severity, onClose }) => { + return ( + + + {message} + + + ); +}; + +export default CustomSnackbar; diff --git a/src/contexts/CartContextR.js b/src/contexts/CartContextR.js new file mode 100644 index 0000000..65b3752 --- /dev/null +++ b/src/contexts/CartContextR.js @@ -0,0 +1,113 @@ +import React, { createContext, useState, useEffect, useContext } from "react"; +import axios from "axios"; +import { useRestaurant } from "./RestaurantContext"; + +export const CartContext = createContext(); + +const API_BASE_URL = "http://127.0.0.1:8000/api"; + +export const CartProvider = ({ children }) => { + const [cart, setCart] = useState([]); + const { restaurantId } = useRestaurant(); + + useEffect(() => { + const storedCart = localStorage.getItem("cart"); + if (storedCart) setCart(JSON.parse(storedCart)); + }, []); + + useEffect(() => { + localStorage.setItem("cart", JSON.stringify(cart)); + }, [cart]); + + const addToCart = (product, quantity = 1) => { + setCart(prev => { + const existingIdx = prev.findIndex(item => item.id === product.id); + if (existingIdx >= 0) { + const updated = [...prev]; + updated[existingIdx].quantity += quantity; + updated[existingIdx].totalPrice = updated[existingIdx].quantity * product.price; + return updated; + } else { + return [ + ...prev, + { + id: product.id, + name: product.name, + unit: product.unit, + price: product.price, + quantity: quantity, + totalPrice: product.price * quantity + } + ]; + } + }); + }; + + const clearCart = () => { + setCart([]); + localStorage.removeItem("cart"); + }; + + const createNewCart = async () => { + if (cart.length === 0) { + alert("Cart is empty!"); + return; + } + + if (!restaurantId) { + alert("Restaurant ID not found!"); + return; + } + + console.log("restaurantId:", restaurantId); + + const payload = { + data: { + type: "cart", + attributes: { + totalPrice: cart.reduce((sum, item) => sum + item.totalPrice, 0) + }, + relationships: { + restaurant: { + data: { id: restaurantId } // ✅ استخدم المتغير مش رقم ثابت + }, + cartItems: cart.map(item => ({ + attributes: { quantity: item.quantity }, + relationships: { product: { data: { id: item.id } } } + })) + } + } + }; + + + // try { + const token = localStorage.getItem("token"); + if (!token) throw new Error("No token found"); + + const response = await axios.post(`${API_BASE_URL}/Cart_Supplier/carts`, payload, { + headers: { + Authorization: `Bearer ${token}`, + Accept: "application/json", + "Content-Type": "application/json" + } + }); + + if (response.data?.data) { + alert("Cart sent to server successfully!"); + console.log(response.data?.data); + clearCart(); + } else { + alert("Failed to create cart on server"); + } + // } catch (error) { + // console.error("Error creating cart:", error); + // alert(error.response?.data?.message || error.message || "Network error"); + // } + }; + + return ( + + {children} + + ); +}; \ No newline at end of file diff --git a/src/contexts/RestaurantContext.js b/src/contexts/RestaurantContext.js new file mode 100644 index 0000000..94eb5ac --- /dev/null +++ b/src/contexts/RestaurantContext.js @@ -0,0 +1,26 @@ +import React, { createContext, useContext, useState, useEffect } from 'react'; + +// إنشاء السياق +const RestaurantContext = createContext(); + +export const useRestaurant = () => useContext(RestaurantContext); + +export const RestaurantProvider = ({ children }) => { + const [restaurantId, setRestaurantId] = useState(() => { + // قراءة القيمة من localStorage عند أول تحميل + const storedId = localStorage.getItem('restaurantId'); + return storedId ? Number(storedId) : null; + }); + + // تحديث localStorage عند تغيير restaurantId + const saveRestaurantId = (id) => { + setRestaurantId(id); + localStorage.setItem('restaurantId', id); + }; + + return ( + + {children} + + ); +}; diff --git a/src/contexts/SnackbarContext.js b/src/contexts/SnackbarContext.js new file mode 100644 index 0000000..f5f2ed0 --- /dev/null +++ b/src/contexts/SnackbarContext.js @@ -0,0 +1,35 @@ +// src/context/SnackbarContext.js +import React, { createContext, useContext, useState } from "react"; +import CustomSnackbar from "../components/common/CustomSnackbar"; + +const SnackbarContext = createContext(); + +export const SnackbarProvider = ({ children }) => { + const [snackbar, setSnackbar] = useState({ + open: false, + message: "", + severity: "info", + }); + + const showSnackbar = (message, severity = "info") => { + setSnackbar({ open: true, message, severity }); + }; + + const closeSnackbar = () => { + setSnackbar((prev) => ({ ...prev, open: false })); + }; + + return ( + + {children} + + + ); +}; + +export const useSnackbar = () => useContext(SnackbarContext); diff --git a/src/contexts/UserContext.js b/src/contexts/UserContext.js new file mode 100644 index 0000000..348e085 --- /dev/null +++ b/src/contexts/UserContext.js @@ -0,0 +1,23 @@ +// src/contexts/UserContext.jsx +import React, { createContext, useState, useEffect } from 'react'; + +export const UserContext = createContext(); + +export const UserProvider = ({ children }) => { + const [user, setUser] = useState({ + email: localStorage.getItem('user_email') || '', + adminData: JSON.parse(localStorage.getItem('adminData')) || null, + }); + + useEffect(() => { + // تحديث localStorage عند تغير user + if (user.email) localStorage.setItem('user_email', user.email); + if (user.adminData) localStorage.setItem('adminData', JSON.stringify(user.adminData)); + }, [user]); + + return ( + + {children} + + ); +}; diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..b2b3ef3 --- /dev/null +++ b/src/index.js @@ -0,0 +1,13 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import App from './App'; + +import { GoogleOAuthProvider } from '@react-oauth/google'; + +const root = ReactDOM.createRoot(document.getElementById('root')); +root.render( + + + +); + diff --git a/src/services/authService.js b/src/services/authService.js new file mode 100644 index 0000000..6fda20d --- /dev/null +++ b/src/services/authService.js @@ -0,0 +1,1990 @@ +import axios from 'axios'; + +const API_BASE_URL = 'http://192.168.196.165:8000/api'; +const BASE_URL = process.env.REACT_APP_BASE_URL || 'http://192.168.196.165:8000'; +// const API_BASE_URL = 'https://kitchplus.velocrea.com/api'; +// const BASE_URL = 'https://kitchplus.velocrea.com/'; +const authService = { + // ======================= + // تسجيل المسؤول + // ======================= + register: async (email, password, password_confirmation) => { + try { + const response = await axios.post(`${API_BASE_URL}/Admin/register`, { + email, + password, + password_confirmation, + }, { + headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' } + }); + + if (response.data?.success && response.data.data?.Admin) { + localStorage.setItem('user_email', email); + localStorage.setItem('token', response.data.data.token); + localStorage.setItem('refresh_token', response.data.data.refresh_token); + localStorage.setItem('adminData', JSON.stringify(response.data.data.Admin)); + } + + return response.data; + } catch (error) { + return error.response ? { + success: false, + status: error.response.status, + message: error.response.data.message || 'Registration failed', + errors: error.response.data.errors || null + } : { success: false, message: 'Network error. Please try again.' }; + } + }, + + // ======================= + // تسجيل الدخول + // ======================= + login: async (email, password) => { + try { + const response = await axios.post(`${API_BASE_URL}/Admin/login`, { email, password }, { + headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' } + }); + + if (response.data?.success && response.data.data?.Admin) { + localStorage.setItem('user_email', email); + localStorage.setItem('token', response.data.data.token); + localStorage.setItem('refresh_token', response.data.data.refresh_token); + localStorage.setItem('adminData', JSON.stringify(response.data.data.Admin)); + } + + return response.data; + } catch (error) { + return error.response ? { + success: false, + status: error.response.status, + message: error.response.data.message || 'Login failed', + errors: error.response.data.errors || null + } : { success: false, message: 'Network error. Please try again.' }; + } + }, + + // ======================= + // تسجيل الخروج + // ======================= + logout: () => { + localStorage.removeItem('token'); + localStorage.removeItem('refresh_token'); + localStorage.removeItem('user_email'); + localStorage.removeItem('adminData'); + return { success: true, message: 'Logged out successfully' }; + }, + + // ======================= + // التحقق من وجود توكن + // ======================= + isTokenValid: () => !!localStorage.getItem('token'), + + // ======================= + // استرجاع بيانات المسؤول + // ======================= + getAdminData: () => { + const adminData = JSON.parse(localStorage.getItem('adminData')); + return adminData || null; + }, + + // ======================= + // استرجاع ID المسؤول + // ======================= + getAdminId: () => { + const adminData = JSON.parse(localStorage.getItem('adminData')); + return adminData?.id || null; + }, + + // ======================= + // استرجاع التوكن + // ======================= + getToken: () => localStorage.getItem('token') || null, + getRefreshToken: () => localStorage.getItem('refresh_token') || null, + + resetPassword: async (email) => { + try { + const response = await axios.post(`${API_BASE_URL}/Admin/reset_password`, { email }); + return response.data; + } catch (error) { + return error.response + ? { + success: false, + status: error.response.status, + message: error.response.data.message || 'Reset request failed', + } + : { success: false, message: 'Network error. Please try again.' }; + } + }, + + verifyCode: async (email, code) => { + try { + const response = await axios.post(`${API_BASE_URL}/Admin/verify`, { email, code }); + return response.data; + } catch (error) { + return error.response + ? { + success: false, + status: error.response.status, + message: error.response.data.message || 'Verification failed', + } + : { success: false, message: 'Network error. Please try again.' }; + } + }, + + updatePassword: async ({ email, password, confirmPassword }) => { + try { + const response = await axios.post(`${API_BASE_URL}/Admin/updatePassword`, { + email, + password, + password_confirmation: confirmPassword + }); + + return response.data; + } catch (error) { + return error.response + ? { + success: false, + status: error.response.status, + message: error.response.data.message || 'Update failed', + errors: error.response.data.errors || null + } + : { success: false, message: 'Network error. Please try again.' }; + } + }, + + googleLogin: async (googleAccessToken) => { + try { + const response = await axios.post(`${API_BASE_URL}/Admin/google-login`, { + token: googleAccessToken, + }, { + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json' + } + }); + + return response.data; + } catch (error) { + if (error.response) { + return { + success: false, + status: error.response.status, + message: error.response.data.message || 'Google login failed', + }; + } + return { + success: false, + message: 'Network error. Please try again.' + }; + } + }, + + createNewRestaurant: async (restaurantData) => { + try { + const token = localStorage.getItem('token'); + if (!token) { + return { success: false, message: 'No token found' }; + } + + const hasFile = restaurantData.logo instanceof File; + + if (hasFile) { + const fd = new FormData(); + for (const key in restaurantData) { + const value = restaurantData[key]; + if (value === null || value === undefined) continue; + + if (key === 'logo') { + fd.append('logo', value); + continue; + } + + if (typeof value === 'boolean') { + // أرسل 1/0 أو "true"/"false" حسب ما يقبله الـ backend. Laravel يقبل "true"/"false" و "1"/"0". + fd.append(key, value ? '1' : '0'); + } else if (typeof value === 'object') { + // إذا يحتوي على مصفوفة أو كائن — حوله لـ JSON + fd.append(key, JSON.stringify(value)); + } else { + fd.append(key, String(value)); + } + } + + // خيار: لعرض ما سترسله (debug) + // for (let pair of fd.entries()) console.log(pair[0], pair[1]); + + const response = await axios.post(`${API_BASE_URL}/restaurants`, fd, { + headers: { + Authorization: `Bearer ${token}`, + Accept: 'application/json', + // 'Content-Type': 'multipart/form-data' + } + }); + + return response.data; + } else { + // لا يوجد ملف → أرسل JSON طبيعي (booleans تبقى boolean) + const response = await axios.post(`${API_BASE_URL}/restaurants`, restaurantData, { + headers: { + Authorization: `Bearer ${token}`, + Accept: 'application/json', + 'Content-Type': 'application/json' + } + }); + return response.data; + } + + } catch (error) { + if (error.response) { + return { + success: false, + status: error.response.status, + message: error.response.data.message || 'Creation failed', + errors: error.response.data.errors || null + }; + } + return { success: false, message: 'Network error. Please try again.' }; + } + }, + + cuisineTypes: async () => { + try { + const token = localStorage.getItem('token'); + if (!token) { + return { success: false, message: 'No token found' }; + } + + const response = await axios.get(`${API_BASE_URL}/restaurants/getCusineTypes`, { + headers: { + Authorization: `Bearer ${token}`, + Accept: 'application/json', + }, + }); + + const cuisines = response?.data?.data?.data || []; + return cuisines; + } catch (error) { + console.error('Error fetching cuisine types:', error); + return []; + } + }, + + registerWaiter: async (waiterData) => { + try { + const token = localStorage.getItem('token'); + if (!token) { + return { success: false, message: 'No token found' }; + } + + const response = await axios.post( + `${API_BASE_URL}/Admin/registerWaiter`, + waiterData, + { + headers: { + Authorization: `Bearer ${token}`, + 'Content-Type': 'application/json', + Accept: 'application/json', + }, + } + ); + + return response.data; + + } catch (error) { + if (error.response) { + // تفاصيل الأخطاء إن وجدت + const detailedErrors = error.response.data.errors || null; + const message = error.response.data.message || 'Failed to register waiter'; + + return { + success: false, + status: error.response.status, + message: message, + errors: detailedErrors, + }; + } + return { + success: false, + message: 'Network error. Please try again.', + }; + } + }, + + registerCooker: async (cookerData) => { + try { + const token = localStorage.getItem('token'); + if (!token) { + return { success: false, message: 'No token found' }; + } + + const response = await axios.post( + `${API_BASE_URL}/Admin/registerCooker`, + cookerData, + { + headers: { + Authorization: `Bearer ${token}`, + 'Content-Type': 'application/json', + Accept: 'application/json', + }, + } + ); + + return response.data; + + } catch (error) { + if (error.response) { + const detailedErrors = error.response.data.errors || null; + const message = error.response.data.message || 'Failed to register cooker'; + + return { + success: false, + status: error.response.status, + message: message, + errors: detailedErrors, + }; + } + return { + success: false, + message: 'Network error. Please try again.', + }; + } + }, + registerAccountant: async (accountantData) => { + try { + const token = localStorage.getItem('token'); + if (!token) { + return { success: false, message: 'No token found' }; + } + + const response = await axios.post( + `${API_BASE_URL}/Admin/registerAccountant`, + accountantData, + { + headers: { + Authorization: `Bearer ${token}`, + 'Content-Type': 'application/json', + Accept: 'application/json', + }, + } + ); + + return response.data; + + } catch (error) { + if (error.response) { + const detailedErrors = error.response.data.errors || null; + const message = error.response.data.message || 'Failed to register accountant'; + + return { + success: false, + status: error.response.status, + message: message, + errors: detailedErrors, + }; + } + return { + success: false, + message: 'Network error. Please try again.', + }; + } + }, + + getAllWaiters: async (restaurantId) => { + try { + const token = localStorage.getItem("token"); + if (!token) { + return { success: false, message: "No token found" }; + } + + const response = await axios.get( + `${API_BASE_URL}/admin/show_all_waiters/${restaurantId}`, + { + headers: { + Authorization: `Bearer ${token}`, + Accept: "application/json", + }, + } + ); + + return response.data; + /* + مثال الاستجابة: + { + "waiters": [ + { "id": 1, "name": "hussain", "email": "gjhu@gmail.com", "shift_type": "morning", "active": 0 }, + { "id": 2, "name": "hussain", "email": "gjhu11@gmail.com", "shift_type": "morning", "active": 0 } + ] + } + */ + + } catch (error) { + if (error.response) { + const message = + error.response.data.message || "Failed to fetch waiters"; + return { + success: false, + status: error.response.status, + message: message, + }; + } + return { + success: false, + message: "Network error. Please try again.", + }; + } + }, + + deleteWaiter: async (waiterId) => { + try { + const token = localStorage.getItem('token'); + if (!token) { + return { message: 'No token found' }; + } + + const response = await axios.delete( + `${API_BASE_URL}/admin/delete_waiter/${waiterId}`, + { + headers: { + Authorization: `Bearer ${token}`, + Accept: 'application/json', + }, + } + ); + + // هنا نرجع الرسالة مباشرة مثل ما أرسلها السيرفر + return { message: response.data.message }; + + } catch (error) { + if (error.response) { + return { + message: error.response.data.message || 'Failed to delete waiter', + status: error.response.status, + }; + } + return { + message: 'Network error. Please try again.', + }; + } + }, + + getWaiterById: async (waiterId) => { + try { + const token = localStorage.getItem("token"); + if (!token) { + return { success: false, message: "No token found" }; + } + + const response = await axios.get( + `${API_BASE_URL}/admin/show_waiter/${waiterId}`, + { + headers: { + Authorization: `Bearer ${token}`, + Accept: "application/json", + }, + } + ); + + return response.data; // هترجع { waiter: { ... } } + } catch (error) { + if (error.response) { + return { + success: false, + status: error.response.status, + message: error.response.data.message || "Failed to fetch waiter", + }; + } + return { success: false, message: "Network error. Please try again." }; + } + }, + // ✅ إحضار كل الطباخين لمطعم محدد + getAllCookers: async (restaurantId) => { + try { + const token = localStorage.getItem("token"); + if (!token) { + return { success: false, message: "No token found" }; + } + + const response = await axios.get( + `${API_BASE_URL}/admin/show_all_cookers/${restaurantId}`, + { + headers: { + Authorization: `Bearer ${token}`, + Accept: "application/json", + }, + } + ); + + return response.data; + /* + مثال استجابة متوقعة: + { + "cookers": [ + { "id": 1, "name": "Ali", "email": "ali@gmail.com", "shift_type": "evening", "active": 1 }, + { "id": 2, "name": "Sara", "email": "sara@gmail.com", "shift_type": "morning", "active": 0 } + ] + } + */ + + } catch (error) { + if (error.response) { + const message = + error.response.data.message || "Failed to fetch cookers"; + return { + success: false, + status: error.response.status, + message: message, + }; + } + return { + success: false, + message: "Network error. Please try again.", + }; + } + }, + + // ✅ حذف طباخ + deleteCooker: async (cookerId) => { + try { + const token = localStorage.getItem('token'); + if (!token) { + return { message: 'No token found' }; + } + + const response = await axios.delete( + `${API_BASE_URL}/admin/delete_cooker/${cookerId}`, + { + headers: { + Authorization: `Bearer ${token}`, + Accept: 'application/json', + }, + } + ); + + // نرجع الرسالة مثل ما يرسلها السيرفر + return { message: response.data.message }; + + } catch (error) { + if (error.response) { + return { + message: error.response.data.message || 'Failed to delete cooker', + status: error.response.status, + }; + } + return { + message: 'Network error. Please try again.', + }; + } + }, + + // ✅ إحضار تفاصيل طباخ محدد + getCookerById: async (cookerId) => { + try { + const token = localStorage.getItem("token"); + if (!token) { + return { success: false, message: "No token found" }; + } + + const response = await axios.get( + `${API_BASE_URL}/admin/show_cooker/${cookerId}`, + { + headers: { + Authorization: `Bearer ${token}`, + Accept: "application/json", + }, + } + ); + + return response.data; // { cooker: { ... } } + + } catch (error) { + if (error.response) { + return { + success: false, + status: error.response.status, + message: error.response.data.message || "Failed to fetch cooker", + }; + } + return { success: false, message: "Network error. Please try again." }; + } + }, + + // ✅ إحضار كل المحاسبين لمطعم محدد + getAllAccountants: async (restaurantId) => { + try { + const token = localStorage.getItem("token"); + if (!token) { + return { success: false, message: "No token found" }; + } + + const response = await axios.get( + `${API_BASE_URL}/admin/show_all_accountants/${restaurantId}`, + { + headers: { + Authorization: `Bearer ${token}`, + Accept: "application/json", + }, + } + ); + + return response.data; + /* + مثال استجابة متوقعة: + { + "accountants": [ + { "id": 1, "name": "Ahmed", "email": "ahmed@gmail.com", "active": 1 }, + { "id": 2, "name": "Lina", "email": "lina@gmail.com", "active": 0 } + ] + } + */ + + } catch (error) { + if (error.response) { + const message = + error.response.data.message || "Failed to fetch accountants"; + return { + success: false, + status: error.response.status, + message: message, + }; + } + return { + success: false, + message: "Network error. Please try again.", + }; + } + }, + + // ✅ حذف محاسب + deleteAccountant: async (accountantId) => { + try { + const token = localStorage.getItem('token'); + if (!token) { + return { message: 'No token found' }; + } + + const response = await axios.delete( + `${API_BASE_URL}/admin/delete_accountant/${accountantId}`, + { + headers: { + Authorization: `Bearer ${token}`, + Accept: 'application/json', + }, + } + ); + + return { message: response.data.message }; + + } catch (error) { + if (error.response) { + return { + message: error.response.data.message || 'Failed to delete accountant', + status: error.response.status, + }; + } + return { + message: 'Network error. Please try again.', + }; + } + }, + + // ✅ إحضار تفاصيل محاسب محدد + getAccountantById: async (accountantId) => { + try { + const token = localStorage.getItem("token"); + if (!token) { + return { success: false, message: "No token found" }; + } + + const response = await axios.get( + `${API_BASE_URL}/admin/show_accountant/${accountantId}`, + { + headers: { + Authorization: `Bearer ${token}`, + Accept: "application/json", + }, + } + ); + + return response.data; // { accountant: { ... } } + + } catch (error) { + if (error.response) { + return { + success: false, + status: error.response.status, + message: error.response.data.message || "Failed to fetch accountant", + }; + } + return { success: false, message: "Network error. Please try again." }; + } + }, + + toggleAccountStatus: async (email, model) => { + try { + const token = localStorage.getItem('token'); // جلب التوكن + if (!token) { + throw new Error("No token found. Please log in."); + } + + const response = await axios.post( + `${API_BASE_URL}/Admin/active`, + { email, model }, + { + headers: { + Authorization: `Bearer ${token}`, + 'Content-Type': 'application/json', + }, + } + ); + return response.data; + } catch (error) { + console.error("Toggle account error:", error); + throw error; + } + }, + + + // ===================== + // دالة لتحويل مسار الصور + // ===================== +processImages: (items, imagePathKey = 'image', defaultImage = '/images/default.png') => { + return items.map(item => { + let imageUrl = defaultImage; + + // دعم المسارات المتداخلة مثل visual_identity.logo_url + const pathParts = imagePathKey.split('.'); + let value = item; + for (let key of pathParts) { + if (value && value[key] !== undefined && value[key] !== null) { + value = value[key]; + } else { + value = null; + break; + } + } + + if (value) { + // إذا القيمة تبدأ بـ "http" اعتبرها رابط كامل ولا تضف BASE_URL + if (value.startsWith('http://') || value.startsWith('https://')) { + imageUrl = value; + } else { + // أضف BASE_URL مع "storage" إذا لم يكن رابط كامل + imageUrl = `${BASE_URL}/storage/${value}`; + } + } + + return { + ...item, + image_url: imageUrl + }; + }); +}, + + getCategories: async () => { + try { + const token = localStorage.getItem('token'); + if (!token) return { success: false, message: 'No token found' }; + + const response = await axios.get(`${API_BASE_URL}/CategoryS/read_CS`, { + headers: { Authorization: `Bearer ${token}`, Accept: 'application/json' }, + }); + + if (response.data?.data) { + const categories = authService.processImages(response.data.data, 'image'); + return { success: true, data: categories }; + } + + return { success: false, message: 'No data found' }; + } catch (error) { + return { + success: false, + message: error.response?.data?.message || 'Network error. Please try again.' + }; + } + }, + + getCountries: async () => { + try { + const token = localStorage.getItem('token'); + if (!token) { + return { success: false, message: 'No token found' }; + } + + const response = await axios.get(`${API_BASE_URL}/restaurants/getCountries`, { + headers: { + Authorization: `Bearer ${token}`, + Accept: 'application/json', + }, + }); + + if (response.data.status) { + // لاحظ: البيانات داخل data.data + const countries = response.data.data.data.map((country) => ({ + id: country.id, + name: country.name, + })); + return { success: true, data: countries }; + } + + return { success: false, message: 'Failed to fetch countries' }; + } catch (error) { + return { + success: false, + message: error.response?.data?.message || 'Network error. Please try again.', + }; + } + }, + + isTokenValid: () => { + return !!localStorage.getItem('token'); + }, + + // createCart: async (cartData) => { + // if (!authService.isTokenValid()) { + // return { success: false, message: 'Invalid token. Please login again.' }; + // } + + // try { + // const token = localStorage.getItem('token'); + // const response = await axios.post(`${API_BASE_URL}/Cart_Supplier/carts`, cartData, { + // headers: { + // Authorization: `Bearer ${token}`, + // Accept: 'application/json', + // 'Content-Type': 'application/json', + // }, + // }); + + // if (response.data) { + // return { success: true, data: response.data.data }; + // } + + // return { success: false, message: 'Failed to create cart' }; + // } catch (error) { + // console.error('Full error response from server:', error.response?.data); + // return { + // success: false, + // status: error.response?.status || null, + // message: error.response?.data?.message || 'Unknown error', + // errors: error.response?.data?.errors || null + // }; + // } + // }, + + + getCart: async () => { + try { + const token = localStorage.getItem("token"); + if (!token) return { success: false, message: "No token found" }; + + const response = await axios.get(`${API_BASE_URL}/Cart_Supplier/carts`, { + headers: { + Authorization: `Bearer ${token}`, + Accept: "application/json", + }, + }); + + if (response.data && response.data.data) { + return { success: true, data: response.data.data }; + } + + return { success: false, message: "No cart data found" }; + } catch (error) { + console.error("Error fetching cart:", error); + return { + success: false, + status: error.response?.status || null, + message: error.response?.data?.message || "Network error. Please try again.", + }; + } + }, + + getCartById: async (cartId) => { + try { + const token = localStorage.getItem("token"); + if (!token) return { success: false, message: "No token found" }; + + const response = await axios.get(`${API_BASE_URL}/Cart_Supplier/carts/${cartId}`, { + headers: { + Authorization: `Bearer ${token}`, + Accept: "application/json", + }, + }); + + if (response.data && response.data.data) { + return { success: true, data: response.data.data }; + } + + return { success: false, message: "No cart data found" }; + } catch (error) { + console.error("Error fetching cart by ID:", error); + return { + success: false, + status: error.response?.status || null, + message: error.response?.data?.message || "Network error. Please try again.", + }; + } + }, + + updateCart: async (cartId, cartData) => { + try { + const token = localStorage.getItem('token'); + if (!token) return { success: false, message: 'No token found' }; + + const response = await axios.put(`${API_BASE_URL}/Cart_Supplier/carts/${cartId}`, cartData, { + headers: { + Authorization: `Bearer ${token}`, + Accept: 'application/json', + 'Content-Type': 'application/json', + }, + }); + + if (response.data && response.data.data) { + return { success: true, data: response.data.data }; + } + + return { success: false, message: 'Failed to update cart' }; + + } catch (error) { + console.error('Error updating cart:', error); + return { + success: false, + status: error.response?.status || null, + message: error.response?.data?.message || 'Network error. Please try again.', + errors: error.response?.data?.errors || null, + }; + } + }, + + deleteCart: async (cartId) => { + try { + const token = localStorage.getItem('token'); + if (!token) return { success: false, message: 'No token found' }; + + const response = await axios.delete(`${API_BASE_URL}/Cart_Supplier/carts/${cartId}`, { + headers: { + Authorization: `Bearer ${token}`, + Accept: 'application/json', + }, + }); + + return response.data; + } catch (error) { + console.error('Error deleting cart:', error); + return { + success: false, + status: error.response?.status || null, + message: error.response?.data?.message || 'Network error. Please try again.', + }; + } + }, + + addCategory: async (categoryData) => { + try { + const token = localStorage.getItem("token"); + const response = await axios.post( + `${API_BASE_URL}/admin/add_category`, + categoryData, + { + headers: { + Authorization: token ? `Bearer ${token}` : "", + Accept: "application/json", + "Content-Type": "application/json", + }, + } + ); + return response.data; + } catch (error) { + console.error("❌ Error adding category:", error); + throw error.response?.data || { message: "Something went wrong" }; + } + }, + + updateCategory: async (categoryId, categoryData) => { + try { + const token = localStorage.getItem("token"); + const response = await axios.put( + `${API_BASE_URL}/admin/update_category/${categoryId}`, + categoryData, + { + headers: { + Authorization: token ? `Bearer ${token}` : "", + Accept: "application/json", + "Content-Type": "application/json", + }, + } + ); + return response.data; // { message: "category updated successfully", category: {...} } + } catch (error) { + console.error("❌ Error updating category:", error); + throw error.response?.data || { message: "Something went wrong" }; + } + }, + + deleteCategory: async (categoryId) => { + try { + const token = localStorage.getItem("token"); + const response = await axios.delete( + `${API_BASE_URL}/admin/delete_category/${categoryId}`, + { + headers: { + Authorization: token ? `Bearer ${token}` : "", + Accept: "application/json", + }, + } + ); + return response.data; // { message: "category deleted successfully" } + } catch (error) { + console.error("❌ Error deleting category:", error); + throw error.response?.data || { message: "Something went wrong" }; + } + }, + + getCategoriesByRestaurant: async (restaurantId) => { + try { + const token = localStorage.getItem("token"); + if (!token) return { success: false, message: "No token found" }; + + const response = await axios.get( + `${API_BASE_URL}/admin/all_categories/${restaurantId}`, + { + headers: { + Authorization: `Bearer ${token}`, + Accept: "application/json", + }, + } + ); + + if (response.data?.categories) { + return { success: true, data: response.data.categories }; + } + + return { success: false, message: "No categories found" }; + } catch (error) { + console.error("❌ Error fetching categories:", error); + return { + success: false, + status: error.response?.status || null, + message: error.response?.data?.message || "Network error. Please try again.", + }; + } + }, + + getMealsByCategory: async (restaurantId, categoryId, page = 1) => { + try { + const token = localStorage.getItem("token"); + if (!token) return { success: false, message: "No token found", data: [], pagination: null }; + + // ✅ شيل restaurantId من الـ URL + const response = await axios.get( + `${API_BASE_URL}/admin/category_meals/${categoryId}?page=${page}`, + { + headers: { + Authorization: `Bearer ${token}`, + Accept: "application/json", + }, + } + ); + + const mealsData = response.data?.data?.category?.meals?.data || []; + const meta = response.data?.data?.category?.meals?.meta || {}; + + const meals = mealsData.map(meal => ({ + id: meal.id, + category_id: meal.category_id, + restaurant_id: meal.restaurant_id, + name: meal.name, + description: meal.description || [], + additions: meal.additions || [], + price: meal.price, + photo: meal.photo || "/images/default-product.png", + created_at: meal.created_at, + updated_at: meal.updated_at, + })); + + return { + success: true, + data: meals, + pagination: { + current_page: meta.current_page || 1, + per_page: meta.per_page || meals.length, + total: meta.total || meals.length, + last_page: meta.last_page || 1, + }, + }; + } catch (error) { + console.error("❌ Error fetching category meals:", error); + return { success: false, message: "Failed to fetch meals", data: [], pagination: null }; + } + }, + + getAllMealsByRestaurant: async (restaurantId, page = 1) => { + try { + const token = localStorage.getItem("token"); + if (!token) return { success: false, message: "No token found" }; + + const response = await axios.get( + `${API_BASE_URL}/admin/all_meals/${restaurantId}?page=${page}`, + { + headers: { + Authorization: `Bearer ${token}`, + Accept: "application/json", + }, + } + ); + + const mealsData = response.data.meals?.data || []; + + // تحويل كل وجبة بحيث تحتوي على الحقل photo مباشرة + const meals = mealsData.map((meal) => ({ + id: meal.id, + category_id: meal.category_id, + restaurant_id: meal.restaurant_id, + name: meal.name, + description: meal.description || [], + additions: meal.additions || [], + price: meal.price, + photo: meal.photo || "/images/default-product.png", + created_at: meal.created_at, + updated_at: meal.updated_at, + })); + + return { + success: true, + data: meals, + pagination: { + current_page: response.data.meals.current_page, + per_page: response.data.meals.per_page, + total: response.data.meals.total, + last_page: response.data.meals.last_page, + next_page_url: response.data.meals.next_page_url, + prev_page_url: response.data.meals.prev_page_url, + }, + }; + } catch (error) { + console.error("❌ Error fetching meals:", error); + return { + success: false, + status: error.response?.status || null, + message: + error.response?.data?.message || "Network error. Please try again.", + }; + } + }, + + addMeal: async (mealData) => { + try { + const token = localStorage.getItem("token"); + const formData = new FormData(); + + Object.keys(mealData).forEach(key => { + const value = mealData[key]; + if (Array.isArray(value)) { + value.forEach((item, idx) => formData.append(`${key}[${idx}]`, item)); + } else if (key === 'photo' && value) { + formData.append('photo', value); + } else if (value !== undefined && value !== null) { + formData.append(key, value); + } + }); + + const response = await axios.post(`${API_BASE_URL}/admin/add_meal`, formData, { + headers: { + 'Content-Type': 'multipart/form-data', + Authorization: token ? `Bearer ${token}` : "", + Accept: "application/json", + }, + }); + + // التأكد أن دائمًا هناك message + return { + message: response.data?.message || "Meal added successfully", + data: response.data?.data || null, + }; + } catch (error) { + console.error("❌ Error adding meal:", error); + return { + message: error.response?.data?.message || "Something went wrong", + data: null, + }; + } + } + , + + updateMeal: async (mealId, data) => { + const token = localStorage.getItem("token"); + if (!token) throw { message: "No token found. Please login." }; + + const formData = new FormData(); + formData.append("name", data.name); + formData.append("category_id", data.category_id); + formData.append("restaurant_id", data.restaurant_id); + + // إضافة الوصف فقط مرة واحدة + (data.description || []).forEach((d) => formData.append('description[]', d)); + + // إضافة الإضافات + (data.additions || []).forEach((a) => formData.append('additions[]', a)); + + formData.append("price", data.price); + + // إضافة الصور إذا كانت موجودة + (data.photo || []).forEach((file) => formData.append("photo", file)); + + const res = await axios.post( + `${API_BASE_URL}/admin/update_meal/${mealId}`, + formData, + { + headers: { + // لا تضف Content-Type هنا! + Authorization: `Bearer ${token}`, + Accept: "application/json", + }, + } + ); + return res.data; + }, + deleteMeal: async (mealId, restaurantId, categoryId) => { + try { + const token = localStorage.getItem("token"); + if (!token) throw { message: "No token found. Please login." }; + + const formData = new FormData(); + formData.append("_method", "DELETE"); // محاكاة طلب DELETE + formData.append("id", mealId); + formData.append("restaurant_id", restaurantId); + formData.append("category_id", categoryId); + + const response = await axios.post( + `${API_BASE_URL}/admin/delete_meal/${mealId}`, + formData, + { + headers: { + Authorization: `Bearer ${token}`, + Accept: "application/json", + }, + } + ); + + return response.data; + } catch (err) { + console.error("Error deleting meal:", err); + throw err.response?.data || { message: "Failed to delete meal." }; + } + }, + + + // 📌 جلب جميع الطاولات لمطعم معيّن + getTablesByRestaurant: async (restaurantId, page = 1) => { + try { + const token = localStorage.getItem("token"); + if (!token) return { success: false, message: "No token found", data: [] }; + + const response = await axios.get( + `${API_BASE_URL}/table/${restaurantId}?page=${page}`, + { + headers: { + Authorization: `Bearer ${token}`, + Accept: "application/json", + }, + } + ); + + const tablesData = response.data?.data?.data || []; + const meta = response.data?.data || {}; + + return { + success: true, + data: tablesData, + pagination: { + current_page: meta.current_page || 1, + per_page: meta.per_page || tablesData.length, + total: meta.total || tablesData.length, + last_page: meta.last_page || 1, + }, + }; + } catch (error) { + console.error("❌ Error fetching tables:", error); + return { + success: false, + status: error.response?.status || null, + message: + error.response?.data?.message || "Network error. Please try again.", + data: [], + pagination: null, + }; + } + }, + // 📌 إضافة طاولة جديدة + addTable: async (tableData) => { + try { + const token = localStorage.getItem("token"); + if (!token) return { success: false, message: "No token found" }; + + const response = await axios.post( + `${API_BASE_URL}/table`, + tableData, + { + headers: { + Authorization: `Bearer ${token}`, + Accept: "application/json", + "Content-Type": "application/json", + }, + } + ); + + return { + success: response.data?.success || false, + message: response.data?.message || "Table created successfully", + data: response.data?.data || null, + }; + } catch (error) { + console.error("❌ Error adding table:", error); + return { + success: false, + status: error.response?.status || null, + message: error.response?.data?.message || "Something went wrong", + errors: error.response?.data?.errors || null, + }; + } + }, + deleteTable: async (tableId) => { + try { + const token = localStorage.getItem("token"); // إذا تستخدم توكن + const response = await axios.delete(`${API_BASE_URL}/table/${tableId}`, { + headers: { + Authorization: token ? `Bearer ${token}` : "", + "Content-Type": "application/json", + }, + }); + return { success: true, data: response.data }; + } catch (error) { + console.error("❌ Error deleting table:", error); + return { success: false, message: error.response?.data || error.message }; + } + }, + + createRestaurantProfile: async (restaurantId, profileData) => { + try { + const token = localStorage.getItem("token"); + if (!token) { + return { success: false, message: "No token found" }; + } + + // نتأكد من وجود id + if (!restaurantId) { + return { success: false, message: "Restaurant ID is required" }; + } + + // هل يوجد ملف (مثلاً logo)؟ + const hasFile = profileData.logo instanceof File; + + if (hasFile) { + const fd = new FormData(); + for (const key in profileData) { + const value = profileData[key]; + if (value === null || value === undefined) continue; + + if (key === "logo") { + fd.append("logo", value); + continue; + } + + if (typeof value === "boolean") { + fd.append(key, value ? "1" : "0"); + } else if (typeof value === "object") { + fd.append(key, JSON.stringify(value)); + } else { + fd.append(key, String(value)); + } + } + + const response = await axios.post( + `${API_BASE_URL}/restaurants/${restaurantId}/profile`, + fd, + { + headers: { + Authorization: `Bearer ${token}`, + Accept: "application/json", + // axios يضبط Content-Type أوتوماتيك مع FormData + }, + } + ); + + return { success: true, data: response.data }; + } else { + // لا يوجد ملف → إرسال JSON طبيعي + const response = await axios.post( + `${API_BASE_URL}/restaurants/${restaurantId}/profile`, + profileData, + { + headers: { + Authorization: `Bearer ${token}`, + Accept: "application/json", + "Content-Type": "application/json", + }, + } + ); + return { success: true, data: response.data }; + } + } catch (error) { + if (error.response) { + return { + success: false, + status: error.response.status, + message: error.response.data.message || "Profile creation failed", + errors: error.response.data.errors || null, + }; + } + return { success: false, message: "Network error. Please try again." }; + } + }, +// دالة لجلب بيانات ملف المطعم + getRestaurantProfile: async(restaurantId)=> { + try { + const response = await fetch( `${API_BASE_URL}/restaurants/${restaurantId}/profile`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + // إضافة Authorization هنا إذا كان مطلوبًا + // 'Authorization': 'Bearer YOUR_TOKEN' + } + }); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + const data = await response.json(); + return data; // ترجع البيانات كاملة كما في المثال + } catch (error) { + console.error("Error fetching restaurant profile:", error); + return null; + } +}, +updateRestaurantProfile: async (restaurantId, profileData) => { + try { + const token = localStorage.getItem("token"); + if (!token) return { success: false, message: "No token found" }; + if (!restaurantId) return { success: false, message: "Restaurant ID is required" }; + + const hasFile = profileData.logo instanceof File; + + if (hasFile) { + const fd = new FormData(); + for (const key in profileData) { + const value = profileData[key]; + if (value === null || value === undefined) continue; + + if (key === "logo") { + fd.append("logo", value); + continue; + } + + if (typeof value === "object") { + fd.append(key, JSON.stringify(value)); + } else { + fd.append(key, String(value)); + } + } + + const response = await axios.put( + `${API_BASE_URL}/restaurants/${restaurantId}/profile`, + fd, + { + headers: { + Authorization: `Bearer ${token}`, + Accept: "application/json", + }, + } + ); + return { success: true, data: response.data }; + } else { + const response = await axios.put( + `${API_BASE_URL}/restaurants/${restaurantId}/profile`, + profileData, + { + headers: { + Authorization: `Bearer ${token}`, + Accept: "application/json", + "Content-Type": "application/json", + }, + } + ); + return { success: true, data: response.data }; + } + } catch (error) { + if (error.response) { + return { + success: false, + status: error.response.status, + message: error.response.data.message || "Profile update failed", + errors: error.response.data.errors || null, + }; + } + return { success: false, message: "Network error. Please try again." }; + } +}, +// 📌 جلب إحصائيات الحجوزات لمطعم معيّن حسب الفترة + getReservationStatistics: async (restaurantId, period = "daily", date = null) => { + try { + const token = localStorage.getItem("token"); + if (!token) return { success: false, message: "No token found", data: [] }; + if (!restaurantId) return { success: false, message: "Restaurant ID is required", data: [] }; + + // التاريخ الافتراضي: اليوم الحالي + const selectedDate = date || new Date().toISOString().split('T')[0]; // YYYY-MM-DD + + const response = await axios.get( + `${API_BASE_URL}/admin/reservation_statistics/${restaurantId}`, + { + params: { period, date: selectedDate }, // إرسال period و date كـ query params + headers: { + Authorization: `Bearer ${token}`, + Accept: "application/json", + }, + } + ); + + const statsData = response.data?.data || []; + + return { + success: response.data?.success || false, + data: statsData, + }; + } catch (error) { + console.error("❌ Error fetching reservation statistics:", error); + return { + success: false, + status: error.response?.status || null, + message: error.response?.data?.message || "Network error. Please try again.", + data: [], + }; + } + }, + getOrderStatistics: async (restaurantId, period = "daily", date = null) => { + try { + const token = localStorage.getItem("token"); + if (!token) return { success: false, message: "No token found", data: [] }; + if (!restaurantId) return { success: false, message: "Restaurant ID is required", data: [] }; + + // التاريخ الافتراضي: اليوم الحالي + const selectedDate = date || new Date().toISOString().split('T')[0]; // YYYY-MM-DD + + const response = await axios.get( + `${API_BASE_URL}/admin/order_statistics/${restaurantId}`, + { + params: { period, date: selectedDate }, // إرسال period و date كـ query params + headers: { + Authorization: `Bearer ${token}`, + Accept: "application/json", + }, + } + ); + + const statsData = response.data?.data || []; + + return { + success: response.data?.success || false, + data: statsData, + }; + } catch (error) { + console.error("❌ Error fetching reservation statistics:", error); + return { + success: false, + status: error.response?.status || null, + message: error.response?.data?.message || "Network error. Please try again.", + data: [], + }; + } + }, + getBillStatistics: async (restaurantId, period = "daily", date = null) => { + try { + const token = localStorage.getItem("token"); + if (!token) return { success: false, message: "No token found", data: [] }; + if (!restaurantId) return { success: false, message: "Restaurant ID is required", data: [] }; + + // التاريخ الافتراضي: اليوم الحالي + const selectedDate = date || new Date().toISOString().split('T')[0]; // YYYY-MM-DD + + const response = await axios.get( + `${API_BASE_URL}/admin/bill_statistics/${restaurantId}`, + { + params: { period, date: selectedDate }, // إرسال period و date كـ query params + headers: { + Authorization: `Bearer ${token}`, + Accept: "application/json", + }, + } + ); + + const statsData = response.data?.data || []; + + return { + success: response.data?.success || false, + data: statsData, + }; + } catch (error) { + console.error("❌ Error fetching reservation statistics:", error); + return { + success: false, + status: error.response?.status || null, + message: error.response?.data?.message || "Network error. Please try again.", + data: [], + }; + } + }, +// 📌 جلب نسبة الإشغال (Occupancy Rate) لمطعم معيّن حسب الفترة +getOccupancyRate: async (restaurantId, period = "daily", date = null) => { + try { + const token = localStorage.getItem("token"); + if (!token) return { success: false, message: "No token found", data: null }; + if (!restaurantId) return { success: false, message: "Restaurant ID is required", data: null }; + + // التاريخ الافتراضي: اليوم الحالي + const selectedDate = date || new Date().toISOString().split('T')[0]; // YYYY-MM-DD + + const response = await axios.get( + `${API_BASE_URL}/admin/occupancy_rate/${restaurantId}`, + { + params: { period, date: selectedDate }, // period و date كـ query params + headers: { + Authorization: `Bearer ${token}`, + Accept: "application/json", + }, + } + ); + + const occupancyRate = response.data?.occupancy_rate || "0%"; + + return { + success: response.data?.success || false, + period: response.data?.period || period, + date: response.data?.date || selectedDate, + data: occupancyRate, + }; + } catch (error) { + console.error("❌ Error fetching occupancy rate:", error); + return { + success: false, + status: error.response?.status || null, + message: error.response?.data?.message || "Network error. Please try again.", + data: null, + }; + } +}, + + getRestaurants: async () => { + try { + const token = localStorage.getItem('token'); + if (!token) return { success: false, message: 'No token found' }; + + const response = await axios.get(`${API_BASE_URL}/restaurants/allresturant`, { + headers: { Authorization: `Bearer ${token}`, Accept: 'application/json' }, + }); + + if (response.data.success && response.data.data?.data) { + // استخدم الدالة الموحدة لتحويل الصور + const restaurants = authService.processImages(response.data.data.data, 'visual_identity.logo_url', '/images/default-restaurant.png'); + return { success: true, data: restaurants }; + } + + return { success: false, message: 'No data found' }; + } catch (error) { + console.error('Error fetching restaurants:', error); + return { + success: false, + status: error.response?.status || null, + message: error.response?.data?.message || 'Network error. Please try again.' + }; + } + }, + + +getRestaurantById: async (restaurantId) => { + try { + const token = localStorage.getItem("token"); + if (!token) return { success: false, message: "No token found" }; + + const response = await axios.get(`${API_BASE_URL}/restaurants/${restaurantId}`, { + headers: { Authorization: `Bearer ${token}`, Accept: "application/json" }, + }); + + if (response.data.success && response.data.data) { + const restaurant = response.data.data; + + // تأكد من تعريف BASE_URL في أعلى الملف + const processed = authService.processImages( + [restaurant], + 'visual_identity.logo_url', + '/images/default-restaurant.png' + ); + + return { success: true, data: processed[0] }; + } + + return { success: false, message: "No data found" }; + } catch (error) { + if (error.response) { + return { + success: false, + status: error.response.status, + message: error.response.data.message || "Failed to fetch restaurant", + }; + } + return { success: false, message: "Network error. Please try again." }; + } +}, + +// ///////////////////////////////////////////////////////// +// ///////////////////////////////////////////////////////// +// ///////////////////////////////////////////////////////// +// ///////////////////////////////////////////////////////// + + + + + + + + + getAllCategory: async () => { + try { + const token = localStorage.getItem("token"); + if (!token) return { success: false, message: "No token found", data: [], pagination: null }; + + const response = await axios.get( + `${API_BASE_URL}/CategoryS/read_CS`, + { + headers: { + Authorization: `Bearer ${token}`, + Accept: "application/json", + }, + } + ); + + // const CatSData = response.data?.data?.category?.CatS?.data || []; + const CatSData = response.data?.data || []; + const meta = response.data?.data?.category?.CatS?.meta || {}; + + const CatS = CatSData.map(Category => ({ + id: Category.id, + name: Category.name, + icon: Category.image, + })); + + return { + success: true, + data: CatS + }; + } catch (error) { + console.error("❌ Error fetching category meals:", error); + return { success: false, message: "Failed to fetch meals", data: [], pagination: null }; + } + }, + + + getAllProduct: async () => { + try { + const token = localStorage.getItem("token"); + if (!token) return { success: false, message: "No token found", data: [], pagination: null }; + + const response = await axios.get( + `${API_BASE_URL}/ProductS/read_PS`, + { + headers: { + Authorization: `Bearer ${token}`, + Accept: "application/json", + }, + } + ); + + const Product = response.data?.data || []; + const meta = response.data?.data?.category?.CatS?.meta || {}; + + const Pro = Product.map(product => ({ + id: product.id, + name: product.name, + category: product.supplier_category_id, + price: product.price, + unit: "Kg", + image: product.image, + })); + + return { + success: true, + data: Pro + }; + } catch (error) { + console.error("Error fetching category meals:", error); + return { success: false, message: "Failed to fetch meals", data: [], pagination: null }; + } + }, + + + + +createCart: async (cartData) => { + try { + const token = localStorage.getItem("token"); + if (!token) return { success: false, message: "No token found", data: null }; + + const response = await axios.post( + `${API_BASE_URL}/Cart_Supplier/carts`, + cartData, + { + headers: { + Authorization: `Bearer ${token}`, + Accept: "application/json", + "Content-Type": "application/json", + }, + } + ); + + return { + success: true, + data: response.data?.data || null, + }; + } catch (error) { + console.error("Error creating cart:", error); + return { success: false, message: "Failed to create cart", data: null }; + } +}, + + + +getProductsByCategory: async (categoryId, page = 1) => { + try { + const token = localStorage.getItem("token"); + if (!token) + return { + success: false, + message: "No token found", + data: [], + pagination: null, + }; + + const response = await axios.get( + `${API_BASE_URL}/ProductS/getproductsbycategory/${categoryId}?page=${page}`, + { + headers: { + Authorization: `Bearer ${token}`, + Accept: "application/json", + }, + } + ); + + const productsData = response.data?.data || []; + const meta = response.data?.meta || {}; + + const products = productsData.map((product) => ({ + id: product.id, + name: product.name, + price: product.price, + category_id: product.supplier_category_id, + image: product.image + // ? `${API_BASE_URL}/${product.image}` + || "/images/default-product.png", + created_at: product.created_at, + updated_at: product.updated_at, + })); + + return { + success: true, + data: products, + pagination: { + current_page: meta.current_page || 1, + per_page: meta.per_page || products.length, + total: meta.total || products.length, + last_page: meta.last_page || 1, + }, + }; + } catch (error) { + console.error("Error fetching products by category:", error); + return { + success: false, + message: "Failed to fetch products", + data: [], + pagination: null, + }; + } +}, + + + + + + + getOrders: async (page = 1) => { + try { + const token = localStorage.getItem("token"); + if (!token) return { success: false, message: "No token found", data: [], pagination: null }; + + const response = await axios.get(`${API_BASE_URL}/Cart_Supplier/carts`, { + headers: { + Authorization: `Bearer ${token}`, + Accept: "application/json", + }, + }); + + const ordersData = response.data?.data || []; + const meta = response.data?.meta || {}; + + const orders = ordersData.map(order => ({ + id: order.id, + totalPrice: order.attributes?.total_price || order.attributes?.totalPrice || "0.00", + createdAt: order.attributes?.createdAt || null, + cartItems: order.relationships?.cart_items || order.relationships?.cartItems || [], + })); + + return { + success: true, + data: orders, + pagination: { + current_page: meta.current_page || 1, + per_page: meta.per_page || orders.length, + total: meta.total || orders.length, + last_page: meta.last_page || 1, + }, + }; + + } catch (error) { + console.error("Error fetching orders:", error); + return { success: false, message: "Failed to fetch orders", data: [], pagination: null }; + } + }, + + + + + + confirmOrder: async (order) => { + try { + const token = localStorage.getItem("token"); + if (!token) return { success: false, message: "No token found", data: null }; + + const response = await axios.post( + `${API_BASE_URL}/Order_Supplier/myorders`, + order, + { + headers: { + Authorization: `Bearer ${token}`, + Accept: "application/json", + "Content-Type": "application/json", + }, + } + ); + return { + success: true, + data: response.data?.data || null, + }; + } catch (error) { + console.error("Error creating cart:", error); + return { success: false, message: "Failed to create cart", data: null }; + } +}, + + + +}; + +export default authService; diff --git a/src/services/cartHelpers.js b/src/services/cartHelpers.js new file mode 100644 index 0000000..057fbf8 --- /dev/null +++ b/src/services/cartHelpers.js @@ -0,0 +1,140 @@ + +import authService from './authService'; + +// === مفاتيح التخزين === +const CART_KEY = 'activeCartId'; + +// === LocalStorage Helpers === +export const setActiveCartId = (id) => { + try { localStorage.setItem(CART_KEY, String(id)); } catch {} +}; +export const getActiveCartId = () => { + try { return localStorage.getItem(CART_KEY); } catch { return null; } +}; +export const clearActiveCartId = () => { + try { localStorage.removeItem(CART_KEY); } catch {} +}; + +// === تحويل عناصر الكارت لصيغة JSON:API === +export const buildCartPayload = (items, totalPrice) => ({ + data: { + type: "cart", + attributes: { + totalPrice: typeof totalPrice === 'number' ? Number(totalPrice) : undefined, + }, + relationships: { + cartItems: items.map(it => ({ + attributes: { quantity: Number(it.quantity) }, + relationships: { + product: { data: { id: it.productId } } + } + })) + } + } +}); + +// === استخراج الـ productId من أي شكل محتمل === +export const extractProductId = (product) => ( + product?.relationships?.supplier_product?.id || + product?.relationships?.product?.data?.id || + product?.supplier_product_id || + product?.product_id || + product?.id +); + +// === استخراج عناصر الكارت من استجابة الباك === +export const getItemsFromCart = (cartData) => { + const rel = cartData?.relationships || {}; + const list = rel.cartItems || rel.cart_items || []; + return list.map(item => ({ + id: item.id, + productId: item.relationships?.supplier_product?.id || + item.relationships?.product?.data?.id, + quantity: Number(item?.attributes?.quantity || 0), + })).filter(x => x.productId); +}; + +// === إضافة/تحديث عنصر في قائمة الكارت === +export const upsertItem = (items, productId, quantity) => { + const idx = items.findIndex(x => String(x.productId) === String(productId)); + if (idx >= 0) { + const merged = [...items]; + merged[idx] = { ...merged[idx], quantity: Number(merged[idx].quantity) + Number(quantity) }; + return merged; + } + return [...items, { productId, quantity: Number(quantity) }]; +}; + +// === حساب إجمالي مؤقت إن توفر priceMap === +export const estimateTotal = (items, priceMap) => { + if (!priceMap) return undefined; + return items.reduce((sum, it) => sum + (Number(priceMap[it.productId]) || 0) * Number(it.quantity), 0); +}; + +// === التأكد من وجود كارت فعّالة وإنشاؤها إذا لم توجد === +export const ensureActiveCart = async () => { + const existing = getActiveCartId(); + if (existing) return existing; + + const token = localStorage.getItem('token'); + if (!token) return null; + + const payload = { + data: { + type: "cart", + attributes: { totalPrice: 0 }, + relationships: { cartItems: [] } + } + }; + + const res = await authService.createCart(payload); + if (res?.success && res?.data?.id) { + setActiveCartId(res.data.id); + return res.data.id; + } + return null; +}; + +// === إضافة منتج للكارت الفعّالة === +export const addItemToActiveCart = async ({ product, quantity = 1, priceMap = null }) => { + const token = localStorage.getItem('token'); + if (!token) return { success: false, message: 'No token found' }; + + const cartId = await ensureActiveCart(); + if (!cartId) return { success: false, message: 'Failed to create or get cart' }; + + const current = await authService.getCartById(cartId); + if (!current?.success || !current?.data) return { success: false, message: 'Failed to fetch active cart' }; + + const existingItems = getItemsFromCart(current.data); + const productId = extractProductId(product); + if (!productId) return { success: false, message: 'Invalid product id' }; + + const mergedItems = upsertItem(existingItems, productId, quantity); + const totalPrice = estimateTotal(mergedItems, priceMap); + const updatePayload = buildCartPayload(mergedItems, totalPrice); + + const updated = await authService.updateCart(cartId, updatePayload); + if (updated?.success && updated?.data?.id) { + setActiveCartId(updated.data.id); + return { success: true, data: updated.data, cartId: updated.data.id }; + } + + return { success: false, message: updated?.message || 'Failed to update cart', errors: updated?.errors || null }; +}; + +// === تصدير الأدوات كموديل واحد === +const cartHelpers = { + setActiveCartId, + getActiveCartId, + clearActiveCartId, + ensureActiveCart, + addItemToActiveCart, + buildCartPayload, + extractProductId, + getItemsFromCart, + upsertItem, + estimateTotal, +}; + +export default cartHelpers; diff --git a/src/setupTests.js b/src/setupTests.js new file mode 100644 index 0000000..8f2609b --- /dev/null +++ b/src/setupTests.js @@ -0,0 +1,5 @@ +// jest-dom adds custom jest matchers for asserting on DOM nodes. +// allows you to do things like: +// expect(element).toHaveTextContent(/react/i) +// learn more: https://github.com/testing-library/jest-dom +import '@testing-library/jest-dom'; diff --git a/src/test.js b/src/test.js new file mode 100644 index 0000000..e2d768a --- /dev/null +++ b/src/test.js @@ -0,0 +1,37 @@ +import React from 'react'; +import { useNavigate } from 'react-router-dom'; +import { useTheme } from '@mui/material/styles'; +import { Box, Typography } from '@mui/material'; + +const Test = () => { + const navigate = useNavigate(); + const theme = useTheme(); + + const handleClick = () => { + navigate('/dashboard'); + }; + + return ( + + + Test Component + + + + ); +}; + +export default Test; \ No newline at end of file diff --git a/src/theme.js b/src/theme.js new file mode 100644 index 0000000..96abf0a --- /dev/null +++ b/src/theme.js @@ -0,0 +1,26 @@ +import { createTheme } from '@mui/material/styles'; + +const theme = createTheme({ + + breakpoints: { + values: { + xs: 0, + sm: 600, + md: 900, + lg: 1200, + xl: 1536, + }, + }, + typography: { + fontFamily: 'INTER', + }, + palette: { + primary: { + main: '#FF914D', + hover: '#e57f3f' + }, + + }, +}); + +export default theme; diff --git a/workflows/main.yml b/workflows/main.yml new file mode 100644 index 0000000..fdee2d2 --- /dev/null +++ b/workflows/main.yml @@ -0,0 +1,13 @@ + deploy: + needs: build_and_push_image + steps: + - name: checkout code + uses: actions/checkout@v5.0.0 + - name: install ghaymah cli + run: curl -sSl https://cli.ghaymah.systems/install.sh | bash + + - name: login to ghaymah + run: $HOME/ghaymah/bin/gy auth login --email "${{secrets.GHAYMAH_EMAIL}}" --password "${{secrets.GHAYMAH_PW}}" + + - name: deploy + run: $HOME/ghaymah/bin/gy resource app launch \ No newline at end of file