From 87d902414c4c3e5d61f6cb8979331ddf9846ff89 Mon Sep 17 00:00:00 2001 From: PhilReact Date: Sun, 10 Dec 2023 14:13:58 +0200 Subject: [PATCH] initial commit --- .eslintrc.cjs | 14 + .gitignore | 25 + .prettierrc | 10 + index.html | 13 + package-lock.json | 9506 +++++++++++++++++ package.json | 55 + src/App.css | 43 + src/App.tsx | 40 + src/assets/images/CoverImageDefault.webp | Bin 0 -> 31696 bytes src/assets/images/QFundDarkLogo.png | Bin 0 -> 42991 bytes src/assets/images/QFundLightLogo.png | Bin 0 -> 43182 bytes src/assets/img/qort.png | Bin 0 -> 1907 bytes src/assets/react.svg | 1 + src/assets/svgs/AccountCircleSVG.tsx | 25 + src/assets/svgs/DarkModeSVG.tsx | 23 + src/assets/svgs/DonateSVG.tsx | 21 + src/assets/svgs/DownloadedLight.tsx | 13 + src/assets/svgs/DownloadingLight.tsx | 13 + src/assets/svgs/ExploreSVG.tsx | 21 + src/assets/svgs/IconTypes.ts | 7 + src/assets/svgs/LightModeSVG.tsx | 23 + src/assets/svgs/PiggybankSVG.tsx | 21 + src/assets/svgs/QortalSVG.tsx | 46 + src/assets/svgs/StarSVG.tsx | 21 + src/assets/svgs/TimesSVG.tsx | 23 + src/assets/svgs/TrackSVG.tsx | 21 + src/components/Crowdfund/Crowdfund-styles.tsx | 583 + src/components/Crowdfund/FileAttachment.tsx | 84 + src/components/Crowdfund/NewCrowdfund.tsx | 569 + src/components/Crowdfund/NewUpdate.tsx | 369 + src/components/ImageUploader.tsx | 89 + src/components/ResponsiveImage.tsx | 56 + src/components/common/AudioPlayer.tsx | 236 + .../BlockedNamesModal-styles.ts | 28 + .../BlockedNamesModal/BlockedNamesModal.tsx | 100 + src/components/common/Comments/Comment.tsx | 295 + .../common/Comments/CommentEditor.tsx | 254 + .../common/Comments/CommentSection.tsx | 274 + .../common/Comments/Comments-styles.tsx | 280 + .../common/Countdown/Countdown-styles.tsx | 63 + src/components/common/Countdown/Countdown.tsx | 142 + src/components/common/DisplayHtml.tsx | 29 + .../common/Donate/Donate-styles.tsx | 48 + src/components/common/Donate/Donate.tsx | 235 + src/components/common/Donate/DonorInfo.tsx | 90 + src/components/common/Donate/DonorModal.tsx | 82 + src/components/common/DownloadTaskManager.tsx | 204 + src/components/common/FileElement.tsx | 419 + src/components/common/LazyLoad.tsx | 48 + .../common/Notification/Notification.tsx | 86 + src/components/common/PageLoader.tsx | 42 + src/components/common/Portal.tsx | 25 + .../common/Progress/Progress-styles.tsx | 92 + src/components/common/Progress/Progress.tsx | 65 + .../Reviews/AddReview/AddReview-styles.tsx | 46 + .../common/Reviews/AddReview/AddReview.tsx | 295 + .../common/Reviews/QFundOwnerReviewCard.tsx | 86 + .../Reviews/QFundOwnerReviews-styles.tsx | 283 + .../common/Reviews/QFundOwnerReviews.tsx | 245 + src/components/common/VideoPlayer.tsx | 812 ++ src/components/common/VideoPlayerGlobal.tsx | 648 ++ .../layout/Navbar/Navbar-styles.tsx | 117 + src/components/layout/Navbar/Navbar.tsx | 129 + src/components/modals/ConsentModal.tsx | 72 + src/components/modals/ReusableModal.tsx | 50 + src/constants/index.ts | 19 + src/global.d.ts | 113 + src/hooks/useFetchCrowdfundStatus.tsx | 239 + src/hooks/useFetchCrowdfunds.tsx | 102 + src/hooks/useFetchOwnerReviews.tsx | 55 + src/hooks/useWindowSize.tsx | 25 + src/index.css | 269 + src/main.tsx | 17 + src/pages/Crowdfund/Crowdfund.tsx | 721 ++ src/pages/Crowdfund/CrowdfundLoader.tsx | 16 + src/pages/Crowdfund/Update-styles.tsx | 96 + src/pages/Crowdfund/Update.tsx | 216 + src/pages/Home/CrowdfundList.tsx | 188 + src/pages/Home/Home-styles.tsx | 329 + src/pages/Home/Home.tsx | 122 + src/state/features/authSlice.ts | 27 + src/state/features/crowdfundSlice.ts | 94 + src/state/features/globalSlice.ts | 90 + src/state/features/notificationsSlice.ts | 73 + src/state/store.ts | 27 + src/styles/fonts/Cairo.ttf | Bin 0 -> 353464 bytes src/styles/fonts/Cambon-Light.ttf | Bin 0 -> 123472 bytes src/styles/fonts/Catamaran.ttf | Bin 0 -> 182788 bytes src/styles/fonts/Copse.ttf | Bin 0 -> 63292 bytes src/styles/fonts/Karla.ttf | Bin 0 -> 88960 bytes src/styles/fonts/Livvic.ttf | Bin 0 -> 103884 bytes src/styles/fonts/Merriweather Sans.ttf | Bin 0 -> 267396 bytes src/styles/fonts/Montserrat.ttf | Bin 0 -> 394140 bytes src/styles/fonts/Mulish.ttf | Bin 0 -> 210380 bytes src/styles/fonts/Oxygen.ttf | Bin 0 -> 46440 bytes src/styles/fonts/ProximaNova.otf | Bin 0 -> 62892 bytes src/styles/fonts/Raleway.ttf | Bin 0 -> 309720 bytes src/styles/theme.tsx | 236 + src/test/download.gif | Bin 0 -> 436341 bytes src/test/mockimg.jpg | Bin 0 -> 21295 bytes src/utils/BoundedNumericTextField.tsx | 142 + src/utils/checkStructure.ts | 18 + src/utils/convertQortalAnchor.ts | 12 + src/utils/extractTextFromSlate.ts | 14 + src/utils/fetchCrowdfunds.ts | 36 + src/utils/fetchOwnerReviews.ts | 38 + src/utils/generateReviewId.ts | 12 + src/utils/queue.ts | 43 + src/utils/time.ts | 46 + src/utils/toBase64.ts | 174 + src/vite-env.d.ts | 1 + src/wrappers/DownloadWrapper.tsx | 198 + src/wrappers/GlobalWrapper.tsx | 100 + tsconfig.json | 31 + tsconfig.node.json | 10 + vite.config.ts | 8 + 116 files changed, 21612 insertions(+) create mode 100644 .eslintrc.cjs create mode 100644 .gitignore create mode 100644 .prettierrc create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/App.css create mode 100644 src/App.tsx create mode 100644 src/assets/images/CoverImageDefault.webp create mode 100644 src/assets/images/QFundDarkLogo.png create mode 100644 src/assets/images/QFundLightLogo.png create mode 100644 src/assets/img/qort.png create mode 100644 src/assets/react.svg create mode 100644 src/assets/svgs/AccountCircleSVG.tsx create mode 100644 src/assets/svgs/DarkModeSVG.tsx create mode 100644 src/assets/svgs/DonateSVG.tsx create mode 100644 src/assets/svgs/DownloadedLight.tsx create mode 100644 src/assets/svgs/DownloadingLight.tsx create mode 100644 src/assets/svgs/ExploreSVG.tsx create mode 100644 src/assets/svgs/IconTypes.ts create mode 100644 src/assets/svgs/LightModeSVG.tsx create mode 100644 src/assets/svgs/PiggybankSVG.tsx create mode 100644 src/assets/svgs/QortalSVG.tsx create mode 100644 src/assets/svgs/StarSVG.tsx create mode 100644 src/assets/svgs/TimesSVG.tsx create mode 100644 src/assets/svgs/TrackSVG.tsx create mode 100644 src/components/Crowdfund/Crowdfund-styles.tsx create mode 100644 src/components/Crowdfund/FileAttachment.tsx create mode 100644 src/components/Crowdfund/NewCrowdfund.tsx create mode 100644 src/components/Crowdfund/NewUpdate.tsx create mode 100644 src/components/ImageUploader.tsx create mode 100644 src/components/ResponsiveImage.tsx create mode 100644 src/components/common/AudioPlayer.tsx create mode 100644 src/components/common/BlockedNamesModal/BlockedNamesModal-styles.ts create mode 100644 src/components/common/BlockedNamesModal/BlockedNamesModal.tsx create mode 100644 src/components/common/Comments/Comment.tsx create mode 100644 src/components/common/Comments/CommentEditor.tsx create mode 100644 src/components/common/Comments/CommentSection.tsx create mode 100644 src/components/common/Comments/Comments-styles.tsx create mode 100644 src/components/common/Countdown/Countdown-styles.tsx create mode 100644 src/components/common/Countdown/Countdown.tsx create mode 100644 src/components/common/DisplayHtml.tsx create mode 100644 src/components/common/Donate/Donate-styles.tsx create mode 100644 src/components/common/Donate/Donate.tsx create mode 100644 src/components/common/Donate/DonorInfo.tsx create mode 100644 src/components/common/Donate/DonorModal.tsx create mode 100644 src/components/common/DownloadTaskManager.tsx create mode 100644 src/components/common/FileElement.tsx create mode 100644 src/components/common/LazyLoad.tsx create mode 100644 src/components/common/Notification/Notification.tsx create mode 100644 src/components/common/PageLoader.tsx create mode 100644 src/components/common/Portal.tsx create mode 100644 src/components/common/Progress/Progress-styles.tsx create mode 100644 src/components/common/Progress/Progress.tsx create mode 100644 src/components/common/Reviews/AddReview/AddReview-styles.tsx create mode 100644 src/components/common/Reviews/AddReview/AddReview.tsx create mode 100644 src/components/common/Reviews/QFundOwnerReviewCard.tsx create mode 100644 src/components/common/Reviews/QFundOwnerReviews-styles.tsx create mode 100644 src/components/common/Reviews/QFundOwnerReviews.tsx create mode 100644 src/components/common/VideoPlayer.tsx create mode 100644 src/components/common/VideoPlayerGlobal.tsx create mode 100644 src/components/layout/Navbar/Navbar-styles.tsx create mode 100644 src/components/layout/Navbar/Navbar.tsx create mode 100644 src/components/modals/ConsentModal.tsx create mode 100644 src/components/modals/ReusableModal.tsx create mode 100644 src/constants/index.ts create mode 100644 src/global.d.ts create mode 100644 src/hooks/useFetchCrowdfundStatus.tsx create mode 100644 src/hooks/useFetchCrowdfunds.tsx create mode 100644 src/hooks/useFetchOwnerReviews.tsx create mode 100644 src/hooks/useWindowSize.tsx create mode 100644 src/index.css create mode 100644 src/main.tsx create mode 100644 src/pages/Crowdfund/Crowdfund.tsx create mode 100644 src/pages/Crowdfund/CrowdfundLoader.tsx create mode 100644 src/pages/Crowdfund/Update-styles.tsx create mode 100644 src/pages/Crowdfund/Update.tsx create mode 100644 src/pages/Home/CrowdfundList.tsx create mode 100644 src/pages/Home/Home-styles.tsx create mode 100644 src/pages/Home/Home.tsx create mode 100644 src/state/features/authSlice.ts create mode 100644 src/state/features/crowdfundSlice.ts create mode 100644 src/state/features/globalSlice.ts create mode 100644 src/state/features/notificationsSlice.ts create mode 100644 src/state/store.ts create mode 100644 src/styles/fonts/Cairo.ttf create mode 100644 src/styles/fonts/Cambon-Light.ttf create mode 100644 src/styles/fonts/Catamaran.ttf create mode 100644 src/styles/fonts/Copse.ttf create mode 100644 src/styles/fonts/Karla.ttf create mode 100644 src/styles/fonts/Livvic.ttf create mode 100644 src/styles/fonts/Merriweather Sans.ttf create mode 100644 src/styles/fonts/Montserrat.ttf create mode 100644 src/styles/fonts/Mulish.ttf create mode 100644 src/styles/fonts/Oxygen.ttf create mode 100644 src/styles/fonts/ProximaNova.otf create mode 100644 src/styles/fonts/Raleway.ttf create mode 100644 src/styles/theme.tsx create mode 100644 src/test/download.gif create mode 100644 src/test/mockimg.jpg create mode 100644 src/utils/BoundedNumericTextField.tsx create mode 100644 src/utils/checkStructure.ts create mode 100644 src/utils/convertQortalAnchor.ts create mode 100644 src/utils/extractTextFromSlate.ts create mode 100644 src/utils/fetchCrowdfunds.ts create mode 100644 src/utils/fetchOwnerReviews.ts create mode 100644 src/utils/generateReviewId.ts create mode 100644 src/utils/queue.ts create mode 100644 src/utils/time.ts create mode 100644 src/utils/toBase64.ts create mode 100644 src/vite-env.d.ts create mode 100644 src/wrappers/DownloadWrapper.tsx create mode 100644 src/wrappers/GlobalWrapper.tsx create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..4020bcb --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,14 @@ +module.exports = { + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + parser: '@typescript-eslint/parser', + parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': 'warn', + }, +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4fff125 --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? +*.zip diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..0a4d4fc --- /dev/null +++ b/.prettierrc @@ -0,0 +1,10 @@ +{ + "printWidth": 80, + "singleQuote": false, + "trailingComma": "es5", + "bracketSpacing": true, + "jsxBracketSameLine": false, + "arrowParens": "avoid", + "tabWidth": 2, + "semi": true +} diff --git a/index.html b/index.html new file mode 100644 index 0000000..91a7111 --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Q-Fund + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..ffa0bb3 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,9506 @@ +{ + "name": "q-fund", + "version": "0.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "q-fund", + "version": "0.0.0", + "dependencies": { + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@mui/icons-material": "^5.11.11", + "@mui/material": "^5.11.13", + "@mui/system": "^5.14.5", + "@mui/x-date-pickers": "^6.12.0", + "@reduxjs/toolkit": "^1.9.3", + "bs58": "^5.0.0", + "colorsys": "github:netbeast/colorsys", + "compressorjs": "^1.2.1", + "dayjs": "^1.11.9", + "dompurify": "^3.0.5", + "localforage": "^1.10.0", + "moment": "^2.29.4", + "qortal-app-utils": "latest", + "quill-image-resize-module-react": "^3.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-dropzone": "^14.2.3", + "react-intersection-observer": "^9.4.3", + "react-quill": "^2.0.0", + "react-redux": "^8.0.5", + "react-rnd": "^10.4.1", + "react-router-dom": "^6.9.0", + "react-toastify": "^9.1.2", + "short-unique-id": "^4.4.4", + "ts-key-enum": "^2.0.12" + }, + "devDependencies": { + "@mui/types": "^7.2.3", + "@types/react": "^18.0.28", + "@types/react-dom": "^18.0.11", + "@typescript-eslint/eslint-plugin": "^5.57.1", + "@typescript-eslint/parser": "^5.57.1", + "@vitejs/plugin-react": "^4.0.0", + "eslint": "^8.38.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.3.4", + "prettier": "^3.0.2", + "typescript": "^5.0.2", + "vite": "^4.3.2" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz", + "integrity": "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-compilation-targets": "^7.22.10", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.10", + "@babel/parser": "^7.22.10", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/code-frame": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", + "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.10", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/compat-data": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/generator": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", + "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.10", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/helper-compilation-targets": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", + "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/helper-module-transforms": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/helpers": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz", + "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/highlight": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", + "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/parser": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", + "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/traverse": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", + "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.10", + "@babel/types": "^7.22.10", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/types": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/core/node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/core/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@babel/core/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==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/core/node_modules/browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/@babel/core/node_modules/caniuse-lite": { + "version": "1.0.30001521", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001521.tgz", + "integrity": "sha512-fnx1grfpEOvDGH+V17eccmNjucGUnCbP6KL+l5KqBIerp26WK/+RQ7CIDE37KGJjaPyqWXXlFUyKiWmvdNNKmQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/@babel/core/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==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/core/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==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/core/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==", + "dev": true + }, + "node_modules/@babel/core/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==", + "dev": true + }, + "node_modules/@babel/core/node_modules/electron-to-chromium": { + "version": "1.4.496", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.496.tgz", + "integrity": "sha512-qeXC3Zbykq44RCrBa4kr8v/dWzYJA8rAwpyh9Qd+NKWoJfjG5vvJqy9XOJ9H4P/lqulZBCgUWAYi+FeK5AuJ8g==", + "dev": true + }, + "node_modules/@babel/core/node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/core/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==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/core/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==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/core/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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/core/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==", + "dev": true + }, + "node_modules/@babel/core/node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/core/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/core/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==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/core/node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/@babel/core/node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "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==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/core/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==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/core/node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/core/node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/@babel/core/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", + "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self/node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", + "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source/node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.11.tgz", + "integrity": "sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime/node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "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/@babel/code-frame": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", + "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", + "dependencies": { + "@babel/highlight": "^7.22.10", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/@babel/highlight": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", + "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/@babel/types": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "node_modules/@emotion/babel-plugin/node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/babel-plugin/node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "node_modules/@emotion/babel-plugin/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==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@emotion/babel-plugin/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==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@emotion/babel-plugin/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==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/chalk/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==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@emotion/babel-plugin/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==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@emotion/babel-plugin/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==" + }, + "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==" + }, + "node_modules/@emotion/babel-plugin/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "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/@emotion/babel-plugin/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==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/@emotion/babel-plugin/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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emotion/babel-plugin/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==" + }, + "node_modules/@emotion/babel-plugin/node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/@emotion/babel-plugin/node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/@emotion/babel-plugin/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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emotion/babel-plugin/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==" + }, + "node_modules/@emotion/babel-plugin/node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@emotion/babel-plugin/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==" + }, + "node_modules/@emotion/babel-plugin/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==" + }, + "node_modules/@emotion/babel-plugin/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==" + }, + "node_modules/@emotion/babel-plugin/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==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@emotion/babel-plugin/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==", + "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/@emotion/babel-plugin/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==" + }, + "node_modules/@emotion/babel-plugin/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "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/@emotion/babel-plugin/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==", + "engines": { + "node": ">=4" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, + "node_modules/@emotion/babel-plugin/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==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@emotion/babel-plugin/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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "dependencies": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache/node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/cache/node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "node_modules/@emotion/cache/node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/is-prop-valid/node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/react": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz", + "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", + "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/serialize/node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "node_modules/@emotion/serialize/node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/serialize/node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@emotion/styled": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", + "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.1", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.4.1.tgz", + "integrity": "sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==", + "peer": true, + "dependencies": { + "@floating-ui/utils": "^0.1.1" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.1.tgz", + "integrity": "sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==", + "peer": true, + "dependencies": { + "@floating-ui/core": "^1.4.1", + "@floating-ui/utils": "^0.1.1" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz", + "integrity": "sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==", + "peer": true, + "dependencies": { + "@floating-ui/dom": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.1.tgz", + "integrity": "sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==", + "peer": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@mui/base": { + "version": "5.0.0-beta.13", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.13.tgz", + "integrity": "sha512-uC0l97pBspfDAp+iz2cJq8YZ8Sd9i73V77+WzUiOAckIVEyCm5dyVDZCCO2/phmzckVEeZCGcytybkjMQuhPQw==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.22.10", + "@emotion/is-prop-valid": "^1.2.1", + "@floating-ui/react-dom": "^2.0.1", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.14.7", + "@popperjs/core": "^2.11.8", + "clsx": "^2.0.0", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/base/node_modules/@mui/types": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.4.tgz", + "integrity": "sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==", + "peer": true, + "peerDependencies": { + "@types/react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/icons-material": { + "version": "5.14.3", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.3.tgz", + "integrity": "sha512-XkxWPhageu1OPUm2LWjo5XqeQ0t2xfGe8EiLkRW9oz2LHMMZmijvCxulhgquUVTF1DnoSh+3KoDLSsoAFtVNVw==", + "dependencies": { + "@babel/runtime": "^7.22.6" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@mui/material": "^5.0.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "5.14.5", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.5.tgz", + "integrity": "sha512-4qa4GMfuZH0Ai3mttk5ccXP8a3sf7aPlAJwyMrUSz6h9hPri6BPou94zeu3rENhhmKLby9S/W1y+pmficy8JKA==", + "dependencies": { + "@babel/runtime": "^7.22.6", + "@mui/base": "5.0.0-beta.11", + "@mui/core-downloads-tracker": "^5.14.5", + "@mui/system": "^5.14.5", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.14.5", + "@types/react-transition-group": "^4.4.6", + "clsx": "^2.0.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material/node_modules/@mui/base": { + "version": "5.0.0-beta.11", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.11.tgz", + "integrity": "sha512-FdKZGPd8qmC3ZNke7CNhzcEgToc02M6WYZc9hcBsNQ17bgAd3s9F//1bDDYgMVBYxDM71V0sv/hBHlOY4I1ZVA==", + "dependencies": { + "@babel/runtime": "^7.22.6", + "@emotion/is-prop-valid": "^1.2.1", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.14.5", + "@popperjs/core": "^2.11.8", + "clsx": "^2.0.0", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material/node_modules/@mui/core-downloads-tracker": { + "version": "5.14.5", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.5.tgz", + "integrity": "sha512-+wpGH1USwPcKMFPMvXqYPC6fEvhxM3FzxC8lyDiNK/imLyyJ6y2DPb1Oue7OGIKJWBmYBqrWWtfovrxd1aJHTA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + } + }, + "node_modules/@mui/material/node_modules/@mui/types": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.4.tgz", + "integrity": "sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==", + "peerDependencies": { + "@types/react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming": { + "version": "5.14.5", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.5.tgz", + "integrity": "sha512-cC4C5RrpXpDaaZyH9QwmPhRLgz+f2SYbOty3cPkk4qPSOSfif2ZEcDD9HTENKDDd9deB+xkPKzzZhi8cxIx8Ig==", + "dependencies": { + "@babel/runtime": "^7.22.6", + "@mui/utils": "^5.14.5", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "5.13.2", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.13.2.tgz", + "integrity": "sha512-VCYCU6xVtXOrIN8lcbuPmoG+u7FYuOERG++fpY74hPpEWkyFQG97F+/XfTQVYzlR2m7nPjnwVUgATcTCMEaMvw==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "5.14.5", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.5.tgz", + "integrity": "sha512-mextXZHDeGcR7E1kx43TRARrVXy+gI4wzpUgNv7MqZs1dvTVXQGVeAT6ydj9d6FUqHBPMNLGV/21vJOrpqsL+w==", + "dependencies": { + "@babel/runtime": "^7.22.6", + "@mui/private-theming": "^5.14.5", + "@mui/styled-engine": "^5.13.2", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.14.5", + "clsx": "^2.0.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/system/node_modules/@mui/types": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.4.tgz", + "integrity": "sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==", + "peerDependencies": { + "@types/react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.3.tgz", + "integrity": "sha512-tZ+CQggbe9Ol7e/Fs5RcKwg/woU+o8DCtOnccX6KmbBc7YrfqMYEYuaIcXHuhpT880QwNkZZ3wQwvtlDFA2yOw==", + "dev": true, + "peerDependencies": { + "@types/react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.14.7", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.7.tgz", + "integrity": "sha512-RtheP/aBoPogVdi8vj8Vo2IFnRa4mZVmnD0RGlVZ49yF60rZs+xP4/KbpIrTr83xVs34QmHQ2aQ+IX7I0a0dDw==", + "dependencies": { + "@babel/runtime": "^7.22.10", + "@types/prop-types": "^15.7.5", + "@types/react-is": "^18.2.1", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0" + } + }, + "node_modules/@mui/x-date-pickers": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-6.12.0.tgz", + "integrity": "sha512-lEfdPKdr2o2jUvEviYB/xaYaHJ3Gf9u/AvU3eCX6R0mzIpi1h1SsmrFOTcBIFkwz1iekUNIdZjfrkKmLX+n6dA==", + "dependencies": { + "@babel/runtime": "^7.22.11", + "@mui/utils": "^5.14.5", + "@types/react-transition-group": "^4.4.6", + "clsx": "^2.0.0", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.9.0", + "@emotion/styled": "^11.8.1", + "@mui/base": "^5.0.0-alpha.87", + "@mui/material": "^5.8.6", + "@mui/system": "^5.8.0", + "date-fns": "^2.25.0", + "date-fns-jalali": "^2.13.0-0", + "dayjs": "^1.10.7", + "luxon": "^3.0.2", + "moment": "^2.29.4", + "moment-hijri": "^2.1.2", + "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.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/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@reduxjs/toolkit": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.5.tgz", + "integrity": "sha512-Rt97jHmfTeaxL4swLRNPD/zV4OxTes4la07Xc4hetpUW/vc75t5m1ANyxG6ymnEQ2FsLQsoMlYB2vV1sO3m8tQ==", + "dependencies": { + "immer": "^9.0.21", + "redux": "^4.2.1", + "redux-thunk": "^2.4.2", + "reselect": "^4.1.8" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.0.2" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@remix-run/router": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.8.0.tgz", + "integrity": "sha512-mrfKqIHnSZRyIzBcanNJmVQELTnX+qagEDlcKO90RgRBVOZGSGvZKeDihTRfWcqoDn5N/NkUcwWTccnpN18Tfg==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@types/node": { + "version": "20.8.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.5.tgz", + "integrity": "sha512-SPlobFgbidfIeOYlzXiEjSYeIJiOCthv+9tSQVpvk4PAdIIc+2SmjNVzWXk9t0Y7dl73Zdf+OgXKHX9XtkqUpw==", + "dependencies": { + "undici-types": "~5.25.1" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "node_modules/@types/quill": { + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/@types/quill/-/quill-1.3.10.tgz", + "integrity": "sha512-IhW3fPW+bkt9MLNlycw8u8fWb7oO7W5URC9MfZYHBlA24rex9rs23D5DETChu1zvgVdc5ka64ICjJOgQMr6Shw==", + "dependencies": { + "parchment": "^1.1.2" + } + }, + "node_modules/@types/quill/node_modules/parchment": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz", + "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==" + }, + "node_modules/@types/react": { + "version": "18.2.20", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.20.tgz", + "integrity": "sha512-WKNtmsLWJM/3D5mG4U84cysVY31ivmyw85dE84fOCk5Hx78wezB/XEjVPWl2JTZ5FkEeaTJf+VgUAUn3PE7Isw==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", + "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", + "devOptional": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-is": { + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-18.2.1.tgz", + "integrity": "sha512-wyUkmaaSZEzFZivD8F2ftSyAfk6L+DfFliVj/mYdOXbVjRcS87fQJLTnhk6dRZPuJjI+9g6RZJO4PNCngUrmyw==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.6.tgz", + "integrity": "sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" + }, + "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==", + "dev": true, + "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/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dev": true, + "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/parser/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==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@typescript-eslint/parser/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==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@typescript-eslint/parser/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==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@typescript-eslint/parser/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==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/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==", + "dev": true, + "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/parser/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==", + "dev": true, + "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/@typescript-eslint/parser/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/parser/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==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/parser/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==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/parser/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==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "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/@typescript-eslint/parser/node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@typescript-eslint/parser/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==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@typescript-eslint/parser/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==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/@typescript-eslint/parser/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@typescript-eslint/parser/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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/@typescript-eslint/parser/node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/@typescript-eslint/parser/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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/parser/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==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "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==", + "dev": true, + "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/scope-manager/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==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/scope-manager/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==", + "dev": true, + "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/@typescript-eslint/scope-manager/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==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/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==", + "dev": true, + "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/type-utils/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==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@typescript-eslint/type-utils/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==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@typescript-eslint/type-utils/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==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@typescript-eslint/type-utils/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==", + "dev": true, + "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/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==", + "dev": true, + "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/type-utils/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==", + "dev": true, + "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/@typescript-eslint/type-utils/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/type-utils/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==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/type-utils/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==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/type-utils/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==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "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/@typescript-eslint/type-utils/node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@typescript-eslint/type-utils/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==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@typescript-eslint/type-utils/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==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/@typescript-eslint/type-utils/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@typescript-eslint/type-utils/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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/@typescript-eslint/type-utils/node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/@typescript-eslint/type-utils/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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/type-utils/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==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "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==", + "dev": true, + "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-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/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==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@typescript-eslint/utils/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==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@typescript-eslint/utils/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==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "node_modules/@typescript-eslint/utils/node_modules/@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dev": true + }, + "node_modules/@typescript-eslint/utils/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==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/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==", + "dev": true, + "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/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==", + "dev": true, + "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/@typescript-eslint/utils/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/utils/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==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/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==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@typescript-eslint/utils/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==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.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==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/utils/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==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "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/@typescript-eslint/utils/node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@typescript-eslint/utils/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==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@typescript-eslint/utils/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==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/@typescript-eslint/utils/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@typescript-eslint/utils/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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/@typescript-eslint/utils/node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/@typescript-eslint/utils/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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@typescript-eslint/utils/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==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.4.tgz", + "integrity": "sha512-7wU921ABnNYkETiMaZy7XqpueMnpu5VxvVps13MjmCo+utBdD79sZzrApHawHtVX66cCJQQTXFcjH0y9dSUK8g==", + "dev": true, + "dependencies": { + "@babel/core": "^7.22.9", + "@babel/plugin-transform-react-jsx-self": "^7.22.5", + "@babel/plugin-transform-react-jsx-source": "^7.22.5", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0" + } + }, + "node_modules/attr-accept": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", + "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/base-x": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", + "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" + }, + "node_modules/blueimp-canvas-to-blob": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/blueimp-canvas-to-blob/-/blueimp-canvas-to-blob-3.29.0.tgz", + "integrity": "sha512-0pcSSGxC0QxT+yVkivxIqW0Y4VlO2XSDPofBAqoJ1qJxgH9eiUDLv50Rixij2cDuEfx4M6DpD9UGZpRhT5Q8qg==" + }, + "node_modules/bs58": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", + "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", + "dependencies": { + "base-x": "^4.0.0" + } + }, + "node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/colorsys": { + "version": "1.0.21", + "resolved": "git+ssh://git@github.com/netbeast/colorsys.git#b5b365e1fb037a179e10ed14adfd1b247a2b6de5", + "license": "ISC" + }, + "node_modules/compressorjs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/compressorjs/-/compressorjs-1.2.1.tgz", + "integrity": "sha512-+geIjeRnPhQ+LLvvA7wxBQE5ddeLU7pJ3FsKFWirDw6veY3s9iLxAQEw7lXGHnhCJvBujEQWuNnGzZcvCvdkLQ==", + "dependencies": { + "blueimp-canvas-to-blob": "^3.29.0", + "is-blob": "^2.1.0" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/dayjs": { + "version": "1.11.9", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz", + "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "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==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dompurify": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.5.tgz", + "integrity": "sha512-F9e6wPGtY+8KNMRAVfxeCOHU0/NPWMSENNq4pQctuXRqqdEPW7q3CrLbR5Nse044WwacyjHGOMlvNsBe1y6z9A==" + }, + "node_modules/eslint": { + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", + "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "^8.47.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "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-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "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-refresh": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.3.5.tgz", + "integrity": "sha512-61qNIsc7fo9Pp/mju0J83kzvLm0Bsayu7OQSLEoJxLDCBjIIyb87bkzufoOvdDxLkSlMfkF7UxomC4+eztUBSA==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint/node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/eslint/node_modules/@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "dev": true, + "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/node_modules/@eslint/js": { + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", + "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/eslint/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==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/eslint/node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/eslint/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==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/eslint/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==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/eslint/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==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/eslint/node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/eslint/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==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?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==", + "dev": true + }, + "node_modules/eslint/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==", + "dev": true + }, + "node_modules/eslint/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/eslint/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/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==", + "dev": true + }, + "node_modules/eslint/node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/eslint/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/eslint/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==", + "dev": true + }, + "node_modules/eslint/node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eslint/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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/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==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/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==", + "dev": true, + "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/eslint/node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/eslint/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==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint/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==", + "dev": true + }, + "node_modules/eslint/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==", + "dev": true + }, + "node_modules/eslint/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==", + "dev": true + }, + "node_modules/eslint/node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/eslint/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==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.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==", + "dev": true, + "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/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/eslint/node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/eslint/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==", + "dev": true + }, + "node_modules/eslint/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "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/eslint/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==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/eslint/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==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/eslint/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/eslint/node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint/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==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/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==", + "dev": true + }, + "node_modules/eslint/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==", + "dev": true + }, + "node_modules/eslint/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==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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==", + "dev": true + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/eslint/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==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/eslint/node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/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==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint/node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint/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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/eslint/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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/eslint/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint/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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/eslint/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==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/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==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/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==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/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==", + "dev": true + }, + "node_modules/eslint/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==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/eslint/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/eslint/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==", + "dev": true + }, + "node_modules/eslint/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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-selector": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz", + "integrity": "sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==", + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "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==", + "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==" + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/is-blob": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-blob/-/is-blob-2.1.0.tgz", + "integrity": "sha512-SZ/fTft5eUhQM6oF/ZaASFDEdbFVe89Imltn9uZr03wdKMcWNVYSMjQPFtg05QuNkt5l5c135ElvXEQG0rk4tw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "dependencies": { + "lie": "3.1.1" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "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==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loose-envify/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==" + }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "engines": { + "node": "*" + } + }, + "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==", + "dev": true + }, + "node_modules/node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/node/-/node-20.7.0.tgz", + "integrity": "sha512-GiKqtgSALW8+W7Zi9T2AI9aME8hJg+1EESH6O7Xmk4k1gJfBKOolpy9gdg8vCyR8dMeJlp5GQZOYnvxsu8v5TA==", + "hasInstallScript": true, + "dependencies": { + "node-bin-setup": "^1.0.0" + }, + "bin": { + "node": "bin/node" + }, + "engines": { + "npm": ">=5.0.0" + } + }, + "node_modules/node-bin-setup": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.1.3.tgz", + "integrity": "sha512-opgw9iSCAzT2+6wJOETCpeRYAQxSopqQ2z+N6BXwIMsQQ7Zj5M8MaafQY8JMlolRR6R1UXg2WmhKp0p9lSOivg==" + }, + "node_modules/prettier": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.2.tgz", + "integrity": "sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "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==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "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==" + }, + "node_modules/qortal-app-utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/qortal-app-utils/-/qortal-app-utils-1.2.1.tgz", + "integrity": "sha512-4VU6/YG/oB/ubmydSbb7BXrHHyHZfquUmSI2MkCAafLoTdClQlHiSYsq6oMZjPwxIaRHF20Tmtk6HZ+2HoZ+Dw==", + "dependencies": { + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@mui/icons-material": "^5.11.11", + "@mui/material": "^5.11.13", + "@mui/system": "^5.14.5", + "@types/node": "^20.8.4", + "colorsys": "github:netbeast/colorsys", + "node": "^20.7.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-dropzone": "^14.2.3", + "react-intersection-observer": "^9.4.3", + "react-quill": "^2.0.0", + "react-rnd": "^10.4.1", + "ts-key-enum": "^2.0.12", + "vite-tsconfig-paths": "^4.2.1" + } + }, + "node_modules/quill": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz", + "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==", + "dependencies": { + "clone": "^2.1.1", + "deep-equal": "^1.0.1", + "eventemitter3": "^2.0.3", + "extend": "^3.0.2", + "parchment": "^1.1.4", + "quill-delta": "^3.6.2" + } + }, + "node_modules/quill-image-resize-module-react": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/quill-image-resize-module-react/-/quill-image-resize-module-react-3.0.0.tgz", + "integrity": "sha512-3jVChLoXh+fwEELx3OswOEEuF+1KU3r/B9RAqZ//s+d+UMduVZzUepU1g/XoxjKoBJvWD2lJwBIFBRUNb8ebCw==", + "dependencies": { + "lodash": "^4.17.4", + "quill": "^1.2.2", + "raw-loader": "^0.5.1" + } + }, + "node_modules/quill/node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quill/node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/quill/node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dependencies": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quill/node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quill/node_modules/eventemitter3": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", + "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==" + }, + "node_modules/quill/node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/quill/node_modules/fast-diff": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", + "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==" + }, + "node_modules/quill/node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/quill/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==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quill/node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quill/node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/quill/node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quill/node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quill/node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quill/node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quill/node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quill/node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quill/node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quill/node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/quill/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==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/quill/node_modules/parchment": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz", + "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==" + }, + "node_modules/quill/node_modules/quill-delta": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz", + "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==", + "dependencies": { + "deep-equal": "^1.0.1", + "extend": "^3.0.2", + "fast-diff": "1.1.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/quill/node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/raw-loader": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", + "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q==" + }, + "node_modules/re-resizable": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.9.6.tgz", + "integrity": "sha512-0xYKS5+Z0zk+vICQlcZW+g54CcJTTmHluA7JUUgvERDxnKAnytylcyPsA+BSFi759s5hPlHmBRegFrwXs2FuBQ==", + "dependencies": { + "fast-memoize": "^2.5.1" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/re-resizable/node_modules/fast-memoize": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz", + "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==" + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-draggable": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.5.tgz", + "integrity": "sha512-OMHzJdyJbYTZo4uQE393fHcqqPYsEtkjfMgvCHr6rejT+Ezn4OZbNyGH50vv+SunC1RMvwOTSWkEODQLzw1M9g==", + "dependencies": { + "clsx": "^1.1.1", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": ">= 16.3.0", + "react-dom": ">= 16.3.0" + } + }, + "node_modules/react-draggable/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/react-dropzone": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.3.tgz", + "integrity": "sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==", + "dependencies": { + "attr-accept": "^2.2.2", + "file-selector": "^0.6.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "react": ">= 16.8 || 18.0.0" + } + }, + "node_modules/react-intersection-observer": { + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.5.2.tgz", + "integrity": "sha512-EmoV66/yvksJcGa1rdW0nDNc4I1RifDWkT50gXSFnPLYQ4xUptuDD4V7k+Rj1OgVAlww628KLGcxPXFlOkkU/Q==", + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/react-quill": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-quill/-/react-quill-2.0.0.tgz", + "integrity": "sha512-4qQtv1FtCfLgoD3PXAur5RyxuUbPXQGOHgTlFie3jtxp43mXDtzCKaOgQ3mLyZfi1PUlyjycfivKelFhy13QUg==", + "dependencies": { + "@types/quill": "^1.3.10", + "lodash": "^4.17.4", + "quill": "^1.3.7" + }, + "peerDependencies": { + "react": "^16 || ^17 || ^18", + "react-dom": "^16 || ^17 || ^18" + } + }, + "node_modules/react-redux": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.2.tgz", + "integrity": "sha512-xJKYI189VwfsFc4CJvHqHlDrzyFTY/3vZACbE+rr/zQ34Xx1wQfB4OTOSeOSNrF6BDVe8OOdxIrAnMGXA3ggfw==", + "dependencies": { + "@babel/runtime": "^7.12.1", + "@types/hoist-non-react-statics": "^3.3.1", + "@types/use-sync-external-store": "^0.0.3", + "hoist-non-react-statics": "^3.3.2", + "react-is": "^18.0.0", + "use-sync-external-store": "^1.0.0" + }, + "peerDependencies": { + "@types/react": "^16.8 || ^17.0 || ^18.0", + "@types/react-dom": "^16.8 || ^17.0 || ^18.0", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0", + "react-native": ">=0.59", + "redux": "^4 || ^5.0.0-beta.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "node_modules/react-redux/node_modules/@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "node_modules/react-redux/node_modules/@types/use-sync-external-store": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", + "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" + }, + "node_modules/react-redux/node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-rnd": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.4.1.tgz", + "integrity": "sha512-0m887AjQZr6p2ADLNnipquqsDq4XJu/uqVqI3zuoGD19tRm6uB83HmZWydtkilNp5EWsOHbLGF4IjWMdd5du8Q==", + "dependencies": { + "re-resizable": "6.9.6", + "react-draggable": "4.4.5", + "tslib": "2.3.1" + }, + "peerDependencies": { + "react": ">=16.3.0", + "react-dom": ">=16.3.0" + } + }, + "node_modules/react-rnd/node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/react-router": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.15.0.tgz", + "integrity": "sha512-NIytlzvzLwJkCQj2HLefmeakxxWHWAP+02EGqWEZy+DgfHHKQMUoBBjUQLOtFInBMhWtb3hiUy6MfFgwLjXhqg==", + "dependencies": { + "@remix-run/router": "1.8.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.15.0.tgz", + "integrity": "sha512-aR42t0fs7brintwBGAv2+mGlCtgtFQeOzK0BM1/OiqEzRejOZtpMZepvgkscpMUnKb8YO84G7s3LsHnnDNonbQ==", + "dependencies": { + "@remix-run/router": "1.8.0", + "react-router": "6.15.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-toastify": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-9.1.3.tgz", + "integrity": "sha512-fPfb8ghtn/XMxw3LkxQBk3IyagNpF/LIKjOBflbexr2AWxAH1MJgvnESwEwBn9liLFXgTKWgBSdZpw9m4OTHTg==", + "dependencies": { + "clsx": "^1.1.1" + }, + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" + } + }, + "node_modules/react-toastify/node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, + "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==", + "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/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "node_modules/redux-thunk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", + "peerDependencies": { + "redux": "^4" + } + }, + "node_modules/reselect": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", + "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==" + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/short-unique-id": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/short-unique-id/-/short-unique-id-4.4.4.tgz", + "integrity": "sha512-oLF1NCmtbiTWl2SqdXZQbo5KM1b7axdp0RgQLq8qCBBLoq+o3A5wmLrNM6bZIh54/a8BJ3l69kTXuxwZ+XCYuw==", + "bin": { + "short-unique-id": "bin/short-unique-id", + "suid": "bin/short-unique-id" + } + }, + "node_modules/ts-key-enum": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/ts-key-enum/-/ts-key-enum-2.0.12.tgz", + "integrity": "sha512-Ety4IvKMaeG34AyXMp5r11XiVZNDRL+XWxXbVVJjLvq2vxKRttEANBE7Za1bxCAZRdH2/sZT6jFyyTWxXz28hw==" + }, + "node_modules/tsconfck": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.2.tgz", + "integrity": "sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^14.13.1 || ^16 || >=18" + }, + "peerDependencies": { + "typescript": "^4.3.5 || ^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.25.3", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", + "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==" + }, + "node_modules/vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "devOptional": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.1.tgz", + "integrity": "sha512-GNUI6ZgPqT3oervkvzU+qtys83+75N/OuDaQl7HmOqFTb0pjZsuARrRipsyJhJ3enqV8beI1xhGbToR4o78nSQ==", + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^2.1.0" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "devOptional": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/vite/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/vite/node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "devOptional": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/vite/node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "devOptional": true + }, + "node_modules/vite/node_modules/postcss": { + "version": "8.4.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz", + "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", + "devOptional": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/vite/node_modules/rollup": { + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.0.tgz", + "integrity": "sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==", + "devOptional": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/vite/node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + } + }, + "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, + "@babel/core": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz", + "integrity": "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-compilation-targets": "^7.22.10", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.10", + "@babel/parser": "^7.22.10", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.1" + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", + "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.22.10", + "chalk": "^2.4.2" + } + }, + "@babel/compat-data": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "dev": true + }, + "@babel/generator": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", + "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", + "dev": true, + "requires": { + "@babel/types": "^7.22.10", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", + "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "requires": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz", + "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==", + "dev": true, + "requires": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10" + } + }, + "@babel/highlight": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", + "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", + "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", + "dev": true + }, + "@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/traverse": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", + "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.10", + "@babel/types": "^7.22.10", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + } + }, + "caniuse-lite": { + "version": "1.0.30001521", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001521.tgz", + "integrity": "sha512-fnx1grfpEOvDGH+V17eccmNjucGUnCbP6KL+l5KqBIerp26WK/+RQ7CIDE37KGJjaPyqWXXlFUyKiWmvdNNKmQ==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "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==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.496", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.496.tgz", + "integrity": "sha512-qeXC3Zbykq44RCrBa4kr8v/dWzYJA8rAwpyh9Qd+NKWoJfjG5vvJqy9XOJ9H4P/lqulZBCgUWAYi+FeK5AuJ8g==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "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==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", + "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true + } + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", + "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true + } + } + }, + "@babel/runtime": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.11.tgz", + "integrity": "sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==", + "requires": { + "regenerator-runtime": "^0.14.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + } + } + }, + "@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "requires": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "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" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", + "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", + "requires": { + "@babel/highlight": "^7.22.10", + "chalk": "^2.4.2" + } + }, + "@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==" + }, + "@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==" + }, + "@babel/highlight": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", + "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/types": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", + "requires": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + } + }, + "@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "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==", + "requires": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "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==" + } + } + }, + "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==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "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==" + }, + "cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "requires": { + "@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" + } + }, + "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==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "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==" + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "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==" + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "requires": { + "has": "^1.0.3" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "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==" + }, + "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==" + }, + "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==", + "requires": { + "callsites": "^3.0.0" + } + }, + "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==", + "requires": { + "@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" + } + }, + "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==" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "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==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + }, + "stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "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==" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + } + } + }, + "@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "requires": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + }, + "dependencies": { + "@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + } + } + }, + "@emotion/is-prop-valid": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "requires": { + "@emotion/memoize": "^0.8.1" + }, + "dependencies": { + "@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + } + } + }, + "@emotion/react": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz", + "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + } + }, + "@emotion/serialize": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", + "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", + "requires": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + }, + "dependencies": { + "@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + } + } + }, + "@emotion/styled": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", + "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.1", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + } + }, + "@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "requires": {} + }, + "@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, + "@eslint-community/regexpp": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "dev": true + }, + "@floating-ui/core": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.4.1.tgz", + "integrity": "sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ==", + "peer": true, + "requires": { + "@floating-ui/utils": "^0.1.1" + } + }, + "@floating-ui/dom": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.1.tgz", + "integrity": "sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw==", + "peer": true, + "requires": { + "@floating-ui/core": "^1.4.1", + "@floating-ui/utils": "^0.1.1" + } + }, + "@floating-ui/react-dom": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz", + "integrity": "sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==", + "peer": true, + "requires": { + "@floating-ui/dom": "^1.5.1" + } + }, + "@floating-ui/utils": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.1.tgz", + "integrity": "sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw==", + "peer": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + }, + "dependencies": { + "@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + } + } + }, + "@mui/base": { + "version": "5.0.0-beta.13", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.13.tgz", + "integrity": "sha512-uC0l97pBspfDAp+iz2cJq8YZ8Sd9i73V77+WzUiOAckIVEyCm5dyVDZCCO2/phmzckVEeZCGcytybkjMQuhPQw==", + "peer": true, + "requires": { + "@babel/runtime": "^7.22.10", + "@emotion/is-prop-valid": "^1.2.1", + "@floating-ui/react-dom": "^2.0.1", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.14.7", + "@popperjs/core": "^2.11.8", + "clsx": "^2.0.0", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "dependencies": { + "@mui/types": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.4.tgz", + "integrity": "sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==", + "peer": true, + "requires": {} + } + } + }, + "@mui/icons-material": { + "version": "5.14.3", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.3.tgz", + "integrity": "sha512-XkxWPhageu1OPUm2LWjo5XqeQ0t2xfGe8EiLkRW9oz2LHMMZmijvCxulhgquUVTF1DnoSh+3KoDLSsoAFtVNVw==", + "requires": { + "@babel/runtime": "^7.22.6" + } + }, + "@mui/material": { + "version": "5.14.5", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.5.tgz", + "integrity": "sha512-4qa4GMfuZH0Ai3mttk5ccXP8a3sf7aPlAJwyMrUSz6h9hPri6BPou94zeu3rENhhmKLby9S/W1y+pmficy8JKA==", + "requires": { + "@babel/runtime": "^7.22.6", + "@mui/base": "5.0.0-beta.11", + "@mui/core-downloads-tracker": "^5.14.5", + "@mui/system": "^5.14.5", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.14.5", + "@types/react-transition-group": "^4.4.6", + "clsx": "^2.0.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" + }, + "dependencies": { + "@mui/base": { + "version": "5.0.0-beta.11", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.11.tgz", + "integrity": "sha512-FdKZGPd8qmC3ZNke7CNhzcEgToc02M6WYZc9hcBsNQ17bgAd3s9F//1bDDYgMVBYxDM71V0sv/hBHlOY4I1ZVA==", + "requires": { + "@babel/runtime": "^7.22.6", + "@emotion/is-prop-valid": "^1.2.1", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.14.5", + "@popperjs/core": "^2.11.8", + "clsx": "^2.0.0", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + } + }, + "@mui/core-downloads-tracker": { + "version": "5.14.5", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.5.tgz", + "integrity": "sha512-+wpGH1USwPcKMFPMvXqYPC6fEvhxM3FzxC8lyDiNK/imLyyJ6y2DPb1Oue7OGIKJWBmYBqrWWtfovrxd1aJHTA==" + }, + "@mui/types": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.4.tgz", + "integrity": "sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==", + "requires": {} + } + } + }, + "@mui/private-theming": { + "version": "5.14.5", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.5.tgz", + "integrity": "sha512-cC4C5RrpXpDaaZyH9QwmPhRLgz+f2SYbOty3cPkk4qPSOSfif2ZEcDD9HTENKDDd9deB+xkPKzzZhi8cxIx8Ig==", + "requires": { + "@babel/runtime": "^7.22.6", + "@mui/utils": "^5.14.5", + "prop-types": "^15.8.1" + } + }, + "@mui/styled-engine": { + "version": "5.13.2", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.13.2.tgz", + "integrity": "sha512-VCYCU6xVtXOrIN8lcbuPmoG+u7FYuOERG++fpY74hPpEWkyFQG97F+/XfTQVYzlR2m7nPjnwVUgATcTCMEaMvw==", + "requires": { + "@babel/runtime": "^7.21.0", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + } + }, + "@mui/system": { + "version": "5.14.5", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.5.tgz", + "integrity": "sha512-mextXZHDeGcR7E1kx43TRARrVXy+gI4wzpUgNv7MqZs1dvTVXQGVeAT6ydj9d6FUqHBPMNLGV/21vJOrpqsL+w==", + "requires": { + "@babel/runtime": "^7.22.6", + "@mui/private-theming": "^5.14.5", + "@mui/styled-engine": "^5.13.2", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.14.5", + "clsx": "^2.0.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "dependencies": { + "@mui/types": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.4.tgz", + "integrity": "sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==", + "requires": {} + } + } + }, + "@mui/types": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.3.tgz", + "integrity": "sha512-tZ+CQggbe9Ol7e/Fs5RcKwg/woU+o8DCtOnccX6KmbBc7YrfqMYEYuaIcXHuhpT880QwNkZZ3wQwvtlDFA2yOw==", + "dev": true, + "requires": {} + }, + "@mui/utils": { + "version": "5.14.7", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.7.tgz", + "integrity": "sha512-RtheP/aBoPogVdi8vj8Vo2IFnRa4mZVmnD0RGlVZ49yF60rZs+xP4/KbpIrTr83xVs34QmHQ2aQ+IX7I0a0dDw==", + "requires": { + "@babel/runtime": "^7.22.10", + "@types/prop-types": "^15.7.5", + "@types/react-is": "^18.2.1", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + } + }, + "@mui/x-date-pickers": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-6.12.0.tgz", + "integrity": "sha512-lEfdPKdr2o2jUvEviYB/xaYaHJ3Gf9u/AvU3eCX6R0mzIpi1h1SsmrFOTcBIFkwz1iekUNIdZjfrkKmLX+n6dA==", + "requires": { + "@babel/runtime": "^7.22.11", + "@mui/utils": "^5.14.5", + "@types/react-transition-group": "^4.4.6", + "clsx": "^2.0.0", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + } + }, + "@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==" + }, + "@reduxjs/toolkit": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.5.tgz", + "integrity": "sha512-Rt97jHmfTeaxL4swLRNPD/zV4OxTes4la07Xc4hetpUW/vc75t5m1ANyxG6ymnEQ2FsLQsoMlYB2vV1sO3m8tQ==", + "requires": { + "immer": "^9.0.21", + "redux": "^4.2.1", + "redux-thunk": "^2.4.2", + "reselect": "^4.1.8" + } + }, + "@remix-run/router": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.8.0.tgz", + "integrity": "sha512-mrfKqIHnSZRyIzBcanNJmVQELTnX+qagEDlcKO90RgRBVOZGSGvZKeDihTRfWcqoDn5N/NkUcwWTccnpN18Tfg==" + }, + "@types/node": { + "version": "20.8.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.5.tgz", + "integrity": "sha512-SPlobFgbidfIeOYlzXiEjSYeIJiOCthv+9tSQVpvk4PAdIIc+2SmjNVzWXk9t0Y7dl73Zdf+OgXKHX9XtkqUpw==", + "requires": { + "undici-types": "~5.25.1" + } + }, + "@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "@types/quill": { + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/@types/quill/-/quill-1.3.10.tgz", + "integrity": "sha512-IhW3fPW+bkt9MLNlycw8u8fWb7oO7W5URC9MfZYHBlA24rex9rs23D5DETChu1zvgVdc5ka64ICjJOgQMr6Shw==", + "requires": { + "parchment": "^1.1.2" + }, + "dependencies": { + "parchment": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz", + "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==" + } + } + }, + "@types/react": { + "version": "18.2.20", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.20.tgz", + "integrity": "sha512-WKNtmsLWJM/3D5mG4U84cysVY31ivmyw85dE84fOCk5Hx78wezB/XEjVPWl2JTZ5FkEeaTJf+VgUAUn3PE7Isw==", + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-dom": { + "version": "18.2.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", + "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", + "devOptional": true, + "requires": { + "@types/react": "*" + } + }, + "@types/react-is": { + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-18.2.1.tgz", + "integrity": "sha512-wyUkmaaSZEzFZivD8F2ftSyAfk6L+DfFliVj/mYdOXbVjRcS87fQJLTnhk6dRZPuJjI+9g6RZJO4PNCngUrmyw==", + "requires": { + "@types/react": "*" + } + }, + "@types/react-transition-group": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.6.tgz", + "integrity": "sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==", + "requires": { + "@types/react": "*" + } + }, + "@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" + }, + "@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==", + "dev": true, + "requires": { + "@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" + } + }, + "@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==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "dependencies": { + "@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==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@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==", + "dev": true + }, + "@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==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true + }, + "@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==", + "dev": true, + "requires": { + "@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" + } + }, + "@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==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "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==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "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==", + "dev": true + }, + "fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "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" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "@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==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "dependencies": { + "@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true + }, + "@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==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "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==", + "dev": true + } + } + }, + "@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==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "dependencies": { + "@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==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@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==", + "dev": true + }, + "@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==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true + }, + "@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==", + "dev": true, + "requires": { + "@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" + } + }, + "@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==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "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==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "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==", + "dev": true + }, + "fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "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" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@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==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@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==", + "dev": true + }, + "@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==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dev": true + }, + "@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true + }, + "@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==", + "dev": true, + "requires": { + "@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" + } + }, + "@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==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + } + }, + "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==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "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==", + "dev": true + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "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" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "@vitejs/plugin-react": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.4.tgz", + "integrity": "sha512-7wU921ABnNYkETiMaZy7XqpueMnpu5VxvVps13MjmCo+utBdD79sZzrApHawHtVX66cCJQQTXFcjH0y9dSUK8g==", + "dev": true, + "requires": { + "@babel/core": "^7.22.9", + "@babel/plugin-transform-react-jsx-self": "^7.22.5", + "@babel/plugin-transform-react-jsx-source": "^7.22.5", + "react-refresh": "^0.14.0" + } + }, + "attr-accept": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", + "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==" + }, + "base-x": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", + "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" + }, + "blueimp-canvas-to-blob": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/blueimp-canvas-to-blob/-/blueimp-canvas-to-blob-3.29.0.tgz", + "integrity": "sha512-0pcSSGxC0QxT+yVkivxIqW0Y4VlO2XSDPofBAqoJ1qJxgH9eiUDLv50Rixij2cDuEfx4M6DpD9UGZpRhT5Q8qg==" + }, + "bs58": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", + "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", + "requires": { + "base-x": "^4.0.0" + } + }, + "clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==" + }, + "colorsys": { + "version": "git+ssh://git@github.com/netbeast/colorsys.git#b5b365e1fb037a179e10ed14adfd1b247a2b6de5", + "from": "colorsys@github:netbeast/colorsys" + }, + "compressorjs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/compressorjs/-/compressorjs-1.2.1.tgz", + "integrity": "sha512-+geIjeRnPhQ+LLvvA7wxBQE5ddeLU7pJ3FsKFWirDw6veY3s9iLxAQEw7lXGHnhCJvBujEQWuNnGzZcvCvdkLQ==", + "requires": { + "blueimp-canvas-to-blob": "^3.29.0", + "is-blob": "^2.1.0" + } + }, + "csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "dayjs": { + "version": "1.11.9", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.9.tgz", + "integrity": "sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "dompurify": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.5.tgz", + "integrity": "sha512-F9e6wPGtY+8KNMRAVfxeCOHU0/NPWMSENNq4pQctuXRqqdEPW7q3CrLbR5Nse044WwacyjHGOMlvNsBe1y6z9A==" + }, + "eslint": { + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", + "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "^8.47.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "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" + }, + "dependencies": { + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "dev": true, + "requires": { + "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" + } + }, + "@eslint/js": { + "version": "8.47.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", + "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", + "dev": true + }, + "@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@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==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@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==", + "dev": true + }, + "@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==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "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==", + "dev": true + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "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==", + "dev": true + }, + "espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "requires": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + } + }, + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "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==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "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==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "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" + } + }, + "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==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "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==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "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==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "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==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "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==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "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==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "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==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "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==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "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==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "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==", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "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==", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "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==", + "dev": true + } + } + }, + "eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "requires": {} + }, + "eslint-plugin-react-refresh": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.3.5.tgz", + "integrity": "sha512-61qNIsc7fo9Pp/mju0J83kzvLm0Bsayu7OQSLEoJxLDCBjIIyb87bkzufoOvdDxLkSlMfkF7UxomC4+eztUBSA==", + "dev": true, + "requires": {} + }, + "file-selector": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz", + "integrity": "sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==", + "requires": { + "tslib": "^2.4.0" + } + }, + "globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" + }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "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==", + "requires": { + "react-is": "^16.7.0" + }, + "dependencies": { + "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==" + } + } + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, + "immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==" + }, + "is-blob": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-blob/-/is-blob-2.1.0.tgz", + "integrity": "sha512-SZ/fTft5eUhQM6oF/ZaASFDEdbFVe89Imltn9uZr03wdKMcWNVYSMjQPFtg05QuNkt5l5c135ElvXEQG0rk4tw==" + }, + "lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "requires": { + "immediate": "~3.0.5" + } + }, + "localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "requires": { + "lie": "3.1.1" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "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==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "dependencies": { + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + } + } + }, + "moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + }, + "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==", + "dev": true + }, + "node": { + "version": "20.7.0", + "resolved": "https://registry.npmjs.org/node/-/node-20.7.0.tgz", + "integrity": "sha512-GiKqtgSALW8+W7Zi9T2AI9aME8hJg+1EESH6O7Xmk4k1gJfBKOolpy9gdg8vCyR8dMeJlp5GQZOYnvxsu8v5TA==", + "requires": { + "node-bin-setup": "^1.0.0" + } + }, + "node-bin-setup": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.1.3.tgz", + "integrity": "sha512-opgw9iSCAzT2+6wJOETCpeRYAQxSopqQ2z+N6BXwIMsQQ7Zj5M8MaafQY8JMlolRR6R1UXg2WmhKp0p9lSOivg==" + }, + "prettier": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.2.tgz", + "integrity": "sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==", + "dev": true + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + }, + "dependencies": { + "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==" + }, + "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==" + } + } + }, + "qortal-app-utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/qortal-app-utils/-/qortal-app-utils-1.2.1.tgz", + "integrity": "sha512-4VU6/YG/oB/ubmydSbb7BXrHHyHZfquUmSI2MkCAafLoTdClQlHiSYsq6oMZjPwxIaRHF20Tmtk6HZ+2HoZ+Dw==", + "requires": { + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@mui/icons-material": "^5.11.11", + "@mui/material": "^5.11.13", + "@mui/system": "^5.14.5", + "@types/node": "^20.8.4", + "colorsys": "github:netbeast/colorsys", + "node": "^20.7.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-dropzone": "^14.2.3", + "react-intersection-observer": "^9.4.3", + "react-quill": "^2.0.0", + "react-rnd": "^10.4.1", + "ts-key-enum": "^2.0.12", + "vite-tsconfig-paths": "^4.2.1" + } + }, + "quill": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz", + "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==", + "requires": { + "clone": "^2.1.1", + "deep-equal": "^1.0.1", + "eventemitter3": "^2.0.3", + "extend": "^3.0.2", + "parchment": "^1.1.4", + "quill-delta": "^3.6.2" + }, + "dependencies": { + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==" + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "eventemitter3": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", + "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==" + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "fast-diff": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", + "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "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==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "parchment": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz", + "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==" + }, + "quill-delta": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz", + "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==", + "requires": { + "deep-equal": "^1.0.1", + "extend": "^3.0.2", + "fast-diff": "1.1.2" + } + }, + "regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + } + } + } + }, + "quill-image-resize-module-react": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/quill-image-resize-module-react/-/quill-image-resize-module-react-3.0.0.tgz", + "integrity": "sha512-3jVChLoXh+fwEELx3OswOEEuF+1KU3r/B9RAqZ//s+d+UMduVZzUepU1g/XoxjKoBJvWD2lJwBIFBRUNb8ebCw==", + "requires": { + "lodash": "^4.17.4", + "quill": "^1.2.2", + "raw-loader": "^0.5.1" + } + }, + "raw-loader": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", + "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q==" + }, + "re-resizable": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.9.6.tgz", + "integrity": "sha512-0xYKS5+Z0zk+vICQlcZW+g54CcJTTmHluA7JUUgvERDxnKAnytylcyPsA+BSFi759s5hPlHmBRegFrwXs2FuBQ==", + "requires": { + "fast-memoize": "^2.5.1" + }, + "dependencies": { + "fast-memoize": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz", + "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==" + } + } + }, + "react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "requires": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + } + }, + "react-draggable": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.5.tgz", + "integrity": "sha512-OMHzJdyJbYTZo4uQE393fHcqqPYsEtkjfMgvCHr6rejT+Ezn4OZbNyGH50vv+SunC1RMvwOTSWkEODQLzw1M9g==", + "requires": { + "clsx": "^1.1.1", + "prop-types": "^15.8.1" + }, + "dependencies": { + "clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==" + } + } + }, + "react-dropzone": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.3.tgz", + "integrity": "sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==", + "requires": { + "attr-accept": "^2.2.2", + "file-selector": "^0.6.0", + "prop-types": "^15.8.1" + } + }, + "react-intersection-observer": { + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.5.2.tgz", + "integrity": "sha512-EmoV66/yvksJcGa1rdW0nDNc4I1RifDWkT50gXSFnPLYQ4xUptuDD4V7k+Rj1OgVAlww628KLGcxPXFlOkkU/Q==", + "requires": {} + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "react-quill": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/react-quill/-/react-quill-2.0.0.tgz", + "integrity": "sha512-4qQtv1FtCfLgoD3PXAur5RyxuUbPXQGOHgTlFie3jtxp43mXDtzCKaOgQ3mLyZfi1PUlyjycfivKelFhy13QUg==", + "requires": { + "@types/quill": "^1.3.10", + "lodash": "^4.17.4", + "quill": "^1.3.7" + } + }, + "react-redux": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.2.tgz", + "integrity": "sha512-xJKYI189VwfsFc4CJvHqHlDrzyFTY/3vZACbE+rr/zQ34Xx1wQfB4OTOSeOSNrF6BDVe8OOdxIrAnMGXA3ggfw==", + "requires": { + "@babel/runtime": "^7.12.1", + "@types/hoist-non-react-statics": "^3.3.1", + "@types/use-sync-external-store": "^0.0.3", + "hoist-non-react-statics": "^3.3.2", + "react-is": "^18.0.0", + "use-sync-external-store": "^1.0.0" + }, + "dependencies": { + "@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "requires": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "@types/use-sync-external-store": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", + "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" + }, + "use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "requires": {} + } + } + }, + "react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true + }, + "react-rnd": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/react-rnd/-/react-rnd-10.4.1.tgz", + "integrity": "sha512-0m887AjQZr6p2ADLNnipquqsDq4XJu/uqVqI3zuoGD19tRm6uB83HmZWydtkilNp5EWsOHbLGF4IjWMdd5du8Q==", + "requires": { + "re-resizable": "6.9.6", + "react-draggable": "4.4.5", + "tslib": "2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + } + } + }, + "react-router": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.15.0.tgz", + "integrity": "sha512-NIytlzvzLwJkCQj2HLefmeakxxWHWAP+02EGqWEZy+DgfHHKQMUoBBjUQLOtFInBMhWtb3hiUy6MfFgwLjXhqg==", + "requires": { + "@remix-run/router": "1.8.0" + } + }, + "react-router-dom": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.15.0.tgz", + "integrity": "sha512-aR42t0fs7brintwBGAv2+mGlCtgtFQeOzK0BM1/OiqEzRejOZtpMZepvgkscpMUnKb8YO84G7s3LsHnnDNonbQ==", + "requires": { + "@remix-run/router": "1.8.0", + "react-router": "6.15.0" + } + }, + "react-toastify": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-9.1.3.tgz", + "integrity": "sha512-fPfb8ghtn/XMxw3LkxQBk3IyagNpF/LIKjOBflbexr2AWxAH1MJgvnESwEwBn9liLFXgTKWgBSdZpw9m4OTHTg==", + "requires": { + "clsx": "^1.1.1" + }, + "dependencies": { + "clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==" + } + } + }, + "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==", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + }, + "redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "requires": { + "@babel/runtime": "^7.9.2" + } + }, + "redux-thunk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", + "requires": {} + }, + "reselect": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", + "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==" + }, + "scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "short-unique-id": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/short-unique-id/-/short-unique-id-4.4.4.tgz", + "integrity": "sha512-oLF1NCmtbiTWl2SqdXZQbo5KM1b7axdp0RgQLq8qCBBLoq+o3A5wmLrNM6bZIh54/a8BJ3l69kTXuxwZ+XCYuw==" + }, + "ts-key-enum": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/ts-key-enum/-/ts-key-enum-2.0.12.tgz", + "integrity": "sha512-Ety4IvKMaeG34AyXMp5r11XiVZNDRL+XWxXbVVJjLvq2vxKRttEANBE7Za1bxCAZRdH2/sZT6jFyyTWxXz28hw==" + }, + "tsconfck": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-2.1.2.tgz", + "integrity": "sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==", + "requires": {} + }, + "tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "devOptional": true + }, + "undici-types": { + "version": "5.25.3", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", + "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==" + }, + "vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "devOptional": true, + "requires": { + "esbuild": "^0.18.10", + "fsevents": "~2.3.2", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "dependencies": { + "@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "dev": true, + "optional": true + }, + "esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "devOptional": true, + "requires": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "devOptional": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "devOptional": true + }, + "postcss": { + "version": "8.4.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz", + "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", + "devOptional": true, + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "rollup": { + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.0.tgz", + "integrity": "sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==", + "devOptional": true, + "requires": { + "fsevents": "~2.3.2" + } + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "devOptional": true + } + } + }, + "vite-tsconfig-paths": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.2.1.tgz", + "integrity": "sha512-GNUI6ZgPqT3oervkvzU+qtys83+75N/OuDaQl7HmOqFTb0pjZsuARrRipsyJhJ3enqV8beI1xhGbToR4o78nSQ==", + "requires": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^2.1.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..ade52a4 --- /dev/null +++ b/package.json @@ -0,0 +1,55 @@ +{ + "name": "q-fund", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "@emotion/react": "^11.11.1", + "@emotion/styled": "^11.11.0", + "@mui/icons-material": "^5.11.11", + "@mui/material": "^5.11.13", + "@mui/system": "^5.14.5", + "@mui/x-date-pickers": "^6.12.0", + "@reduxjs/toolkit": "^1.9.3", + "bs58": "^5.0.0", + "colorsys": "github:netbeast/colorsys", + "compressorjs": "^1.2.1", + "dayjs": "^1.11.9", + "dompurify": "^3.0.5", + "localforage": "^1.10.0", + "moment": "^2.29.4", + "qortal-app-utils": "latest", + "quill-image-resize-module-react": "^3.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-dropzone": "^14.2.3", + "react-intersection-observer": "^9.4.3", + "react-quill": "^2.0.0", + "react-redux": "^8.0.5", + "react-rnd": "^10.4.1", + "react-router-dom": "^6.9.0", + "react-toastify": "^9.1.2", + "short-unique-id": "^4.4.4", + "ts-key-enum": "^2.0.12" + }, + "devDependencies": { + "@mui/types": "^7.2.3", + "@types/react": "^18.0.28", + "@types/react-dom": "^18.0.11", + "@typescript-eslint/eslint-plugin": "^5.57.1", + "@typescript-eslint/parser": "^5.57.1", + "@vitejs/plugin-react": "^4.0.0", + "eslint": "^8.38.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.3.4", + "prettier": "^3.0.2", + "typescript": "^5.0.2", + "vite": "^4.3.2" + } +} diff --git a/src/App.css b/src/App.css new file mode 100644 index 0000000..da78883 --- /dev/null +++ b/src/App.css @@ -0,0 +1,43 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} + diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..9cba8e7 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,40 @@ +import { useState } from 'react'; +import { Route, Routes } from 'react-router-dom'; +import { ThemeProvider } from '@mui/material/styles'; +import { CssBaseline } from '@mui/material'; +import { darkTheme, lightTheme } from './styles/theme'; +import { store } from './state/store'; +import { Provider } from 'react-redux'; +import GlobalWrapper from './wrappers/GlobalWrapper'; +import Notification from './components/common/Notification/Notification'; +import { Home } from './pages/Home/Home'; +import DownloadWrapper from './wrappers/DownloadWrapper'; +import { Crowdfund } from './pages/Crowdfund/Crowdfund'; + +function App() { + // const themeColor = window._qdnTheme + + const [theme, setTheme] = useState('dark'); + + return ( + + + + + setTheme(val)}> + + + setTheme(val)} />} + /> + } /> + + + + + + ); +} + +export default App; diff --git a/src/assets/images/CoverImageDefault.webp b/src/assets/images/CoverImageDefault.webp new file mode 100644 index 0000000000000000000000000000000000000000..219413b05548d40f28a431a6be37b4a1a85b88ef GIT binary patch literal 31696 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

h1qL_Fx3@=&{G!>P7@`6I!w7I)m!pEhX zZbo;x*F>5u|HR(!iJ~z7v~a!F#WqMfa4xZvMM8iiD~{E?*uc$%@!oJTE7~(ybyC^0 zt^>To^FTf9d8)N9qEyk=D5wOI^*-xI-SG!bKr)|vKD!~1-Fvsewqy& zl#oL#_f@tGhfjwEP){bucY&V%=W>rl@AE(7Mg=#jV=od*CAhCCQXVpkme)hYP z7amC3&$`>~V`k9|`t`0z>X%6dboI2!aCdQ6&&+%BAt2>;%|yK#p(h!Tz}qsB6}Kum z`Si5Hm~%>^!@+%`KjwH|8)H%^mqgn0oZu&l5AlAj=pJ(>ld&%2m*5+N%B`?u>z-lU zCq`p-P{m~BcnIr9ILNY}lE#5i`z_6212tMT9e15O4k~F?;|n{*1P*A3nm-5+{&$=ZRtVv- zKTSJb?X^M8!OvU9+>Pw0;L%8Oi30*(Py=zEyvd&F{p`%s=2gGO%qDZ~XGI9;q(mfU zs-J(trmM69+WxPK<+bAcvoJR~1lP$j=Qgor1~#xJbts{~T%igyBh#V17ei>txco-lq#`8vFgOu0-_N5kV!1INW2 z!L9i)?zmE@7QKIk)L5k?lLnkcAXNK$e4^Ko;>XbQv?V3GtomC+=7VjuWwY_cG6d}~ zn|l*^$$~yu(ie^pl@n4|v}wh@#_2G#;Jht*?{l%qiAmHM0aC!7IhXXZdoucg-8{R- zbP&!oK(F3xPq-W_V30DZmUAmEj#ZAm*{Xit0gHa_?@7Op^+=& zN;ens%BdcpBuYhz0W%IE-QFrOvrW|VUU;mPz6Yfe>L7)@=IE)>-}IIeK~Tnl3`e%f z_9eysuwH+NY}J5>S>~M2LR!h73LBl6*#t0h7W%dwZ%I8UC*>p`JI|Ei6Q z=#qPE@(j`>bjAltwgJvjkOTAVT8mUYu$t`lOJ3G#3X`#l8M6uH{a) z;oE_!oHEFRoWn@ZxqVXNZRKnomGaedROF(Aj`y-`XYgcma$#uD z@OvYJ(r#{%klG0jx8GqX1CQeP>}$mxDuoVBJ?)VPdKY27??$31;dB+7G-bb$CQpXX zV+vT!LdP2ak@c~tx}aIR(k;$3bL|lLf<`*D-gF_(|1*oM7SRHw53EMgtBtSTC_Nsw z1E-D3z1CEqYFoDL{ItNt)Ot0FxWIT zBzuZgA#S~pmlHo~UOA7VLu&43cd_=DF;7}@{8K|<#0WzW>?HrY_}3NE>w>KNUR#hV zvXtAcXeuO!+ZwFyVt=~2i2F`>sy>ggo+|9XSenkWtRypd&*dFojma zqt=nVF)?>%|DZo)JG0aN3_(fYx76S%|XdS78#+ z$9dyctd{P83Prc|>P`}tq<*5N^(I!o3b?^b*z|1(unCu|vk>x|9?Aq>DGG6Z`Qo)* z?HFb|A#_Q@ait2*FB-QSh38~<0f~0Kc33c>eJb!NoEDr(E=!&JV(lAd%|;){W2w9R z_{jYW!;V0ExXgPn5*U*|n4hF(-zM1|V=jWoO|2x-8K=vquY#yp&8L+Dg3fHB!qEx9laQ?tSlmFTiOM#`cjqnw*m1FJ( zwx;H~jhBklV)7ya}`?t<`_WAShHs=BR@|xiQO#u2*BTmRD5P3>MBN`<1NQ7|M`fc=MM^n(w10h%&VCb zLy#Z$B;Vljo4kmuHI5H`z7sVc8rE$QTE#W*5U+OfmB^|Gp9&X~uzuS}SAk{HmOm}p zdP|46oKK^0ghZunuq@fUMcQrb_O&Y>`_1g=l_t}-i%_U;GAngaYdpDa8R7$RZC;Ru zbFXV^@YUgpZs{V45t-g3eN9yX%B&l=j*t`cwsl12yNW#L#6YldO`-1uC&v zTRo&!-FT>ou{$`tCFy8u&Qzl}FI|98yExx6`}KiGl&k5%C!~w+``E%I9yRw%_%JVK z0qJ7CtxPCwgOmc6eyRK0@P(?CTpm*CyFhsVK4i=Gl?qX~io$DOib_zAKGsR?74}Uu z8gQWFQTkQ@;i9x^=vP(Y7%!#8N7jM6-xz42-3e8+k>6wq>lp7KA=$M`OgPne<|pWd zI8_cktdA^%x;kVblWQaHVK>GaH}eMWD=pd%tA#pP1MVt!@KSW3EO@}W=0u&IJV_EW zSHDHsLNwT?W&}jQjEBOGqMx={xNCXh^g6n;+REj8QP}3s67dF+hpTkKOtSn;&T8ey zJVpfv{9K3zLC}e`t-iRhw*hU#pruNuA54s5Rrg|;0Y2MYj9QN#Wugd^;M2E}cJ+JB zsE1aEq)SUoD`a5%(WJRnq$4w0jU4`Ig04D9en}5(K8)zw3+-vFRS2oQ#&$YAKg%sI z+`R3)$ZJ0}E1s;UktzH^rwUi);EUrTuBgqHl^$`D@HVZW@TA|>&W)k+E{wIMK(wya zp;m@U++hyI%t1CL*=CNeHb#`-sLVwcEv8(p%jNrzFCRofCYa+D?Lk(S*xT~1T+2L? zgcZe(%$&uZac1%n#cV3+qCf$S-NCH(p5v6ERp1vkr}hF5n_gQZw@DPo`hq^ou&8db z5P1~Es(BB#yXz!r6)!6Xr(~{IwR&Qs?2$2y>yIiC8WdA~B#-)8`x?T2+l%MBE8A*X z^W!2MCCp`nehetUjet^@YujzHZx_lqQSK@x!YzG}eq3A0$ieg!*I(o7rZL|L7s9&I z&ZpKwK3`qDM6r|NP0eWK`W*z@!0JZwv+8ggQ2~cxKLWj3Y{7W4WQQTK%Myz z(ArZ!HMgap7hL)mk)yA8pY=T#0R?-Au)^ob{cly-oMXyj%8l`v4Xs!eF_OI`yz1}L zfjtrSXX)_z3ZPAeYuB9*Pf?z6O*Z%$GMO?X!4ie4Gd;@c(Mf{_`yE>`X zAZ2?f&fC#Y(36l7D!*Ihwaa!FNQn|tp_1uq@mB-SnlsrOx+?vb64f)ZNN54XY=0!_ zy1$US?erNoVd29>z`jBW0;j;^ZXfAh^~A}U&M(}C%D`h?#p3pek(m}>Y?_@;&*z+& zMg4h+E|4(tWX8?!Kb^bBhLAKCw5WY&lN+ zPxH%1i~js7OFWYSB$eCn`T@hz&>LvsBIKzXxCmRed*h@hnWXL?jGIu##pQs*$732^ zGPKqV^Tkh*zbW=?E5vt^Ex%I%&NP8f#ugAa(RnXh!xcO4R>AT0x4~${2121wv z_m@ikVtc%K5irk3Ov#ozrh6Rtw2MIJ{*T4`j(O&PrZy#ec^3EFONyR&e;w;Ky>&;p z0oBNo7VxYVj*D6tmq*fNOe0Z__yx{B$IX^v6&~EfB_W6myj&KAOXEsq=?hI{f}}p9 z(&XQ>(9d(l@WfC=JkBS{hk1v9@Rt76kX+Jl5;ID(GUMPyGDKK;n+9TA!)wTAB|-5HEslnbEkvYxQ11VsE%% zHx&3r`D>n`zngxCWn9H=5j<+Tbhles`Ez5-goPwJP@tAqG?fjZT-Sco!Aq;avzEc8 zLf+NQEtdzyx-Rx*zW=VK`t4e$3!jMQ*KQMP-jR!;Oa^0bJ0%Fa%TPJ#fTG)PB6rp) z*L{WA@e5hXl)gMqI#uFE+=pHu^cN1{npWu!2si9g?S%qJk0sZ~NyRt>o$?*HhJe2p z2{!zJ%&AV+t?PWJ-Rw6CQYEX#wfxISt_0|3v^FMUQRh3sID6YKR8_Ok!Ny(Cc=o=7 zWf-GD_-If79A@gkGtuMVwE^Ss4XHKADJtYLTNfEpm!gru7PE{eM+zF{*+Il3vj0)n zHN=Rb1=+T3+qP}nwr$(CZQFLgwr$(?{M{sz%<86+yQLDM?w1sYmI@zGE~I6nY4C=z_Vi8sCfv6k_~=Us_F^)TL+!+mA8Y^3eMBG z(~VUA27Cn5p>MzX;91%}x$Q%y13pjrQyv2(t$$^x`y#de`0CK+v()Vvp^jXwx_sa! z9XKnqLmDJ3l!3jPZV^Q}^&!8G#=E^CI#N)2JF1vZCb3KLt&Xj(yrvF?uhw3F8IJvF zaYfICpFiYOpQ^CHf16;1`$QR$0XvxdT4)ualIxCBnB11Iad4KfWOGI7O_IdNTh_&uLMWK5sKQwD(c-Kb(KVRn&gfMKie zR(y%4nQ9&cjjs=uZGRH&Hi3nlbJ>)lGzF|kz*#^SV8^Qr;RF9V2o#F2W~X<$NpkRU z%7s*VwrFKFK3J$16)fJv4eb$kM9h9=I34*T$Be72`31p1jxdtQZ_*cBZpn1g(uQHBvE9`eosB>Em0w6_mHTSb z;40m31)3YpAg5pl`N*u26dz%8^|#627((5&PYof`jv-dQvP(uzg~Gv99J6f8ld>gTE5AIdFcZxs|5??`aao?DVOBLO3ICi6U1k%&of3Di+u_SIN~0sJG(y3)nV`RHWg~u6{be^3n;#ur%P8NdsG_n6wVzColuz7 zpdVO~>p3~6^xA*shnSl{Ep3=w!r$bVgQGP9tLlf zc(S?gSDLq5>d*RUVYAo7C74QGqt0j6^ciT{#--#n2-(*L7A{Ie0k zP<)wTbVM4U#zCpD*$s|20MW2OHxeqvLKW@rb!fCW<^`b0IAc$cRR@AGxMp&u?=zsG zaJn1;C*i$kLMA)!x*dOB0 zo@f7$SMcuFl*LG40IfdLVxdxH>O_cXDhDW3WR)E5e>Uab0KkZR^Z}&aj)bTL*5VuB z>8AOs0faP=#GlBk^Uh!jkD4^a&1k+SiG_AWT>X6qBwRog!fUPI`+|SQ=&a&=S#{ul zx1iV#3F5-WS|bp*kMIJa-f;4qmiLL}0rs0B6HzWu=x2W04gG{W%g1LbVm{^gyoET3 z8Nflo^m!pe%%;dnf|=n!1kV{oDDRQ7J)BLBovP z^q&Q6lINRwN<`lp*;|nZM69&zazEH`!B?NULcS74jh)a-glWzRl&LVhbW&JZ>Qbx{? z>4h?NUh@dkt@agNt>$fgWDY{n0I#+luo#J2uA9O%65@WibbMHtyUuDIZSZL4S14U1 z_qmCCCf`e@7SMCgL!WsA(olR22ldKSgoOqRYH(2)nh|0{5kg!;cVU-~fo{2}KBneV zwV`_mvcvU*X z9aLAF0!;Gd?uh%q|92r~_R}`+;(PlL+K{)PaAL$kBlBznt(a0>mL&wP8qTlF_ZAoL zSSl6&$-G~Tx1UBtVxPK;`5wspl9M-lV-?BzOp{EnKQfxe_*nsXC0!KO6(X|7Sj74m zEOUTBdcyJiF3!}*ZLEJwh=9^0rBu?KBA8%zTHjD<0Wp;u!rBGr>MCK$PHxDqlm_tL z2^i6vFt1xU53q9%e6d-yaLsttwi=rO8j$Jg%|hFtdu}U}VMmEs7#U>}G59XwuHvtFa)~pULpZDTb>WxFzm=yXBlr~SECtC;gf$qM! zIQepVtDKPHsaBXYH*$~uPNY*W4D}pnYfO(PBt$H2^Xy z)@o-xmBJy)$HWlvAHPrD3l)chUdiZ*v0ErdV-0+8Y{MngmV4V9cm`0l>A*acx}nzF zEfw4O#$-3ej${-|#SF~xwI8j4o+uIobz1mEMiJHwawAls`R9As+Oslt8rVMxu_!Bs zLrzZEn%%oSr$&k4ROZDA1-pB8U4gZ%nTFEXTELsn^6ACi1NsH3({%euBh5dYRx1k? zhprI7j#w$Q7VdPQXim7F4nq8|ie`ucW7{JHz0?&_^bLIKn#TFzja77m*VXsjLaHV{ zuyWGVk1+L*C32H(OBuzb$_!hxv&_r5p8X4vvK;mhpQjSvABr~F$H)ZZW`it8Sf%=J z{Y)`4gBQqQA8nh23}b+}Qny@xlUjMQ3{UF~KL4Q5&ZL(3C6DC(3w9ZTf*GP+#*Y-J zxyX!up@*gm-UIm`(!8Cx4ASACI2dZXlJwQ-OEyyCKy?9yngg0<0n?8oi5lUnzKc+Q zr*cQ6wujEgM&`^_CvO%6X{{?42BBGl3!>vAc~(;X+qbXJS8e*2hCqA-B+1>2ITD@A ztM@+*9Hb|xw2UDHK{?8GW`}w8a(^?wrjwh}mjQ|2(?9+?THCspcpb|{XW76BBiFKD zVET9gZBhleETPoQ6Twz?huIOKN93)kjF`P51#=oC1-~pSpetHCY;~AQ$=ae?AF3eMe`7G>!V=3$d+ZGbn!?4(+exA)-bsUeT_sm!3xJ+I7`=LR z7{h*z)MblK`5c6aKXBl}mfJ1N=o5Ys>LgBZWct7h;5ZDR$ob^TjC-`}PUIn6QIE68$-o!$>!w@CZ~W zotYVdjIPmIOf)l^CM127a^6)bbh&~P-la)e%iv5#ru#Yloi+`QRUeR%&=9B> zPnv~sbd{jYZB4E3eeCr*G7W#C$yu`gWy6#jr66{(D+FoF1PFiIN@pLgsfNIg9ZhyW zVyE-{ERRv|Bdx~W_6ltl()6I^fD$RHGv)DL1^DqmpJK<|TwC$YBRqxyl6EWt#5;m% z7PP-cA%{f{Q?c=b?6-ma*8aPJ7Rp%6%wV=b>Kg9;!PU?2$DwM*Oh<>L)=Iyd>gtJ& zeFqHf@9mbm?ZiU~NEhGuxb#gG+BB)+P3Dq9fL|Ic2r=AR5tJjr0gUg60O*vTPxDl! z9-J*6vO}E6!ZzE{=orWfkZeFv(*O{slkov3BH-Kz1jRx@v-7C9G5Pk#Y; z!Y8kfH-gCy-2lKw5UM+&?msc`cC9H@!UY5@>UI>8w4HrNx zn^bnDwPG39sJ;eO3_duI9t)aVb)Y{(;N)tiqB!E~-`l*6S)pTcD zu%ZBa_>gmKPBP5SWW4gMB37JPTvJ9Y;A zx(I((%xkg}cQ)gI=3tAQx>G4{y-j_9(%>hW$kc0&!_3?-`$Cwj!Az#5(139HFC0Xs3VUf z91kNGhyL@iL5B{Yc<1uG! zL@1BdODEKSW-;rJuYt57*Ob?+KLdE{w6A5lQvy}guU}}_NaE5@$RYxyG}UTi_rk5F z)gA-MF|FWbl)!N4Q-|tnT`~pD)47U_Ggh&(b}@t z+ffK*gk%36cMbw$kdO*%BorC#B0?Q}VvTa8xKTj+^{<<7c9ISckmJ&7rF49QNP~kI zh+G>>?F+cGIdI+NjZK9nFedUo{5Qkc=qxcco%|yJ8azGnHAo_(Px50aidth87w_LN z4)hu{%v+6=DOh)^eBsulHNTHN*-pW`KxQUYNfSU*V{v@xrGsLXQSMDeBT}z0I)xG9 z-%yf;VPp_(*_YFt3A;dhS{O2WNAoZ+;C*+Kd(bPfsuTJ3IJqpxe6B5KTi@O#0-G58 z>lLW}{O6HCrn&tyQ3jy6ZajsxEVhl zOGKBoK?DORYk7cEwYraVztLAto-rp_qIU=imqu!Caw;;YM#^H!HY};jX2-=~{lUwx zI0s-Lu_7##kPz5zCxYTP%=7=tI$E8L^9NP%v**BmXP93n+2T`_6ajn<5QmxUJRO-b zj7GdMJP{KOt}{yg;vy+X4o(ZA6UgXTAA&)GKWTj!MSy%ilBJT=09gLC$XmuL%`JgG z$F3P2d#G@_RA7rVF;wz0K;Qp#62W4zK7me{(FG1Znz1kAVMu1jtot$)2B1i$Zon|G6o|DMkAsX6#FfyuC#ZE!4W90BftWyEej zmOgJlS(lgMOlCIEDBb!GM!kJ`M5!n3efZ0}u26RA>c_3D2;G+0Op~scj-^4(;ng+_ z&0tbDfVFTOBf#P4VaZ%Ty+=96B3svx;9MMS7j554cQbe!_G%xkV76+`m$$x57_^T) z%b=R6yG&ZgA^dGVi*kM2OZ#B+Au#XwY+rrw3Wr zI38#<0mO6OQ(+MPvBk4t8ROJuZP>wLn<9|SlqCU)X~l`!$olQu$9xVlW9D3?$Q~Yd z{Wm{~Qfj#PeXxSta{xR*p28&5RE0`LgjgBNe4K91s51+Jvhj?WBl&VADy&6?krI?b zQ24exQU&8jNTVuFI9*?miqX%e3*7$>C6hgg%Be*Hgo;{?_qGB%`;HUVQVmlc5$8;J z2HO0JQDTQJ#P4|c-<1(m)xH;osW+a=sO}PgFkI*F)D9Bp!+$98)L4$j=#V78_A$12 zXQIplw8OBFs4D@$h=W`L0PnFt5H4wF33`g%k|2^r_QIfFv;ClRcZd~+P+_5%hUtWI zjZue=frNjP63jY&y7Y|_^4mb$vs%B}bzu?vL=;%IMHVFzcC_IrSV4ta1niFouWU;Z zqHW!STc>j+X2DNYFkku;!fRbbIfPRqnow@>>sq(XJQ zDJ!pEBgvs$I2J{>2}`uNCGlP3vxKLCCdYQcD7^HLIB$mS@yv93Wv{fG6=Uk8CAifZ zOJF1o^=8gMj6GyTPk_8%l%|qlqP3Io-XBr)Xl)*eFqC}jp63?q$p!N4q}SS2xMB~| z>MTMi8&s*V(?59b!ZX#tZZjjn1ZKFctw<#AW`(DgM{1~iwQ9{t}f z7cZyS|Jb+V&_N&elH(mYhbOE)GOpE;-cXU<1xS36O51nsp{PW#fPTsjDQ6%~sg!k$ z;=Wacl>a!&-=QM=fRBNtU?!~l!^V##Nd_u0Xo;ZHG}~woN~iL4m3Qe@pWXW7jF*R? zs*n_s^;(cWSjC zRBSu$E;Q%U!_EVgWn>kYv*@f7M?kVX1$lxZ{?LYK`*q)JkM>y|pVV*OE4?u8o44a3 zQ87zk$=y}^N9+NLXWIt$d9Ac-V%SyMWeN{TcMWKB>4+OS0Tc<#ZLEbC<129CXI7WZ zAV8unFugfaFJ-T^;8lt@1^jTC``^)S7b!K=nc6;KZk(f(6%-Cntt(I(5%7-+MiIIw z2IigjDEnKCAkV=*zH@QK_LM;hNV?qfx7a=D0f-r|08v9p-)~|rLf7H5q?KxfGz-jz zb>?J8y{g)M1&mu+@90!c74(BIoK&g`{Tm^MfMDUvuC@Eubt8N3+F#@Q(7HbELHh9Q zyl#))vT>;}eP*aR*)p5_T?l*-&4TImZ4U&+vo4c*)*>#+Wxlvt@71F7KBn~L9NX}n zk$5mfkoto4deHN(uzB-AMDgG6jpQVmQGY6`G|3)4Lb}?}`Bjy8b#?mhEmAw3Vilnm z*(}wzXj?*H#GmdB@(?^1rJ^jnA8P)CsbYqPG)xjse8 z^RagwNr+|>FdHE~CWs+?kIc_UJj|-h7hx9QA~7I+L_s{qrZW^>$w1(-D@WEfdg5dH zhinYH*STsN-N}Vq*i)xT>m``Gcy9>k$XapxQnh@Gx|h^#-&eE_uxUqbFNgay(=o_s z2}e40$UHp=zUkO~0-z{PkMLRbRV-e$x=ocr35QZr0?Q51CCJ_A;FLjtz{8N(+}G;N zb&ajJg)JI2Wln}*y!?5Gz@FiiJFmreiTgxBeJP7TFofk6W)E#jRl)Q*>pDNFzuyp0 zeCk2Y2bN4HR@|ASf63X{$3m!CB{7SG7%DG4tew`62aSI*!NqZ;@)#;*qAEk8>%36S z`=mT7fKf1n#TH1yYY=_QHk&l#ZIEki<(Ca;81>y!cw7*V%ZDt>g|94grSR2EvFy1( zfi8oqjHU$mZx0@)kbXL?(DuAKO}ufqOS}UnlmZ!6lr#&c%;(SxnlXv#B+sj*!{mjB zgwy#pWw_79cadP|UughPw+@6%FxZuxxj-s*-}nbDbwWAywF>y3w6tRur((%S)e>pM z;{W#h&6DNc3g# zP12Vi^T=#ec7lKnCUuG=&o@Obi!vv3^7=3TO-KCkSu{IwGVZrz8)3GpvjKpSKdH;) zIB%wR1lnn_-Y_RE5Irs^YT@CO^6*c4$|SlV5#{{k3pW? z9ul7`@!;FQP=7ZU-QtdLl*rF(D2#lI@~M zTy$%bC}#~6k+Js&Y6=ptXj^b^Ct9#_pgN7Rtkj7FuptIx_Bk4qVkiST5#QMBa@ltz zL$^1m>X2M^k{$=e96L<7%w4BcmYp(NuHN{^{^wzg`)eg7m#K(zP~fADX{SqT`X*>cAhJi_|#@BKzf&sXPR)_x|oPr_a$-RLNa}bnw ze(7Egd`5NCthB)u3p$J#^jHOfBGt`G0=b_;R+Y%4c-D2>qS-6`bWHDuG8#pUwVUNjK_~D< za}fcq8eVT?pWFoR%8z66 z8)bVgqiH{}#A`DZ)#|}aBbfHY${gj&cF*A>2e_eaz6lL9R5bPNlEGdW*#zi&P@6d` z{V4MLS{P01eB5O8A7K|2m+!UY8}j$rZ}PcWQcz(hogN?#aVdYr&UpMgg++w6h><%K zKfS>aB`_8RyBHCp2L;)jRsKlxHDcsk7@0ayUu5A*3^0e!y#h?7nim?hN{19E1j$XM zp(x`eXbsn^IEHlCE4@c;|1j&dSWTKFT2nTE*9MiKfWpb@>NCm z)O9G!qa#@}uz-Q+Z3XF)+Am{5`y#H^#cXcJL>oK| zF#UWR{{n?tHa&9F=(#@=@LLgUhXVBn-(nKD+hL8tcC?Nqm3C98y{Go>40%ZLRmlO` z_bEjMxJA;O1V<6DghRUlW;2P~>-m5xv<+-A;!R7^ajg!Al}fZ`Zy1#+$tOggP*YUK zyP-dNPqu^ITBf0l!1w_b21fPL zq=Db6iIG9Tyyw~ZBu=toYD4NAci96Odx}HnI`$c2N?r<3;Dwp%u;pT#1kw`?*slk+ z?aN=>Ia~^wf!Bqni~5N&deLBRmS%^DYv$S4(F?0NP!deiK<MbtflSN0j76Zk;NlKJ`#VvQ<#jm z-qeW;MRJvcUj^{37WE-U|EtV6Fu_*aaS-kI4Rse+_Aa|haS2dsM#`nswThA;QCvTv z(#O&{bta5Fpa+JH_)Fv}alGJ|(zB(6x|WWWsX;y-oSEuzqVSJGD^3S2&+1s=%UG=D zI%r);Y_Zs&{~59;;Fw3lvGR|j1n?ck>3R)+dD;nUuuNksV;w{XW3hscLa>N2)0?P79qzeQqHdFWci_06|cnU-3^;; zoYaoHg}9UmLG$AfX;qw5@#R1qb-qrpKrY=33Ai|mME_i08l^?6xnbceSENOC78{c< zkA39TGWC+#&*309ayDhbLY3}#TgE-m!^#mhfh&@P-q!QK8TBt0h`Ox*{f&%XJ>X&&6ZOZ(41y!4sNTi|h#?J~P- z)+GZ@l6smJOi{{FS0NVc?$(-2m`pdJ4wUqlM{a5!FxWyYH2)rB_GzGlJqIbSNn5j} z9Z4Ot*8+{32~Whk=~qzNXx(FPKL4b~4FN5tnkaqK|U;mvbT078>s?fh|hA=AZ z!P=PbHt6Q3x}@}WNF{X;s-URoO~{!5mIiBDf3TmcLvYgAA+x4LS0|zqJYVcNJ}4yK zZBr#(?#W=u8j7G#S579Ek=TEL2(7GPnKRPkAqF#_ zhDzXhv5q$Al>0`|y}f|5F#!!6RC_>)9@rEsK`m^4Lpu9Ah|2)<*}_h7X(sa{+HKTW zg1o{5xX(1RE!(p$vb#bm`@Gv>uhrVUfG6R$h-hj!FeM6kFz#snsg(2n=o_BYbrT{` zC6+sq9X|*{GgKYc(f_n$H7k3DMAf<;Rnrmax|vK{w1DVdzHXSPhc888()IX02V5T3 z2bP^qZ)Yj+t>17CR zk+@0^Zp4)5t_xW83-3RP#QuKkRyo!1HV1!(XYs8+wZgv2Gl37UiB7=#I+7ti88^7x zLyLWOF{Qj|BTKcP4J(%rNFlHiWoKgu*s1Hq?&~rwJFV$gbv8>7arFcFZIz-*=jC!A z1`v5$6Ys~KV&#Q|akrbi5`5B5t>mj!e&h+&RH>=Ou{W!}hrIh7>3Elrs);C8LS_v6 znj-K~FT{<73!m=;f7<8lY_05dewX@!8ob@F!X7b!6b`_>29w9dyqZRm+beMtN`5vW z2}cR{HZiOj3Vqsv$8yJ{f_OswcDjla=PN;u06c3O)K*oR7^d1wBs(c5A9}%{t5d-E zh>+HNFUKvYMlLKV?}n|ZJD8suXdiyRiL0o-{fRO(sePDt5Jle2lc>NWxv3ZK=yzEH zDAVX2B``#dOxJd|ahFdn;~(1D2?er84yHsL7`R{Vvll!Ho9kXnBt!pDaWX8L#An-E z!LFCRQvHLeoNoE!Zs?bvusodKvy{;Jpgl7VGx5+@`96-j%7aETm|N4OrO4HWe>eMb zDh&mNwaa>GN7~di&>8jW#sEi8KXp*4RKfnZ_^6outiGxT1ZgH&EOuBLRj3>1{-v#g zjX6JalgQ=-vHReq3Ma7{H0Af~7r||+NluXwK9PD%w06Ro)iNBMe22S19#!wuO&8EF zCE}VIv-kM3y^$Dx_y>0QEI%cgS;rXTh_2?{^XN9Id}GVTZQ7Lu_21pO)EDiUt7&=9 zE%A-Q?H12orD1-NZZq8E2POnHDL{1pz7!c?@&!H-|J&>wZ1sR@)YOU_d%$b0k8Q?P zMJ(4qg{+)McB)8>;&9RHQVQSBE|GBM%*pqE350oelbd{bOR`>j^uGzXi;ip#n2i(! z51K%t`*lOS@@|`ndr07bkz@r}g6FxXYOFIis6w8VYI5n~9Fnn`j9Gge@F1ubge4}9 zFqx)6a8&|Gu>XM*DLtci(szL{%S@N#LoeP0i9=1uJXH+`2Zd~Gg*{lYlfTI^O*xki zD){S?qoy(iLwN7VIoCqcu&DvQNK|mI+UC+EXwTxbd2?57`Zm))H~Do=-YQYngu+BQ z@wuH@hQ+Fc{d8zgn2G%19Dn@n&67nZyI<{Smurx8^dU$H1SMaLH{=OiUpNvsqDh5SclUVU?s=~qs}d6&?MMRpcgX?=+C zI1nw5*e=_Zk|iS3+Lh0Nr@dY8F2pV!%dm7`52Ls{6pWIS>E=$itCOYhY z?c0^_>_{tErwj0dkZolCY(C~6IJlP{(C4z(bSJ|HZa$J7pVf(MDM>&z{|g%)tr-MSmGXY>602VviJ0@fB%f`Dz_ zEbvg(wkh%Y+|Z zPEk`yHj|8eS;Y5SO909_vL$*@?fQ|%`aB;;%TU!gY6bMY)(&z_&T!)3o8p0?Tqw_t z@}DJjD!Td;&9^uBTC^Z%BRq~Z(fYYW*x|tsO3b#h^3Yh1fjNXG7K+IrJGd+_dK0nk zjW--H0j{dG%{dh@+{skr-5 zL8Mq>*<9e(7VnNR^XxT6xvYeu?@m+~n2ZymbOWaar;m4z|gpoSkYL28V*#~5!Z_UiwB&Yj+I{%WL4Vu z#$V)_cp4D`X-YydGXBWzA=Z*EREx)JcD9$M)NsdHyC>kN#pSMb@FyHr zXf}d$DFHwDFzN%(y&%o{r0%L@Yeoz|t4$tw9-o3TVY*pv4cy(W_g+6Kj3PwRU93~8 z#|Tp&>yf-A9yCiLvNv!kQv-~LD2~$j6f^^O)eZngHs`(qA)*>_3E}#D&K`Qc+<%-K z5vXcOQXAT2nvN^UlF4SQdO9=eyjH7K9rp-?*emT$P+nC9Kt@S3UvhsEvs=j5y6)a@ zH;t=w+QkXvPEF1;;i0P5f58gORihduLfu2u<}E-VtzrLAAPQi&>XS$-R8{hwl)rfU z$31x;Y7iBzsmzV(jt*Jr2Gk8MMp!_n~DB@&a)eOEMh)9YyTjuOy;$RDJby9kvMQ}anTqaCk$l~;_Tit~S|YR< zaOc*ZS9NqS5k?K|8X6i#d$0sL3_wplZ#~$MlrO|5tU1tYB$a*F-QBddW9V8@R@Whj zZ_Mt6t*kp!G}+l0*nin5@8E7E*qPE;jhvq8Y<FKLY+!KXPwHUFyWWTE0TwCN>Ue}Y6qHhC2hRllNV_M^F}HbT?|a2` zT)EFjRL4$5u*AY_5V%KO3LC(|?2ny7daynP4rYS?^ClTre=_%rvnq;!% z#~Lg<&ADOEo81P%1{!M4zN`^I2n>-tvQ}@t$mSxC+nFX_i(6F5j7tUyu*;);Mx~qP z^OLpeA3w#!yap8yhBojRNu3+;+?F55VL(6@nc3p)#ay@o%7MqOi7X-0eY@qX%o!;X z@t@U-l1si56KdUgKY%_Wk7A`hF;{oOLi@y!7)h9^rrSi>Rh1~lb(F{&evl-Ucql#$ zfy%Z$18|=Z+6*2fl0CC$Sm#P~{w28HSjjT@$ zpkxSml*beBfpL& zqbFMakoka5OCJk%FCzwVDQk2fjy=Y(8F}tWbmMUsv8C@}b5$#d4sU~XyPU$K`zk$} z-S=CfVE1$^8z;w(Nc0C$Ph6!twM?29CnlzNh zN8y+6)FtRm8n~Ht;{9Pows7j?=%T%91&TrFf=&-yESCgx(Cnd^5>(VJ7J&Q}}>t=@`qGrnH zh?px(MDY{PJztJ(?G!v3LVt9l3!@)CL*9%@k81mvvy2iYmb`^oPMGN|UzfFQ^&2v;oO3 z&7uQ!h~qyqpha0DL==&zvi$MxNp5d#9ZX82-}e-8|LYeYc==r$vNN{PCV_QP!1m?6 z+tSa0pe1zUaQ(u>yP^n@oeZ9!Lh~xOOvt843UoZS<}H4qL0ism&;cUx%i}L!pgd15 zv;KGFo%x<*ju1xPUjr4zIsSUGEfW{D_?~-=!cjog z#a<|E+}FtE^d||gF>ASod|8}Ve{{=rncz6T#07nOguZpwQKUv3!w}Ylekmm&Qoy-ltld)f2u?mNon6bz%a}wSu1vtL5Un=fXzLclO z+~j}y_``E~3T7c>gWhXqhL-qMO1fb&X-$5$lb~$jOrndXPr&IvAZjSdo?hC+$!>~l z6LI_Td~Gw0KM*j(dJ}i1WogKVMnj8133dGtD3H{Ge2fYls>ziq>;a9;LLs9Ygs$y= zXC4~UDc>BTw(W=spUm$GzMH`iFWyabef$0fyxtYEx6p~?{h%zw_)LKZPEN;<+0W@5 z6gG}n+@Wo^Ji=!{Eix|p0sm?Kd7ew}S8QvUkySyS#u*5H>j~M?tL2oI*n|RpcE&1l zoQ~51l4<=THoEbDIfWa1x|I&67AFK*i2s-vLN4+t0u`g>sgG})Z3%b^VL%^(fRJ{> zP?V7z!xvt1B-2O>&i$g^75DtVq{JS}SMtIb@xx69-aHQ*=n3ZWZg#KF@QDf>+L+JI z1Ep>1l-TGF-lMN2&6%??Xj*>K_7 zR&0ap&P%nnEsQC+U49~2QQ8Lx5rwBE!}bARRluQ;Ww|oTSmMaKXG9*-ptqhRA$Ub= z8cT=kCYOhmdcC%Ox=1Msr!dnu0JWmeh#%QMbqXFSHY{P&@TpC}C73u(3v+l$>j_vT z2ikr>X6JdWSRFU>Xl~(R=vU3K-F6gyz6pEsj>CyVbS!JAm%Gj7G|%(2?$*>lB8zRA z0rFEZ2K3@1B~L)tr{r|mWKaW@3AOnr)0`9E>~6s3bV1MK z9Bu}VU|%QkyL;_Z3M-D(1d>eXcTLK}Jc{P3M#)LEG@)k)G+EG1HU;z)t+Kv>5O>AQ z33vg!K7@8o1L_vK0LhU!L_ES~J=57zG8Zl;+aykG>+v_{E2e>7-#ZKH@4f&5xfS2U zu6wHq94mcVSZo^7rU#o2@K+>m+?+_;3v1^l`o4p0kIi=Ww*H2lP=m5SzXPz+Z!ABJ z`K*7LVe2%)_f3Nxc{lr~f!|Yy*rWdjM7bCu=Sp1c>kB_H?u2G{nDrJ!xwL7CrQ^O$ z*hd|CpZ8Lbk%n;q%mG0zrGAEgGW2$S#RI$yD*}>p0ELNS>2&y71~Ejqw*lSc7^rG2 zW!qaO<1N;xQJw4@ZE_L*h}x8Sc^D!rhpRcE%B7*uxdbh@ho9hGMpmKt+WheOmRt=x r-eUuR48jzM!A_CINNf4Y7(K|!HPONl8#K|$aCcL5L}zl<(yhCyyfHd31QP*7-n z|6S0DjA(>VP(?Y?V!|pedgr=`9-rqIvX)a7q;vA8U~>XC_(B}2!wq`h&vfBF!xb!f zDrW81K2*>FxZJ?1ZeUZP6Dud@gO|;!tNs`xkkiP-Mdq95(`}0TB=3Va?Ms&Z1@EC9 zktYCJ#0P^6?tgFp`w9MkTY)c`C>cGc|6nxz&=`$9Y7~^U&C3w*f6Pq;!FO+NVVWy8 z+Js8$J4*V|inU!ikCy|;bciVi7wZQc6ZE{o2-1JH3HS}S6)0JRvY@uRRvo<}zOj(o zxA2ia?0Lc{+l^vAHjx!FChBqnTlJ0N7RpC~0rDrZI?SW^^c2@}zI*!8_(mtpv%Glm z)6MNW!`zok+3pjkm^|K4K zx^?sAZBwW;gDZ=cATSv_`miL~R(LMQt&cS{z7PNdraKJkrmxa|P@ypdh}WNDc6TLq z8@fUEKPBgb!eS=|yw_@;V=13?DoaXx6rI4d*kX z+9C2ei&es#l@#oEyNu--C(){L9SmZzWVZ@GZ9ZbTy#NSe# zHXP>~K9;(5LGx+>pA0zIL$t~Ec;U$v!vlB6uX2k8IvmWGc?4kaB}oujKWFatuffE} z9Ab%2CMWr&@W~ehE0C^hW;gItu{L4;0&OwFYnN7Ed~w-qL-Mun;IdXYISW0)kBn)V zo5b8m>|8l}gr6ipsl-l^g^wDbmk@eZF44e20&v5%IGE{y$6sok_}{I1`oqQ(M zUuZxL_=jO>Yd@>dt(dg13r1K(01ko0dxs+NHfX=6G%quqq%vf8MG$=vT=3ysotp-T zIfkjODTZ3dUIuRFI?+J)<~fHv=nt(0kEN5$@RPnnjZf48G?*~R7}-qD@LSV!shD5p z+m9O1FFE%%jxHlHX zt?E}lJ|>;p?N7PvQgnT<>Q?^kXfRE7exTlJNWx)DW|{7~+nGioCcwV&TfvlhNlQJk zi^kcw|15n?2Y85W{;n*xXE&X9Wkw+sP(hPQb!rW_lx$|8V+DIpiqWc4uz_ood1YbR zLqtVg{{z-60jHo7{IAjVw^9~Zpzc7?w^2b_)(omt2*Erw)zP8oNEQxgp^Vaq9GgI@4YJ@pPFaQ@(d54ZY)P9>IB`n+*N93BljBqnJo@ zwdcijmu`*-*yc31eUTelYs)-Uv zOJKqX`2aFVVC6BstTaCc{T;f&RO?fDlOepwNKcsnaEaFqm>C%1h@=#G#WP+k?-MyE z>U~c<>2|GwAJ)gejG=X#jK^oJy)lv)+0U^=qp}EhxQsnA!5#LmO|!qZsuzpbch8$U z`1RL2-5DqM@L7>g(D1h-#r3bHy049~0RAyjDCVTei65@-Yn$6wQfV0Kg3P@RCn0U4 zbQ;_&7-bAdHg*fktJu5_LUu25MxBUzvTN=L<2?%z33;(g^JPF~!chIQvF3<>SA*uE znB%t9XdP-C3BT}pb(j%9gre6YxysYVCyY&IpRq7qvz`5KM};9)iKg{UjR9t%iH^L( z!zN!hLbNOiGhxrd+2t?=mN<4%TJ_&Slgk8=J4)MarxFK?=s>-s{Icq>h$uGpME2|z z%uPbdE_{4#MAbL|w0atHKxK6IKvlEggm;ahrf)?5-j;yP&qM0%i?v?YpO$a#4~5yn z)fCjKQf(|_I%{y4pRKrmT z$eLq;N{w^wA^?g-$;#=Q+>J=4?-WpW(Ji?R?mA$T$q?$m15&|;BEe3NO%iF=r1z72 z*Y0Q^@(vz!| zCROU&y@iVIr-1FV7gEiOx42c1&S6AGh>b_qL2h~V%Cl6a2V5J~JEatGb2UuWc?LG6 zF@2-!NjjM>r}P!)F>_i##^gb%=H^tg`L;9}tM~f?*c?Mc1 z%ES)2)OG{UZVw};WQmP7EbQ868e7Cs+Fx~&%1nGf4SEFZm|s9!65-{6$G1 zg;va_!5gl|_!F=CNl#!Bmf+9R$<_xTX=I(p9dj;e>lIk+-5U2>l^F(f zR3mZ`BW$_g_h|a-_pNGS96U%)1h?nt?7jvs(gT+T&rD6rbUVE!m3nxd+|eUJI-(~~ zFt+Ge1g|(I@RkQ+6B~MOxZJtgSH#nps)rp&F!~IGSQ1dgzo58T?-jG7?dr+ykIVt5}oVSErrI=$5I`?clwNzYvu z%Hd&g6Q|`rk`|BSkVcz@(~~9=tub5fCj!|{bkG0J%R8D=pB$wT{a6K9$RK_gCb!0V zn)|L;fq9l*UrTFX^Sxd@5ha6WSJQnyu`upwg%Mmx)=7qUBRyBC_A*1Sy*JZ{@tb!({e*^W-jak8Y z)hdZEd7#uEs^{ow!@|J{?Y)hgFhj~eJ_9>-(OR~ zQ9E3w6AZPh%gB?TQ*UDSFVr)b_`)qIG_>z9DBJ_kv<7sMWdDeMc{_yBqZ48$glreI zy&7R|+r<>0wpU!ABX*!gNknxWI^}Pa7h(1%Sz(;;)4506irZQn%uVrbu+!5WJb-=q z&BN|MUNJefIa=zE;co{u><)jCMgiwJA?OEo?d458*JFW3 z=37Ka%^y=u5U5&(*R1!bFyx4ta>tGz6!t<9!R z?TvYoD!pVXW&Fq6v}x8JdDn!{5w#r2pPcWh0Dcu`wO~g!u!m7&*{Hda>d67IjQnrT zG37Xp%D*aF52F(zV(takJ(lmhJT|gp)SGxW25c1s#-MG!V%?*UOuy%UjFpda>EE^P z#(m1(iFU{Iv+mj)H7ys{>&MgQ0h4jsURj8gf91JMd>~a0LUvI2&~M!^>k$j3m4?E* zomU+-R5!<(C1&kOYLK3DBHzK)?~5bCQ=6gl0>yg3o=xUV!NCqV-9ytbd3oc9+fY`0 zjfJ(3LH9?v3I4WpucZlkwtTG5hvh)AU#M}wZuhn&5byV{IN!S|_Z4;1T_cmxcuwDp za_Y>|@n_y(?LFN~FMf)X>q|x9txGG0>m580GpQ95*9VYpL3wwyj3gS=kjDD-8gXaL z?+}Z&ODXhUoMbNxtk2^YsKj-2&)3g5G0z!O*6+6Eeo&Z5_w?txD9*X~XP)=3cx|() zdgYS(PGQ^dPYvi#Z$T7ObYzO$2V z!qYJ-Em^lYM-1d>zlfXSwSN4S@Lu9O^MV|EspNl|6|ECPsEPk+q=VMF-1Is{1e@F0 z@;2Cu{@-t`Qg4K6eMAHAXEW!sKE2EkOw-)@%oR63VG@)gR`z6%NCZ}efLZ^YLiU2D z8VL!q%Y()4mxjw+-We6Fd5#r()YP)08Frp&3W;4>(c|xPfAuM@Cw{dqNklrvN0eZa zi4@WHvcmmv_cFI@D^in>cP6g4lCU{K2f+ao2J z3L4RZfo=0TEw}%1Bil+^3zgz-2raq%fA)zzqUk29KBsBuyXQxiZr6pgzVS>xr`s}9 zjow0N30>mE{mw)ocGYjZExz~40@$y0>;jic6 zwit@Y35RH#{`bL&UhNfr=D~SeK?}~%1A*zN>br6SBfu+CaZLb@_yHKx3VlEGsbuT3 zf=I|zuW6&ImiaD~y1%SDZsZ*`%L`HEKcn$vj~G|&gA{J;a_IJfndA%^uSt=UaN!;5 zqm&EO;^6-E#W(HzMnd($s~>|>InHhYF%@vVKhoW2EE%4^PCf$@O9OWIp(eFCk)oFC4wPWDv#ywzV z7W5sv1FgW`o~rqL-GD`RAGI_%QgUPD!qn5S?d6KRI_lIs%~R6z)m2Z#bfN)k_JE%D zoV#MJ5#&r)9=?!^2Ei34TVHUM{yGcf$~x71t}^;ny~TLWc3?M%YC-w`c$sZdt53wO zxl3xE-&?y+E_Q$o@!&Gg%xioXIzIgmE8IB}N8g3rM<~>WI>H)Dem#ayvHok*3$Cvziw3O1;Ov9!H!er1RDh|9*4N|n`LUYzQHw2?m8rTcb}XCRyZViatGo0{_@F9 zWUR^+m<#QlMF1^2vfViqt(^>s9|9D9PINO<2GDeOM7u3_77o?fp3uLzxE%bxDLV?Z zq&p@TK`&UJb77`Os=!rJ-NQ?0sXPaGtl+t|?rz2Z#^>sWWBvGTVppBaJn zCIhi!Yum+$T@RG+(yg7saowI?J_W3{)sj>g8RzU5ee7vu(XgX8t|xcuQ8+yP4cv!3 zCDfY-KaMNmf$d6Xd)sq6sxOv?@eOSL)RS)O7OABXcY3*QP@n~Bl;5{)f}*MMRh8=ZEKj%svxfZs77gH!;L;ve`dM=S%ObxnzW|GN@~w^Q z8J7CF1?# zI4?l&L&28GB}9?*2~TGJ-@G~9Ma_3}3K4b0!I-3;=LY@N&V!C~9Oxydp$1qa+mg(? zZoaIkA9eq{rh}3Q8)sEo%xjnrNA?FBgN(UZ6LRZQmb;$B)1-1Tl6Zps&kCKYw-HUL zPrX^IJZ`J`J-Mg{0(&b)_48Pg@rSs>|9nC6{V(}#eBGer#eSMHJ>AGdbfWJ-Y$t+M zD|CwGJE5WctrXAfnm%|}Ua(aw-H<-LEpq^?mGA6DJ6|0zq|;u6d-rr;e$r%}ve5Me zO+m^$A1@at0uOyXC2CB|sfE~flfd}Aw?-!Eq35ePpHxYwoTkAobs@Of&G!JboNR{? zBf(|XVid$P);x1uSJcB&w=@5S=5?GW0F!~~mo-22G#{_?ykz`xA0S_x_be5ZDF#{E zT2WOO(@K>vEAz~RL6Qz@Cu}dG(v+#~CW2geC!>;^mkVe-*-jNP+_sz^`)W;Q!#*qOPkp{hpE<6Y;oqN-5=bf%QZ#w+|4+S zqQYt(KJPXzkcB#!3Opgs|0Ky_;kp=TxI?%q7~rEV2!T18(Iz=XTJDN=W)e`2ujlU> zXBu60H~>ZwA95jbXE(GGaUa*ij5Iu_c-ZM6&-+BFkX2fcf}`PfMkCQyNShj}rq-~~ z=z=bUmuh#o)4q?`5Y;k)RHm$gLx#emO^+*nkAe`ho zYHTxsVw*R6oTY((qcZU*V!f0#I14TnhXLa7!6OPKZBZAxsoY;S3NDeG4Z?{E?d=X# zI7v2K)1pXTFgT4&$qoI7tG!a0AA)R}SLzr(rGNx>+d!E)@B>uJ-(i}}xGu(321)&A zW;qHbb7OOYpfKJ3o&S?LZFU`ME;{WC;cDKIS#M)NvQ=+3B!!T%OEv5C&l`Vu&AjK`&G9CYTfODqP z+g4BO-U%?)-08iI=Gn0Mh9O!}X1q#^CsUn4GW= z<^U~4F}51@i+V2CyG^OYrI}%4>&rU5eo`uWMM(ULiohmz)LkX}eTBzM>U~eD)dQTK zazwX}JpXl`=DKF`Vtz_HBZ7J84}>5l#Je!sXmoXZ*|x19tnW)TDh-B`SxIeMn&L%# zkr)Tf`OiVYp^+y0Dg>rggWogu z2RkP*=%x;nEuS~17a94rpPkHR$Si(7yRo$rXx6TqVq99poVd?Z7Yf$i(N&z69nZeV zCVwS^nEmC!h~^5a|23_c(yX0w)Vw?zowWOAykm!5~mC=KtIpdAet z$Mc~6W^1(m`oPuHpuy(K$%xw@yD1nOE^gW=+vABX-&_t&xjzYbRnA={4({XpZOT%U z>;!{fuU+ZX%{O#In#78U3T_%x)6)d24+M)<6sjgA|FvU^)RR(ah?Pz+#(}q+JQZe7 z418H_0qMQucGPXl6qkO3J=^^AW8t`rlgk#5q2EHQ$InC#R|Yz6BprwHwmROp`>QXV z*xE^-JFHc8p^-lEK*|K@O}{QeDDbN-^~O^eaqP_lNh7@iLGRO3udU86e~Dn1MRKa{ zYVBDxI4=;4dAB2=o>FC%w@U3*@r5_$KFHw4x=7cfK@`FjB5jb)E`pd@FYHs%jfmHe zZ%ClU{4B=LGjY`yoi@Q4lL?nIj}V6rggCS);tNEN4Rp^ zr)RD!cBDmVVe`a|Hj(ui`}o1xaQP&iMKAH$zI6!k*7bE(=k>g2SG(bh$LKfiXh;7v zrOhWaH~+;M9Zh)n{$JC9ifm|{D7oW}>v?I{B7>*M7c1mn})hOmHx zw(-=NP)7cu1EH9-WsIttFQep8iIN6n_8<8^0O0TUzMS4Qoj0PU8%rw}Nc_2h8*b&M z+M%YWg$6e}tP@%raK2#Z>Y5)dzXcc{&Ut?*T)HSQUv8!OZh-?21!(w1EhM)+1z!h=H{)W=U=ED z=0=7x&}J_j#Sa9xB0mVJIwTqS-G&0+f`!hUYil3SZ-5+_%PvsVUe5Ei1f2}oM5IKe zb6z<)yQh+Ux1-7DtF^M|Yf`~Zklbhj>eDiI!R2<4la#^;k$v5@{fG*{)NG9A3SBAEm z)x;GS_DQBOP2#sqC0>Y6w|jV>X;`p4c}-t2r@f^Rn%RHBtPlUJVhQxSxgy@Uxk?t= zBmbCD@!Ghcz7LjIw0lFLwh8*E`ZpHosH=D(J>G=MN|!(ddL%Ag=^}HP^ZTsnpSoV4 zd=sRopZwCXUYIVJd>-;@yIk^ClFo;iYgF!otwZ|rU;CM~@!JZY*!P#>yQK^J>tJ{MPwS%=e-KUPYTiy@ zV)k_FPlNUJh59^QWD-~WnKy+HiQ5-`%*zSFTdR1!ALZ1$uWeGyn$vB(63m)Pds}B~ zf%g@&1reyhY(sNVN-Yzp{e`HCS#_H}_8KQbYS41l*F=2!);%Z7KUtg@hm;@iH0WQ_ zFv;u0JfGv;)A4sB)CB1I-)%@m|9cNKWed(GSCi;46lanL&!|$F#G7j~Gj4SDDc%~p z{V*$^T!9#H3Cd}aH?GO*`k`3}DHT@lX*FJPrIL)jl0-a7^m6MN_903TYueN?*0j9S z#hl+-s?6Pjucc4i{4Zy$Vn78_*#P#)#KcQIJxNKDv1~))d=^+)lw`zfY&uyA2USUQ|FW{csL$c*Fn)~8l+s%6l+PqBMb+|l8f%Ip2UNREsDAvugU!ddm zs3_@`-tCy9hQ#HN*N%pcs`K;A{>P626OYC&e}7L1_d{I;k4a-?BF&l z@jJfE1S&ODaL+mZ?4{Nh!asTtJ3?6bR4(^>!xg-MHb3%b;jE!@z_Hld)VMOqZZcJD z5Y*6Ps&xXOS^m>;hO9K4^~N%qvx>I-yk6VD)JJmdxF6^H^J@(C__oDcW?HnEgBUD{ zs4m(Z;|fQeJ_>R>UKCicM z=O64uP=>=cZw70I`3Au^*US&3^=R5H&JSqC_9p2La6)I^@;s)U9-29>DYu#{QGNB* zcUcgy0LXc8u;h$&;KU#kQHK?W9sM$0e$;SLo=!aXtvWwpQeBzEC=`bFWG16T?DDgz zD{;|ClL-Ub_I)tHY9E49f(0E{Wv}a#>gdBoPKzhK&l7JD@$WGnOTxjEg`fOCwu-)} z78y$*XH1DliGWLTOCrBgI9S?n2B^3k-bp&pcZkUwUWboPOm6;ArlEA;9yGnU%Gz54 z3DzDcsxIGW;{+T1k@o&L4IekB&8pKKopASesunilu@MNvczvU@K5c<5w~zeg*7;?! z;6G-F+mG2u^bR2P>`w#bkL~+&J^bQmt*7{8T$Ax5?9mZjzy*K=ZW?QP-6Q|k&9@_@m%pmwh5K4V$&|Ie zsu7|`Z~Orp+QTW5hIir+%1pn_adx1kC-O|op?(D!9i;h?#ZxD%Mv=%$s3FNfOPlma zP;~n+mE-zZs5sJX+}i4)?ihO)Up2m?p6sT$$YRl7L*YAM0XH2V>JnG*3qy3DXs?yzY z&tmQpJ1}_jo$8>s2pJw3gcjq)oVEiA+uSS3(wsa?(pPc-GM6i&5PEX;m4mGL{H0r4b9$^ zB;Oj}TeWBiumcDX>w$Id;Ba-4zvEGxryB8wr~fNHjGaVrEsDBu2;6cS)x#1gEY$kL z)=(14mvQhGudq@n@xWbwLuIrojm;tk)z@*pVTcLai11Z2DsaQP;xtw6#Sr+P1l&j) z#^mRm2`tf`<_rr^;doNX+}|7SEva`eFM|)gSn-T;D9X4biyxbqoW8ib9{EFRt6h`D zV?|nT0k)FYTk-ou)0;Y4VdS|J@Wx&jp^HaH8S5>q3HF8QL}-Wj``Tw}8a8m7=d6-E z`%hb4vmC5dkFjztxUwJx^hwi9@yehKx1p}5Cr?1e`!3vDnaMUu7x4i^K`%5!;^z|1 zL9-rRB22>li^uqRf6>9HeGn*{GnP2kl z`6jH;RN`nky>-uCwp)eM27rl=r$YYwJxYL(e@1_+^m(oVfiMXi^NN2d?y# z5K5x)cc)$hN>v>y%$BfU2wI|@g4<$&-minOUF`>JHolL!o_8g^e4{4hF15B8 zWA9?q2W46d_33g`Euic3P~QfzA^zneQJ6&};c6WaxAm7WJr|poo97{7!d=Cr-phIvElx1%9;nd{^b$d zOTj2ci>fyI@GL1b#*2cJ;cB&#fUM&Ad0xQ8(VYS&3BPcq1RiD!G?#EO(ik7DI&Pzob)=^X4y$Wq(eJ;~jKE{+a$y$Nm_1)BW#>uR#l8g=Bw@2C>dn{Q zgKxZ_?<}u49d;|m=i0=b0hB`m_ad@p#$HX!jc>||>!AhyQ~$y1tfZ6K#Xbd_)q(Uz zIl~if_Wr5*fghg33R-U|v~RLkoBapvt{N#p&<{S&Xtvj=ClJ}q9I1pN^x8thtRT`g z2sP9`+7j=0I7Tr3&%Z#3aHJ)LAcY1gC7&0B|@)0O7Mc{*IJj;Q#@CAgc}IT46C@T%=z{8ePc0X_tP zs>_#n+H-X)Ixb5U(M(qS@pFUSRR}h(*^|{bJbpNVa0e9vg)P!VklHXw_+0kcwAkjj zVTd%je8pQsmKevF^6cG$t!K~7Q^wYq0iet8Ylbgj2Y}AN_?0j4l<#@ALNV*cuYwll zs6WrrGpm5Eo4=a{spS!`uw&!4%nIwDK*;0GTBrZ$Nbio^)&3H9mK4l(hxU^>KsH%# zLCG87qX+n^lw~*Kb)HHwt5xn;W9|x~;p;qKrO2qzoF_PwfoPMC2s+G;>n-1`zd8wR zGn);UDnyNzdk49ofdz^eTGmV$?4SSLBYB!F%R;tRj`0h0qO7=Fsjq6Hm6sT0*UWq_ zGON9_UdCKTQ}9n~m9*?Xxzpir;GWTiYNWz)hxfTLIotci-Ay#0>IDTfRJ=gwG=ql# z_^Rj$sdMibk;g~t^{le!7We;C;_DYguRnqzwu&KudWMxG>xQdWRDV4B5%xFw*UV#H&E;9~8%K+DPkk~sMQlDWyQ zf_7xERl=TW_8o=Ygr=P$@q(bvxLLuCTqaTZqU1G_uZ?(@>EdK}qxu-|l zDN?}3uphCSuIIN_X2$^&84ZLE+em(XpzxUZPjPI%v<1q(8YN`!1bk{qVLc z%K-yMi=xZQEX{VsiBU>-_R<~F7-8HL8;P}7wF=>md~4xzo3bxf4|j4F~DQFX`fF*y}YlT8`B zl$b%eQYvKJaSnt8(70Y%NQ$1OzE0Z@PO&1VX{RkTKNeaWqG3FzO~WfoW;7{NqQ+(T ziW%w%eh=C)Nh%Vp6#V^>xD;0Pa-%IjK`dkBGj$Fe9HfsGwny^)A(($tA8HzUmUmFp~a_;<&@)L6$lz|Q03y%B|Q+)gN zCYQf3bIhSia4A^NRUIUC5*i|nM$QG23|aaDnZV}NXwB@~1>g+}Czd3>${iQIy)v1D zSsf9wbd1ZOO>14HZ24TBN|Q-yKszW1yU?vX5unSOk8|Yfoax|N*+YmE62pmuWb1v# zSL`jCauQ*bv5Voh$!Ly=gD@+4!D{!7RRJ~ zAM6_ZX-Qiq-7-;FqU@TO6F%9+!~2U@ii#it&V!tuxtc0m(*LZ05oqJSQ@|hYfYO-9 zN5swTgKBJcIpaK5wZHzi*VRZrkbwT0i}^mt2n%N02kK@H1X{L&EoS{`-wtSB6hC_7 zIJv7JDS@bczl%eu9D-VF)#|cC&q@L=fClTKH#hz*^a(kT!e6&jJ4_&vt-!*>y?X;B zWaoaOM2*Kopa^imyo`HhHj8iJzJ31!UH*TC!+)Wl7x1lA8gm)HVd_Or88#=uO5TH& z)3=nb#yPZXkD$&q>ST}Uhc z7L3v+q7n#nQWCg{=~j7e$s?)>MkeKT)4(+0)V4Shda_;(!!0f0( zy?VY)>~?x9xw)9+w_Fad{UX=RLNAMZc;x>=(`em(_L$W9IxT4rfG!5OfZy-M<@R-R zmjp-O`A?4&Jikjy>q?>SYGgcHu)N_$F?xCnl@(TS}Kd`@r+~> z2>D+;@9_}`uo>%YF!7Hw+Wl=BEu5d!sN3mc;lFz>Ep@j0GjKYQ&xtA?o-Z|kp43AM z{@(t|?tM266v-xnW;K;`|KJXPUy6V1Q_vmDD7*%eMzX45v%oXZI%bJ6+fnd|VzE^j zWw`e$YZ~0Uy;|ck8`_UQ+WKDZXK)->>9+r;D>4<|W(ZejLYw_tRWo=t??HO0AALAq zE(vP0i5Dhm5q1XBDE-T8G;NIxMbQ|s zArJ+;!a{@RvoOgnE_9hQKz?Xxdg@l4Q) zaBo%As#WH-W_0LS&qje-6-k#rl7DlomG;1Df+x8!%kcRFhDbUt!#>NaL|>p#J$o8s zfij)(Fdmt(2Y0E{8vAY>XNA{N#knb`mcFJ~+jNhIkv+pV8(dgbAKOUWKAEo*()evH z`fX+Su5sadAr@~!D|zGPZ|D~@zvc3)qngADxL193mrLq?cxqU1)p@Y+7sfSk+DHJQ&0PT(G8d?u|kO7T{R0mvgj`xL-*>gPNO_6P2 zI~OhBt_z!$^2&?XUq1I<@;9mA*G5SJX|O62j~jW$=%V? z;J(A@sM9F>RTJv77t>Lt|ryy@`Ihi^d2gGh`z4#;^a*Rwq;GJlb&305}T2befgH1d== zK6&8=F4)a2nqzlm7GaF|>xrmvfK^q-?_``hX})!Gj6corEGDw88hFjc!zqR!UhISX z@CMxZ?f*svBS=KF zR{g4HVxCU?TGdWTMv^bN<$vzdoutHi-v2Yun59EQPEoU6FXSz9FNRGOpUmeiE^`OxI_Ql6XJ)rMS8&#fd_ zZ#+)ugl~W(%p!SI>G}2bEBZ&G(cr5W^9=0H)}yJDP!VPh;^%jiMD$Z74-U6RL?eBh z^U&?Ik;fGliIeE%T1lcE-Fc_Ba1432j=d?cD5-B|l9jdCRcxFLi9Zf15ut|g#rf3? zyG@hhkWS1q6d2S0Ko+Lhy7S$}Xmyrl!&*zRHdLB}AYnaYL&@G>R7hATgc8nX)&i+I zRwVaNk2!`%VOQU{Hr|^anL}xLeC%`Y{aFs#U7qUj1>MrigE(sIikq~a4LO;O-}XsM zz1Y{V=n|CZx5l3fzh#Bb+S}@HwMzE>7J1#ohD6coz8@ZDCzOvfUsV*R5)e@I(2uSQ z5e~n133%+yy^<5lvMj8Y)wiB&4^Eg(?H>8+3WE!h4TH}f)M{-DqrSSk83Vo9@w}Yf z7p@ua22yVE5uszW1Q!4ZxYatjVdMHs4;1!JOGs7Cne@ddSW_Y=tuy4`bugZyK_Bq2A{IV(2vbVRbE1Y($w+dy{^BZ0o@?IECioXcu$|Go`Qq&wwz@N4nHcU8 z<`;A~$D|iBRSn@QQ)pp815bEkNgnxErLg|EwWo?rmf4ml;{41j1JT1au2>OlZ?&+6 zD!yrgd#t)3aa#Uo6$zh-Db!mzxRUpDVVjDjblMOPsZ9DEInPZ8?Tw}R!Z=l&#@5JR zr(swPY6xy{L!bRAeWvONGtYYT*E-Sq6wzOA5is>Umh5j8U&~ZOpUpp(Uu|ttal|0)Ile?;uaFegCe42Un&5otz8>+UaN5LlGQY z=VPybrCvam9@#?<**$fj!Ovw5TshK&bMfrCa?+aZ!|GRe8G|U!Zr@w*MsdLV{F>M9Ou1#;<;2ErT3zZVYe6PpuSw?Hgmqily z$C(MAZ6AdyCg{rh);gBtE231zxLYKx$RdgMLUhG`XC@*L6^j^fr%vo{6{b`6MMJ@rI z9~Y?IACwPb<+`xNVDJ07^A>9OKMoOz57O14_4+19j~&)Gw++{Sg6>Ty9Q@C~QxpA* z;wyKPR;>CRU4aKru8ylHN}Kl93t?9%3Kn`+F_J!GfS+(e7qVOR=$YW>4A=8;|9(Ts z;!GU!M}gilyz%LhQ6j0gtum%nPKb1}$&!!~748L=|BqWHkO#eAfJk$rWA=h2reb(@e<8*RPc7PajMYyHJjVTZIv*XXjv`st(M&9QIpU&G1s z{3z#)ClVpU0JzldA-?WBJ5t3R+QIzx*U12M)4ER1zl>xsIs!vH@mfae1-JGTr80U4 zP$M1nMWyWyG4oaz_JF)tgA1~wTjMm-W<94^@95JObvanP@jj$FJ`~y8`Dw;OYM&Rg zD_Ud4u2Mhwm*3hIA=OYNU^HPsJ56NvpTGLc?y^YAzc_p=Jw{brn%W#ByAz9fcCLCt zZcAW-APM0UckuSii{K`tqk`J3yx{1Uw4HT657!!fp|eh#^W-0TdlAQo9MbGxFzsG> zpX|ef3dSXzSzFo_^c@J5YTg zBKxH{S_lE?jyWAO_rO0<5S_&FBQu6r$@kSWoIJ9R#d=F?%cdCHZo1v9Q;iW+!lzvYl|-rCM}il=(zurD={4 zLUOUs)qZ7PzDVkEb?b?|m0cVFMV^fTy#S56@%+o>RKH6b-9#_4vVcrm5CzFg-E6;@ zS$jgeE?cD7;;7zG6c>UZQHRs-)!a>lfPCNOaSpA;9?X=MOQ0RuAMdjKHI^T3dL(~fZ?9#5qIu|@6ZR9Ip9 zL>tmR-WgBq-4KFtD$RyhZtScmU`mQ@m9G%`Ln$)~*-+>Jl{RYp* zy?t%i1J{IyJR1jw37cg7fJJ!yStOxxxNK@+qy%N(t#-4sA4STVxxU7I9zq&UTU*9T z&)gM58U~Xlzu9>C6WsYYZq8vvpBQ21j0zDOWxn1zf;PS^*FP%Z&-xkAO@`kx!SyS| z#%}xhG_J1wN@$Fv!wR3kcU&jCb36K&(CWXRnvsZk&ZI9oTV$gDRvD99B%3gGanMqM ze`gaxZtOu9fs__lQmtwDf(QIsXa933mbZ66&e+@xNI~U~@q-w`!&;;0c;YxrKkJ8+=!i4lVHi5np>oYWtXaEc5 zyWV;#XUqQ1>mU^xddu&hm?ED_v(Ufy4*wD%`-Jf;xq}SOyC7D&og`}x1<4b(egiG$ z`L{z->uwSyW;xgAG^e?I))6W@a8Y7e8xMbb+JY0lumEODfbP*kvuk@aDPQ}Nx^ybs z&miJBj6+kOKRhboR!hVby*W{zjsGJRvME#ur0R9bw+zDUdR$n6*4KgStePqQq zWS0|AWYe#;Vm-w5y>E(fjQV`7Yx@vg+N$~Wm(i*J#K}vSI+>&Vmnouh5$d%Bu) zvAQv5i09$@AjOKe>%g<|PfprX+sipYIY!OE%T}7jZZrQvU@_zkmjsZ}=!pO=k$j+r zzxB7$BGT!47mrI#1zc>H?O>?ZxJ1{JA+Jg9os;;-fD0Z)^*I~aixv&iN4`apruz}m z*z>4lwT!QLuu32Qeh#lVw{ku~Q(NNOIezg3V!EO7^|f%-TR(TIl}l{O72Io%QPgLt zB2$dh!a4j$A5p$|eoAfq5;aHp7y<~`Sax+&%-DL=Mh)?Nv6Q4_U-+EDrCPv;T;{Aw z{7`U&^MNhZ-o9~fS{w~%M{tF0SS;(YN^`uW59NNo&{oKn-H4lhiAzVaCLVHjQA=w0>@Q;US)GIQlDbdLz$ek)@Y z7KI6)vV`(6JKTX-N-o9<6XYt)%2{hCViY7<#mfWM{}u9B8WUDQW+T=GsaB5CaA?F1 zb@E#(dfR6_@Io6a6IXS)1x;2#5G^O+m#%X_Mjcp}L}I220*n{T6dW4CdkB(C3EObvJZRwJ~BBLgw<`;QS88Rt_^A-D6wAb(|X6i zYa*_+k_KcA%g7_(i>C&e3u1br`5B@gK{R+=!sF+N(&oD2Ylq*$?H$NI0l*F%K6KEA zI+ZNIf|_*F{R`KLC10eA#i(tpy<8X)vF{a*!hDWX-cXy)jzY{k_KhdmL@|roV2O2M zoL30ag$=-Lylg92v%x7y5>^FjA9A=G>F$h29~u_NX+3v^&4Tvzwe^{OO}Arc#nunC z?*n14-~vo*;n9Z9oWr-A?dUUu1oRm>AKwzKghl(RjhXM{a$F(6@0P1=v!UTjfW@me z!nTJpCxxux!IJ1F1Av@R6n@t?1Dc@5V)eAAdM>x)iYRM85yytqzW9T4J>RVb`%tP? zuXNML%ZgAY`Q+X#NciHM{bo$YiY{y^?;@xvnd3OJ4c=*;bfc8!K`K$`kN4I7@ko(V zj7|RpMFt`?8Gs5Yida(DXlQBJ5@eh<)?A*t-xUmaqz?H^wg&E23w>JNixh;keITvE z@c7(ZYJDVxRP=6>nyjRS-0^eduNlo3iM^-x2|9^|$9oRKK~Ib5VI<>Weyhfg% z=>GvvHJ0ivT<458YVRbn<{_FKqe}*DsR9biU}hcF1f`8BFKWRj7krWMLw6Sxvz>G_ z!&zd;8c{JhRxR$kZUk9eM?bv|b=d2$TufVs`t{9Wb@`bGVz|SrHYMxdm`kTGJ@%1F zql=cp!0wWHZ>2aXM^evmXYQpvX&?)k!X^sOSXAa5FZq3r(uPMUZUsdkhDa~bP2{1s zJe;{ApGU7&lHsmGvQSgbft2FD-CT+a_r^6ixASEqxqH#tAD$aednnyVK_ipt;OrCM zG=rVNTkGF`b7P3w_H#t=ju@bclH?T7S_!5tgUPLBQ|QGfT&>7(b7{Ir!T$EP+*Dam zZ6k-8dt}zQ{}9c(0BQ2NeS?K(3;p_E&WH$xXiB3GP)WWLOh^+A+B-%RWw%s4c3?>U zB6V3taB(qqEv37>(%Bvuv#|*-=FcW(ckLs*e;N`y9hB2(j)C-2T}_ z*K3DF`%{FkH2i#T%oAs$s)00K@xMJv0p*~TMzz_mQdEBLF2gatG~^e z`O5J6LgCoR;dXWKNyVWlZb3g%N;8x>czk0}v$iuCBkvht+?R}oiK74deBH5hKbbGF za;?;-eGKw5LF}fmFW4TZo+~CgIr^Oa`(l1D@oMU!7@c{5@7(~y-J4r9Z0pRcjG>5E z7o!ulG*nHsfmnpniA)hoKw7Vz+o6^aU7Ky>zbp9Q<`bQ98^UaHTxF0b4P0tUwj~=Y z37pM|`7sZ+uDc%f*>=13I{Mxs5db*A%6R*=#z(V8Bd!mTR&F+53@4EFZ+_oFsdj>$ zE4Ws_XKr77_|2v%1N`^%6kE)O8HlV|#z8~}hWo6;&MNafLEF2S0q;C(GFgZ^y@pQI ztLeAkfaXIQ6x31*aef@VjdFoo7xYqvqJbb1n9CXU9(g@%8)Ruj(n4XbivN8`C8lX@ zh81t<&GeP@86K%m+(c&f>0H(A*fnT8z>FeD6rZwtw8bu2m_XNKsWRLBn`JYX6OQDablccC%#aIsv_p!~`e1sp6WVNmTiIKbBuO>s>q^rm@W zjqYf$y4N3!!c+i?i$Qoc<*w~ukJmfm+2pw{EzIXzf0g6}j<2&;W~+lml~w1`rpM{f zUjvY!NiZ%wjpCv-c>QsvD)QnZ zxcC|TR(#iw*H!6!anEG9k!+rB(zjiN9-OlAmGc92D)4Yz(%q1v&~;6ISlm2Ufs@UW z(AJc1LFYp`m{hl+o3g~$GxrUqpA!Ehymq=Yy;j%OpYUe9Je8)!=De=grMgBCpA6p_ zhQFuIRN0%a0_@g>GGpigHjq5Cg>ku1Bx3#-qIL_Sj#K=_+xg)}*QIh%F6f-DH)@Wq z-Nj;N06SrJLkHvjM_x{U=Wfl}@ObsfSFf$gev0zNa}f<2w7r}cd$rS0pY)Qazkt!N zsvydBUZ2K4$gc`$9bL7nTh-Nz;FSjXN1Yp-JbK9w%nU;GJzgy8S{Z|Ai;S1}oNi6i zAQne(SENGmS@xTrU4s+EKtV7#P78*9UEzl>h-s6%LQ4tO>KbabnDv1~w8O~X1>7o; zfuw$@1p-oGE2TauZX@#Dj&0PykEB0aLfRBj-GSoozw09R)U$eIO7NANNW37NbAX@^ z%esP1>Z^K2!>hPO-#Cx+PV4G<)WlyMhOH1N@I=-`wz?o>xb94TUUkyrQwdEgR)`Br z=Kxa*yFgo2^s9>KVaw$AMIX7*2~iz>Zbc8s8|U>ZFT+V;arE0Lzq%1twMUiDU_K6l z%QI8p!GGyKzc59S7DW>sm?iF9f1x7z-R<^<&tH(bm6}4SLh?DR5VO{6Gwyz!-m_a< zi;u-Q@4Npa2^AU>JLMETWpWbJE{>ON;%)amxpl7|$t+&JyR_`Y-=q#*vkmeJVQLp)YW3nB z)KAsTUsnkkiTf-z$$aRJ>#$1f-)gFkRP0>4bQMaYCcbEak}+WFFhmcVOYD9(SMYHy zJs<|*bO7bzxY(ugIorf>u6Gmcs-6}^Ydv+WlOcwSL8WERV^ZqTJhC(%Q3O*ymr zo#5!&Iho`)R@38&RU5x@h$}OxP@^6+ccv1;w|EfZQ8*OUO%0W^>gRgyS%TJV#q{jf ztLXX#E7fapLZLQBoHJFi%t3y(aIyIJW=g3#r5{1A zyT-IetbZs#_rmw5U$cPH+%M;Xq12PNx^oap9C@0ma)L1~Lii=3jZsQ&k+a!*>ER}SO8SGWCQXB%v+i|`d6~>@E zV20|AUTia9MU=zhZ+K+=_1wkv=(uIEunJNos0e)tw58MaD4x>LT5M}5pd;LB-|Ucg z9Q8_RP2-BeK>Q3-(GtPPTm##NV!pCm#1$qdNN4S27sG+egbyc<@todQy@w88s;>3N z{4uBLjR|zwn%rEwa?^A$?=ebl_i8=3g+>EQr;~Ay%dr_g7v0Ebgic{c0TVUVN6XG4 zJ+2x3r+@Uj4@THj`La&zlSS;4sH^^MHh;!P+YXx(q1tQAfG(Lyg#D8FX|lIQ3WvCC z{-UG*T#8Hmmj5=Wl~V$6qbcBEVnk&cMJuBi+a2{QJ^S{)3yYXq(t@hDFT&%V;?%DZ z0_Wb(8P(_QEJ+->2xnemFkWCfMpsi)g!gA3t~_Hj(Ggyl^5UVX+HlYjO5amt*3AUO z?=WDt!$liY>xnlWcfRWhVYdDzVWGQC@4fgM#Mk;+--aIRpmVzXKOpT=fps1ds5OOh zpBXSGE$D2$A>dSO(_Bdri0JPC2jW?6+rh<)r1=1phqQ7n+Z;<|sJra`(3l@et3eOm zu_Y2lDTH$mVu-@1`_>})bT8z3hVu_X*K_Z$DwVPp!^&ENH7o;oiUcXoy1%O?h{~BW z_WsKt1fKN1ZoUVKM?PY)UPu6V@yuM8)+(l*Fca zNyO}im{(Ma2Q*!>(Q?+YWSfqB;a4$5H{1X+yg`EVFn8#9;}j!_jiPPA{1Qu0C{A zBecmEtk_3`KBDq`e~BZGp7F<`Jte2agf$LKiU;`N08?v2?lYDl&_#V`mE&ekMs&&} zm>g_%YIgnBSCZ28@cmU&Cb{58Ek}+3;WtFHAirT@!V$EvC4<^#3?s1MbuctLxu0D4 zlySht89ndE!fYC6#=0#{s`MQDsw#7HBC6XFvVqNJGs`{Y(#B)HDy8_gH`tVHZy170 z*6Ehk?BN6!P_7glC;(wADKb<@I%VATRhV*3@cQ36>av#U-#1t({0`55*0qkOw-dL8 zCkBTX1D@+$rjyLsz2LnfaDqS;00A&eZl+&5Z#KsG>An8UI)mIVEs9+E^m5CqpNWvW zdUIt1_wAe*kh|B%)63zcNabiDnjzLxeoz;@rUp<10!sE7RR!FkmjBBx=kPecw=ge|*;S^hD<_Izc#~sng+IxWhR?7?6%&vccpD z3@F=FS-$1|vvOMM_mn?rZZv;=^4rSkAzi-Og>hFjL^T-oB?Eh^&##0}sku>#p1=|c zeQFBhPKmp=&$==qdA04?mrk~jKl!a|f6&16^ht+eh^J%dKc}Z@q@musmHsJH`GPXO zuI-Dgo*U&B&CR+$N=weCZzRvt+)X4hPgc%tPy)=Su6x0YFPWo;xtCrC-c>91!}W0c zR$b4;8s<>(`|-*b;m>FUm#_QaB>wDm@ZFB9^Lf^-LY66U(V(|)Wca5RfzZRv=aGVv z#r79qMeK1bRZ1-j?f-*&5dHm3T6SX`io2wU@Z+%4o;M6Boi_0wiFa+V~}wwD*2TE6>m(}L6e*Z#Cl3zd=0GQpuCqN>mmv;oGIWWG&X5i_43 z3vI%=2Y5VkPaRT3Fgq7deVl(RxIEs#Pb{9+*(#YYr-zRKp%XDl%^miN3#{aKhaOIr zxKp3CCvfEgPyh)1(7cj6VKkzsppl9(B2(MaLB8!{J z(1FzL$p}ixJWICZ)U)Z-t28e5Spt>Mqq2~dFPL3B=dJ)E6TLI*%M+xCT~9s>d)S`* z?g#l@_=QMn!)1~*q+_WBA$SM2g)FZ^%WUoTCp&k2^;G*JzUzCNFifc{`u=TQ14Vhe zGz=Np6g@s-7WWAwnsddihTbo|i5m@lC?~(zXG&R{(lzQ92Nn5xq2-|smgcVzlm|f3 zQr&Tt|AM3dY1@T`O3-5j5=;cm?4Olv{P~F9z0i@IJYTUS5)l365dFGWTckxgvg@Um zMtz*``k}{qd8;Ou1@-E)G5t4!GBO04fdsJh{mX}+IlO(|c3)hauY;pSy68an2;4}H z{1c~7TH18a7)avf!~u1UR&!-~Xv%u$)hGza!W(XKr-_(HFHH~7mln$yOI_(bir@oO_D-npkN3t!P&Z0s(9|Oe zHN1cSiqW-%yvaz{r%P~EKE~~?=$6rxQo;E;z%Ra3p?aQ;RUfIinYIlUi8=bq)rXuH zyYdR&vxZ#kcYL&cadezhd>pu)oX{b9-F{10fTcq_<8Xq>6`A}nF^vWtD`&4GcKISM z{?#kr^8vey?(!h6_|&@sS(Cnl4c?0x5n#>Op_|0pO62rL_VO&lc!BC!bX3GYlcp)O z(h5!Bw{&G|aiMM%_J+qvYPKYA6j}Vcb_f6ai|#B2?YtyjZn5_~I7|dB^Y0le%f9@Y zP3NzT)<5@XS&gKyBM2A0s?rf~Kct}a?-#OtntUl}xkg@wF0|3WPDZnWv&lJRBg^f- zTJV}#nCljw%E5Ho^o`qJ$EI;bvxDE{s7s6P_?v}6$!-PS@j3cY_L(_+$6C# zc44Pe8%s)+-x857Z|;`AJOE*&q#uRP;Zy4L7fe(%n|Hn58!j)1OQLlSGhdR5?YaF9 zb$n~3c%q7Z^=U>rC_or4Uo;j+sVF>eRu{(jdDqp#i2ax;E-)d#*#ckKInga2Ym|cS41nL{pnIgaf6!kPb3(6gFy*LQz=-bB?-{;nx`kjXA;r_j`%SLG zz3}EgQf5zG ztqJ)JQUv8qo6lqWn%HI_Q}5;Ju2)Lx{#S-c2SObZ7}dt&zIuQLJ~rcbR1IgeBvH|E zN_v(Zt8z#>>wA0(57h&wvpFeu?5X=i<-|F&a6MZuSyL`@3?wDS{p7#Yh}o}*_s(zW z`3)83k#am&B~qppj=xDiJ9`mRE&9S7=-c40C03Q{iRit|ivSLongx`bec68KSC*82-Z*{Ml zsyO^}@`I+(nV6ZHo2;8;y@gFi-DcZecY!(1qH31vBVX)L-P&;h7T_Xbgl3RL0bM8- zBvxj16>rh>Hw z?YUcRjvk9R#Jr5l=L!*fw$N5qd4Yudsa{5oNc1jX2S|dk)+z`KbA|o>0wP%GX4)Mo zz|J0A>^>HNO5+qxl-N&Kh|p^jdW2z*b5e-G1d9Tf_&y~oYtL^BZ3&6Es}fnknn03M zYeNp&p?U|C5g;m8kGfD#&m**K8a0HmTN5TVUd*-{If0m6E?;+AjvR!<3crQS-FSUVk!P|M#Ioq?Cu7lZ6o`=!Pm zv&P#?f0c!FCgshyQ52HVzUsuD&=cV;9^ZwX=bCWT;FTuNTu3e~!kXy$8Nq&nT`=rfU z%F6LE;K9(@m}Gw`?RjjUCy5Tj{|MrLWIO0<`j@3&3hAmLKZsw+g@W)te@J5@AC;Fs zecS{bP|Wr%rMqq22Al;1TCvje>}NCc?7InixrZ{~g+0q-xbn=JC*CHIQ26^ry7H04 zucXeGUYpa1WbOm1j$il7ElT~Y)}~v6LfD7L z3~~xkrP6_On)#U&g109ND(4J=N6Q2+ck{$Xx7-sspP%>(Of(DFi$%(GF{!LA$!4Su^LBp@D}XA-KV!*ao2hqD;-pYFsgQR z8M09=J@`~Ttlh-K-S;QEHPabWe@rZL@WdZ#bWs;ec|~Vjaxuw?DsQUhtUD-%>ItsL zn8kRSU5Krs0(RRad0p4BSDzdO89J*+Tb$tLGH@;>k=Tw|$&$i2`w7-wq~z9CzVg#N zOwwKuH;nPVC7p|m$Y?}Vqyu{UGbi<&GZ%;5u-!$PnVeZ!Q}l-2vx=L$E2L6@_y$mZ zxuqzL^5E#~eJeE%p(+0S0+#Wv`N<)RMu9Pi*vuyutB$JLrk_5w9k2O0VeL<|GrOw? zW5nWnI(*P-6Xjax%AaPqHlQts-Vk#;E+1_j&bsMk8PEl6SBAn-+8-J;#MmNQ$JKBc9!w{wKb|P8{m+$oER~IeARi^(-Vh_EwmLw6;CA z!%DJ_u7+AW<5cq_-Ch`p>4v>#u3$^TgEsw+cYMa6!^b*DY!YXb%W-TJZdPOn&B_Pg+{jA>3dn5eqY)YU$ zFzGMF%Ntc(>zWSm@hHEY5NV}`0zr~N!M<}|HmDe%uG9xh0r?Q|^2L&46K-G3MB(3v zI{ZIcqv1+fC606&LO5|yr5}U_Gw7wWTWtj7B0x~kk`nX_il(|Ays%psVMfi-i6|wL zVC+0dV7(RdPos`^))$`*l@d%(@*mKTBT+%0R?mX0mARYN7 zXv*)|g3c37@t@%MVE#yMf^&qfQu2-a`xmkJqfB%?L|F#@(e@9}{|p=-IYLPh-)Q+d z^$7*&0-&-=0VG9i1tqkp78sJxGHj zr>avX*MRL*Kt}I@1_Z!6u}N#Y@Qiv6BUT@e?wH8%vG5Jn{RG|@f4E(gvfD8~H+8Dz z=WRmJxS#Xy`hSAeTFTmuscrDvE)$ed{$BV|Wf_R;e*{!|SYn^@cRH#z8@O-^Nnw>u z!yTN8t7xXE1>7((RLPwhJtC95FQkr9;jng|wxm^GDf=t?;=JKKP2gmuHmQvApp zmk>;RqvaPAZd~~Go!O<>2NS%i(PjDsC`h{9;V`OjUm>{aNMaOu=D;R9yMf0=vY(W^ ze0tHOBCx@s={xS|BL+@Bkpmy|n~)7#7d#6*57Uq|sz;63r#5{V8H`-tKBCYwqQY{{j5=Z`h8>|xm9Yo^Uw&kH%n=AhXxo`u&@Qop^Rc}=? z0fYdZ%~>jar2Q476SVGJE^CTvO!#3QW899_KzfQ&acOCTm7vzA0&ym-ToHuhb9&}5~j{xb2 zG$$ivSvVq&PTWgqX3``=aUKmgi8}{EormkgjudnvXv#^Z07#BP^u6d+q3UxO#l5T_Q3=I5$OR zwRPWZi@a4--4kua+wxEFgAekRAtluV>C}uetLsU*{)4+(bP*iJ0frZQ&)_{r ztvOnnko4KGIp#T+tKEB)RX2tDN6=}YX9(5(M;daMS zlG>bltO18wN@2z_L>DE@d>T-Ol~X;=hDdc*D45QrhrmOgnU`E^I8Tb>C(LJY9ssqh ziQ@mH`y>~%Ve6bV%?jxtMz*w8kz47o|K!7a(nrz5l9{2{K$DiCO3c_S$=o4@^n<_@ zQEuU9#O>@PndF}rOzaG2Nds-^q=7ePw8KM1OHJSNTQHpxN9GR!dPNq@R>5`@fpp`J z6k;b<6C$Ny2LgeaATOneiOm?rFo{LP>Cm{ArW&=8~8}U{kJ&R=!}A; ztnozi+?am3U;=b-S<-I0UIufxE}{UL+|H`bRpwS}Qiua=_>z|dmK>mqNs1dEa*Q9E z247JLh46WYJWJ(&i!O=s?^8f=T!cpiS2H(E=48C@QrV#`T!?1(PZ6C}jx63qaBTF) zpXYM}3GTjCX=l0@UK})i<~5E!5!9f2>@QT`u1z|AyJq1yO?a>l1?Y4|$m>W^w4BJt zO0rTJNbqC<=C$#Qs8?JZWK>4L1B(?=e~2TZsF6hROA?ehxS3$Qqvq@0yX?N{;T3Ok zpEJAMa`gt{^7$U!wDrB|&*vMT?gr{u$W3F!Yo?4)Y}@w^n?_cdfM?w2xtcO1a6xY) zm3$Mz-ov0@Sem5eTregI4l0g*2u^4f?BWBu};?#0W1bV>7{Qr9L zX){U;4_{#n%?lj+UzG+b7vZn)1ebGaU{Q2L0U#30HI(ooYAetf8T9)zhUD#PmqLC<0j0U;8Ge>bHtm#TTBL&mDVPL$?HT z>j-Hn`hG#p-v>b_D_i>uJ8lWZ)|z8h)4ArTOzM#b1!}iXWA=fromgpSV?{eMyEi}v zuZ~EC^WvWMmwG+dfuv9A1qyL8$wbjnCyHTnx0|THHYVi{ZoSNt|58(sDSwbA07lKUuNS}H& zr3unDHIt!I=y4EkLYV^Y)u^4l{=@{P5JlUy@i6QpiE*Z>zLE|;x=%`|cv&{w(`t?D zhJJ6;@06d@)uSI)xfT2PK@?<Q{V*xS{(fF&RfIp5v)-edB5k6^&ck(w;nvq_o)Zc=XbuSf~kXs>e(tdTI= zEsMJmc-(>5*;cyQI|+@JQ1?Uc8Fqha&`JpJ4G4BwlC>-+r%yod!$s!k9Lk$0Mjnw@ z;2cLauyuy5o5xjywup)ViWR$V>+m}jp>f+pJ7+twP7qZzSp|~GvS}CnkFih$+`GkM zn4vFVqXpr%4zD)Jp1xAoHWC2=^#<8!aVL%oFBqC$hUe!w!$yKIHr%=`*4mQPRXeX$t?8nucpD=ScytC!T2dj}LZ2Y03?{9f4?NI& z<`}6LE5r^*N4~c4Q)Z-Hqp1jqbpE8p-e-e(I&n%{Vb!revjJEq+WeJ~`1h3REM{s= zL%4R$3*M9iw{PYZqpVk-kxA8SeHPt+G?5)!=@16#R(r9@!E_DC$LSe?xqusXk#ddn z?o3ycBXi2-VOQHI^F(uJ{+yo5DXA)F=$LXG~%q!vN9Ba2ZR( zo3H&}31zy52h}v&%%-z@#0OsakODgaj}x|wcKtyp-`X3~Y+0w2KbSO&`ELL@XyJCK z|DJz1*$Hoe=6>WaD%8!t9nQ?SvY$@&i_=0C-L``ryl}X~ztHm8aCNxx#G0thk<@g5 zoavoV_fb-AICELop}PZY-(9bI;f$|92JvP2OTq))aOmvRpzwV}=J_ zr?B2pCkI|~6y-3F;U}s>auC$D8)~tI~$M_#MDjfeLHtN$ZA_f z%NZY_p*eaJ{NuDUQ6(R}HSf+voL|s>p82!=!=_cXwVwoO1tUt+On;oDtY zPYr%zb8V#V0d35ABb;d`CkCx9>F5am=WSF8VJHbbcQXtH0CKye1?s@Z(A&GZreW`XY#>xhn5EguU+k1eTci4H1jr)C~Kh$ z(_U}X+nBJ=!u+_MH92EZ9U#ea8DrN(^u~pk@rRIN^k*A=O`&3uPpevyiDTxXK*_j^ zW`-i0AR?|M8 zV6d^_Fq-IZh7})dTn^Jw+2#_(fR<>8(!Gg8*USAD4JJOph5vFpBne8qgN{-T|LiNK zWJY9q*l}_tTQ&!rFs4GQsEa|2GNdJb>9Rqj-yfp$i1kj)?w9YRF5Eqs4K--iKf2X4 zTydftj&)$f=pj`*@{F$kAnZVi44zwlmXW}Ayzh@wQnWLv!i`_|NTq6E6}AUdH~uP1 z_tuI44OCEaVSSN*t{vUZb&PKPI2`|iHM^i^va89QEb{n*V*7r_;G+Ae!=Zcea`ipj z}-!t1G<==iYlaF&;5pb1{ngXYU&$xIKKY7QfvR*7L5dv#OStV4yEX?fI` zIknF@9#3B(U-=MtN3+z;1wCCXm=cwEgtW%>g;qJpIPHehuh49PFe)+&votqhJ26eE8yK<>HWvtWKhht^D50YQ-U-&uufnqHA?_K|?w zhA#Dl(T72Q22m~7&5IZ)Ly|hj}$#0WeiE{lxvBe~N z8|B(gMx63`nIyK*J;+frDg!o>y78vEUhax#5da$NTx!@=%@`j3$}69CFT`O1BPFpV z4d<_AN4r6)+iamA@)A6%L;i^rP~Lbo=VVdMZQ$nJ-8Tar^y`3fw0k>wjp;Wf5b@}I zcJx634jDnWfT<|}td!T*LdS~*k&sd_l&Eo6H9fnS1M$w;#slz%LI*qUWMhmmCsyQ1DTcL z`4AgiK@%Qo;M$nEWpN_c-41Q-G{_WMx#Q1CBwB7 z%bf=wTk>Vn7X?i3vzUC?zt`cWmlH!%I_=|!RKR&XvNEh_K6wtautnkisN3xLly_IN zAs_1=QZiXdW`7ku6J2xLJ~Ywki{p*3`{IQKp2WHJ40i2=H$5~?BELbhf%_!%wWq_W zPWK~BMMCCv;^CjfTCTxVMDp@ijB-9+(6VkWh5?O5^PyKr>fGnc!-IWtx3zCCOwU)4 zU1opPIj>W*)FOUc(du@Cco{=YpA=_KxNV6b2zOG z(9--%Bltu6mT?R`p|Xn3ivs_ssab4&UCczSeD`XtR!4iW%;y}e0+a6#7zByTIHN2+ zLZ}gx$+Xh<`D|2)Myil8yIb6Qrr(p}+%@z%m0fIv_wrhf;PEc&dj9F`IHFmz@00#; z@rYGb*v+7xv@e9Jc-cLxsKH9Ya31B8?0 zUY-OpuYV~}sSDnua=BI=1Dpeq566w&4$edmHXR#?7)N2$Uu#DvK`kq5rk_Gq`KbFR zF7MwQZ71)f6IXKid8of*0&5nrh1@klehVxY`yX>KTGu?nP{dVlQm~C3Z>VGS9R~-Q z+dVJ&b+Obc_l=ESq@92b-_3hp{0rOa1w^;wJ`3oU-nD)W16@MM8m=MHfDDOgeZjhE zu%Mw9q0fTPtcv(O#AmHeFO!RPTeSarGqx3ft3NItj2&ko9J^7?$}6`PMxXwxH= z_SL|>!e@psqVd1*+V_%%4LUyYd4}wv)xRG#s>{!Er!9SnX%;INpB=8^8_UScdx$PtQEm}cll#M*;rQIB|ygXrkKCU$R z(VT>}XZ}ls4a=<4J2*=?-0pc+uKLtCWvu&~3qtEDIvCv4BcMm)NvVMN5zeS<`@=xl zu#66nAc6)Wh#t3KG@r$BkAXcn9e-J|yB+W7Snk3}zb7;_;}~-E|NfkwIf48sbTy6s z6ffPX{_qXRN!8*d~$r2b^*iGmA`qKOPAi)al@9snaN3@t7QBa5$WP*b?imZff7s zB-JbfayFdZ$gEivJDKmKJ-r(gkN)b8w7NkD9{b&{Ky#ja zi{^F=z>b8mv-I1Rh(~5Qi+5%N$^sH(B-(obMGO5}`d~Lx6B3fbiYNTWYpF(C9)-=< zgue}snk8FViYj@km0w8!Onupy|7gG<+%n4(Rws_pyf45N!+RP2VuN780oO;QE{Z5^ zp~*UB&U5!b!!m=AaAAp@17*baG(V}v62C9L+pa|}r0w;{)V^nw&27J~Z^D1gMCHzB zLB=G3kjD*sXJ>yD#IY7}CY`KIMbOgyVc89MaaU`8aim}hfG$%C*D#+Om`ALdV|01~ zXh5e`J3{BdX8ZiGsVu0tZAmM~H2)Tcf9255SxzIrE@3B)&UwErW7BPAiIf{~1$� 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/QFundLightLogo.png b/src/assets/images/QFundLightLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..16f008554cb1e48298a5ad9d5edfa600fe58b268 GIT binary patch literal 43182 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 txTCL73&mFC6>0

setCurrentEdit(null)} + aria-labelledby="alert-dialog-title" + aria-describedby="alert-dialog-description" + > + + + + handleSubmit(obj, true)} + postId={postId} + postName={postName} + isEdit + commentId={currentEdit?.identifier} + commentMessage={currentEdit?.message} + /> + + + + + + + + )} + + + {comment?.created && ( + + {formatDate(+comment?.created)} + + )} + + setIsReplying(true)} + > + reply + + {user?.name === comment?.name && ( + setCurrentEdit(comment)} + > + edit + + )} + {isReplying && ( + { + setIsReplying(false); + setIsEditing(false); + }} + > + close + + )} + + + + + + {isReplying && ( + + )} + + + ); +}; + +const CommentCard = ({ + message, + created, + name, + replies, + children, + setCurrentEdit, +}: any) => { + const [avatarUrl, setAvatarUrl] = React.useState(""); + const { user } = useSelector((state: RootState) => state.auth); + + const theme = useTheme(); + + const getAvatar = React.useCallback(async (author: string) => { + try { + const url = await qortalRequest({ + action: "GET_QDN_RESOURCE_URL", + name: author, + service: "THUMBNAIL", + identifier: "qortal_avatar", + }); + + setAvatarUrl(url); + } catch (error) { + console.error(error); + } + }, []); + + useEffect(() => { + getAvatar(name); + }, [name]); + + return ( + + + + + + + {name} + + + + {message} + + + {replies?.map((reply: any) => { + return ( + + + + {reply?.created && ( + + {formatDate(+reply?.created)} + + )} + {user?.name === reply?.name ? ( + setCurrentEdit(reply)} + sx={{}} + > + edit + + ) : ( + + )} + + + + ); + })} + + {children} + + ); +}; diff --git a/src/components/common/Comments/CommentEditor.tsx b/src/components/common/Comments/CommentEditor.tsx new file mode 100644 index 0000000..2f9560b --- /dev/null +++ b/src/components/common/Comments/CommentEditor.tsx @@ -0,0 +1,254 @@ +import { Box, Button, TextField } from "@mui/material"; +import React, { useEffect, useState } from "react"; +import { useDispatch, useSelector } from "react-redux"; +import { RootState } from "../../../state/store"; +import ShortUniqueId from "short-unique-id"; +import { setNotification } from "../../../state/features/notificationsSlice"; +import { toBase64 } from "../../../utils/toBase64"; +import localforage from "localforage"; +import { COMMENT_BASE } from "../../../constants"; +import { + CommentInput, + CommentInputContainer, + SubmitCommentButton, +} from "./Comments-styles"; +const uid = new ShortUniqueId(); + +const notification = localforage.createInstance({ + name: "notification", +}); + +const MAX_ITEMS = 10; + +export interface Item { + id: string; + lastSeen: number; + postId: string; + postName: string; +} + +export async function addItem(item: Item): Promise { + // Get all items + let notificationComments: Item[] = + (await notification.getItem("comments")) || []; + + // Find the item with the same id, if it exists + let existingItemIndex = notificationComments.findIndex(i => i.id === item.id); + + if (existingItemIndex !== -1) { + // If the item exists, update its date + notificationComments[existingItemIndex].lastSeen = item.lastSeen; + } else { + // If the item doesn't exist, add it + notificationComments.push(item); + + // If adding the item has caused us to exceed the max number of items, remove the oldest one + if (notificationComments.length > MAX_ITEMS) { + notificationComments.sort((a, b) => b.lastSeen - a.lastSeen); // sort items by date, newest first + notificationComments.pop(); // remove the oldest item + } + } + + // Store the items back into localForage + await notification.setItem("comments", notificationComments); +} +export async function updateItemDate(item: any): Promise { + // Get all items + let notificationComments: Item[] = + (await notification.getItem("comments")) || []; + + let notificationCreatorComment: any = + (await notification.getItem("post-comments")) || {}; + const findPostId = notificationCreatorComment[item.postId]; + if (findPostId) { + notificationCreatorComment[item.postId].lastSeen = item.lastSeen; + } + + // Find the item with the same id, if it exists + notificationComments.forEach((nc, index) => { + if (nc.postId === item.postId) { + notificationComments[index].lastSeen = item.lastSeen; + } + }); + + // Store the items back into localForage + await notification.setItem("comments", notificationComments); + await notification.setItem("post-comments", notificationCreatorComment); +} +interface CommentEditorProps { + postId: string; + postName: string; + onSubmit: (obj: any) => void; + isReply?: boolean; + commentId?: string; + isEdit?: boolean; + commentMessage?: string; +} + +function utf8ToBase64(inputString: string): string { + // Encode the string as UTF-8 + const utf8String = encodeURIComponent(inputString).replace( + /%([0-9A-F]{2})/g, + (match, p1) => String.fromCharCode(Number("0x" + p1)) + ); + + // Convert the UTF-8 encoded string to base64 + const base64String = btoa(utf8String); + return base64String; +} + +export const CommentEditor = ({ + onSubmit, + postId, + postName, + isReply, + commentId, + isEdit, + commentMessage, +}: CommentEditorProps) => { + const [value, setValue] = useState(""); + const dispatch = useDispatch(); + const { user } = useSelector((state: RootState) => state.auth); + + useEffect(() => { + if (isEdit && commentMessage) { + setValue(commentMessage); + } + }, [isEdit, commentMessage]); + + const publishComment = async ( + identifier: string, + idForNotification?: string + ) => { + let address; + let name; + let errorMsg = ""; + + address = user?.address; + name = user?.name || ""; + + if (!address) { + errorMsg = "Cannot post: your address isn't available"; + } + if (!name) { + errorMsg = "Cannot post without a name"; + } + + if (value.length > 200) { + errorMsg = "Comment needs to be under 200 characters"; + } + + if (errorMsg) { + dispatch( + setNotification({ + msg: errorMsg, + alertType: "error", + }) + ); + throw new Error(errorMsg); + } + + try { + const base64 = utf8ToBase64(value); + const resourceResponse = await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: name, + service: "BLOG_COMMENT", + data64: base64, + identifier: identifier, + }); + dispatch( + setNotification({ + msg: "Comment successfully published", + alertType: "success", + }) + ); + if (idForNotification) { + addItem({ + id: idForNotification, + lastSeen: Date.now(), + postId, + postName: postName, + }); + } + + return resourceResponse; + } catch (error: any) { + let notificationObj: any = null; + if (typeof error === "string") { + notificationObj = { + msg: error || "Failed to publish comment", + alertType: "error", + }; + } else if (typeof error?.error === "string") { + notificationObj = { + msg: error?.error || "Failed to publish comment", + alertType: "error", + }; + } else { + notificationObj = { + msg: error?.message || "Failed to publish comment", + alertType: "error", + }; + } + if (!notificationObj) throw new Error("Failed to publish comment"); + + dispatch(setNotification(notificationObj)); + throw new Error("Failed to publish comment"); + } + }; + const handleSubmit = async () => { + try { + const id = uid(); + + let identifier = `${COMMENT_BASE}${postId.slice(-12)}_base_${id}`; + let idForNotification = identifier; + + if (isReply && commentId) { + const removeBaseCommentId = commentId; + removeBaseCommentId.replace("_base_", ""); + identifier = `${COMMENT_BASE}${postId.slice( + -12 + )}_reply_${removeBaseCommentId.slice(-6)}_${id}`; + idForNotification = commentId; + } + if (isEdit && commentId) { + identifier = commentId; + } + + await publishComment(identifier, idForNotification); + onSubmit({ + created: Date.now(), + identifier, + message: value, + service: "BLOG_COMMENT", + name: user?.name, + }); + setValue(""); + } catch (error) { + console.error(error); + } + }; + + return ( + + setValue(e.target.value)} + /> + + + {isReply ? "Submit reply" : isEdit ? "Edit" : "Submit comment"} + + + ); +}; diff --git a/src/components/common/Comments/CommentSection.tsx b/src/components/common/Comments/CommentSection.tsx new file mode 100644 index 0000000..597f98e --- /dev/null +++ b/src/components/common/Comments/CommentSection.tsx @@ -0,0 +1,274 @@ +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; +import { CommentEditor } from "./CommentEditor"; +import { Comment } from "./Comment"; +import { Box, Button, CircularProgress, useTheme } from "@mui/material"; +import { styled } from "@mui/system"; +import { useSelector } from "react-redux"; +import { RootState } from "../../../state/store"; +import { useNavigate, useLocation } from "react-router-dom"; +import { COMMENT_BASE } from "../../../constants"; +import { + CommentContainer, + CommentEditorContainer, + CommentsContainer, + LoadMoreCommentsButton, + LoadMoreCommentsButtonRow, + NoCommentsRow, +} from "./Comments-styles"; + +interface CommentSectionProps { + postId: string; + postName: string; +} + +const Panel = styled("div")` + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + width: 100%; + padding-bottom: 10px; + height: 100%; + overflow: hidden; + + &::-webkit-scrollbar { + width: 8px; + height: 8px; + } + + &::-webkit-scrollbar-thumb { + background-color: #888; + border-radius: 4px; + } + + &::-webkit-scrollbar-thumb:hover { + background-color: #555; + } +`; +export const CommentSection = ({ postId, postName }: CommentSectionProps) => { + const navigate = useNavigate(); + const location = useLocation(); + const [listComments, setListComments] = useState([]); + const [isOpen, setIsOpen] = useState(false); + const { user } = useSelector((state: RootState) => state.auth); + const [newMessages, setNewMessages] = useState(0); + const [loadingComments, setLoadingComments] = useState(false); + + const onSubmit = (obj?: any, isEdit?: boolean) => { + if (isEdit) { + setListComments((prev: any[]) => { + const findCommentIndex = prev.findIndex( + item => item?.identifier === obj?.identifier + ); + if (findCommentIndex === -1) return prev; + + const newArray = [...prev]; + newArray[findCommentIndex] = obj; + return newArray; + }); + + return; + } + setListComments(prev => [ + ...prev, + { + ...obj, + }, + ]); + }; + + useEffect(() => { + const query = new URLSearchParams(location.search); + let commentVar = query?.get("comment"); + if (commentVar) { + if (commentVar && commentVar.endsWith("/")) { + commentVar = commentVar.slice(0, -1); + } + setIsOpen(true); + if (listComments.length > 0) { + const el = document.getElementById(commentVar); + if (el) { + el.scrollIntoView(); + el.classList.add("glow"); + setTimeout(() => { + el.classList.remove("glow"); + }, 2000); + } + navigate(location.pathname, { replace: true }); + } + } + }, [navigate, location, listComments]); + + const getReplies = useCallback( + async (commentId, postId) => { + const offset = 0; + + const removeBaseCommentId = commentId.replace("_base_", ""); + const url = `/arbitrary/resources/search?mode=ALL&service=BLOG_COMMENT&query=${COMMENT_BASE}${postId.slice( + -12 + )}_reply_${removeBaseCommentId.slice( + -6 + )}&limit=0&includemetadata=false&offset=${offset}&reverse=false&excludeblocked=true`; + const response = await fetch(url, { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + }); + const responseData = await response.json(); + const comments: any[] = []; + for (const comment of responseData) { + if (comment.identifier && comment.name) { + const url = `/arbitrary/BLOG_COMMENT/${comment.name}/${comment.identifier}`; + const response = await fetch(url, { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + }); + + const responseData2 = await response.text(); + if (responseData) { + comments.push({ + message: responseData2, + ...comment, + }); + } + } + } + return comments; + }, + [postId] + ); + + const getComments = useCallback( + async (isNewMessages?: boolean, numberOfComments?: number) => { + try { + setLoadingComments(true); + let offset = 0; + if (isNewMessages && numberOfComments) { + offset = numberOfComments; + } + const url = `/arbitrary/resources/search?mode=ALL&service=BLOG_COMMENT&query=${COMMENT_BASE}${postId.slice( + -12 + )}_base_&limit=20&includemetadata=false&offset=${offset}&reverse=false&excludeblocked=true`; + const response = await fetch(url, { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + }); + const responseData = await response.json(); + let comments: any[] = []; + for (const comment of responseData) { + if (comment.identifier && comment.name) { + const url = `/arbitrary/BLOG_COMMENT/${comment.name}/${comment.identifier}`; + const response = await fetch(url, { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + }); + + const responseData2 = await response.text(); + if (responseData) { + comments.push({ + message: responseData2, + ...comment, + }); + } + const res = await getReplies(comment.identifier, postId); + comments = [...comments, ...res]; + } + } + if (isNewMessages) { + setListComments(prev => [...prev, ...comments]); + setNewMessages(0); + } else { + setListComments(comments); + } + } catch (error) { + console.error(error); + } finally { + setLoadingComments(false); + } + }, + [postId] + ); + + useEffect(() => { + getComments(); + }, [getComments, postId]); + + const structuredCommentList = useMemo(() => { + return listComments.reduce((acc, curr, index, array) => { + if (curr?.identifier?.includes("_reply_")) { + return acc; + } + acc.push({ + ...curr, + replies: array.filter(comment => + comment.identifier.includes(`_reply_${curr.identifier.slice(-6)}`) + ), + }); + return acc; + }, []); + }, [listComments]); + + return ( + <> + + + {loadingComments ? ( + + + + ) : listComments.length === 0 ? ( + + There are no comments yet. Be the first to comment! + + ) : ( + + {structuredCommentList.map((comment: any) => { + return ( + + ); + })} + + )} + {listComments.length > 20 && ( + + { + getComments( + true, + listComments.filter( + item => !item.identifier.includes("_reply_") + ).length + ); + }} + variant="contained" + size="small" + > + Load More Comments + + + )} + + + + + + + ); +}; diff --git a/src/components/common/Comments/Comments-styles.tsx b/src/components/common/Comments/Comments-styles.tsx new file mode 100644 index 0000000..cee7681 --- /dev/null +++ b/src/components/common/Comments/Comments-styles.tsx @@ -0,0 +1,280 @@ +import { styled } from "@mui/system"; +import { Card, Box, Typography, Button, TextField } from "@mui/material"; + +export const StyledCard = styled(Card)(({ theme }) => ({ + backgroundColor: + theme.palette.mode === "light" + ? theme.palette.primary.main + : theme.palette.primary.dark, + maxWidth: "600px", + width: "100%", + margin: "10px 0px", + cursor: "pointer", + "@media (max-width: 450px)": { + width: "100%;", + }, +})); + +export const CardContentContainer = styled(Box)(({ theme }) => ({ + backgroundColor: + theme.palette.mode === "light" + ? theme.palette.primary.dark + : theme.palette.primary.light, + margin: "5px 10px", + borderRadius: "15px", +})); + +export const CardContentContainerComment = styled(Box)(({ theme }) => ({ + backgroundColor: theme.palette.mode === "light" ? "#a9d9d038" : "#c3abe414", + border: `1px solid ${theme.palette.primary.main}`, + margin: "0px", + padding: "8px 15px", + borderRadius: "8px", + width: "100%", + display: "flex", + flexDirection: "column", +})); + +export const StyledCardHeader = styled(Box)({ + display: "flex", + alignItems: "center", + justifyContent: "flex-start", + gap: "5px", + padding: "7px", +}); + +export const StyledCardHeaderComment = styled(Box)({ + display: "flex", + alignItems: "center", + justifyContent: "flex-start", + gap: "7px", + padding: "9px 7px", +}); + +export const StyledCardCol = styled(Box)({ + display: "flex", + overflow: "hidden", + flexDirection: "column", + gap: "2px", + alignItems: "flex-start", + width: "100%", +}); + +export const StyledCardColComment = styled(Box)({ + display: "flex", + overflow: "hidden", + flexDirection: "column", + gap: "2px", + alignItems: "flex-start", + width: "100%", +}); + +export const StyledCardContent = styled(Box)({ + display: "flex", + flexDirection: "column", + alignItems: "center", + justifyContent: "flex-start", + padding: "5px 10px", + gap: "10px", +}); + +export const StyledCardContentComment = styled(Box)({ + display: "flex", + flexDirection: "column", + alignItems: "flex-start", + justifyContent: "flex-start", + padding: "5px 10px", + gap: "10px", +}); + +export const StyledCardComment = styled(Typography)(({ theme }) => ({ + fontFamily: "Mulish", + letterSpacing: 0, + fontWeight: 400, + color: theme.palette.text.primary, + fontSize: "19px", +})); + +export const TitleText = styled(Typography)({ + whiteSpace: "nowrap", + overflow: "hidden", + textOverflow: "ellipsis", + width: "100%", + fontFamily: "Cairo, sans-serif", + fontSize: "22px", + lineHeight: "1.2", +}); + +export const AuthorText = styled(Typography)({ + fontFamily: "Raleway, sans-serif", + fontSize: "16px", + lineHeight: "1.2", +}); + +export const AuthorTextComment = styled(Typography)(({ theme }) => ({ + fontFamily: "Montserrat, sans-serif", + fontSize: "17px", + letterSpacing: "0.3px", + fontWeight: 400, + color: theme.palette.text.primary, + userSelect: "none", +})); + +export const IconsBox = styled(Box)({ + display: "flex", + gap: "3px", + position: "absolute", + top: "12px", + right: "5px", + transition: "all 0.3s ease-in-out", +}); + +export const BookmarkIconContainer = styled(Box)({ + display: "flex", + boxShadow: "rgba(99, 99, 99, 0.2) 0px 2px 8px 0px;", + backgroundColor: "#fbfbfb", + color: "#50e3c2", + padding: "5px", + borderRadius: "3px", + transition: "all 0.3s ease-in-out", + "&:hover": { + cursor: "pointer", + transform: "scale(1.1)", + }, +}); + +export const BlockIconContainer = styled(Box)({ + display: "flex", + boxShadow: "rgba(99, 99, 99, 0.2) 0px 2px 8px 0px;", + backgroundColor: "#fbfbfb", + color: "#c25252", + padding: "5px", + borderRadius: "3px", + transition: "all 0.3s ease-in-out", + "&:hover": { + cursor: "pointer", + transform: "scale(1.1)", + }, +}); + +export const CommentsContainer = styled(Box)({ + width: "90%", + maxWidth: "1000px", + display: "flex", + flexDirection: "column", + flex: "1", + overflow: "auto", +}); + +export const CommentContainer = styled(Box)({ + display: "flex", + flexDirection: "column", + margin: "25px 0px 50px 0px", + maxWidth: "100%", + width: "100%", + gap: "10px", + padding: "0px 5px", +}); + +export const NoCommentsRow = styled(Box)({ + display: "flex", + alignItems: "center", + justifyContent: "center", + flex: "1", + padding: "10px 0px", + fontFamily: "Mulish", + letterSpacing: 0, + fontWeight: 400, + fontSize: "18px", +}); + +export const LoadMoreCommentsButtonRow = styled(Box)({ + display: "flex", +}); + +export const EditReplyButton = styled(Button)(({ theme }) => ({ + width: "30px", + alignSelf: "flex-end", + background: theme.palette.primary.light, + color: "#ffffff", +})); + +export const LoadMoreCommentsButton = styled(Button)(({ theme }) => ({ + fontFamily: "Montserrat", + fontWeight: 400, + letterSpacing: "0.2px", + fontSize: "15px", + backgroundColor: theme.palette.primary.main, + color: "#ffffff", +})); + +export const CommentActionButtonRow = styled(Box)({ + display: "flex", + alignItems: "center", + gap: "5px", +}); + +export const CommentEditorContainer = styled(Box)({ + width: "100%", + display: "flex", + justifyContent: "center", +}); + +export const CommentDateText = styled(Typography)(({ theme }) => ({ + fontFamily: "Mulish", + letterSpacing: 0, + fontWeight: 400, + fontSize: "13px", + marginLeft: "5px", + color: theme.palette.text.primary, +})); + +export const CommentInputContainer = styled(Box)({ + display: "flex", + flexDirection: "column", + marginTop: "15px", + width: "90%", + maxWidth: "1000px", + borderRadius: "8px", + gap: "10px", + alignItems: "center", + marginBottom: "25px", +}); + +export const CommentInput = styled(TextField)(({ theme }) => ({ + backgroundColor: theme.palette.mode === "light" ? "#a9d9d01d" : "#c3abe4a", + border: `1px solid ${theme.palette.primary.main}`, + width: "100%", + borderRadius: "8px", + '& [class$="-MuiFilledInput-root"]': { + fontFamily: "Mulish", + letterSpacing: 0, + fontWeight: 400, + color: theme.palette.text.primary, + fontSize: "19px", + minHeight: "100px", + backgroundColor: "transparent", + "&:before": { + borderBottom: "none", + "&:hover": { + borderBottom: "none", + }, + }, + "&:hover": { + backgroundColor: "transparent", + "&:before": { + borderBottom: "none", + }, + }, + }, +})); + +export const SubmitCommentButton = styled(Button)(({ theme }) => ({ + fontFamily: "Montserrat", + fontWeight: 400, + letterSpacing: "0.2px", + fontSize: "15px", + backgroundColor: theme.palette.primary.main, + color: "#ffffff", + width: "75%", +})); diff --git a/src/components/common/Countdown/Countdown-styles.tsx b/src/components/common/Countdown/Countdown-styles.tsx new file mode 100644 index 0000000..5d57155 --- /dev/null +++ b/src/components/common/Countdown/Countdown-styles.tsx @@ -0,0 +1,63 @@ +import { styled } from "@mui/system"; +import { Box, Typography } from "@mui/material"; + +export const CountdownCard = styled(Box)(({ theme }) => ({ + display: "flex", + flexDirection: "column", + alignItems: "center", + justifyContent: "center", + gap: "15px", + width: "fit-content", + maxWidth: "450px", + minWidth: "450px", + padding: "25px", + border: `1px solid ${theme.palette.primary.light}`, + borderRadius: "8px", +})); + +export const CountdownRow = styled(Box)(({ theme }) => ({ + display: "flex", + flexDirection: "row", + alignItems: "center", +})); + +export const CountdownCol = styled(Box)(({ theme }) => ({ + display: "flex", + flexDirection: "column", + gap: "0px", + padding: "0px 2px", + alignItems: "center", +})); + +export const CountdownFont = styled(Typography)(({ theme }) => ({ + fontFamily: "Mulish", + fontSize: "18px", + letterSpacing: 0, + fontWeight: 400, + color: theme.palette.text.primary, +})); + +export const CountdownFontNumber = styled(Typography)(({ theme }) => ({ + fontFamily: "Montserrat", + fontWeight: 300, + fontSize: "40px", + letterSpacing: 0, + lineHeight: "45px", + color: theme.palette.text.primary, +})); + +export const CountdownContainer = styled(Box)(({ theme }) => ({ + display: "flex", + flexDirection: "column", + alignItems: "center", + gap: "5px", +})); + +export const EstimatedTimeRemainingFont = styled(Typography)(({ theme }) => ({ + fontFamily: "Mulish", + fontSize: "16px", + color: theme.palette.text.primary, + fontWeight: 400, + letterSpacing: 0, + userSelect: "none", +})); diff --git a/src/components/common/Countdown/Countdown.tsx b/src/components/common/Countdown/Countdown.tsx new file mode 100644 index 0000000..9fbb25a --- /dev/null +++ b/src/components/common/Countdown/Countdown.tsx @@ -0,0 +1,142 @@ +import React, { useEffect, useState } from "react"; +import moment from "moment"; +import { CircularProgress } from "@mui/material"; +import { + CountdownCard, + CountdownCol, + CountdownContainer, + CountdownFont, + CountdownFontNumber, + CountdownRow, + EstimatedTimeRemainingFont, +} from "./Countdown-styles"; + +interface CountdownProps { + endDate: moment.Moment; + blocksRemaining: number | null; + loadingAtInfo: boolean; + ATCompleted: boolean; +} + +export const Countdown: React.FC = ({ + endDate, + blocksRemaining, + loadingAtInfo, + ATCompleted, +}) => { + const [timeRemainingDays, setTimeRemainingDays] = useState( + null + ); + const [timeRemainingHours, setTimeRemainingHours] = useState( + null + ); + const [timeRemainingMinutes, setTimeRemainingMinutes] = useState< + number | null + >(null); + + // useEffect that runs the countdown timer + useEffect(() => { + let intervalId: NodeJS.Timeout | null = null; + const updateCountdown = () => { + const now = moment(); + const duration = moment.duration(endDate.diff(now)); + + if (duration.asMilliseconds() <= 0) { + setTimeRemainingDays(0); + setTimeRemainingHours(0); + setTimeRemainingMinutes(0); + if (intervalId) clearInterval(intervalId); + return; + } + + const totalMinutes = duration.asMinutes(); + const days = Math.floor(totalMinutes / (60 * 24)); + const hours = Math.floor((totalMinutes % (60 * 24)) / 60); + const minutes = Math.floor(totalMinutes % 60); + + setTimeRemainingDays(days); + setTimeRemainingHours(hours); + setTimeRemainingMinutes(minutes); + }; + + // Ensure the crowdfund has not ended before running the countdown + if (!endDate || !blocksRemaining) return; + + updateCountdown(); + intervalId = setInterval(updateCountdown, 1000); + + return () => { + if (intervalId) { + clearInterval(intervalId); + } + }; + }, [blocksRemaining, endDate]); + + return ( + <> + {!loadingAtInfo ? ( + + {!ATCompleted ? ( + <> + + + + Estimated Time Remaining + + + + + {timeRemainingDays} + + {`Day${ + timeRemainingDays === 1 ? "" : "s" + }`} + + + : + + + + {timeRemainingHours} + + {`Hour${ + timeRemainingHours === 1 ? "" : "s" + }`} + + + : + + + + {timeRemainingMinutes} + + {`Minute${ + timeRemainingMinutes === 1 ? "" : "s" + }`} + + + + + + + + Blocks Remaining: {blocksRemaining} + + + updated every 30 seconds + + + + + ) : ( + + Crowdfunding has ended. + + )} + + ) : ( + + )} + + ); +}; diff --git a/src/components/common/DisplayHtml.tsx b/src/components/common/DisplayHtml.tsx new file mode 100644 index 0000000..86d03b7 --- /dev/null +++ b/src/components/common/DisplayHtml.tsx @@ -0,0 +1,29 @@ +import { useMemo } from "react"; +import DOMPurify from "dompurify"; +import "react-quill/dist/quill.snow.css"; +import "react-quill/dist/quill.core.css"; +import "react-quill/dist/quill.bubble.css"; +import { convertQortalLinks } from "../../utils/convertQortalAnchor"; +import { CrowdfundInlineContent } from "../Crowdfund/Crowdfund-styles"; + +export const DisplayHtml = ({ html }) => { + const cleanContent = useMemo(() => { + if (!html) return null; + + const sanitize: string = DOMPurify.sanitize(html, { + USE_PROFILES: { html: true }, + }); + const anchorQortal = convertQortalLinks(sanitize); + return anchorQortal; + }, [html]); + + if (!cleanContent) return null; + return ( + +
+ + ); +}; diff --git a/src/components/common/Donate/Donate-styles.tsx b/src/components/common/Donate/Donate-styles.tsx new file mode 100644 index 0000000..def3215 --- /dev/null +++ b/src/components/common/Donate/Donate-styles.tsx @@ -0,0 +1,48 @@ +import { styled } from "@mui/material/styles"; +import { Box, Button, InputLabel } from "@mui/material"; +import { changeLightness } from "qortal-app-utils"; + +const ButtonStyle = styled(Button)({ + fontFamily: "Mulish", + fontWeight: "800", + fontSize: "21px", + lineHeight: "1.75", + textTransform: "uppercase", + minWidth: "64px", + padding: "15px 25px", + color: "#ffffff", + "&:disabled": { + filter: "brightness(0.8)", + }, +}); + +export const DonateModalCol = styled(Box)({ + display: "flex", + flexDirection: "column", + alignItems: "center", + width: "400px", + justifyContent: "center", + gap: "20px", +}); + +export const CrowdfundPageDonateButton = styled(ButtonStyle)(({ theme }) => ({ + backgroundColor: theme.palette.primary.main, + "&:hover": { + backgroundColor: changeLightness(theme.palette.primary.main, -10), + }, +})); + +export const DonorDetailsButton = styled(ButtonStyle)(({ theme }) => ({ + backgroundColor: theme.palette.secondary.main, + "&:hover": { + backgroundColor: changeLightness(theme.palette.secondary.main, -10), + }, +})); + +export const DonateModalLabel = styled(InputLabel)(({ theme }) => ({ + fontFamily: "Copse", + fontSize: "27px", + letterSpacing: "1px", + color: theme.palette.text.primary, + fontWeight: 400, +})); diff --git a/src/components/common/Donate/Donate.tsx b/src/components/common/Donate/Donate.tsx new file mode 100644 index 0000000..85f04be --- /dev/null +++ b/src/components/common/Donate/Donate.tsx @@ -0,0 +1,235 @@ +import { useEffect, useState } from "react"; +import { + Box, + Button, + Dialog, + DialogActions, + DialogContent, + DialogTitle, + InputAdornment, + Tooltip, + useTheme, +} from "@mui/material"; +import { useDispatch } from "react-redux"; +import Portal from "../Portal"; +import { setNotification } from "../../../state/features/notificationsSlice"; +import { + CrowdfundPageDonateButton, + DonateModalCol, + DonateModalLabel, +} from "./Donate-styles"; +import { QortalSVG } from "../../../assets/svgs/QortalSVG"; +import BoundedNumericTextField from "../../../utils/BoundedNumericTextField"; +import { getUserBalance, truncateNumber } from "qortal-app-utils"; + +interface DonateProps { + atAddress: string; + ATDonationPossible: boolean; + onSubmit: () => void; + onClose: () => void; +} + +export const Donate = ({ + onSubmit, + onClose, + atAddress, + ATDonationPossible, +}: DonateProps) => { + const dispatch = useDispatch(); + const theme = useTheme(); + + const [isOpen, setIsOpen] = useState(false); + const [amount, setAmount] = useState(0); + const [currentBalance, setCurrentBalance] = useState(""); + const resetValues = () => { + setAmount(0); + setIsOpen(false); + }; + + const sendCoin = async () => { + try { + if (!atAddress) return; + if (isNaN(amount)) return; + + // Check one last time if the AT has finished and if so, don't send the coin + const url = `/at/${atAddress}`; + const response = await fetch(url, { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + }); + const responseDataSearch = await response.json(); + if (response.status !== 200 || responseDataSearch?.isFinished) { + dispatch( + setNotification({ + msg: "This crowdfund has ended", + alertType: "error", + }) + ); + resetValues(); + return; + } + // Prevent them from sending a coin if there's 4 blocks left or less to avoid timing issues + const url2 = `/blocks/height`; + const blockHeightResponse = await fetch(url2, { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + }); + const blockHeight = await blockHeightResponse.json(); + const diff = +responseDataSearch?.sleepUntilHeight - +blockHeight; + if (diff <= 4) { + dispatch( + setNotification({ + msg: "This crowdfund has ended", + alertType: "error", + }) + ); + resetValues(); + return; + } + await qortalRequest({ + action: "SEND_COIN", + coin: "QORT", + destinationAddress: atAddress, + amount: amount, + }); + dispatch( + setNotification({ + msg: "Donation successfully sent", + alertType: "success", + }) + ); + resetValues(); + onSubmit(); + } catch (error: any) { + let notificationObj: any = null; + if (typeof error === "string") { + notificationObj = { + msg: error || "Failed to send coin", + alertType: "error", + }; + } else if (typeof error?.error === "string") { + notificationObj = { + msg: error?.error || "Failed to send coin", + alertType: "error", + }; + } else { + notificationObj = { + msg: error?.message || "Failed to send coin", + alertType: "error", + }; + } + if (!notificationObj) return; + dispatch(setNotification(notificationObj)); + } + }; + useEffect(() => { + getUserBalance().then(foundBalance => { + setCurrentBalance(truncateNumber(foundBalance, 2)); + }); + }, []); + return ( + + + + setIsOpen(prev => !prev)} + disabled={!ATDonationPossible} + variant="contained" + > + Donate Now + + + + {isOpen && ( + + setIsOpen(false)} + aria-labelledby="alert-dialog-title" + aria-describedby="alert-dialog-description" + > + + + + + Amount + + setAmount(+value)} + variant={"standard"} + allowDecimals={false} + allowNegatives={false} + addIconButtons={true} + InputProps={{ + startAdornment: ( + + + + ), + }} + /> + + {currentBalance ? ( +
You have {currentBalance} QORT
+ ) : ( + <> + )} +
+ + + + +
+
+ )} +
+ ); +}; diff --git a/src/components/common/Donate/DonorInfo.tsx b/src/components/common/Donate/DonorInfo.tsx new file mode 100644 index 0000000..bcd6cf9 --- /dev/null +++ b/src/components/common/Donate/DonorInfo.tsx @@ -0,0 +1,90 @@ +import { DonorDetailsButton } from "./Donate-styles"; +import { Tooltip } from "@mui/material"; +import { + addStringNumbers, + getAccountNames, + removeTrailingZeros, + SearchTransactionResponse, +} from "qortal-app-utils"; +import React, { useEffect, useState } from "react"; +import DonorModal from "./DonorModal"; + +interface DonorInfoProps { + rawDonorData: SearchTransactionResponse[]; + aggregateDonorData?: boolean; +} + +export type ViewableDonorData = { + nameIfExists: string; + address: string; + amount: string; +}; + +const DonorInfo = ({ + rawDonorData, + aggregateDonorData = true, +}: DonorInfoProps) => { + const [displayModal, setDisplayModal] = useState(false); + const [donorData, setDonorData] = useState([]); + + const processOneDonor = ( + donorArray: ViewableDonorData[], + donor: ViewableDonorData + ) => { + const donorIndex = donorArray.findIndex(d => { + return d.address === donor.address; + }); + + if (aggregateDonorData && donorIndex >= 0) { + donorArray[donorIndex].amount = addStringNumbers( + donorArray[donorIndex].amount, + donor.amount + ); + } else { + donorArray.push(donor); + } + }; + + const processAllDonors = async () => { + const processedDonorData: ViewableDonorData[] = []; + Promise.all( + rawDonorData.map(({ creatorAddress, amount }) => { + return getAccountNames(creatorAddress); + }) + ).then(responseArray => { + responseArray.map((response, index) => { + processOneDonor(processedDonorData, { + nameIfExists: response[0].name, + address: response[0].owner, + amount: removeTrailingZeros(rawDonorData[index].amount), + }); + }); + setDonorData(processedDonorData); + }); + }; + + useEffect(() => { + processAllDonors(); + }, [rawDonorData]); + return ( + <> + + { + setDisplayModal(true); + }} + > + Donor Details + + + setDisplayModal(false)} + /> + + ); +}; + +export default DonorInfo; diff --git a/src/components/common/Donate/DonorModal.tsx b/src/components/common/Donate/DonorModal.tsx new file mode 100644 index 0000000..a4e1e5c --- /dev/null +++ b/src/components/common/Donate/DonorModal.tsx @@ -0,0 +1,82 @@ +import { + Button, + Modal, + Stack, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, +} from "@mui/material"; +import { ModalBody } from "../../Crowdfund/Crowdfund-styles"; +import Box from "@mui/material/Box"; +import { ViewableDonorData } from "./DonorInfo"; +import { truncateNumber } from "qortal-app-utils"; + +interface DonorModalProps { + donorData: ViewableDonorData[]; + closeModal: () => void; + open: boolean; +} + +const DonorModal = ({ donorData, closeModal, open }: DonorModalProps) => { + const getAverageDonation = () => { + const donorCount = donorData.length; + if (donorCount === 0) return 0; + let donorSum = 0; + donorData.map(data => { + donorSum += Number(data.amount); + }); + const average = donorSum / donorCount; + return truncateNumber(average, 2); + }; + + return ( + + + + + + + + ID + Name + Amount + Address + + + + {donorData.map((donorData, index) => ( + + {index + 1} + {donorData.nameIfExists} + {donorData.amount} + {donorData.address} + + ))} + +
+
+
+ +

Total # of Donations: {donorData.length}

+

Average Donation Amount: {getAverageDonation()}

+
+ +
+
+ ); +}; +export default DonorModal; diff --git a/src/components/common/DownloadTaskManager.tsx b/src/components/common/DownloadTaskManager.tsx new file mode 100644 index 0000000..b727ca0 --- /dev/null +++ b/src/components/common/DownloadTaskManager.tsx @@ -0,0 +1,204 @@ +import React, { useState, useEffect } from 'react' +import { + Accordion, + AccordionDetails, + AccordionSummary, + Box, + Button, + LinearProgress, + List, + ListItem, + ListItemIcon, + Popover, + Typography, + useTheme +} from '@mui/material' +import Movie from '@mui/icons-material/Movie' +import AttachFileIcon from '@mui/icons-material/AttachFile'; +import { useSelector } from 'react-redux' +import { RootState } from '../../state/store' +import ExpandMoreIcon from '@mui/icons-material/ExpandMore' +import { useLocation, useNavigate } from 'react-router-dom' +import { DownloadingLight } from '../../assets/svgs/DownloadingLight' +import { DownloadedLight } from '../../assets/svgs/DownloadedLight' + +export const DownloadTaskManager: React.FC = () => { + const { downloads } = useSelector((state: RootState) => state.global) + const location = useLocation() + const theme = useTheme() + const [visible, setVisible] = useState(false) + const [hidden, setHidden] = useState(true) + const navigate = useNavigate() + const [anchorEl, setAnchorEl] = useState(null); + + + const [openDownload, setOpenDownload] = useState(false); + + + const handleClick = (event?: React.MouseEvent) => { + const target = event?.currentTarget as unknown as HTMLButtonElement | null; + setAnchorEl(target); + }; + + const handleCloseDownload = () => { + setAnchorEl(null); + setOpenDownload(false); + }; + + useEffect(() => { + // Simulate downloads for demo purposes + + if (visible) { + setTimeout(() => { + setHidden(true) + setVisible(false) + }, 3000) + } + }, [visible]) + + + useEffect(() => { + if (Object.keys(downloads).length === 0) return + setVisible(true) + setHidden(false) + }, [downloads]) + + + if ( + !downloads || + Object.keys(downloads).length === 0 + ) + return null + + + let downloadInProgress = false + if(Object.keys(downloads).find((key)=> (downloads[key]?.status?.status !== 'READY' && downloads[key]?.status?.status !== 'DOWNLOADED'))){ + downloadInProgress = true + } + + return ( + + + + + + {Object.keys(downloads) + .map((download: any) => { + const downloadObj = downloads[download] + const progress = downloads[download]?.status?.percentLoaded || 0 + const status = downloads[download]?.status?.status + const service = downloads[download]?.service + return ( + { + const id = downloadObj?.properties?.jsonId + if (!id) return + + navigate( + `/crowdfund/${downloadObj?.properties?.user}/${id}` + ) + }} + > + + + {service === 'VIDEO' ? ( + + ): } + + + + + + + {`${progress?.toFixed(0)}%`}{' '} + {status && status === 'REFETCHING' && '- refetching'} + {status && status === 'DOWNLOADED' && '- building'} + + + + {downloadObj?.identifier} + + + ) + })} + + + + + + ) +} diff --git a/src/components/common/FileElement.tsx b/src/components/common/FileElement.tsx new file mode 100644 index 0000000..850c006 --- /dev/null +++ b/src/components/common/FileElement.tsx @@ -0,0 +1,419 @@ +import * as React from "react"; +import { styled, useTheme } from "@mui/material/styles"; +import Box from "@mui/material/Box"; +import Typography from "@mui/material/Typography"; +import { MyContext } from "../../wrappers/DownloadWrapper"; +import { useDispatch, useSelector } from "react-redux"; +import { RootState } from "../../state/store"; +import { CircularProgress } from "@mui/material"; +import AttachFileIcon from "@mui/icons-material/AttachFile"; +import { base64ToUint8Array } from "../../utils/toBase64"; +import { setNotification } from "../../state/features/notificationsSlice"; + +const Widget = styled("div")(({ theme }) => ({ + padding: 8, + borderRadius: 10, + maxWidth: 350, + position: "relative", + zIndex: 1, + backdropFilter: "blur(40px)", + background: "skyblue", + transition: "0.2s all", + "&:hover": { + opacity: 0.75, + }, +})); + +const CoverImage = styled("div")({ + width: 40, + height: 40, + objectFit: "cover", + overflow: "hidden", + flexShrink: 0, + borderRadius: 8, + backgroundColor: "rgba(0,0,0,0.08)", + "& > img": { + width: "100%", + }, +}); + +interface IAudioElement { + title: string; + description?: string; + author?: string; + fileInfo?: any; + postId?: string; + user?: string; + children?: React.ReactNode; + mimeType?: string; + disable?: boolean; + mode?: string; + otherUser?: string; + customStyles?: any; +} + +interface CustomWindow extends Window { + showSaveFilePicker: any; // Replace 'any' with the appropriate type if you know it +} + +const customWindow = window as unknown as CustomWindow; + +export default function FileElement({ + title, + description, + author, + fileInfo, + postId = "", + user, + children, + mimeType, + disable, + mode, + otherUser, + customStyles, +}: IAudioElement) { + const { downloadVideo } = React.useContext(MyContext); + const [isLoading, setIsLoading] = React.useState(false); + const [fileProperties, setFileProperties] = React.useState(null); + const [downloadLoader, setDownloadLoader] = React.useState(false); + const { downloads } = useSelector((state: RootState) => state.global); + const hasCommencedDownload = React.useRef(false); + const dispatch = useDispatch(); + const download = React.useMemo(() => { + if (!downloads || !fileInfo?.identifier) return {}; + const findDownload = downloads[fileInfo?.identifier]; + + if (!findDownload) return {}; + return findDownload; + }, [downloads, fileInfo]); + + const resourceStatus = React.useMemo(() => { + return download?.status || {}; + }, [download]); + + const retryDownload = React.useRef(0); + + const handlePlay = async () => { + if (disable) return; + hasCommencedDownload.current = true; + if ( + resourceStatus?.status === "READY" && + download?.url && + download?.properties?.filename + ) { + if (downloadLoader) return; + dispatch( + setNotification({ + msg: "Saving file... please wait", + alertType: "info", + }) + ); + setDownloadLoader(true); + try { + const { name, service, identifier } = fileInfo; + + const url = `/arbitrary/${service}/${name}/${identifier}`; + fetch(url) + .then(response => response.blob()) + .then(async blob => { + await qortalRequest({ + action: "SAVE_FILE", + blob, + filename: download?.properties?.filename, + mimeType: + download?.properties?.mimeType || + download?.properties?.type || + "", + }); + }) + .catch(error => { + console.error("Error fetching the video:", error); + }); + } catch (error: any) { + let notificationObj: any = null; + if (typeof error === "string") { + notificationObj = { + msg: error || "Failed to send message", + alertType: "error", + }; + } else if (typeof error?.error === "string") { + notificationObj = { + msg: error?.error || "Failed to send message", + alertType: "error", + }; + } else { + notificationObj = { + msg: error?.message || "Failed to send message", + alertType: "error", + }; + } + if (!notificationObj) return; + dispatch(setNotification(notificationObj)); + } finally { + setDownloadLoader(false); + } + return; + } + + const { name, service, identifier } = fileInfo; + let filename = fileProperties?.filename; + let mimeType = fileProperties?.mimeType; + if (!fileProperties) { + try { + dispatch( + setNotification({ + msg: "Downloading file... please wait", + alertType: "info", + }) + ); + const res = await qortalRequest({ + action: "GET_QDN_RESOURCE_PROPERTIES", + name: name, + service: service, + identifier: identifier, + }); + setFileProperties(res); + filename = res?.filename; + mimeType = res?.mimeType; + } catch (error: any) { + if (retryDownload.current === 0) { + handlePlay(); + retryDownload.current = 1; + return; + } + setIsLoading(false); + dispatch( + setNotification({ + msg: error?.message || "Error with download. Please try again", + alertType: "error", + }) + ); + } + } + if (!filename) return; + setIsLoading(true); + downloadVideo({ + name, + service, + identifier, + properties: { + ...fileInfo, + }, + }); + }; + + React.useEffect(() => { + if ( + resourceStatus?.status === "READY" && + download?.url && + download?.properties?.filename && + hasCommencedDownload.current + ) { + setIsLoading(false); + dispatch( + setNotification({ + msg: "Download completed. Click to save file", + alertType: "info", + }) + ); + } + }, [resourceStatus, download]); + + return ( + + {children && ( + + {children}{" "} + {(resourceStatus.status && resourceStatus?.status !== "READY") || + isLoading ? ( + <> + + {`${Math.round( + resourceStatus?.percentLoaded || 0 + ).toFixed(0)}% loaded`} + + ) : resourceStatus?.status === "READY" ? ( + <> + + Ready to save: click here + + {downloadLoader && ( + + )} + + ) : null} + + )} + {!children && ( + + + + + + + + {author} + + + {title} + + + {description} + + {mimeType && ( + + {mimeType} + + )} + + + {((resourceStatus.status && resourceStatus?.status !== "READY") || + isLoading) && ( + + + {resourceStatus && ( + + {resourceStatus?.status === "REFETCHING" ? ( + <> + <> + {( + (resourceStatus?.localChunkCount / + resourceStatus?.totalChunkCount) * + 100 + )?.toFixed(0)} + % + + + <> Refetching in 2 minutes + + ) : resourceStatus?.status === "DOWNLOADED" ? ( + <>Download Completed: building file... + ) : resourceStatus?.status !== "READY" ? ( + <> + {( + (resourceStatus?.localChunkCount / + resourceStatus?.totalChunkCount) * + 100 + )?.toFixed(0)} + % + + ) : ( + <>Download Completed: fetching file... + )} + + )} + + )} + {resourceStatus?.status === "READY" && + download?.url && + download?.properties?.filename && ( + + + Ready to save: click here + + {downloadLoader && ( + + )} + + )} + + )} + + ); +} diff --git a/src/components/common/LazyLoad.tsx b/src/components/common/LazyLoad.tsx new file mode 100644 index 0000000..5ce7a30 --- /dev/null +++ b/src/components/common/LazyLoad.tsx @@ -0,0 +1,48 @@ +import React, { useState, useEffect, useRef } from 'react' +import { useInView } from 'react-intersection-observer' +import CircularProgress from '@mui/material/CircularProgress' + +interface Props { + onLoadMore: () => Promise + isLoading?: boolean +} + +const LazyLoad: React.FC = ({ onLoadMore, isLoading }) => { + const [isFetching, setIsFetching] = useState(false) + + const firstLoad = useRef(false) + const [ref, inView] = useInView({ + threshold: 0.7 + }) + + useEffect(() => { + if (inView) { + setIsFetching(true) + onLoadMore().finally(() => { + setIsFetching(false) + firstLoad.current = true + }) + } + }, [inView]) + + return ( +
+
+ +
+
+ ) +} + +export default LazyLoad diff --git a/src/components/common/Notification/Notification.tsx b/src/components/common/Notification/Notification.tsx new file mode 100644 index 0000000..501f081 --- /dev/null +++ b/src/components/common/Notification/Notification.tsx @@ -0,0 +1,86 @@ +import { useDispatch, useSelector } from 'react-redux' +import { toast, ToastContainer, Zoom, Slide } from 'react-toastify' +import { removeNotification } from '../../../state/features/notificationsSlice' +import 'react-toastify/dist/ReactToastify.css' +import { RootState } from '../../../state/store' + +const Notification = () => { + const dispatch = useDispatch() + + const { alertTypes } = useSelector((state: RootState) => state.notifications) + + if (alertTypes.alertError) { + toast.error(`❌ ${alertTypes?.alertError}`, { + position: 'bottom-right', + autoClose: 4000, + hideProgressBar: false, + closeOnClick: true, + pauseOnHover: true, + draggable: true, + progress: undefined, + icon: false + }) + dispatch(removeNotification()) + } + if (alertTypes.alertSuccess) { + toast.success(`✔️ ${alertTypes?.alertSuccess}`, { + position: 'bottom-right', + autoClose: 4000, + hideProgressBar: false, + closeOnClick: true, + pauseOnHover: true, + draggable: true, + progress: undefined, + icon: false + }) + dispatch(removeNotification()) + } + if (alertTypes.alertInfo) { + toast.info(`${alertTypes?.alertInfo}`, { + position: 'top-right', + autoClose: 1300, + hideProgressBar: false, + closeOnClick: true, + pauseOnHover: true, + draggable: true, + progress: undefined, + theme: 'light' + }) + dispatch(removeNotification()) + } + + if (alertTypes.alertInfo) { + return ( + + ) + } + + return ( + + ) +} + +export default Notification diff --git a/src/components/common/PageLoader.tsx b/src/components/common/PageLoader.tsx new file mode 100644 index 0000000..9ab0d17 --- /dev/null +++ b/src/components/common/PageLoader.tsx @@ -0,0 +1,42 @@ +import React from 'react'; +import CircularProgress from '@mui/material/CircularProgress'; +import { Box, useTheme } from '@mui/material' + +interface PageLoaderProps { + size?: number + thickness?: number +} + +const PageLoader: React.FC = ({ + size = 40, + thickness = 5 +}) => { + const theme = useTheme() + + return ( + + + + ) +} + +export default PageLoader; diff --git a/src/components/common/Portal.tsx b/src/components/common/Portal.tsx new file mode 100644 index 0000000..1e0cb26 --- /dev/null +++ b/src/components/common/Portal.tsx @@ -0,0 +1,25 @@ +import React, { useEffect, useState } from 'react' +import { createPortal } from 'react-dom' + +interface PortalProps { + children: React.ReactNode +} + +const Portal: React.FC = ({ children }) => { + const [mounted, setMounted] = useState(false) + + useEffect(() => { + setMounted(true) + + return () => setMounted(false) + }, []) + + return mounted + ? createPortal( + children, + document.querySelector('#modal-root') as HTMLElement + ) + : null +} + +export default Portal diff --git a/src/components/common/Progress/Progress-styles.tsx b/src/components/common/Progress/Progress-styles.tsx new file mode 100644 index 0000000..e048542 --- /dev/null +++ b/src/components/common/Progress/Progress-styles.tsx @@ -0,0 +1,92 @@ +import { styled } from "@mui/material/styles"; +import { Box, CircularProgress, Typography } from "@mui/material"; + +export const FundAmountsCol = styled(Box)(({ theme }) => ({ + display: "flex", + flexDirection: "column", + alignItems: "flex-start", + justifyContent: "center", + gap: "7px", +})); + +export const FundAmountsRow = styled(Box)(({ theme }) => ({ + display: "flex", + flexDirection: "row", + alignItems: "center", + justifyContent: "flex-start", + gap: "15px", +})); + +export const FundAmount = styled(Typography)(({ theme }) => ({ + fontFamily: "Montserrat", + fontWeight: 500, + fontSize: "28px", + letterSpacing: "0.2px", + userSelect: "none", + color: + theme.palette.mode === "light" + ? theme.palette.primary.dark + : theme.palette.primary.light, +})); + +export const FundAmountNumber = styled(Box)(({ theme }) => ({ + display: "flex", + alignItems: "center", + gap: "5px", + fontFamily: "Montserrat", + fontWeight: 500, + fontSize: "28px", + letterSpacing: "0.2px", + userSelect: "none", + color: theme.palette.text.primary, + "& span": { + textOverflow: "ellipsis", + whiteSpace: "nowrap", + overflow: "hidden", + maxWidth: "100%", + fontSize: "28px", + width: "100px", + }, +})); + +export const ProgressRow = styled(Box)(({ theme }) => ({ + display: "grid", + gridTemplateColumns: "1fr 1fr", + alignItems: "center", + width: "fit-content", + minWidth: "450px", + maxWidth: "450px", + padding: "25px", + border: `1px solid ${theme.palette.primary.light}`, + borderRadius: "8px", +})); + +export const CustomCircularProgress = styled(CircularProgress)(({ theme }) => ({ + position: "relative", + color: + theme.palette.mode === "light" + ? theme.palette.primary.dark + : theme.palette.primary.light, + justifySelf: "center", + + "&::before": { + content: '""', + display: "block", + position: "absolute", + top: "50%", + left: "50%", + width: "calc(100% - 2px)", + height: "calc(100% - 2px)", + borderRadius: "50%", + background: + theme.palette.mode === "dark" + ? `radial-gradient(circle at center, transparent 34%, #fffffff0 34%)` + : `radial-gradient(circle at center, transparent 34%, #e2e0e0ee 34%)`, + transform: "translate(-50%, -50%)", + zIndex: -1, + }, + + "& .MuiCircularProgress-circle": { + zIndex: 1, + }, +})); diff --git a/src/components/common/Progress/Progress.tsx b/src/components/common/Progress/Progress.tsx new file mode 100644 index 0000000..9159f5a --- /dev/null +++ b/src/components/common/Progress/Progress.tsx @@ -0,0 +1,65 @@ +import { useTheme } from "@mui/material"; +import { + CustomCircularProgress, + FundAmount, + FundAmountNumber, + FundAmountsCol, + FundAmountsRow, + ProgressRow, +} from "./Progress-styles"; +import { QortalSVG } from "../../../assets/svgs/QortalSVG"; + +interface CrowdfundProgressProps { + achieved?: number | null; + raised: number; + goal: number; +} + +export const CrowdfundProgress: React.FC = ({ + achieved, + raised, + goal, +}) => { + const theme = useTheme(); + const progress = achieved + ? (+achieved / +goal) * 100 + : (+raised / +goal) * 100; + + return ( + + + + {achieved ? "Achieved:" : "Raised:"} + + + + {achieved ? +Math.round(achieved) : +Math.round(raised)} + + + + + Goal: + + + {+goal} + + + + 0 ? 1 : progress} + /> + + ); +}; diff --git a/src/components/common/Reviews/AddReview/AddReview-styles.tsx b/src/components/common/Reviews/AddReview/AddReview-styles.tsx new file mode 100644 index 0000000..e5e3459 --- /dev/null +++ b/src/components/common/Reviews/AddReview/AddReview-styles.tsx @@ -0,0 +1,46 @@ +import { styled } from "@mui/system"; +import { Box, Button, TextareaAutosize } from "@mui/material"; + +export const AddReviewHeader = styled(Box)(({ theme }) => ({ + display: "flex", + flexDirection: "row", + alignItems: "center", +})); + +export const AddReviewContainer = styled(Box)(({ theme }) => ({ + display: "flex", + flexDirection: "column", + alignItems: "center", + padding: "25px", + justifyContent: "flex-start", + flexGrow: 1, + width: "100%", +})); + +export const AddReviewDescription = styled(TextareaAutosize)(({ theme }) => ({ + width: "100%", + fontFamily: "Mulish", + fontSize: "19px", + fontWeight: 400, + letterSpacing: "0px", + lineHeight: "1.5", + padding: "12px", + borderRadius: "12px 12px 0 12px", + color: theme.palette.text.primary, + background: theme.palette.background.default, + resize: "none", + "& placeholder": { + color: theme.palette.mode === "light" ? "#808183" : "#edeef0", + fontFamily: "Mulish", + fontWeight: 400, + fontSize: "19px", + letterSpacing: "0px", + }, + border: `1px solid ${theme.palette.background.paper}`, + "&:hover": { + borderColor: theme.palette.secondary.main, + }, + "&:focus": { + borderColor: theme.palette.secondary.main, + }, +})); diff --git a/src/components/common/Reviews/AddReview/AddReview.tsx b/src/components/common/Reviews/AddReview/AddReview.tsx new file mode 100644 index 0000000..2b64231 --- /dev/null +++ b/src/components/common/Reviews/AddReview/AddReview.tsx @@ -0,0 +1,295 @@ +import { FC, useState, useMemo } from "react"; +import { + AddReviewContainer, + AddReviewDescription, + AddReviewHeader, +} from "./AddReview-styles"; +import { Rating } from "@mui/material"; +import { CustomInputField } from "../../../Crowdfund/Crowdfund-styles"; +import { + CreateButton, + CloseButton, + CloseButtonRow, + Divider, + OwnerName, +} from "../QFundOwnerReviews-styles"; +import { useDispatch, useSelector } from "react-redux"; +import { RootState } from "../../../../state/store"; +import ShortUniqueId from "short-unique-id"; +import { setNotification } from "../../../../state/features/notificationsSlice"; +import { objectToBase64 } from "../../../../utils/toBase64"; +import { + addToHashMapOwnerReviews, + addToReviews, +} from "../../../../state/features/globalSlice"; +import { generateReviewId } from "../../../../utils/generateReviewId"; + +/* Reviews notes + Prevent them from adding a review to their own store + Filter their own review + Make sure user has at least one store order before being able to leave a review + Get first 100 reviews for the average (without metadata) +*/ + +interface AddReviewProps { + QFundId: string; + QFundOwner: string; + setOpenLeaveReview: (open: boolean) => void; +} + +export const AddReview: FC = ({ + QFundId, + QFundOwner, + setOpenLeaveReview, +}) => { + const dispatch = useDispatch(); + const username = useSelector((state: RootState) => state.auth?.user?.name); + + const [rating, setRating] = useState(null); + const [reviewTitle, setReviewTitle] = useState(""); + const [reviewDescription, setReviewDescription] = useState(""); + + // Verify if review identifier already exists + const verifyIfReviewIdExists = async ( + username: string, + identifier: string + ) => { + try { + const response = await qortalRequest({ + action: "LIST_QDN_RESOURCES", + service: "DOCUMENT", + name: username, + identifier: identifier, + includeMetadata: true, + limit: 1, + }); + if (response?.resources?.length > 0) { + return true; + } + return false; + } catch (err) { + console.log(err); + return false; + } + }; + + // Add review to QDN + const addReviewFunc = async () => { + let ownerName = ""; + let reviewId = ""; + let errorMsg = ""; + let userName = ""; + let ownerRegistrationNumber; + + if (QFundOwner) { + ownerName = QFundOwner; + } + + if (username) { + userName = username; + } + + // Get person's name registration number + + try { + const QFundOwnerRegistration = await qortalRequest({ + action: "GET_NAME_DATA", + name: ownerName, + }); + if (Object.keys(QFundOwnerRegistration).length > 0) { + ownerRegistrationNumber = QFundOwnerRegistration.registered; + } + } catch (error) { + console.error(error); + } + + // Validation + if (!ownerName) { + errorMsg = + "Cannot send a message without a access to the Q-Fund Owner's name!"; + } + + if (!userName) { + errorMsg = "Cannot add a review without having a name!"; + } + + if (!QFundId) { + errorMsg = "Cannot add a review without having a Q-Fund ID!"; + } + + if (!ownerRegistrationNumber) { + errorMsg = + "Cannot add a review without having a Q-Fund Owner's registration number!"; + } + + if (!rating || !reviewTitle || !reviewDescription) { + errorMsg = + "Cannot add a review without a rating, title, and description!"; + } + + if (errorMsg) { + dispatch( + setNotification({ + msg: errorMsg, + alertType: "error", + }) + ); + throw new Error(errorMsg); + } + + if (QFundOwner && QFundId && ownerRegistrationNumber && rating) { + // Create identifier for the review + reviewId = generateReviewId( + QFundOwner, + QFundId, + ownerRegistrationNumber, + rating + ); + } + + // Check if review identifier already exists + const doesExist = await verifyIfReviewIdExists(userName, reviewId); + if (doesExist) { + throw new Error( + "The review identifier already exists! Try changing your review's title" + ); + } + + // Resource raw data + const reviewObj = { + title: reviewTitle, + description: reviewDescription, + rating: rating, + created: Date.now(), + }; + + const reviewToBase64 = await objectToBase64(reviewObj); + try { + // Publish Review to QDN + const resourceResponse = await qortalRequest({ + action: "PUBLISH_QDN_RESOURCE", + name: userName, + service: "DOCUMENT", + identifier: reviewId, + data64: reviewToBase64, + filename: "review.json", + // Resource metadata down here + title: reviewTitle.slice(0, 60), + description: reviewDescription.slice(0, 150), + }); + setOpenLeaveReview(false); + dispatch( + addToReviews({ + id: reviewId, + name: userName, + created: Date.now(), + updated: Date.now(), + title: reviewTitle.slice(0, 60), + description: reviewDescription.slice(0, 150), + rating: rating, + }) + ); + dispatch( + addToHashMapOwnerReviews({ + id: reviewId, + name: userName, + created: Date.now(), + updated: Date.now(), + title: reviewTitle, + description: reviewDescription, + rating: rating, + isValid: true, + }) + ); + dispatch( + setNotification({ + alertType: "success", + msg: "Added Review Successfully!", + }) + ); + } catch (error: any) { + let notificationObj: any = null; + if (typeof error === "string") { + notificationObj = { + msg: error || "Failed to create review", + alertType: "error", + }; + } else if (typeof error?.error === "string") { + notificationObj = { + msg: error?.error || "Failed to create review", + alertType: "error", + }; + } else { + notificationObj = { + msg: error?.message || "Failed to create review", + alertType: "error", + }; + } + if (!notificationObj) return; + dispatch(setNotification(notificationObj)); + if (error instanceof Error) { + throw new Error(error.message); + } else { + throw new Error("An unknown error occurred"); + } + } + }; + + return ( + + + {`Leave a review for ${QFundOwner}`} + + + + + , + newValue: number | null + ) => { + setRating(newValue); + }} + precision={0.5} + value={rating} + style={{ fontSize: "55px", paddingTop: "5px" }} + /> + setReviewTitle(e.target.value as string)} + inputProps={{ maxLength: 180 }} + required + style={{ width: "100%" }} + /> + setReviewDescription(e.target.value as string)} + required + /> + + + { + setOpenLeaveReview(false); + }} + > + Close + + + Add Review + + + + + ); +}; diff --git a/src/components/common/Reviews/QFundOwnerReviewCard.tsx b/src/components/common/Reviews/QFundOwnerReviewCard.tsx new file mode 100644 index 0000000..358589c --- /dev/null +++ b/src/components/common/Reviews/QFundOwnerReviewCard.tsx @@ -0,0 +1,86 @@ +import { useState, FC, useEffect } from "react"; +import { Rating } from "@mui/material"; +import { + ReviewContainer, + ReviewDateFont, + ReviewDescriptionFont, + ReviewHeader, + ReviewTitleFont, + ReviewTitleRow, + ReviewUsernameFont, +} from "./QFundOwnerReviews-styles"; +import moment from "moment"; +import { useFetchOwnerReviews } from "../../../hooks/useFetchOwnerReviews"; +import { useSelector } from "react-redux"; +import { RootState } from "../../../state/store"; +import { OwnerReview } from "../../../state/features/globalSlice"; + +interface QFundOwnerReviewCardProps { + review: OwnerReview; +} + +export const QFundOwnerReviewCard: FC = ({ + review, +}) => { + const [showCompleteReview, setShowCompleteReview] = useState(false); + const [fullStoreTitle, setFullStoreTitle] = useState(""); + const [fullStoreDescription, setFullStoreDescription] = useState(""); + + const hashMapOwnerReviews = useSelector( + (state: RootState) => state.global.hashMapOwnerReviews + ); + + const { created, name, title, rating, description, id, updated } = review; + + const { getReview, checkAndUpdateResource } = useFetchOwnerReviews(); + + const handleFetchReviewRawData = async () => { + try { + if (name && id) { + // avoid fetching the same review twice on QDN if it's already in the hashmap + const res = checkAndUpdateResource({ + id, + updated, + }); + // if the review is not in the hashmap, fetch it from QDN + if (res) { + getReview(name, id, review); + } + } + } catch (error) { + console.error(error); + } + }; + + useEffect(() => { + Object.keys(hashMapOwnerReviews).find(key => { + if (key === review.id) { + setShowCompleteReview(true); + setFullStoreTitle(hashMapOwnerReviews[key].title); + setFullStoreDescription(hashMapOwnerReviews[key].description); + } + }); + }, [hashMapOwnerReviews]); + + return ( + { + setShowCompleteReview(true); + handleFetchReviewRawData(); + }} + showCompleteReview={showCompleteReview ? true : false} + > + + {name} + + {fullStoreTitle || title} + + + {moment(created).format("llll")} + + + {fullStoreDescription || description} + + + ); +}; diff --git a/src/components/common/Reviews/QFundOwnerReviews-styles.tsx b/src/components/common/Reviews/QFundOwnerReviews-styles.tsx new file mode 100644 index 0000000..e75214b --- /dev/null +++ b/src/components/common/Reviews/QFundOwnerReviews-styles.tsx @@ -0,0 +1,283 @@ +import { styled } from "@mui/material/styles"; +import { ReusableModal } from "../../modals/ReusableModal"; +import { Box, Button, Typography } from "@mui/material"; +import { TimesSVG } from "../../../assets/svgs/TimesSVG"; + +interface OwnerReviewsProps { + showCompleteReview: boolean; +} + +export const AddReviewButton = styled(Button)(({ theme }) => ({ + display: "flex", + alignItems: "center", + padding: "4px 15px", + gap: "10px", + fontFamily: "Livvic", + fontSize: "16px", + width: "auto", + color: theme.palette.mode === "dark" ? "#000000" : "#ffffff", + backgroundColor: theme.palette.mode === "dark" ? "#ffffff" : "#000000", + border: "none", + borderRadius: "5px", + transition: "all 0.3s ease-in-out", + "&:hover": { + cursor: "pointer", + backgroundColor: theme.palette.mode === "dark" ? "#ffffff" : "#000000", + boxShadow: + theme.palette.mode === "dark" + ? "0px 8px 10px 1px hsla(0,0%,0%,0.14), 0px 3px 14px 2px hsla(0,0%,0%,0.12), 0px 5px 5px -3px hsla(0,0%,0%,0.2)" + : "rgba(0, 0, 0, 0.1) 0px 4px 6px -1px, rgba(0, 0, 0, 0.06) 0px 2px 4px -1px;", + }, +})); + +export const AverageReviewContainer = styled(Box)({ + display: "flex", + flexDirection: "column", + alignItems: "center", + justifyContent: "flex-start", + maxHeight: "200px", + width: "100%", +}); + +export const ReviewsFont = styled(Typography)(({ theme }) => ({ + textAlign: "center", + fontFamily: "Mulish", + fontSize: "19px", + fontWeight: 400, + letterSpacing: "0px", + color: theme.palette.text.primary, + userSelect: "none", + marginBottom: "5px", +})); + +export const AverageReviewNumber = styled(Typography)(({ theme }) => ({ + fontFamily: "Raleway", + fontSize: "60px", + fontWeight: 600, + letterSpacing: "2px", + color: theme.palette.text.primary, + userSelect: "none", + lineHeight: "35px", + marginBottom: "25px", +})); + +export const TotalReviewsFont = styled(Typography)(({ theme }) => ({ + fontFamily: "Mulish", + fontSize: "19px", + fontWeight: 400, + color: theme.palette.text.primary, + userSelect: "none", + opacity: 0.8, + letterSpacing: 0, +})); + +export const ReviewContainer = styled(Box)( + ({ theme, showCompleteReview }) => ({ + display: "flex", + flexDirection: "column", + alignItems: "flex-start", + justifyContent: "flex-start", + gap: "10px", + padding: "5px", + borderRadius: "5px", + width: "100%", + transition: "all 0.3s ease-in-out", + "&:hover": { + cursor: showCompleteReview ? "auto" : "pointer", + backgroundColor: showCompleteReview + ? "transparent" + : theme.palette.mode === "light" + ? "#d3d3d3ac" + : "#aeabab1e", + }, + }) +); + +export const ReviewHeader = styled(Box)({ + display: "flex", + flexDirection: "column", + gap: "1px", +}); + +export const ReviewTitleRow = styled(Box)({ + display: "flex", + flexDirection: "row", + alignItems: "center", + justifyContent: "flex-start", + gap: "15px", +}); + +export const ReviewUsernameFont = styled(Box)(({ theme }) => ({ + fontFamily: "Montserrat", + fontSize: "17px", + fontWeight: 400, + letterSpacing: "0.3px", + color: theme.palette.text.primary, +})); + +export const ReviewTitleFont = styled(Box)(({ theme }) => ({ + fontFamily: "Montserrat, sans-serif", + fontSize: "18px", + fontWeight: 500, + letterSpacing: "-0.3px", + color: theme.palette.text.primary, +})); + +export const ReviewDateFont = styled(Typography)(({ theme }) => ({ + fontFamily: "Mulish", + fontSize: "16px", + fontWeight: 400, + letterSpacing: "0px", + color: theme.palette.text.primary, + opacity: 0.8, +})); + +export const ReviewDescriptionFont = styled(Box)(({ theme }) => ({ + fontFamily: "Mulish", + fontSize: "19px", + fontWeight: 400, + letterSpacing: "0px", + color: theme.palette.text.primary, +})); + +export const OwnerReviewsContainer = styled(Box)(({ theme }) => ({ + display: "flex", + flexDirection: "column", + flexGrow: 1, + gap: "30px", + overflowY: "auto", + "&::-webkit-scrollbar-track": { + backgroundColor: "transparent", + }, + "&::-webkit-scrollbar-track:hover": { + backgroundColor: "transparent", + }, + "&::-webkit-scrollbar": { + width: "8px", + height: "10px", + backgroundColor: "transparent", + }, + "&::-webkit-scrollbar-thumb": { + backgroundColor: theme.palette.mode === "light" ? "#d3d9e1" : "#414763", + borderRadius: "8px", + backgroundClip: "content-box", + border: "4px solid transparent", + }, + "&::-webkit-scrollbar-thumb:hover": { + backgroundColor: theme.palette.mode === "light" ? "#b7bcc4" : "#40455f", + }, +})); + +export const CloseIconModal = styled(TimesSVG)({ + position: "absolute", + top: "15px", + right: "5px", + transition: "all 0.2s ease-in-out", + "&:hover": { + cursor: "pointer", + transform: "scale(1.1)", + }, +}); + +export const ReusableModalStyled = styled(ReusableModal)(({ theme }) => ({ + "& [class$='MuiBox-root']": { + "&::-webkit-scrollbar-track": { + backgroundColor: "transparent", + }, + "&::-webkit-scrollbar-track:hover": { + backgroundColor: "transparent", + }, + "&::-webkit-scrollbar": { + width: "8px", + height: "10px", + backgroundColor: "transparent", + }, + "&::-webkit-scrollbar-thumb": { + backgroundColor: theme.palette.mode === "light" ? "#d3d9e1" : "#414763", + borderRadius: "8px", + backgroundClip: "content-box", + border: "4px solid transparent", + }, + "&::-webkit-scrollbar-thumb:hover": { + backgroundColor: theme.palette.mode === "light" ? "#b7bcc4" : "#40455f", + }, + }, +})); + +export const OwnerAvatar = styled("img")({ + width: "90px", + height: "90px", + borderRadius: "50%", + objectFit: "cover", +}); + +export const OwnerName = styled(Box)(({ theme }) => ({ + display: "flex", + justifySelf: "center", + userSelect: "none", + fontFamily: "Copse", + fontWeight: 400, + fontSize: "25px", + letterSpacing: "0.5px", + color: theme.palette.text.primary, +})); + +export const Divider = styled(Box)(({ theme }) => ({ + width: "100%", + height: "2px", + backgroundColor: theme.palette.text.primary, + padding: "0 10px", + divider: 0.7, +})); + +export const HeaderRow = styled(Box)(({ theme }) => ({ + display: "grid", + gridTemplateColumns: "auto 1fr", + alignItems: "center", + justifyContent: "flex-start", + width: "100%", + padding: "10px 15px", + fontFamily: "Copse, sans-serif", + fontSize: "23px", + color: theme.palette.text.primary, +})); + +export const CardDetailsContainer = styled(Box)({ + display: "flex", + flexDirection: "column", + flexGrow: 1, +}); + +export const OwnerNameCol = styled(Box)({ + display: "flex", + alignItems: "center", + flexDirection: "column", +}); + +export const CloseButtonRow = styled(Box)({ + display: "flex", + gap: 1, + justifyContent: "flex-end", +}); + +export const CreateButton = styled(Button)({ + fontFamily: "Montserrat", + fontWeight: 400, + letterSpacing: "0.2px", + textTransform: "uppercase", + fontSize: "15px", + backgroundColor: "#32d43a", + color: "black", + "&:hover": { + cursor: "pointer", + backgroundColor: "#2bb131", + }, +}); + +export const CloseButton = styled(Button)({ + fontFamily: "Montserrat", + fontWeight: 400, + letterSpacing: "0.2px", + textTransform: "uppercase", + fontSize: "15px", +}); diff --git a/src/components/common/Reviews/QFundOwnerReviews.tsx b/src/components/common/Reviews/QFundOwnerReviews.tsx new file mode 100644 index 0000000..b57adae --- /dev/null +++ b/src/components/common/Reviews/QFundOwnerReviews.tsx @@ -0,0 +1,245 @@ +import { FC, useState, useCallback, useEffect, useMemo } from "react"; +import { CircularProgress, Grid, Rating, useTheme } from "@mui/material"; +import { + CardDetailsContainer, + Divider, + HeaderRow, + OwnerAvatar, + OwnerName, + OwnerNameCol, + OwnerReviewsContainer, +} from "./QFundOwnerReviews-styles"; +import { StarSVG } from "../../../assets/svgs/StarSVG"; +import { + AddReviewButton, + AverageReviewContainer, + AverageReviewNumber, + CloseIconModal, + ReviewsFont, + TotalReviewsFont, +} from "./QFundOwnerReviews-styles"; +import { QFundOwnerReviewCard } from "./QFundOwnerReviewCard"; +import { ReusableModal } from "../../modals/ReusableModal"; +import { useDispatch, useSelector } from "react-redux"; +import LazyLoad from "../../../components/common/LazyLoad"; +import { RootState } from "../../../state/store"; +import { AddReview } from "./AddReview/AddReview"; +import { REVIEW_BASE } from "../../../constants"; +import { + OwnerReview, + upsertReviews, +} from "../../../state/features/globalSlice"; +import { AccountCircleSVG } from "../../../assets/svgs/AccountCircleSVG"; + +// Fetch 100 reviews from the crowdfund owner +// Average reviews from the crowdfund owner + +interface QFundOwnerReviewsProps { + QFundId: string; + QFundOwner: string; + QFundOwnerAvatar: string; + QFundOwnerRegisteredNumber: number | null; + averageOwnerRating: number | null; + setOpenQFundOwnerReviews: (open: boolean) => void; +} + +export const QFundOwnerReviews: FC = ({ + QFundId, + QFundOwner, + QFundOwnerAvatar, + QFundOwnerRegisteredNumber, + averageOwnerRating, + setOpenQFundOwnerReviews, +}) => { + const theme = useTheme(); + const dispatch = useDispatch(); + + const ownerReviews = useSelector( + (state: RootState) => state.global.ownerReviews + ); + + const [openLeaveReview, setOpenLeaveReview] = useState(false); + const [loadingReviews, setLoadingReviews] = useState(false); + const [reviewIdentifier, setReviewIdentifier] = useState(""); + + // Fetch all the owner's reviews (regardless of the Q-Fund) resources from QDN + const getQFundOwnerReviews = useCallback(async () => { + if (!QFundId || !QFundOwner) return; + try { + setLoadingReviews(true); + let ownerRegistrationNumber; + if (QFundOwnerRegisteredNumber) { + ownerRegistrationNumber = QFundOwnerRegisteredNumber; + } else { + throw new Error("No registered number found for QFund owner name"); + } + + const offset = ownerReviews.length; + const shortQFundOwner = QFundOwner.slice(0, 15); + // Those first three constants will remain the same no matter which crowdfund the owner made + const query = `${REVIEW_BASE}-${shortQFundOwner}-${ownerRegistrationNumber}`; + // Set the review identifier in the local state so we can filter only the reviews that are for the current Q-Fund + setReviewIdentifier(query); + // Since it the url includes /resources, you know you're fetching the resources and not the raw data + const url = `/arbitrary/resources/search?service=DOCUMENT&query=${query}&limit=10&includemetadata=true&mode=LATEST&offset=${offset}&reverse=true`; + const response = await fetch(url, { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + }); + const responseData = await response.json(); + // Modify resource into data that is more easily used on the front end + const structuredReviewData = responseData.map( + (review: any): OwnerReview => { + const splitIdentifier = review.identifier.split("-"); + return { + id: review?.identifier, + name: review?.name, + created: review?.created, + updated: review?.updated, + title: review?.metadata?.title, + description: review?.metadata?.description, + rating: Number(splitIdentifier[splitIdentifier.length - 1]) / 10, + }; + } + ); + + // Filter out duplicates by checking if the review id already exists in ownerReviews in global redux store + const copiedOwnerReviews: OwnerReview[] = [...ownerReviews]; + + structuredReviewData.forEach((review: OwnerReview) => { + const index = ownerReviews.findIndex( + (ownerReview: OwnerReview) => ownerReview.id === review.id + ); + if (index !== -1) { + copiedOwnerReviews[index] = review; + } else { + copiedOwnerReviews.push(review); + } + }); + + dispatch(upsertReviews(copiedOwnerReviews)); + } catch (error) { + console.error(error); + } finally { + setLoadingReviews(false); + } + }, [ownerReviews, QFundId, QFundOwner]); + + // Pass this function down to lazy loader + const handleGetReviews = useCallback(async () => { + await getQFundOwnerReviews(); + }, [getQFundOwnerReviews]); + + return ( + <> + + {QFundOwnerAvatar ? ( + + ) : ( + + )} + + {QFundOwner} + setOpenLeaveReview(true)}> + {" "} + Add Review + + + setOpenQFundOwnerReviews(false)} + color={theme.palette.text.primary} + height={"26"} + width={"26"} + /> + + + + + {averageOwnerRating && ( + + + Average Review + + {averageOwnerRating || null} + + + + {`${ownerReviews.length} review${ + ownerReviews.length === 1 ? "" : "s" + }`} + + + + )} + + + {ownerReviews.length === 0 ? ( + No reviews yet + ) : ( + ownerReviews + .filter((review: OwnerReview) => { + // Change and add filter here to remove owner's own reviews + return review.id.includes(reviewIdentifier); + }) + .map((review: OwnerReview) => { + return ; + }) + )} + + + + + + + + + + ); +}; diff --git a/src/components/common/VideoPlayer.tsx b/src/components/common/VideoPlayer.tsx new file mode 100644 index 0000000..cad719e --- /dev/null +++ b/src/components/common/VideoPlayer.tsx @@ -0,0 +1,812 @@ +import React, { useContext, useEffect, useMemo, useRef, useState } from 'react' +import ReactDOM from 'react-dom' +import { Box, IconButton, Slider } from '@mui/material' +import { CircularProgress, Typography } from '@mui/material' +import { Key } from 'ts-key-enum' +import { + PlayArrow, + Pause, + VolumeUp, + Fullscreen, + PictureInPicture, VolumeOff +} from '@mui/icons-material' +import { styled } from '@mui/system' +import { MyContext } from '../../wrappers/DownloadWrapper' +import { useDispatch, useSelector } from 'react-redux' +import { RootState } from '../../state/store' +import { Refresh } from '@mui/icons-material' + +import { Menu, MenuItem } from '@mui/material' +import { MoreVert as MoreIcon } from '@mui/icons-material' +import { setVideoPlaying } from '../../state/features/globalSlice' +const VideoContainer = styled(Box)` + position: relative; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + margin: 0px; + padding: 0px; +` + +const VideoElement = styled('video')` + width: 100%; + height: auto; + max-height: calc(100vh - 150px); + background: rgb(33, 33, 33); +` + +const ControlsContainer = styled(Box)` + position: absolute; + display: flex; + align-items: center; + justify-content: space-between; + bottom: 0; + left: 0; + right: 0; + padding: 8px; + background-color: rgba(0, 0, 0, 0.6); +` + +interface VideoPlayerProps { + src?: string + poster?: string + name?: string + identifier?: string + service?: string + autoplay?: boolean + from?: string | null + customStyle?: any + user?: string + jsonId?: string +} + +export const VideoPlayer: React.FC = ({ + poster, + name, + identifier, + service, + autoplay = true, + from = null, + customStyle = {}, + user = '', + jsonId = '' +}) => { + const dispatch = useDispatch() + const videoRef = useRef(null) + const [playing, setPlaying] = useState(false) + const [volume, setVolume] = useState(1) + const [mutedVolume, setMutedVolume] = useState(1) + const [isMuted, setIsMuted] = useState(false) + const [progress, setProgress] = useState(0) + const [isLoading, setIsLoading] = useState(false) + const [canPlay, setCanPlay] = useState(false) + const [startPlay, setStartPlay] = useState(false) + const [isMobileView, setIsMobileView] = useState(false) + const [playbackRate, setPlaybackRate] = useState(1) + const [anchorEl, setAnchorEl] = useState(null) + const videoPlaying = useSelector((state: RootState) => state.global.videoPlaying); + const reDownload = useRef(false) + const { downloads } = useSelector((state: RootState) => state.global) + const download = useMemo(() => { + if (!downloads || !identifier) return {} + const findDownload = downloads[identifier] + + if (!findDownload) return {} + return findDownload + }, [downloads, identifier]) + + const src = useMemo(() => { + return download?.url || '' + }, [download?.url]) + const resourceStatus = useMemo(() => { + return download?.status || {} + }, [download]) + + const minSpeed = 0.25; + const maxSpeed = 4.0; + const speedChange = 0.25; + + const updatePlaybackRate = (newSpeed: number) => { + if (videoRef.current) { + if (newSpeed > maxSpeed || newSpeed < minSpeed) + newSpeed = minSpeed + videoRef.current.playbackRate = newSpeed + setPlaybackRate(newSpeed) + } + } + + const increaseSpeed = (wrapOverflow = true) => { + const changedSpeed = playbackRate + speedChange + let newSpeed = wrapOverflow ? changedSpeed : Math.min(changedSpeed, maxSpeed) + + + if (videoRef.current) { + updatePlaybackRate(newSpeed); + } + } + + const decreaseSpeed = () => { + if (videoRef.current) { + updatePlaybackRate(playbackRate - speedChange); + } + } + + + const toggleRef = useRef(null) + const { downloadVideo } = useContext(MyContext) + const togglePlay = async () => { + if (!videoRef.current) return + setStartPlay(true) + if (!src || resourceStatus?.status !== 'READY') { + const el = document.getElementById('videoWrapper') + if (el) { + el?.parentElement?.removeChild(el) + } + ReactDOM.flushSync(() => { + setIsLoading(true) + }) + getSrc() + } + if (playing) { + videoRef.current.pause() + } else { + videoRef.current.play() + } + setPlaying(!playing) + } + + const onVolumeChange = (_: any, value: number | number[]) => { + if (!videoRef.current) return + videoRef.current.volume = value as number + setVolume(value as number) + setIsMuted(false) + } + + const onProgressChange = (_: any, value: number | number[]) => { + if (!videoRef.current) return + videoRef.current.currentTime = value as number + setProgress(value as number) + if (!playing) { + videoRef.current.play() + setPlaying(true) + } + } + + const handleEnded = () => { + setPlaying(false) + } + + const updateProgress = () => { + if (!videoRef.current) return + setProgress(videoRef.current.currentTime) + } + + const [isFullscreen, setIsFullscreen] = useState(false) + + const enterFullscreen = () => { + if (!videoRef.current) return + if (videoRef.current.requestFullscreen) { + videoRef.current.requestFullscreen() + } + } + + const exitFullscreen = () => { + if (document.exitFullscreen) { + document.exitFullscreen() + } + } + + const toggleFullscreen = () => { + isFullscreen ? exitFullscreen() : enterFullscreen() + } + const togglePictureInPicture = async () => { + if (!videoRef.current) return + if (document.pictureInPictureElement === videoRef.current) { + await document.exitPictureInPicture() + } else { + await videoRef.current.requestPictureInPicture() + } + } + + useEffect(() => { + const handleFullscreenChange = () => { + setIsFullscreen(!!document.fullscreenElement) + } + + document.addEventListener('fullscreenchange', handleFullscreenChange) + return () => { + document.removeEventListener('fullscreenchange', handleFullscreenChange) + } + }, []) + + useEffect(()=> { + if(videoPlaying && videoPlaying.id === identifier && src && videoRef?.current){ + handleCanPlay() + videoRef.current.volume = videoPlaying.volume + videoRef.current.currentTime = videoPlaying.currentTime + videoRef.current.play() + setPlaying(true) + setStartPlay(true) + dispatch(setVideoPlaying(null)) + } + }, [videoPlaying, identifier, src]) + + const handleCanPlay = () => { + setIsLoading(false) + setCanPlay(true) + } + + const getSrc = React.useCallback(async () => { + if (!name || !identifier || !service || !jsonId || !user) return + try { + downloadVideo({ + name, + service, + identifier, + properties: { + jsonId, + user + } + }) + } catch (error) { + console.error(error) + } + }, [identifier, name, service, jsonId, user]) + + useEffect(() => { + const videoElement = videoRef.current + + const handleLeavePictureInPicture = async (event: any) => { + const target = event?.target + if (target) { + target.pause() + if (setPlaying) { + setPlaying(false) + } + } + } + + if (videoElement) { + videoElement.addEventListener( + 'leavepictureinpicture', + handleLeavePictureInPicture + ) + } + + return () => { + if (videoElement) { + videoElement.removeEventListener( + 'leavepictureinpicture', + handleLeavePictureInPicture + ) + } + } + }, []) + + useEffect(() => { + const videoElement = videoRef.current + + const minimizeVideo = async () => { + if (!videoElement) return + + dispatch(setVideoPlaying(videoElement)) + // const handleClose = () => { + // if (videoElement && videoElement.parentElement) { + // const el = document.getElementById('videoWrapper') + // if (el) { + // el?.parentElement?.removeChild(el) + // } + // } + // } + // const createCloseButton = (): HTMLButtonElement => { + // const closeButton = document.createElement('button') + // closeButton.textContent = 'X' + // closeButton.style.position = 'absolute' + // closeButton.style.top = '0' + // closeButton.style.right = '0' + // closeButton.style.backgroundColor = 'rgba(255, 255, 255, 0.7)' + // closeButton.style.border = 'none' + // closeButton.style.fontWeight = 'bold' + // closeButton.style.fontSize = '1.2rem' + // closeButton.style.cursor = 'pointer' + // closeButton.style.padding = '2px 8px' + // closeButton.style.borderRadius = '0 0 0 4px' + + // closeButton.addEventListener('click', handleClose) + + // return closeButton + // } + // const buttonClose = createCloseButton() + // const videoWrapper = document.createElement('div') + // videoWrapper.id = 'videoWrapper' + // videoWrapper.style.position = 'fixed' + // videoWrapper.style.zIndex = '900000009' + // videoWrapper.style.bottom = '0px' + // videoWrapper.style.right = '0px' + + // videoElement.parentElement?.insertBefore(videoWrapper, videoElement) + // videoWrapper.appendChild(videoElement) + + // videoWrapper.appendChild(buttonClose) + // videoElement.controls = true + // videoElement.style.height = 'auto' + // videoElement.style.width = '300px' + + // document.body.appendChild(videoWrapper) + } + + return () => { + if (videoElement) { + if (videoElement && !videoElement.paused && !videoElement.ended) { + minimizeVideo() + } + } + } + }, []) + + function formatTime(seconds: number): string { + seconds = Math.floor(seconds) + let minutes: number | string = Math.floor(seconds / 60) + let hours: number | string = Math.floor(minutes / 60) + + let remainingSeconds: number | string = seconds % 60 + let remainingMinutes: number | string = minutes % 60 + + if (remainingSeconds < 10) { + remainingSeconds = '0' + remainingSeconds + } + + if (remainingMinutes < 10) { + remainingMinutes = '0' + remainingMinutes + } + + if (hours === 0) { + hours = '' + } + else { + hours = hours + ':' + } + + return hours + remainingMinutes + ':' + remainingSeconds + } + + const reloadVideo = () => { + if (!videoRef.current) return + const currentTime = videoRef.current.currentTime + videoRef.current.src = src + videoRef.current.load() + videoRef.current.currentTime = currentTime + if (playing) { + videoRef.current.play() + } + } + + useEffect(() => { + if ( + resourceStatus?.status === 'DOWNLOADED' && + reDownload?.current === false + ) { + getSrc() + reDownload.current = true + } + }, [getSrc, resourceStatus]) + + const handleMenuOpen = (event: any) => { + setAnchorEl(event.currentTarget) + } + + const handleMenuClose = () => { + setAnchorEl(null) + } + + useEffect(() => { + const videoWidth = videoRef?.current?.offsetWidth + if (videoWidth && videoWidth <= 600) { + setIsMobileView(true) + } + }, [canPlay]) + + const getDownloadProgress = (current: number, total: number) => { + const progress = current / total * 100; + return Number.isNaN(progress) ? '' : progress.toFixed(0) + '%' + } + const mute = () => { + setIsMuted(true) + setMutedVolume(volume) + setVolume(0) + if (videoRef.current) videoRef.current.volume = 0 + } + const unMute = () => { + setIsMuted(false) + setVolume(mutedVolume) + if (videoRef.current) videoRef.current.volume = mutedVolume + } + + const toggleMute = () => { + isMuted ? unMute() : mute(); + } + + const changeVolume = (volumeChange: number) => { + if (videoRef.current) { + const minVolume = 0; + const maxVolume = 1; + + + let newVolume = volumeChange + volume + + newVolume = Math.max(newVolume, minVolume) + newVolume = Math.min(newVolume, maxVolume) + + setIsMuted(false) + setMutedVolume(newVolume) + videoRef.current.volume = newVolume + setVolume(newVolume); + } + + } + const setProgressRelative = (secondsChange: number) => { + if (videoRef.current) { + const currentTime = videoRef.current?.currentTime + const minTime = 0 + const maxTime = videoRef.current?.duration || 100 + + let newTime = currentTime + secondsChange; + newTime = Math.max(newTime, minTime) + newTime = Math.min(newTime, maxTime) + videoRef.current.currentTime = newTime; + setProgress(newTime); + } + } + + const setProgressAbsolute = (videoPercent: number) => { + if (videoRef.current) { + videoPercent = Math.min(videoPercent, 100) + videoPercent = Math.max(videoPercent, 0) + const finalTime = videoRef.current?.duration * videoPercent / 100 + videoRef.current.currentTime = finalTime + setProgress(finalTime); + } + } + + + const keyboardShortcutsDown = (e: React.KeyboardEvent) => { + e.preventDefault() + + switch (e.key) { + case Key.Add: increaseSpeed(false); break; + case '+': increaseSpeed(false); break; + case '>': increaseSpeed(false); break; + + case Key.Subtract: decreaseSpeed(); break; + case '-': decreaseSpeed(); break; + case '<': decreaseSpeed(); break; + + case Key.ArrowLeft: { + if (e.shiftKey) setProgressRelative(-300); + else if (e.ctrlKey) setProgressRelative(-60); + else if (e.altKey) setProgressRelative(-10); + else setProgressRelative(-5); + } break; + + case Key.ArrowRight: { + if (e.shiftKey) setProgressRelative(300); + else if (e.ctrlKey) setProgressRelative(60); + else if (e.altKey) setProgressRelative(10); + else setProgressRelative(5); + } break; + + case Key.ArrowDown: changeVolume(-0.05); break; + case Key.ArrowUp: changeVolume(0.05); break; + } + } + + const keyboardShortcutsUp = (e: React.KeyboardEvent) => { + e.preventDefault() + + switch (e.key) { + case ' ': togglePlay(); break; + case 'm': toggleMute(); break; + + case 'f': enterFullscreen(); break; + case Key.Escape: exitFullscreen(); break; + + case '0': setProgressAbsolute(0); break; + case '1': setProgressAbsolute(10); break; + case '2': setProgressAbsolute(20); break; + case '3': setProgressAbsolute(30); break; + case '4': setProgressAbsolute(40); break; + case '5': setProgressAbsolute(50); break; + case '6': setProgressAbsolute(60); break; + case '7': setProgressAbsolute(70); break; + case '8': setProgressAbsolute(80); break; + case '9': setProgressAbsolute(90); break; + } + } + + + return ( + + + {isLoading && ( + + + {resourceStatus && ( + + {resourceStatus?.status === 'REFETCHING' ? ( + <> + <> + {getDownloadProgress(resourceStatus?.localChunkCount, resourceStatus?.totalChunkCount)} + + + <> Refetching in 25 seconds + + ) : resourceStatus?.status === 'DOWNLOADED' ? ( + <>Download Completed: building video... + ) : resourceStatus?.status !== 'READY' ? ( + <> + {getDownloadProgress(resourceStatus?.localChunkCount, resourceStatus?.totalChunkCount)} + + + ) : ( + <>Fetching video... + )} + + )} + + )} + {((!src && !isLoading) || !startPlay) && ( + { + if (from === 'create') return + dispatch(setVideoPlaying(null)) + togglePlay() + }} + sx={{ + cursor: 'pointer' + }} + > + + + )} + + + + + {isMobileView && canPlay ? ( + <> + + {playing ? : } + + + + + + + + + + + + + + increaseSpeed()}> + + Speed: {playbackRate}x + + + + + + + + + + + ) : canPlay ? ( + <> + + {playing ? : } + + + + + + + {progress && videoRef.current?.duration && formatTime(progress)}/ + {progress && + videoRef.current?.duration && + formatTime(videoRef.current?.duration)} + + + {isMuted ? : } + + + increaseSpeed()} + > + Speed: {playbackRate}x + + + + + + + + + + ) : null} + + + ) +} diff --git a/src/components/common/VideoPlayerGlobal.tsx b/src/components/common/VideoPlayerGlobal.tsx new file mode 100644 index 0000000..da14639 --- /dev/null +++ b/src/components/common/VideoPlayerGlobal.tsx @@ -0,0 +1,648 @@ +import React, { useContext, useEffect, useMemo, useRef, useState } from 'react' +import ReactDOM from 'react-dom' +import { Box, IconButton, Slider, useTheme } from '@mui/material' +import { CircularProgress, Typography } from '@mui/material' +import { Key } from 'ts-key-enum' +import { + PlayArrow, + Pause, + VolumeUp, + Fullscreen, + PictureInPicture, VolumeOff +} from '@mui/icons-material' +import { styled } from '@mui/system' +import { MyContext } from '../../wrappers/DownloadWrapper' +import { useDispatch, useSelector } from 'react-redux' +import { RootState } from '../../state/store' +import { Refresh } from '@mui/icons-material' +import CloseIcon from '@mui/icons-material/Close'; + +import { Menu, MenuItem } from '@mui/material' +import { MoreVert as MoreIcon } from '@mui/icons-material' +import { setVideoPlaying } from '../../state/features/globalSlice' +const VideoContainer = styled(Box)` + position: relative; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + margin: 0px; + padding: 0px; +` + +const VideoElement = styled('video')` + width: 100%; + height: auto; + max-height: calc(100vh - 150px); + background: rgb(33, 33, 33); +` + +const ControlsContainer = styled(Box)` + position: absolute; + display: flex; + align-items: center; + justify-content: space-between; + bottom: 0; + left: 0; + right: 0; + padding: 8px; + background-color: rgba(0, 0, 0, 0.6); +` + +interface VideoPlayerProps { + src?: string + poster?: string + name?: string + identifier?: string + service?: string + autoplay?: boolean + from?: string | null + customStyle?: any + user?: string + jsonId?: string + element?: null | any + checkIfDrag?: ()=> boolean; +} + +export const VideoPlayerGlobal: React.FC = ({ + poster, + name, + identifier, + service, + autoplay = true, + from = null, + customStyle = {}, + user = '', + jsonId = '', + element, + checkIfDrag +}) => { + const theme = useTheme() + + const videoRef = useRef(null) + const [playing, setPlaying] = useState(false) + const [volume, setVolume] = useState(1) + const [mutedVolume, setMutedVolume] = useState(1) + const [isMuted, setIsMuted] = useState(false) + const [progress, setProgress] = useState(0) + const [isLoading, setIsLoading] = useState(false) + const [canPlay, setCanPlay] = useState(false) + const [startPlay, setStartPlay] = useState(false) + const [isMobileView, setIsMobileView] = useState(false) + const [playbackRate, setPlaybackRate] = useState(1) + const [anchorEl, setAnchorEl] = useState(null) + const dispatch = useDispatch() + const reDownload = useRef(false) + const { downloads } = useSelector((state: RootState) => state.global) + const download = useMemo(() => { + if (!downloads || !identifier) return {} + const findDownload = downloads[identifier] + + if (!findDownload) return {} + return findDownload + }, [downloads, identifier]) + + + const resourceStatus = useMemo(() => { + return download?.status || {} + }, [download]) + + const minSpeed = 0.25; + const maxSpeed = 4.0; + const speedChange = 0.25; + + const updatePlaybackRate = (newSpeed: number) => { + if (videoRef.current) { + if (newSpeed > maxSpeed || newSpeed < minSpeed) + newSpeed = minSpeed + videoRef.current.playbackRate = newSpeed + setPlaybackRate(newSpeed) + } + } + + const increaseSpeed = (wrapOverflow = true) => { + const changedSpeed = playbackRate + speedChange + let newSpeed = wrapOverflow ? changedSpeed : Math.min(changedSpeed, maxSpeed) + + + if (videoRef.current) { + updatePlaybackRate(newSpeed); + } + } + + const decreaseSpeed = () => { + if (videoRef.current) { + updatePlaybackRate(playbackRate - speedChange); + } + } + + + const toggleRef = useRef(null) + const { downloadVideo } = useContext(MyContext) + const togglePlay = async () => { + + if(checkIfDrag && checkIfDrag()) return + if (!videoRef.current) return + if (playing) { + videoRef.current.pause() + } else { + videoRef.current.play() + } + setPlaying((prev)=> !prev) + } + + const onVolumeChange = (_: any, value: number | number[]) => { + if (!videoRef.current) return + videoRef.current.volume = value as number + setVolume(value as number) + setIsMuted(false) + } + + const onProgressChange = (_: any, value: number | number[]) => { + if (!videoRef.current) return + videoRef.current.currentTime = value as number + setProgress(value as number) + if (!playing) { + videoRef.current.play() + setPlaying(true) + } + } + + const handleEnded = () => { + setPlaying(false) + } + + const updateProgress = () => { + if (!videoRef.current) return + setProgress(videoRef.current.currentTime) + } + + const [isFullscreen, setIsFullscreen] = useState(false) + + const enterFullscreen = () => { + if (!videoRef.current) return + if (videoRef.current.requestFullscreen) { + videoRef.current.requestFullscreen() + } + } + + const exitFullscreen = () => { + if (document.exitFullscreen) { + document.exitFullscreen() + } + } + + const toggleFullscreen = () => { + isFullscreen ? exitFullscreen() : enterFullscreen() + } + const togglePictureInPicture = async () => { + if (!videoRef.current) return + if (document.pictureInPictureElement === videoRef.current) { + await document.exitPictureInPicture() + } else { + await videoRef.current.requestPictureInPicture() + } + } + + useEffect(() => { + const handleFullscreenChange = () => { + setIsFullscreen(!!document.fullscreenElement) + } + + document.addEventListener('fullscreenchange', handleFullscreenChange) + return () => { + document.removeEventListener('fullscreenchange', handleFullscreenChange) + } + }, []) + + + const handleCanPlay = () => { + setIsLoading(false) + setCanPlay(true) + } + + + + useEffect(() => { + const videoElement = videoRef.current + + const handleLeavePictureInPicture = async (event: any) => { + const target = event?.target + if (target) { + target.pause() + if (setPlaying) { + setPlaying(false) + } + } + } + + if (videoElement) { + videoElement.addEventListener( + 'leavepictureinpicture', + handleLeavePictureInPicture + ) + } + + return () => { + if (videoElement) { + videoElement.removeEventListener( + 'leavepictureinpicture', + handleLeavePictureInPicture + ) + } + } + }, []) + + + + function formatTime(seconds: number): string { + seconds = Math.floor(seconds) + let minutes: number | string = Math.floor(seconds / 60) + let hours: number | string = Math.floor(minutes / 60) + + let remainingSeconds: number | string = seconds % 60 + let remainingMinutes: number | string = minutes % 60 + + if (remainingSeconds < 10) { + remainingSeconds = '0' + remainingSeconds + } + + if (remainingMinutes < 10) { + remainingMinutes = '0' + remainingMinutes + } + + if (hours === 0) { + hours = '' + } + else { + hours = hours + ':' + } + + return hours + remainingMinutes + ':' + remainingSeconds + } + + const reloadVideo = () => { + if (!videoRef.current) return + const src = videoRef.current.src + const currentTime = videoRef.current.currentTime + videoRef.current.src = src + videoRef.current.load() + videoRef.current.currentTime = currentTime + if (playing) { + videoRef.current.play() + } + } + + + const handleMenuOpen = (event: any) => { + setAnchorEl(event.currentTarget) + } + + + const handleMenuClose = () => { + setAnchorEl(null) + } + + useEffect(() => { + const videoWidth = videoRef?.current?.offsetWidth + if (videoWidth && videoWidth <= 600) { + setIsMobileView(true) + } + }, [canPlay]) + + const getDownloadProgress = (current: number, total: number) => { + const progress = current / total * 100; + return Number.isNaN(progress) ? '' : progress.toFixed(0) + '%' + } + const mute = () => { + setIsMuted(true) + setMutedVolume(volume) + setVolume(0) + if (videoRef.current) videoRef.current.volume = 0 + } + const unMute = () => { + setIsMuted(false) + setVolume(mutedVolume) + if (videoRef.current) videoRef.current.volume = mutedVolume + } + + const toggleMute = () => { + isMuted ? unMute() : mute(); + } + + const changeVolume = (volumeChange: number) => { + if (videoRef.current) { + const minVolume = 0; + const maxVolume = 1; + + + let newVolume = volumeChange + volume + + newVolume = Math.max(newVolume, minVolume) + newVolume = Math.min(newVolume, maxVolume) + + setIsMuted(false) + setMutedVolume(newVolume) + videoRef.current.volume = newVolume + setVolume(newVolume); + } + + } + const setProgressRelative = (secondsChange: number) => { + if (videoRef.current) { + const currentTime = videoRef.current?.currentTime + const minTime = 0 + const maxTime = videoRef.current?.duration || 100 + + let newTime = currentTime + secondsChange; + newTime = Math.max(newTime, minTime) + newTime = Math.min(newTime, maxTime) + videoRef.current.currentTime = newTime; + setProgress(newTime); + } + } + + const setProgressAbsolute = (videoPercent: number) => { + if (videoRef.current) { + videoPercent = Math.min(videoPercent, 100) + videoPercent = Math.max(videoPercent, 0) + const finalTime = videoRef.current?.duration * videoPercent / 100 + videoRef.current.currentTime = finalTime + setProgress(finalTime); + } + } + + + const keyboardShortcutsDown = (e: React.KeyboardEvent) => { + e.preventDefault() + + switch (e.key) { + case Key.Add: increaseSpeed(false); break; + case '+': increaseSpeed(false); break; + case '>': increaseSpeed(false); break; + + case Key.Subtract: decreaseSpeed(); break; + case '-': decreaseSpeed(); break; + case '<': decreaseSpeed(); break; + + case Key.ArrowLeft: { + if (e.shiftKey) setProgressRelative(-300); + else if (e.ctrlKey) setProgressRelative(-60); + else if (e.altKey) setProgressRelative(-10); + else setProgressRelative(-5); + } break; + + case Key.ArrowRight: { + if (e.shiftKey) setProgressRelative(300); + else if (e.ctrlKey) setProgressRelative(60); + else if (e.altKey) setProgressRelative(10); + else setProgressRelative(5); + } break; + + case Key.ArrowDown: changeVolume(-0.05); break; + case Key.ArrowUp: changeVolume(0.05); break; + } + } + + const keyboardShortcutsUp = (e: React.KeyboardEvent) => { + e.preventDefault() + + switch (e.key) { + case ' ': togglePlay(); break; + case 'm': toggleMute(); break; + + case 'f': enterFullscreen(); break; + case Key.Escape: exitFullscreen(); break; + + case '0': setProgressAbsolute(0); break; + case '1': setProgressAbsolute(10); break; + case '2': setProgressAbsolute(20); break; + case '3': setProgressAbsolute(30); break; + case '4': setProgressAbsolute(40); break; + case '5': setProgressAbsolute(50); break; + case '6': setProgressAbsolute(60); break; + case '7': setProgressAbsolute(70); break; + case '8': setProgressAbsolute(80); break; + case '9': setProgressAbsolute(90); break; + } + } + + useEffect(()=> { + if(element){ + let oldElement = document.getElementById('videoPlayer'); + if(oldElement && oldElement?.parentNode){ + oldElement?.parentNode.replaceChild(element, oldElement); + videoRef.current = element + setPlaying(true) + setCanPlay(true) + setStartPlay(true) + videoRef?.current?.addEventListener('click', ()=> {}) + videoRef?.current?.addEventListener('timeupdate', updateProgress) + videoRef?.current?.addEventListener('ended', handleEnded) + + } + + } +}, [element]) + + return ( + +
+ + { + dispatch(setVideoPlaying(null)) + }} sx={{ + cursor: 'pointer', + backgroundColor: 'rgba(0,0,0,.5)' + }}> +
+
+ +
+ + {isMobileView && canPlay ? ( + <> + + {playing ? : } + + + + + + + + + + + + + + increaseSpeed()}> + + Speed: {playbackRate}x + + + + + + + + + + + ) : canPlay ? ( + <> + + {playing ? : } + + + + + + + {progress && videoRef.current?.duration && formatTime(progress)}/ + {progress && + videoRef.current?.duration && + formatTime(videoRef.current?.duration)} + + + {isMuted ? : } + + + increaseSpeed()} + > + Speed: {playbackRate}x + + + + + + + + + + ) : null} + +
+ ) +} diff --git a/src/components/layout/Navbar/Navbar-styles.tsx b/src/components/layout/Navbar/Navbar-styles.tsx new file mode 100644 index 0000000..02b4ef1 --- /dev/null +++ b/src/components/layout/Navbar/Navbar-styles.tsx @@ -0,0 +1,117 @@ +import { AppBar, Button, Typography, Box } from '@mui/material'; +import { styled } from '@mui/system'; +import { LightModeSVG } from '../../../assets/svgs/LightModeSVG'; +import { DarkModeSVG } from '../../../assets/svgs/DarkModeSVG'; + +export const CustomAppBar = styled(AppBar)(({ theme }) => ({ + display: 'flex', + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + width: '100%', + padding: '40px 25px', + backgroundImage: 'none', + boxShadow: 'none', + [theme.breakpoints.only('xs')]: { + gap: '15px', + }, + height: '55px', +})); + +export const LogoContainer = styled('img')({ + width: '12%', + minWidth: '52px', + height: 'auto', + padding: '2px 0', + userSelect: 'none', + objectFit: 'contain', + cursor: 'pointer', +}); + +export const CustomTitle = styled(Typography)({ + fontWeight: 600, + color: '#000000', +}); + +export const AuthenticateButton = styled(Button)(({ theme }) => ({ + display: 'flex', + flexDirection: 'row', + alignItems: 'center', + padding: '8px 15px', + borderRadius: '40px', + gap: '4px', + backgroundColor: theme.palette.secondary.main, + color: '#fff', + fontFamily: 'Raleway', + transition: 'all 0.3s ease-in-out', + boxShadow: 'none', + '&:hover': { + cursor: 'pointer', + boxShadow: 'rgba(0, 0, 0, 0.15) 1.95px 1.95px 2.6px;', + backgroundColor: theme.palette.secondary.dark, + filter: 'brightness(1.1)', + }, +})); + +export const AvatarContainer = styled(Box)({ + display: 'flex', + alignItems: 'center', + gap: '5px', +}); + +export const DropdownContainer = styled(Box)(({ theme }) => ({ + display: 'flex', + alignItems: 'center', + gap: '5px', + backgroundColor: theme.palette.background.paper, + padding: '10px 15px', + transition: 'all 0.4s ease-in-out', + '&:hover': { + cursor: 'pointer', + filter: + theme.palette.mode === 'light' ? 'brightness(0.95)' : 'brightness(1.1)', + }, +})); + +export const DropdownText = styled(Typography)(({ theme }) => ({ + fontFamily: 'Raleway', + fontSize: '16px', + color: theme.palette.text.primary, + userSelect: 'none', +})); + +export const NavbarName = styled(Typography)(({ theme }) => ({ + fontFamily: 'Raleway', + fontSize: '18px', + userSelect: 'none', +})); + +export const ThemeSelectRow = styled(Box)({ + display: 'flex', + alignItems: 'center', + gap: '10px', + flexBasis: 0, + height: '100%', +}); + +export const LightModeIcon = styled(LightModeSVG)(({ theme }) => ({ + transition: 'all 0.1s ease-in-out', + '&:hover': { + cursor: 'pointer', + filter: + theme.palette.mode === 'dark' + ? 'drop-shadow(0px 4px 6px rgba(255, 255, 255, 0.6))' + : 'drop-shadow(0px 4px 6px rgba(99, 88, 88, 0.1))', + }, +})); + +export const DarkModeIcon = styled(DarkModeSVG)(({ theme }) => ({ + transition: 'all 0.1s ease-in-out', + '&:hover': { + cursor: 'pointer', + filter: + theme.palette.mode === 'dark' + ? 'drop-shadow(0px 4px 6px rgba(255, 255, 255, 0.6))' + : 'drop-shadow(0px 4px 6px rgba(99, 88, 88, 0.1))', + }, +})); diff --git a/src/components/layout/Navbar/Navbar.tsx b/src/components/layout/Navbar/Navbar.tsx new file mode 100644 index 0000000..6793aca --- /dev/null +++ b/src/components/layout/Navbar/Navbar.tsx @@ -0,0 +1,129 @@ +import React from "react"; +import { Box, useTheme } from "@mui/material"; +import { + CustomAppBar, + ThemeSelectRow, + LogoContainer, + LightModeIcon, + DarkModeIcon, + AuthenticateButton, + NavbarName, + AvatarContainer, +} from "./Navbar-styles"; +import { useNavigate } from "react-router-dom"; +import { useDispatch, useSelector } from "react-redux"; +import ExitToAppIcon from "@mui/icons-material/ExitToApp"; +import QFundLogo from "../../../assets/images/QFundDarkLogo.png"; +import QFundLogoLight from "../../../assets/images/QFundLightLogo.png"; +import { RootState } from "../../../state/store"; +import { AccountCircleSVG } from "../../../assets/svgs/AccountCircleSVG"; +interface Props { + isAuthenticated: boolean; + authenticate: () => void; + setTheme: (val: string) => void; + fixed?: boolean; +} + +const NavBar: React.FC = ({ + isAuthenticated, + authenticate, + setTheme, + fixed, +}) => { + const theme = useTheme(); + const dispatch = useDispatch(); + const navigate = useNavigate(); + + const username = useSelector((state: RootState) => state.auth.user?.name); + + const userAvatarHash = useSelector( + (state: RootState) => state.global.userAvatarHash + ); + + return ( + + + {theme.palette.mode === "dark" ? ( + setTheme("light")} + color={!fixed ? "white" : theme.palette.text.primary} + height="22" + width="22" + /> + ) : ( + setTheme("dark")} + color={!fixed ? "white" : theme.palette.text.primary} + height="22" + width="22" + /> + )} + { + navigate(`/`); + }} + /> + + + {!isAuthenticated && ( + + + Authenticate + + )} + {isAuthenticated && username && ( + <> + + + {username} + + {!userAvatarHash[username] ? ( + + ) : ( + User Avatar + )} + + + )} + + + ); +}; + +export default NavBar; diff --git a/src/components/modals/ConsentModal.tsx b/src/components/modals/ConsentModal.tsx new file mode 100644 index 0000000..7e6c662 --- /dev/null +++ b/src/components/modals/ConsentModal.tsx @@ -0,0 +1,72 @@ +import * as React from "react"; +import Button from "@mui/material/Button"; +import Dialog from "@mui/material/Dialog"; +import DialogActions from "@mui/material/DialogActions"; +import DialogContent from "@mui/material/DialogContent"; +import DialogContentText from "@mui/material/DialogContentText"; +import DialogTitle from "@mui/material/DialogTitle"; +import localForage from "localforage"; +import { useTheme } from "@mui/material"; +const generalLocal = localForage.createInstance({ + name: "q-fund-general", +}); + +export default function ConsentModal() { + const theme = useTheme(); + + const [open, setOpen] = React.useState(false); + + const handleClose = () => { + setOpen(false); + }; + + const getIsConsented = React.useCallback(async () => { + try { + const hasConsented = await generalLocal.getItem("general-consent"); + if (hasConsented) return; + + setOpen(true); + generalLocal.setItem("general-consent", true); + } catch (error) {} + }, []); + + React.useEffect(() => { + getIsConsented(); + }, []); + return ( +
+ + Welcome + + + Q-Fund is currently in its first version and as such there could be + some bugs. The Qortal community, along with its development team and + the creators of this application, cannot be held accountable for any + content published or displayed. Also, they are not responsible for + any loss of coin due to either bad actors or bugs in the + application. Furthermore, they bear no responsibility for any data + loss that may occur as a result of using this application. + + + + + + +
+ ); +} diff --git a/src/components/modals/ReusableModal.tsx b/src/components/modals/ReusableModal.tsx new file mode 100644 index 0000000..baec39d --- /dev/null +++ b/src/components/modals/ReusableModal.tsx @@ -0,0 +1,50 @@ +import React from "react"; +import { Box, Modal, useTheme } from "@mui/material"; + +interface MyModalProps { + open: boolean; + onClose?: () => void; + onSubmit?: (obj: any) => Promise; + children: any; + customStyles?: any; + id?: string; +} + +export const ReusableModal: React.FC = ({ + id, + open, + onClose, + onSubmit, + children, + customStyles = {} +}) => { + const theme = useTheme(); + return ( + + + {children} + + + ); +}; diff --git a/src/constants/index.ts b/src/constants/index.ts new file mode 100644 index 0000000..0fa7f76 --- /dev/null +++ b/src/constants/index.ts @@ -0,0 +1,19 @@ +const useTestIdentifiers = false; + +export const CROWDFUND_BASE = useTestIdentifiers + ? "MYTEST_crowdfund_" + : "q-fund_crowdfund_"; + +export const ATTACHMENT_BASE = useTestIdentifiers + ? "attachments_MYTEST_" + : "attachments_q-fund_"; + +export const COMMENT_BASE = useTestIdentifiers + ? "qcomment_v1_MYTEST_" + : "qcomment_v1_q-fund_"; + +export const UPDATE_BASE = useTestIdentifiers + ? "MYTEST_update_crowdfund_" + : "q-fund_update_crowdfund_"; + +export const REVIEW_BASE = useTestIdentifiers ? "q-fund-testrw" : "q-fund-rw"; diff --git a/src/global.d.ts b/src/global.d.ts new file mode 100644 index 0000000..37ed5ce --- /dev/null +++ b/src/global.d.ts @@ -0,0 +1,113 @@ +// src/global.d.ts + +type TransactionType = + | "GENESIS" + | "PAYMENT" + | "REGISTER_NAME" + | "UPDATE_NAME" + | "SELL_NAME" + | "CANCEL_SELL_NAME" + | "BUY_NAME" + | "CREATE_POLL" + | "VOTE_ON_POLL" + | "ARBITRARY" + | "ISSUE_ASSET" + | "TRANSFER_ASSET" + | "CREATE_ASSET_ORDER" + | "CANCEL_ASSET_ORDER" + | "MULTI_PAYMENT" + | "DEPLOY_AT" + | "MESSAGE" + | "CHAT" + | "PUBLICIZE" + | "AIRDROP" + | "AT" + | "CREATE_GROUP" + | "UPDATE_GROUP" + | "ADD_GROUP_ADMIN" + | "REMOVE_GROUP_ADMIN" + | "GROUP_BAN" + | "CANCEL_GROUP_BAN" + | "GROUP_KICK" + | "GROUP_INVITE" + | "CANCEL_GROUP_INVITE" + | "JOIN_GROUP" + | "LEAVE_GROUP" + | "GROUP_APPROVAL" + | "SET_GROUP" + | "UPDATE_ASSET" + | "ACCOUNT_FLAGS" + | "ENABLE_FORGING" + | "REWARD_SHARE" + | "ACCOUNT_LEVEL" + | "TRANSFER_PRIVS" + | "PRESENCE"; + +interface QortalRequestOptions { + action: string; + name?: string; + service?: string; + data64?: string; + title?: string; + description?: string; + category?: string; + tags?: string[] | string; + identifier?: string; + address?: string; + metaData?: string; + encoding?: string; + includeMetadata?: boolean; + limit?: number; + offset?: number; + reverse?: boolean; + resources?: any[]; + filename?: string; + list_name?: string; + item?: string; + items?: string[]; + tag1?: string; + tag2?: string; + tag3?: string; + tag4?: string; + tag5?: string; + coin?: string; + destinationAddress?: string; + amount?: number; + blob?: Blob; + mimeType?: string; + file?: File; + encryptedData?: string; + mode?: string; + query?: string; + excludeBlocked?: boolean; + exactMatchNames?: boolean; + creationBytes?: string; + type?: string; + assetId?: number; + txType?: TransactionType[]; + confirmationStatus?: string; + startBlock?: number; + blockLimit?: number; + txGroupId?: number; +} + +declare function qortalRequest(options: QortalRequestOptions): Promise; +declare function qortalRequestWithTimeout( + options: QortalRequestOptions, + time: number +): Promise; + +declare global { + interface Window { + _qdnBase: any; // Replace 'any' with the appropriate type if you know it + _qdnTheme: string; + } +} + +declare global { + interface Window { + showSaveFilePicker: ( + options?: SaveFilePickerOptions + ) => Promise; + } +} diff --git a/src/hooks/useFetchCrowdfundStatus.tsx b/src/hooks/useFetchCrowdfundStatus.tsx new file mode 100644 index 0000000..5c9d69e --- /dev/null +++ b/src/hooks/useFetchCrowdfundStatus.tsx @@ -0,0 +1,239 @@ +import { useCallback, useEffect, useRef, useState } from "react"; + +export const useFetchCrowdfundStatus = ( + crowdfundData: any, + atAddress: string, + blocksRemainingZero: boolean +) => { + const [ATDeployed, setATDeployed] = useState(false); + const [ATCompleted, setATCompleted] = useState(false); + const [ATLoadingStatus, setATLoadingStatus] = useState( + "Verifying Deployment Status..." + ); + const [ATStatus, setATStatus] = useState(""); + const [ATAmount, setATAmount] = useState(null); + const [ATEnded, setATEnded] = useState(false); + const [checkedATEnded, setCheckedATEnded] = useState(false); + + const interval = useRef(null); + + // First check if the crowdfund has been deployed. + // If it has, check if the AT is still active by making an API request with transaction/search, type AT and looking for property called "amount". If no response, then AT is still active. If there is a response, it is completed. + // We also need a useEffect in case the Q-Fund goes from in progress to completed. We do this by having a + // If it is completed, check if amount value is greater than or equal to the goal value. If it is, then the goal has been achieved. If it isn't, then the goal has not been achieved. + + // Fetch AT Deployment Status using the AT Address + const fetchQFundDeploymentStatus = useCallback(async () => { + try { + if (!atAddress) return; + const res = await qortalRequest({ + action: "SEARCH_TRANSACTIONS", + txType: ["DEPLOY_AT"], + confirmationStatus: "CONFIRMED", + address: atAddress, + limit: 1, + reverse: true, + }); + if (res?.length > 0) { + // Check if AT is sleeping and isn't finished yet + const url = `/at/${atAddress}`; + const response = await fetch(url, { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + }); + if (response.status === 200) { + const responseDataSearch = await response.json(); + // if we get a 200 response from /at/address, as well as the sleepUntilHeight property and !isFinished, then AT is deployed and we can check if it's in progress, achieved, or not achieved. + if ( + responseDataSearch?.sleepUntilHeight && + !responseDataSearch?.isFinished + ) { + setATDeployed(true); + setATLoadingStatus("Verifying Q-Fund Completion Status..."); + return res; + // if we get a 200 response from /at/address, but we're missing both the sleepUntilHeight property and isFinished, then AT is still being deployed + } else if ( + !responseDataSearch?.sleepUntilHeight && + !responseDataSearch?.isFinished + ) { + setATDeployed(false); + setATStatus("Q-Fund Being Deployed"); + return []; + // if we get a 200 response from /at/address, and we're missing the sleepUntilHeight property, but isFinished is true, then the AT is completed. + } else if ( + !responseDataSearch.sleepUntilHeight && + responseDataSearch.isFinished + ) { + setATDeployed(true); + setATLoadingStatus("Verifying Q-Fund Completion Status..."); + return res; + } + // if we get a 204 response from /at/address, then AT is not deployed yet because we still don't have the sleepUntilHeight property + } else { + setATStatus("Q-Fund Being Deployed"); + setATDeployed(false); + return []; + } + } else { + setATStatus("Q-Fund Being Deployed"); + setATDeployed(false); + return []; + } + } catch (error) { + console.error(error); + setATLoadingStatus("Error when fetching Q-Fund Deployment Status"); + } + }, [atAddress]); + + // useEffect that checks whether a Q-Fund is currently in deployment or not. If it is, we prevent the user from donating to the Q-Fund. We do polling every 30 seconds. + useEffect(() => { + if (atAddress) { + let intervalId: NodeJS.Timeout | undefined; + const checkDeploymentStatus = async () => { + const checkStatus = async () => { + const ATFound = await fetchQFundDeploymentStatus(); + if (ATFound?.length > 0) { + clearInterval(intervalId); // Stop the polling if AT becomes available + } else { + setATDeployed(false); + setATLoadingStatus(""); + } + }; + checkStatus(); + intervalId = setInterval(checkStatus, 30000); + // Clear the interval when the component unmounts + return () => { + if (intervalId) clearInterval(intervalId); + }; + }; + checkDeploymentStatus(); + } + }, [atAddress, fetchQFundDeploymentStatus]); + + // See if AT is completed + const fetchQFundCompletionStatus = useCallback(async () => { + try { + if (!atAddress) return; + const res = await qortalRequest({ + action: "SEARCH_TRANSACTIONS", + txType: ["AT"], + confirmationStatus: "CONFIRMED", + address: atAddress, + limit: 0, + reverse: true, + }); + if (res?.length > 0 && ATEnded) { + const totalAmount: number = res.reduce( + (total: number, transaction) => + total + parseFloat(transaction.amount), + 0 + ); + setATCompleted(true); + setATLoadingStatus(""); + setATAmount(totalAmount); + // Check if AT is achieved or not achieved + if (totalAmount >= crowdfundData?.deployedAT?.goalValue) { + setATStatus("Q-Fund Goal Achieved"); + } else { + setATStatus("Q-Fund Goal Not Achieved"); + } + } else if (res?.length === 0 && ATEnded) { + setATCompleted(true); + setATLoadingStatus(""); + setATStatus( + "Q-Fund Completed! Check back later to see the achievement status." + ); + } else if (res.length > 0 && !ATEnded) { + setATCompleted(true); + setATLoadingStatus(""); + setATAmount(res[0]?.amount); + // Check if AT is achieved or not achieved + if (res[0]?.amount >= crowdfundData?.deployedAT?.goalValue) { + setATStatus("Q-Fund Goal Achieved"); + } else { + setATStatus("Q-Fund Goal Not Achieved"); + } + } else { + setATCompleted(false); + setATLoadingStatus(""); + setATStatus("Q-Fund In Progress"); + } + } catch (error) { + console.error(error); + setATLoadingStatus("Error when fetching Q-Fund Completion Status"); + } + }, [atAddress, ATEnded]); + + // useEffect that check if AT is completed or not. If it is completed, we then check if it is achieved or not achieved based on the amount value. If it receives an ATEnded prop, recall the useEffect to see the achievement status of the AT. + useEffect(() => { + if (ATDeployed && atAddress) { + const checkCompletionStatus = async () => { + await fetchQFundCompletionStatus(); + }; + checkCompletionStatus(); + } + }, [ATDeployed, atAddress, fetchQFundCompletionStatus, checkedATEnded]); + + // Check if the crowdfund has ended by checking /at/address for isFinished property inside the response object + const hasQFundEnded = useCallback(async (atAddress: string) => { + try { + const url = `/at/${atAddress}`; + const response = await fetch(url, { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + }); + if (response.status === 200) { + const responseDataSearch = await response.json(); + if ( + Object.keys(responseDataSearch).length > 0 && + responseDataSearch?.isFinished + ) { + setATEnded(true); + setCheckedATEnded(true); + return responseDataSearch; + } else { + setATEnded(false); + setCheckedATEnded(true); + return responseDataSearch; + } + } + } catch (error) { + console.log(error); + } + }, []); + + // Poll every 5 seconds to check if the crowdfund has ended when blocksRemaining is 0 + useEffect(() => { + if (blocksRemainingZero && !checkedATEnded) { + let isCalling = false; + interval.current = setInterval(async () => { + if (isCalling) return; + isCalling = true; + const response = await hasQFundEnded(atAddress); + + if (response) { + clearInterval(interval.current); + } + + isCalling = false; + }, 5000); + } + return () => { + if (interval.current) { + clearInterval(interval.current); + } + }; + }, [blocksRemainingZero]); + + return { + ATDeployed, + ATCompleted, + ATLoadingStatus, + ATStatus, + ATAmount, + }; +}; diff --git a/src/hooks/useFetchCrowdfunds.tsx b/src/hooks/useFetchCrowdfunds.tsx new file mode 100644 index 0000000..de665a7 --- /dev/null +++ b/src/hooks/useFetchCrowdfunds.tsx @@ -0,0 +1,102 @@ +import React from "react"; +import { useDispatch, useSelector } from "react-redux"; +import { + addToHashMap, + upsertCrowdfunds, + Crowdfund, +} from "../state/features/crowdfundSlice"; + +import { RootState } from "../state/store"; +import { fetchAndEvaluateCrowdfunds } from "../utils/fetchCrowdfunds"; +import { CROWDFUND_BASE } from "../constants"; + +export const useFetchCrowdfunds = () => { + const dispatch = useDispatch(); + const hashMapCrowdfund = useSelector( + (state: RootState) => state.crowdfund.hashMapCrowdfunds + ); + const crowdfunds = useSelector( + (state: RootState) => state.crowdfund.crowdfunds + ); + + const checkAndUpdateResource = React.useCallback( + (crowdfund: Crowdfund) => { + const existingCrowdfund = hashMapCrowdfund[crowdfund.id]; + if (!existingCrowdfund) { + return true; + } else if ( + crowdfund?.updated && + existingCrowdfund?.updated && + (!existingCrowdfund?.updated || crowdfund?.updated) > + existingCrowdfund?.updated + ) { + return true; + } else { + return false; + } + }, + [hashMapCrowdfund] + ); + + const getCrowdfund = async ( + user: string, + identifier: string, + content: any + ) => { + const res = await fetchAndEvaluateCrowdfunds({ + user, + identifier, + content, + }); + + dispatch(addToHashMap(res)); + }; + + const getCrowdfunds = React.useCallback(async () => { + try { + const offset = crowdfunds.length; + const listLimit = 20; + const url = `/arbitrary/resources/search?mode=ALL&service=DOCUMENT&query=${CROWDFUND_BASE}&limit=${listLimit}&includemetadata=false&reverse=true&excludeblocked=true&exactmatchnames=true&offset=${offset}`; + const response = await fetch(url, { + method: "GET", + headers: { + "Content-Type": "application/json", + }, + }); + const responseData = await response.json(); + + const structureData = responseData.map((resource: any): Crowdfund => { + return { + title: resource?.metadata?.title, + category: resource?.metadata?.category, + categoryName: resource?.metadata?.categoryName, + tags: resource?.metadata?.tags || [], + description: resource?.metadata?.description, + created: resource?.created, + updated: resource?.updated, + user: resource.name, + id: resource.identifier, + }; + }); + dispatch(upsertCrowdfunds(structureData)); + + for (const content of structureData) { + if (content.user && content.id) { + const res = checkAndUpdateResource(content); + if (res) { + getCrowdfund(content.user, content.id, content); + } + } + } + } catch (error) { + console.error(error); + } + }, [crowdfunds, hashMapCrowdfund]); + + return { + getCrowdfunds, + checkAndUpdateResource, + getCrowdfund, + hashMapCrowdfund, + }; +}; diff --git a/src/hooks/useFetchOwnerReviews.tsx b/src/hooks/useFetchOwnerReviews.tsx new file mode 100644 index 0000000..0ee9758 --- /dev/null +++ b/src/hooks/useFetchOwnerReviews.tsx @@ -0,0 +1,55 @@ +import React from "react"; +import { useDispatch, useSelector } from "react-redux"; +import { addToHashMapOwnerReviews } from "../state/features/globalSlice"; +import { RootState } from "../state/store"; +import { fetchAndEvaluateOwnerReviews } from "../utils/fetchOwnerReviews"; + +interface Resource { + id: string; + updated?: number; +} + +export const useFetchOwnerReviews = () => { + const dispatch = useDispatch(); + const hashMapOwnerReviews = useSelector( + (state: RootState) => state.global.hashMapOwnerReviews + ); + + // Get the review raw data from QDN + const getReview = async (owner: string, reviewId: string, content: any) => { + const res = await fetchAndEvaluateOwnerReviews({ + owner, + reviewId, + content, + }); + + dispatch(addToHashMapOwnerReviews(res)); + }; + + // Make sure that raw data isn't already present in Redux hashmap + const checkAndUpdateResource = React.useCallback( + (resource: Resource) => { + // Check if the post exists in hashMapPosts + const existingResource = hashMapOwnerReviews[resource.id]; + if (!existingResource) { + // If the post doesn't exist, add it to hashMapPosts + return true; + } else if ( + resource?.updated && + existingResource?.updated && + resource.updated > existingResource.updated + ) { + // If the post exists and its updated is more recent than the existing post's updated, update it in hashMapPosts + return true; + } else { + return false; + } + }, + [hashMapOwnerReviews] + ); + + return { + getReview, + checkAndUpdateResource, + }; +}; diff --git a/src/hooks/useWindowSize.tsx b/src/hooks/useWindowSize.tsx new file mode 100644 index 0000000..bf2b9cc --- /dev/null +++ b/src/hooks/useWindowSize.tsx @@ -0,0 +1,25 @@ +import { useState, useEffect } from 'react'; + +export function useWindowSize() { + const [windowSize, setWindowSize] = useState({ + width: undefined, + }); + + useEffect(() => { + function handleResize() { + setWindowSize({ + width: window.innerWidth, + }); + } + + window.addEventListener("resize", handleResize); + + // Call handler right away so state gets updated with initial window size + handleResize(); + + // Remove event listener on cleanup + return () => window.removeEventListener("resize", handleResize); + }, []); // Empty array means that effect doesn't depend on any values from props or state, so it runs once when the component mounts, and never re-runs. + + return windowSize; +} diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..5b3f63f --- /dev/null +++ b/src/index.css @@ -0,0 +1,269 @@ +@font-face { + font-family: "Mulish"; + src: url("./styles/fonts/Mulish.ttf") format("truetype"); +} + +@font-face { + font-family: "Copse"; + src: url("./styles/fonts/Copse.ttf") format("truetype"); +} + +@font-face { + font-family: "Cambon Light"; + src: url("./styles/fonts/Cambon-Light.ttf") format("truetype"); +} + +@font-face { + font-family: "Catamaran"; + src: url("./styles/fonts/Catamaran.ttf") format("truetype"); +} + +@font-face { + font-family: "Oxygen"; + src: url("./styles/fonts/Oxygen.ttf") format("truetype"); +} + +@font-face { + font-family: "Cairo"; + src: url("./styles/fonts/Cairo.ttf") format("truetype"); +} + +:root { + padding: 0px; + margin: 0px; + box-sizing: border-box; +} + +* { + padding: 0px; + margin: 0px; +} + +p { + font-size: 18px; +} + +.line-clamp { + height: 100px; + overflow: hidden; + display: -webkit-box; + -webkit-line-clamp: 5; /* number of lines to show */ + -webkit-box-orient: vertical; + text-overflow: ellipsis; +} + +.edit-btn:hover { + opacity: 0.75; + transition: 0.2s all; +} + +.post-image { + max-width: 100%; + border-radius: 5px; + width: 100%; + height: 100%; +} + +.test-grid { + display: grid; + grid-template-columns: repeat(4, 1fr); + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + min-height: 25px; +} + +.test-grid-item { + border: 1px solid powderblue; +} + +body::-webkit-scrollbar-track { + background-color: transparent; +} +body::-webkit-scrollbar-track:hover { + background-color: transparent; +} + +body::-webkit-scrollbar { + width: 16px; + height: 10px; + background-color: white; +} + +body::-webkit-scrollbar-thumb { + background-color: #838eee; + border-radius: 8px; + background-clip: content-box; + border: 4px solid transparent; +} + +body::-webkit-scrollbar-thumb:hover { + background-color: #6270f0; +} + +.MuiList-root::-webkit-scrollbar-track { + background-color: transparent; +} +.MuiList-root::-webkit-scrollbar-track:hover { + background-color: transparent; +} + +.MuiList-root::-webkit-scrollbar { + width: 14px; + height: 10px; + background-color: white; +} + +.MuiList-root::-webkit-scrollbar-thumb { + background-color: lightgray; + border-radius: 8px; + background-clip: content-box; + border: 4px solid transparent; +} + +.MuiList-root::-webkit-scrollbar-thumb:hover { + background-color: lightslategray; +} + +.my-masonry-grid { + display: -webkit-box; /* Not needed if autoprefixing */ + display: -ms-flexbox; /* Not needed if autoprefixing */ + display: flex; + margin-left: -20px; /* gutter size offset */ + width: auto; + padding: 15px 20px; +} + +.my-masonry-grid_column { + padding-left: 20px; /* gutter size */ + background-clip: padding-box; +} + +/* Style your items */ +.my-masonry-grid_column > li { + /* change div to reference your elements you put in */ + margin-bottom: 30px; +} + +.my-svg path { + fill: red; +} + +.qortal-link { + text-decoration: none; /* Removes the underline */ + color: inherit; /* Inherits the color of the parent element */ +} +.qortal-link:hover, +a:focus { + text-decoration: underline; /* Adds underline on hover and focus for accessibility */ +} + +.download-icon { + transition: all 0.5s ease-in-out; + animation: downloadIconAnimation 2s infinite; +} + +@keyframes downloadIconAnimation { + 0% { + transform: scale(1); + fill: #fff; + } + 50% { + transform: scale(1.2); + fill: #3498db; + } + 100% { + transform: scale(1); + fill: #fff; + } +} + +.closePlayer { + position: absolute; + top: 0px; + width: 100%; + transition: all 0.3s; + display: flex; + justify-content: flex-end; + z-index: 8000; +} + +/* When the screen is 600px or less, display .myClassUnder600 and hide .myClassOver600 */ +@media screen and (max-width: 600px) { + .myClassUnder600 { + display: none !important; + } +} + +@media screen and (min-width: 601px) { + .myClassOver600 { + display: none !important; + } +} + +.editor-container { + background: #fcfcfc; + color: #000000; + border-radius: 5px; + min-width: 75%; + min-height: 50vh; +} +.editor-container * { + max-width: 100%; + word-break: break-word; +} + +.audio-player { + width: 100%; + max-width: 600px; + margin: 0 auto; + padding: 20px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); + border-radius: 10px; +} + +.audio-player .toggle-play { + display: block; + margin-bottom: 20px; + padding: 10px 20px; + border: none; + border-radius: 5px; + background: #007bff; + color: white; + cursor: pointer; +} + +.audio-player .toggle-play:hover { + background: #0056b3; +} + +.audio-player .progress-container { + width: 100%; + height: 20px; + background: #ccc; + cursor: pointer; + margin-bottom: 20px; +} + +.audio-player .progress-bar { + height: 100%; + background: #007bff; +} + +.audio-player .volume-slider { + width: 100%; + cursor: pointer; +} + +.audio-player .volume-slider { + width: 100%; + cursor: pointer; +} + +/* React Quill */ + +.ql-editor { + min-height: 100px; +} \ No newline at end of file diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..654ad07 --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,17 @@ +import ReactDOM from 'react-dom/client' +import App from './App' +import './index.css' +import { BrowserRouter } from 'react-router-dom' +interface CustomWindow extends Window { + _qdnBase: any +} + +const customWindow = window as unknown as CustomWindow + +const baseUrl = customWindow?._qdnBase || '' +ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( + + +