diff --git a/.eslintrc.json b/.eslintrc.json
new file mode 100644
index 0000000..119ba4c
--- /dev/null
+++ b/.eslintrc.json
@@ -0,0 +1,141 @@
+{
+ "parser": "@typescript-eslint/parser",
+ "extends": [
+ "airbnb",
+ "plugin:@typescript-eslint/recommended",
+ "plugin:prettier/recommended",
+ "plugin:react-hooks/recommended",
+ "plugin:react/jsx-runtime"
+ ],
+ "plugins": ["react-hooks"],
+ "rules": {
+ "@typescript-eslint/triple-slash-reference": 0,
+ "no-return-assign": "off",
+ "no-param-reassign":"off",
+ "@typescript-eslint/no-floating-promises": 0,
+ "no-console": 1,
+ "no-shadow": 0,
+ "no-nested-ternary":"off",
+ "@typescript-eslint/no-explicit-any": "warn",
+ "react/button-has-type": "off",
+ "react-hooks/rules-of-hooks": "error",
+ "react-hooks/exhaustive-deps": "off",
+ "react/prop-types": "off",
+ "react/display-name": "off",
+ "react/no-array-index-key": "off",
+ "react/require-default-props": "off",
+ "react/jsx-props-no-spreading": "off",
+ "no-new":"off",
+ "max-classes-per-file":"off",
+ "react/jsx-filename-extension": [
+ "error",
+ {
+ "extensions": [".ts", ".tsx"]
+ }
+ ],
+ "react/function-component-definition": [
+ 2,
+ {
+ "namedComponents": ["arrow-function","function-declaration"],
+ "unnamedComponents": "arrow-function"
+ }
+ ],
+ "@typescript-eslint/no-shadow": "error",
+ "@typescript-eslint/no-empty-function": "warn",
+ "@typescript-eslint/no-use-before-define": "error",
+ "@typescript-eslint/consistent-type-imports": "warn",
+ "@typescript-eslint/explicit-function-return-type": "off",
+ "@typescript-eslint/explicit-module-boundary-types": "off",
+ "@typescript-eslint/no-unused-vars": [
+ "error",
+ {
+ "args": "all",
+ "varsIgnorePattern": "^_",
+ "argsIgnorePattern": "^_"
+ }
+ ],
+ "import/extensions": "off",
+ "jsx-a11y/click-events-have-key-events": "off",
+ "jsx-a11y/no-static-element-interactions": "off",
+ "import/prefer-default-export": "off",
+ "import/no-anonymous-default-export": [2, {
+ "allowObject": true
+ }],
+ "import/no-extraneous-dependencies": "error",
+ "import/order": [
+ "error",
+ {
+ "newlines-between": "always",
+ "alphabetize": {
+ "order": "asc",
+ "caseInsensitive": true
+ }
+ }
+ ],
+ "padding-line-between-statements": [
+ "error",
+ {
+ "blankLine": "always",
+ "prev": "*",
+ "next": "return"
+ },
+ {
+ "blankLine": "always",
+ "prev": "block-like",
+ "next": "*"
+ },
+ {
+ "blankLine": "always",
+ "prev": "*",
+ "next": "block-like"
+ },
+ {
+ "blankLine": "always",
+ "prev": "*",
+ "next": "default"
+ },
+ {
+ "blankLine": "always",
+ "prev": "*",
+ "next": "export"
+ }
+ ],
+ "no-underscore-dangle": [
+ "error",
+ {
+ "allow": ["__REDUX_DEVTOOLS_EXTENSION_COMPOSE__"]
+ }
+ ],
+ "spaced-comment": [
+ "error",
+ "always",
+ {
+ "markers": ["/"]
+ }
+ ],
+ "arrow-body-style": ["error", "as-needed"],
+ "no-unused-vars": "off",
+ "no-use-before-define": "off"
+ },
+ "ignorePatterns": ["tsconfig.json", "vite.config.ts", "build"],
+ "settings": {
+ "import/parsers": {
+ "@typescript-eslint/parser": [".js", ".jsx", ".ts", ".tsx"]
+ },
+ "import/resolver": {
+ "node": {
+ "extensions": [".js", ".jsx", ".ts", ".tsx"],
+ "moduleDirectory": ["node_modules", "src/"]
+ }
+ }
+ },
+ "parserOptions": {
+ "ecmaVersion": 2019,
+ "sourceType": "module"
+ },
+ "env": {
+ "browser": true,
+ "es6": true,
+ "jest": true
+ }
+}
\ No newline at end of file
diff --git a/.github/workflows/react.yml b/.github/workflows/react.yml
new file mode 100644
index 0000000..f7714aa
--- /dev/null
+++ b/.github/workflows/react.yml
@@ -0,0 +1,38 @@
+# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node
+# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs
+
+name: gamescicd
+
+on:
+ push:
+ branches: [ "develop" ]
+ # pull_request:
+ # branches: [ "develop" ]
+
+jobs:
+ build:
+
+ runs-on: self-hosted
+
+ strategy:
+ matrix:
+ node-version: [18.x]
+ # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
+
+ steps:
+ - uses: actions/checkout@v3
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v3
+ with:
+ node-version: ${{ matrix.node-version }}
+ cache: 'npm'
+ - run: sudo systemctl stop rsback
+ - run: npm i
+ - run: cp /home/worker/env/.env /home/worker/_build/RsClone/RsClone/
+ - run: rm vite.config.ts
+ - run: mv /home/worker/_build/RsClone/RsClone/vite.config.ts.prod /home/worker/_build/RsClone/RsClone/vite.config.ts
+ - run: npm run build
+ - run: rm -rf /var/www/html/*
+ - run: cp -rf /home/worker/_build/RsClone/RsClone/dist/* /var/www/html/
+ - run: cp -rf /home/worker/test-img/* /var/www/html/images/
+ - run: sudo systemctl start rsback
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..912245f
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,27 @@
+# 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?
+
+#ENV
+.env
\ No newline at end of file
diff --git a/README.md b/README.md
index 397b48a..7899d8e 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,79 @@
+
# RsClone
+
Clone of steam for final task
+
+## Stack
+### Frontend
+- React
+- Vite
+- Type Script
+- SASS
+- clsx - работа с CSS классами
+- Zustand - state-менеджер
+- Formik - работа с формами
+- Yup - валидация форм
+- ml-matrix - работа с матрицамии вычисляениями
+
+
+### Backend
+- Express
+- mongoose - MongoDB OMT
+- winston - логгирование.
+- bcryptjs - хэширование паролей
+- jsonwebtoken - создание JWT токенов
+- ws - работ с WebSoket'ами
+- uuid - генерация ключей для уникальных ссылок
+- nodemailer - почтовый клиент
+- node-captcha-generator - создание капчи
+- middleware-async - для асинхронных middleware функций в запросах
+- dotenv
+- cors
+- body-parser
+- cookie-parser
+- nodemon
+
+## Back-End
+
+- Адрес **back-end** сервера с ssl (**в преоритете**):
+https://rsgames.online:8888/
+
+- Адрес **back-end** сервера:
+http://rsgames.online:8000/
+
+Если по каким-то причинам удаленный сервер "лежит" и не отвечает можно запустить локальный сервер:
+Команда для запуска сервера:
+```bash
+npm run serve
+```
+**! в другом терминале**
+- Адрес локального **back-end** сервера:
+http://localhost:8000
+- Адрес локального **back-end** сервера с ssl:
+https://localhost:8888/
+
+! **Чтобы localhost работал с https запросами в хроме** ввести `chrome://flags/#allow-insecure-localhost` поставить в `enabled`
+
+**! Для корректной работы локального сервера нужен файл `.env` в корне проекта**
+``` JS
+PORT=8888
+PORTS=8000
+PASS=******
+KEY=*********
+SMTP_HOST=mail.rsgames.online
+SMTP_PORT=587
+SMTP_USER=info@rsgames.online
+SMTP_PASS=*******
+HOST=rsgames.online
+NODE_TLS_REJECT_UNAUTHORIZED=0
+```
+
+### Разделы по работе с Back-End:
+- [Авторизация](docs/auth.md)
+- [Список Игр](docs/games.md)
+- [Отзывы и реитинг (комментарии)](docs/comments.md)
+- [Морской Бой](docs/seawar.md)
+- [Работа с победителями, Back End](docs/win.md)
+
+### [Файл с фичами](features.md)
+
diff --git a/backEnd/controllers/game-data-controller.mjs b/backEnd/controllers/game-data-controller.mjs
new file mode 100644
index 0000000..324db7f
--- /dev/null
+++ b/backEnd/controllers/game-data-controller.mjs
@@ -0,0 +1,248 @@
+import { Comment } from "../data/comment.mjs";
+import { GameData } from "../data/game.mjs";
+import { User } from "../data/User.mjs";
+import { games } from "../games/data/games.mjs";
+import { logger } from "../logger.mjs";
+import {
+ getCommentsForGame,
+ getGameRaiting,
+} from "../utils/comments-utils.mjs";
+
+// eslint-disable-next-line consistent-return
+export async function getGamesList(_req, res) {
+ try {
+ const gamesList = await GameData.find();
+
+ if (!gamesList) {
+ return res.status(404).json({ message: "Games not found!" });
+ }
+
+ const fullGamesList = await Promise.all(
+ gamesList.map(async (game) => {
+ const raiting = await getGameRaiting(game.name);
+ const comments = await getCommentsForGame(game.name);
+
+ const {
+ name,
+ image,
+ descriptionRu,
+ descriptionEn,
+ rulesRu,
+ rulesEn,
+ fullName,
+ isComingSoon,
+ } = game;
+
+ return {
+ name,
+ image,
+ descriptionRu,
+ descriptionEn,
+ rulesRu,
+ rulesEn,
+ raiting,
+ comments,
+ fullName,
+ isComingSoon,
+ };
+ })
+ );
+
+ res.json(fullGamesList);
+ } catch (err) {
+ res.status(400).json({ message: "Failed to get games list" });
+ logger.error(err);
+ }
+}
+
+export async function getGameData(req, res) {
+ try {
+ const { name } = req.query;
+ const game = await GameData.findOne({ name });
+
+ const raiting = await getGameRaiting(name);
+ const comments = await getCommentsForGame(name);
+
+ if (!game) {
+ res.status(404).json({ message: "Game not found!" });
+ } else {
+ const gameRes = {
+ // eslint-disable-next-line no-underscore-dangle
+ _id: game._id,
+ name: game.name,
+ image: game.image,
+ descriptionRu: game.descriptionRu,
+ descriptionEn: game.descriptionEn,
+ rulesRu: game.rulesRu,
+ rulesEn: game.rulesEn,
+ fullName: game.fullName,
+ isComingSoon: game.isComingSoon,
+ raiting,
+ comments,
+ };
+ res.json(gameRes);
+ }
+ } catch (err) {
+ res.status(400).json({ message: "Failed to get game" });
+ }
+}
+
+export async function addNewGame(req, res) {
+ try {
+ const data = req.body;
+ const gameData = new GameData(data);
+ await gameData.save();
+ res.json(gameData);
+ } catch (err) {
+ res.status(400).json({ message: "Failed to add game" });
+ logger.error(err);
+ }
+}
+
+// eslint-disable-next-line consistent-return
+export async function editGameData(req, res) {
+ try {
+ const { name } = req.query;
+ const data = req.body;
+ const gameData = await GameData.findOne({ name });
+
+ if (!gameData) {
+ return res.status(404).json({ message: "Game not found!" });
+ }
+
+ if (data.name) gameData.name = data.name;
+ if (data.image) gameData.image = data.image;
+ if (data.descriptionRu) gameData.descriptionRu = data.descriptionRu;
+ if (data.descriptionEn) gameData.descriptionEn = data.descriptionEn;
+ if (data.rulesRu) gameData.rulesRu = data.rulesRu;
+ if (data.rulesEn) gameData.rulesEn = data.rulesEn;
+ if (data.raiting) gameData.raiting = data.raiting;
+ if (data.fullName) gameData.fullName = data.fullName;
+ if (data.isComingSoon) gameData.isComingSoon = data.isComingSoon;
+
+ await gameData.save();
+ res.json(gameData);
+ } catch (err) {
+ res.status(400).json({ message: "Failed to edit game" });
+ logger.error(err);
+ }
+}
+
+export async function getGameList(req, res) {
+ try {
+ const { name } = req.query;
+ const gameKeys = Object.keys(games);
+ const gamesList = [];
+ gameKeys.forEach((key) => {
+ if (
+ games[key].gameName === name &&
+ !games[key].isStarted &&
+ !games[key].winner
+ ) {
+ gamesList.push({
+ name,
+ gameId: key,
+ player: games[key].players[0].userName,
+ maxPlayers: games[key].playersCount,
+ playersInGame: games[key].players.length,
+ });
+ }
+ });
+ res.json(gamesList);
+ } catch (err) {
+ res.status(400).json({ message: "Failed to get games list" });
+ logger.error(err);
+ }
+}
+
+export async function getAllComments(req, res) {
+ try {
+ const { gameName: name } = req.query;
+
+ const comments = await getCommentsForGame(name);
+
+ res.json(comments);
+ } catch (err) {
+ res.status(400).json({ message: "Faild to get commets" });
+ }
+}
+
+// eslint-disable-next-line consistent-return
+export async function setComment(req, res) {
+ try {
+ const { gameName: name } = req.query;
+ const { text, raiting } = req.body;
+ const { userName } = req;
+
+ const userObj = await User.findOne({ userName });
+ if (!userObj) return res.status(401).json({ message: "Wrong User Name" });
+
+ const gameObj = await GameData.findOne({ name });
+ if (!gameObj) return res.status(401).json({ message: "Wrong Game Name" });
+
+ // eslint-disable-next-line no-underscore-dangle
+ const user = userObj._id;
+ // eslint-disable-next-line no-underscore-dangle
+ const game = gameObj._id;
+
+ const hasComment = await Comment.findOne({ user, game });
+
+ if (hasComment) {
+ if (text) hasComment.text = text;
+ if (raiting) hasComment.raiting = raiting;
+ hasComment.date = new Date();
+ hasComment.save();
+
+ res.json({
+ user: userName,
+ game: name,
+ text: hasComment.text,
+ raiting: hasComment.raiting,
+ date: hasComment.date,
+ });
+ } else {
+ const comment = new Comment({ user, game, text, raiting });
+ comment.save();
+
+ res.json({
+ user: userName,
+ game: name,
+ text: comment.text,
+ raiting: comment.raiting,
+ });
+ }
+ } catch (err) {
+ res.status(400).json({ message: "Faild to save commet" });
+ logger.error(err);
+ }
+}
+
+// eslint-disable-next-line consistent-return
+export async function removeComment(req, res) {
+ try {
+ const { gameName: name } = req.query;
+ const { userName } = req;
+
+ const userObj = await User.findOne({ userName });
+ if (!userObj) return res.status(401).json({ message: "Wrong User Name" });
+
+ const gameObj = await GameData.findOne({ name });
+ if (!gameObj) return res.status(401).json({ message: "Wrong Game Name" });
+
+ // eslint-disable-next-line no-underscore-dangle
+ const user = userObj._id;
+ // eslint-disable-next-line no-underscore-dangle
+ const game = gameObj._id;
+
+ const hasComment = await Comment.findOne({ user, game });
+ if (!hasComment)
+ return res.status(404).json({ message: "Comment not found" });
+
+ await hasComment.remove();
+
+ res.status(204).json({ message: "" });
+ } catch (err) {
+ res.status(400).json({ message: "Faild to delete commet" });
+ logger.error(err);
+ }
+}
diff --git a/backEnd/controllers/user-controller.mjs b/backEnd/controllers/user-controller.mjs
new file mode 100644
index 0000000..10a5351
--- /dev/null
+++ b/backEnd/controllers/user-controller.mjs
@@ -0,0 +1,339 @@
+import bcrypt from "bcryptjs";
+import { validationResult } from "express-validator";
+import jsonwebtoken from "jsonwebtoken";
+// eslint-disable-next-line import/no-extraneous-dependencies
+import { v4 as uuidv4 } from "uuid";
+
+import { ALWAYS_ADMINS } from "../data/adminsList.mjs";
+import { UserStatus } from "../data/Status.mjs";
+import { User } from "../data/User.mjs";
+import { logger } from "../logger.mjs";
+import { mailService } from "../mail/mail-service.js";
+
+const generateToken = (id, statuses) =>
+ jsonwebtoken.sign({ id, statuses }, process.env.KEY, { expiresIn: "60d" });
+
+// eslint-disable-next-line consistent-return
+export async function resetpass(req, res) {
+ try {
+ const { userName, email } = req.body;
+
+ if (!userName && !email) {
+ return res.status(401).json({ message: "Wrong Input Data" });
+ }
+
+ const searchUser = userName
+ ? await User.findOne({ userName })
+ : await User.findOne({ email: email.toLocaleLowerCase() });
+
+ if (!searchUser) {
+ return res.status(404).json({ message: "User not found" });
+ }
+
+ const newResetToken = uuidv4();
+ searchUser.resetToken = newResetToken;
+ searchUser.save();
+
+ mailService.sendResetPassEMail(
+ searchUser.email,
+ searchUser.userName,
+ `https://${process.env.HOST}?resetToken=${newResetToken}`
+ );
+
+ res.json({
+ message: `E-mail sended to ${searchUser.email}`,
+ });
+ } catch (e) {
+ res.status(400).json({ message: "Reset Error" });
+ logger.error(e);
+ }
+}
+
+// eslint-disable-next-line consistent-return
+export async function setNewPass(req, res) {
+ try {
+ const { password, resetToken } = req.body;
+ const searchUser = await User.findOne({ resetToken });
+
+ if (!searchUser) {
+ return res.status(404).json({ message: "User not found" });
+ }
+
+ const hashPass = bcrypt.hashSync(password, 7);
+ searchUser.password = hashPass;
+ const newResetToken = uuidv4();
+ searchUser.resetToken = newResetToken;
+ searchUser.save();
+ mailService.sendPassChangedEmail(
+ searchUser.email,
+ searchUser.userName,
+ password
+ );
+ res.json({ message: "Password has been changed!" });
+ } catch (err) {
+ res.status(400).json({ message: "Password Reset Error" });
+ logger.error(err);
+ }
+}
+
+// eslint-disable-next-line consistent-return
+export async function changePass(req, res) {
+ try {
+ const { password, newPassword } = req.body;
+ const { userName } = req;
+ const user = await User.findOne({ userName });
+
+ if (!user) {
+ return res.status(404).json({ message: "User not found" });
+ }
+
+ const validPass = bcrypt.compareSync(password, user.password);
+
+ if (!validPass) {
+ return res.status(405).json({ message: "Incorrect password" });
+ }
+
+ const hashPass = bcrypt.hashSync(newPassword, 7);
+ user.password = hashPass;
+ user.resetToken = uuidv4();
+
+ mailService.sendPassChangedEmail(user.email, userName, newPassword);
+ user.save();
+
+ res.json({ message: "Password has been changed!" });
+ } catch (err) {
+ res.status(400).json({ message: "Password Changing Error" });
+ logger.error(err);
+ }
+}
+
+// eslint-disable-next-line consistent-return
+export async function getNameForNewPass(req, res) {
+ try {
+ const { resetToken } = req.query;
+ const searchUser = await User.findOne({ resetToken });
+
+ if (!searchUser) {
+ return res.status(404).json({ message: "User not found" });
+ }
+
+ res.json({ userName: searchUser.userName });
+ } catch (err) {
+ res.status(400).json({ message: "Error: Cannot get userName" });
+ logger.error(err);
+ }
+}
+
+// eslint-disable-next-line consistent-return
+export async function register(req, res) {
+ try {
+ const errors = validationResult(req);
+
+ if (!errors.isEmpty()) {
+ return res.status(401).json({ message: "Validation error", errors });
+ }
+
+ const { userName: preUserName, email, password } = req.body;
+ const userName = preUserName.trim();
+ const searchUser = await User.findOne({ userName });
+
+ if (searchUser) {
+ return res.status(400).json({ message: "User is allredy registred" });
+ }
+
+ const searchUserByEmail = await User.findOne({
+ email: email.toLocaleLowerCase(),
+ });
+
+ if (searchUserByEmail) {
+ return res
+ .status(400)
+ .json({ message: "User with current email is allredy registred" });
+ }
+
+ const hashPass = bcrypt.hashSync(password, 7);
+ const userStatus = await UserStatus.findOne({ value: "user" });
+ const resetToken = uuidv4();
+ const user = new User({
+ userName,
+ email: email.toLocaleLowerCase(),
+ password: hashPass,
+ status: [userStatus.value],
+ resetToken,
+ });
+ mailService.sendRegistrEmail(email, userName, password);
+ user.save();
+ res.json({ message: "New User has been successfully created!" });
+ } catch (err) {
+ res.status(400).json({ message: "Registration Error" });
+ logger.error(err);
+ }
+}
+
+// eslint-disable-next-line consistent-return
+export async function login(req, res) {
+ try {
+ const { userName, password } = req.body;
+ const searchUser = await User.findOne({ userName });
+
+ if (!searchUser) {
+ return res.status(404).json({ message: "User not found" });
+ }
+
+ const validPass = bcrypt.compareSync(password, searchUser.password);
+
+ if (!validPass) {
+ return res.status(405).json({ message: "Incorrect password" });
+ }
+
+ // eslint-disable-next-line no-underscore-dangle
+ const token = generateToken(searchUser._id, searchUser.status);
+
+ res.cookie("token", token, {
+ maxAge: 60 * 24 * 60 * 60 * 1000,
+ httpOnly: false,
+ secure: true,
+ });
+ res.json({ token });
+ } catch (err) {
+ res.status(400).json({ message: "Login Error" });
+ logger.error(err);
+ }
+}
+
+export async function getUsers(req, res) {
+ try {
+ const users = req.query.search
+ ? await User.find({ userName: { $regex: req.query.search } })
+ : await User.find();
+ res.json(users);
+ } catch (err) {
+ res.status(400).json({ message: "Failed to get users" });
+ logger.error(err);
+ }
+}
+
+export async function getUser(req, res) {
+ try {
+ const user = await User.findById(req.user.id);
+ const { userName, email, status, banned, date, image } = user;
+ res.json({ userName, email, status, banned, date, image });
+ } catch (err) {
+ res.status(400).json({ message: "Failed to get user" });
+ logger.error(err);
+ }
+}
+
+// eslint-disable-next-line consistent-return
+export async function setUserStatus(req, res) {
+ try {
+ const { userName, status } = req.body;
+
+ const user = await User.findOne({ userName });
+ user.status = [];
+ await user.save();
+
+ for (let i = 0; i < status.length; i += 1) {
+ // eslint-disable-next-line no-await-in-loop
+ const stat = await UserStatus.findOne({ value: status[i] });
+ user.status.push(stat.value);
+ }
+
+ if (ALWAYS_ADMINS.includes(userName) && !user.status.includes("admin")) {
+ user.status.push("admin");
+ await user.save();
+
+ return res.json({
+ message: "You can not changed this admin status!",
+ user,
+ });
+ }
+
+ await user.save();
+
+ res.json({ message: "Status changed", user });
+ } catch (err) {
+ res.status(400).json({ message: "Failed to set new status" });
+ logger.error(err);
+ }
+}
+
+// eslint-disable-next-line consistent-return
+export async function deleteUser(req, res) {
+ try {
+ const { userName } = req.body;
+
+ if (ALWAYS_ADMINS.includes(userName)) {
+ return res.json({
+ message: "You can not delete this user!",
+ });
+ }
+
+ const user = await User.findOne({ userName });
+
+ if (!user) {
+ res.status(404).json({ message: "User not found" });
+ } else {
+ await user.remove();
+ res.status(204).json({ message: "User has been deleted" });
+ }
+ } catch (err) {
+ res.status(400).json({ message: "Failed to delete user" });
+ logger.error(err);
+ }
+}
+
+export function banUser(banned) {
+ return async function ban(req, res) {
+ try {
+ const { userName } = req.query;
+ const user = await User.findOne({ userName });
+
+ if (!user) {
+ res.status(404).json({ message: "User not found" });
+ } else {
+ user.banned = banned;
+ await user.save();
+ res.json({
+ message: `User has been ${banned ? "banned" : "unbanned"}`,
+ });
+ }
+ } catch (err) {
+ res.status(400).json({ message: "Failed to ban user" });
+ logger.error(err);
+ }
+ };
+}
+
+export async function getUserByName(req, res) {
+ try {
+ const { userName } = req.query;
+ const user = await User.findOne({ userName });
+
+ if (!user) {
+ res.status(404).json({ message: "User not found" });
+ } else {
+ res.json(user);
+ }
+ } catch (err) {
+ res.status(400).json({ message: "Failed to get user" });
+ logger.error(err);
+ }
+}
+
+export async function saveStatusesToDB() {
+ const userStatus = new UserStatus();
+ const adminStatus = new UserStatus({ value: "admin" });
+ const moderatorStatus = new UserStatus({ value: "moderator" });
+
+ await userStatus.save();
+ await adminStatus.save();
+ await moderatorStatus.save();
+}
+
+export async function checkUser(userName, token) {
+ const { id: _id } = jsonwebtoken.decode(token);
+ const searchUser = await User.findById({ _id });
+
+ return searchUser && searchUser.userName === userName;
+}
diff --git a/backEnd/controllers/win-controller.mjs b/backEnd/controllers/win-controller.mjs
new file mode 100644
index 0000000..08ad62c
--- /dev/null
+++ b/backEnd/controllers/win-controller.mjs
@@ -0,0 +1,176 @@
+/* eslint-disable no-underscore-dangle */
+import { GameData } from "../data/game.mjs";
+import { User } from "../data/User.mjs";
+import { Winner } from "../data/winner.mjs";
+import { logger } from "../logger.mjs";
+
+// eslint-disable-next-line consistent-return
+export async function addWinner(req, res) {
+ try {
+ const data = req.body;
+
+ if (!req.userName) {
+ return res.status(405).json({ message: "User is not authorized" });
+ }
+
+ const user = await User.findOne({ userName: req.userName });
+
+ if (!user) {
+ return res.status(405).json({ message: "User is not authorized" });
+ }
+
+ data.user = user._id;
+
+ if (user.banned) {
+ return res.status(405).json({ message: "User is banned" });
+ }
+
+ const game = await GameData.findOne({ name: data.game });
+
+ if (!game) {
+ return res.status(404).json({ message: "Game not found" });
+ }
+
+ data.game = game._id;
+
+ const winner = new Winner(data);
+ await winner.save();
+ res.json({
+ _id: winner._id,
+ userName: user.userName,
+ gameName: game.name,
+ points: winner.points,
+ date: winner.date,
+ });
+ } catch (err) {
+ res.status(400).json({ message: "Failed to add winner" });
+ logger.error(err);
+ }
+}
+
+const getPositionForGame = async (gameId, user) => {
+ const usersSet = new Set();
+ const winners = await Winner.find({ game: gameId });
+ const res = winners
+ .sort((a, b) => b._doc.points - a._doc.points)
+ .filter((winner) => {
+ if (usersSet.has(winner.user.toString())) return false;
+ usersSet.add(winner.user.toString());
+
+ return true;
+ })
+ .map((obj, i) => {
+ const newObj = { ...obj._doc };
+ newObj.position = i + 1;
+
+ return newObj;
+ })
+ .find((winner) => winner.user.toString() === user._id.toString()) || {
+ position: -1,
+ };
+
+ return res;
+};
+
+// eslint-disable-next-line consistent-return
+export async function getWinners(req, res) {
+ try {
+ const { game } = req.query;
+ const { userName: queryUserName } = req.query;
+
+ if (!req.userName) {
+ return res.status(405).json({ message: "User is not authorized" });
+ }
+
+ if (game) {
+ const currentGame = await GameData.findOne({ name: game });
+
+ if (!currentGame) {
+ return res.status(404).json({ message: "Game not found" });
+ }
+
+ const winners = await Winner.find({ game: currentGame._id });
+
+ const fullList = (
+ await Promise.all(
+ winners.map(async (winner) => {
+ const userName = (await User.findById(winner.user))?.userName;
+ if (!userName) winner.remove();
+
+ return {
+ _id: winner._id,
+ userName,
+ gameName: currentGame.name,
+ points: winner.points,
+ date: winner.date,
+ };
+ })
+ )
+ )
+ .filter((winner) => winner.userName)
+ .sort((a, b) => b.points - a.points);
+
+ const resList = [];
+ const usersSet = new Set();
+ fullList.forEach((winner) => {
+ if (!usersSet.has(winner.userName)) {
+ resList.push(winner);
+ usersSet.add(winner.userName);
+ }
+ });
+
+ res.json(resList);
+ } else {
+ let user = await User.findOne({ userName: req.userName });
+
+ if (!user) {
+ return res.status(405).json({ message: "User is not authorized" });
+ }
+
+ if (queryUserName) {
+ user = await User.findOne({ userName: queryUserName });
+ }
+
+ if (!user) {
+ return res.status(405).json({ message: "User not found" });
+ }
+
+ const wins = await Winner.find({ user: user._id });
+
+ const fullList = (
+ await Promise.all(
+ wins.map(async (winner) => {
+ const gameName = (await GameData.findById(winner.game))?.name ?? "";
+ const position =
+ (await getPositionForGame(winner.game, user))?.position ?? -1;
+ if (!gameName || !position) winner.remove();
+
+ return {
+ _id: winner._id,
+ userName: user.userName,
+ gameName,
+ points: winner.points,
+ date: winner.date,
+ position,
+ };
+ })
+ )
+ )
+ .filter((winner) => winner.gameName !== "" && winner.position !== -1)
+ .sort((a, b) => b.points - a.points);
+
+ const resList = [];
+ const gamesSet = new Set();
+ fullList.forEach((winner) => {
+ if (!gamesSet.has(winner.gameName)) {
+ resList.push(winner);
+ gamesSet.add(winner.gameName);
+ }
+ });
+
+ res.json(resList);
+ }
+ } catch (err) {
+ res.status(400).json({ message: "Failed to get winner" });
+ }
+}
diff --git a/backEnd/data/Status.mjs b/backEnd/data/Status.mjs
new file mode 100644
index 0000000..4393f8f
--- /dev/null
+++ b/backEnd/data/Status.mjs
@@ -0,0 +1,7 @@
+import { Schema, model } from "mongoose";
+
+const statusSchema = new Schema({
+ value: { type: String, unique: true, default: "user" },
+});
+
+export const UserStatus = model("UserStatus", statusSchema);
diff --git a/backEnd/data/User.mjs b/backEnd/data/User.mjs
new file mode 100644
index 0000000..7ab0855
--- /dev/null
+++ b/backEnd/data/User.mjs
@@ -0,0 +1,14 @@
+import { Schema, model } from "mongoose";
+
+const userSchema = new Schema({
+ userName: { type: String, unique: true, require: true },
+ image: { type: String, require: false },
+ email: { type: String, unique: true, require: true },
+ password: { type: String, require: true },
+ date: { type: Date, default: Date.now },
+ status: [{ type: String, ref: "Status" }],
+ resetToken: { type: String, unique: true, require: true },
+ banned: { type: Boolean, default: false },
+});
+
+export const User = model("User", userSchema);
diff --git a/backEnd/data/adminsList.mjs b/backEnd/data/adminsList.mjs
new file mode 100644
index 0000000..83faa02
--- /dev/null
+++ b/backEnd/data/adminsList.mjs
@@ -0,0 +1 @@
+export const ALWAYS_ADMINS = ["Jerubrin", "Max", "Olya", "Admin"];
diff --git a/backEnd/data/capcha.mjs b/backEnd/data/capcha.mjs
new file mode 100644
index 0000000..f3b20e0
--- /dev/null
+++ b/backEnd/data/capcha.mjs
@@ -0,0 +1,61 @@
+// eslint-disable-next-line import/no-extraneous-dependencies
+import Captcha from "node-captcha-generator";
+import { v4 as uuidv4 } from "uuid";
+
+const CAPCHA_LENGTH = 5;
+const CAPCHA_WIDTH = 450;
+const CAPCHA_HEIGHT = 200;
+const CAPCHA_TIMEOUT = 5 * 60 * 1000;
+
+class CaptchaGenerator {
+ capches = {};
+
+ async newCapcha() {
+ const capcha = new Captcha({
+ length: CAPCHA_LENGTH,
+ size: {
+ width: CAPCHA_WIDTH,
+ height: CAPCHA_HEIGHT,
+ },
+ });
+ const token = uuidv4();
+ this.capches[token] = capcha;
+ const image = await this.getImage(token);
+
+ setTimeout(() => {
+ try {
+ delete this.capches[token];
+ } catch {
+ /* empty */
+ }
+ }, CAPCHA_TIMEOUT);
+
+ return { token, image };
+ }
+
+ async getImage(token) {
+ return new Promise((res, rej) => {
+ this.capches[token].toBase64((err, image) => {
+ if (err) rej(err);
+ res(image);
+ });
+ });
+ }
+
+ checkCorrectCapcha(token, value) {
+ const capcha = this.capches[token];
+ if (!capcha) return false;
+
+ if (capcha.value !== value) {
+ delete this.capches[token];
+
+ return false;
+ }
+
+ delete this.capches[token];
+
+ return true;
+ }
+}
+
+export const capchaGenerator = new CaptchaGenerator();
diff --git a/backEnd/data/comment.mjs b/backEnd/data/comment.mjs
new file mode 100644
index 0000000..0190aa8
--- /dev/null
+++ b/backEnd/data/comment.mjs
@@ -0,0 +1,11 @@
+import { Schema, model } from "mongoose";
+
+const commentSchema = new Schema({
+ user: { type: Schema.Types.ObjectId, ref: "User" },
+ game: { type: Schema.Types.ObjectId, ref: "GameData" },
+ text: { type: String, default: "No comment..." },
+ raiting: { type: Number, default: 5 },
+ date: { type: Date, default: Date.now },
+});
+
+export const Comment = model("Comment", commentSchema);
diff --git a/backEnd/data/game.mjs b/backEnd/data/game.mjs
new file mode 100644
index 0000000..9472d95
--- /dev/null
+++ b/backEnd/data/game.mjs
@@ -0,0 +1,14 @@
+import { Schema, model } from "mongoose";
+
+const gameData = new Schema({
+ name: { type: String, unique: true, require: true },
+ image: { type: String, default: "" },
+ descriptionRu: { type: String, default: "Нет описания" },
+ descriptionEn: { type: String, default: "No description" },
+ rulesRu: { type: String, default: "Нет правил" },
+ rulesEn: { type: String, default: "No rules" },
+ fullName: { type: String, default: "" },
+ isComingSoon: { type: Boolean, default: false },
+});
+
+export const GameData = model("GameData", gameData);
diff --git a/backEnd/data/messages.mjs b/backEnd/data/messages.mjs
new file mode 100644
index 0000000..e69de29
diff --git a/backEnd/data/show-error.js b/backEnd/data/show-error.js
new file mode 100644
index 0000000..c8a1541
--- /dev/null
+++ b/backEnd/data/show-error.js
@@ -0,0 +1,4 @@
+export const showFormattedError = (err) => {
+ // eslint-disable-next-line no-console
+ console.error("message: ", err.message);
+};
diff --git a/backEnd/data/winner.mjs b/backEnd/data/winner.mjs
new file mode 100644
index 0000000..ee063cf
--- /dev/null
+++ b/backEnd/data/winner.mjs
@@ -0,0 +1,10 @@
+import { Schema, model } from "mongoose";
+
+const winnerSchema = new Schema({
+ user: { type: Schema.Types.ObjectId, ref: "User" },
+ game: { type: Schema.Types.ObjectId, ref: "GameData" },
+ points: { type: Number, default: -1 },
+ date: { type: Date, default: Date.now },
+});
+
+export const Winner = model("winners", winnerSchema);
diff --git a/backEnd/games.mjs b/backEnd/games.mjs
new file mode 100644
index 0000000..d007e86
--- /dev/null
+++ b/backEnd/games.mjs
@@ -0,0 +1,61 @@
+import bodyParser from "body-parser";
+import cors from "cors";
+import { Router } from "express";
+import { asyncMiddleware } from "middleware-async";
+
+import {
+ addNewGame,
+ editGameData,
+ getAllComments,
+ getGameData,
+ getGameList,
+ getGamesList,
+ removeComment,
+ setComment,
+} from "./controllers/game-data-controller.mjs";
+import { adminMiddleware } from "./middleware/admin-middleware.mjs";
+import { authorizedUser } from "./middleware/authorized-user.mjs";
+import { banedUser } from "./middleware/baned-midleware.mjs";
+
+const jsonParser = bodyParser.json();
+
+export const gameHttpRouter = new Router();
+
+gameHttpRouter.use(cors());
+// gameHttpRouter.use(logger);
+gameHttpRouter.get("/all", getGamesList);
+gameHttpRouter.get("/data", getGameData);
+gameHttpRouter.post(
+ "/data",
+ adminMiddleware(["admin", "moderator"]),
+ jsonParser,
+ addNewGame
+);
+gameHttpRouter.put(
+ "/data",
+ adminMiddleware(["admin", "moderator"]),
+ jsonParser,
+ editGameData
+);
+gameHttpRouter.get("/list", getGameList);
+
+gameHttpRouter.get(
+ "/comments",
+ asyncMiddleware(authorizedUser),
+ banedUser,
+ getAllComments
+);
+gameHttpRouter.post(
+ "/comments",
+ jsonParser,
+ asyncMiddleware(authorizedUser),
+ banedUser,
+ setComment
+);
+gameHttpRouter.delete(
+ "/comments",
+ jsonParser,
+ asyncMiddleware(authorizedUser),
+ banedUser,
+ removeComment
+);
diff --git a/backEnd/games/data/game-data.mjs b/backEnd/games/data/game-data.mjs
new file mode 100644
index 0000000..9fea6a1
--- /dev/null
+++ b/backEnd/games/data/game-data.mjs
@@ -0,0 +1,27 @@
+export class SeaWarGameData {
+ constructor(
+ gameId,
+ player,
+ enemyName,
+ isEnemyReady,
+ isMainUser,
+ isStarted,
+ isLead,
+ winner,
+ yourField,
+ enemyField,
+ moves
+ ) {
+ this.gameId = gameId;
+ this.player = player;
+ this.enemyName = enemyName;
+ this.isEnemyReady = isEnemyReady;
+ this.isMainUser = isMainUser;
+ this.isStarted = isStarted;
+ this.isLead = isLead;
+ this.winner = winner;
+ this.yourField = yourField;
+ this.enemyField = enemyField;
+ this.moves = moves;
+ }
+}
diff --git a/backEnd/games/data/games.mjs b/backEnd/games/data/games.mjs
new file mode 100644
index 0000000..010d86e
--- /dev/null
+++ b/backEnd/games/data/games.mjs
@@ -0,0 +1,11 @@
+export const games = {};
+
+export class Game {
+ constructor(gameName, playersCount = 2) {
+ this.gameName = gameName;
+ this.players = [];
+ this.playersCount = playersCount;
+ this.isStarted = false; // is Game started
+ this.winner = null;
+ }
+}
diff --git a/backEnd/games/data/message-data.mjs b/backEnd/games/data/message-data.mjs
new file mode 100644
index 0000000..866e8e6
--- /dev/null
+++ b/backEnd/games/data/message-data.mjs
@@ -0,0 +1,8 @@
+export class MessageData {
+ constructor(userName, gameId, type, data) {
+ this.userName = userName;
+ this.gameId = gameId;
+ this.type = type;
+ this.data = data;
+ }
+}
diff --git a/backEnd/games/data/player.mjs b/backEnd/games/data/player.mjs
new file mode 100644
index 0000000..5ac6112
--- /dev/null
+++ b/backEnd/games/data/player.mjs
@@ -0,0 +1,11 @@
+export class Player {
+ constructor(userName) {
+ this.userName = userName;
+ this.isReady = false;
+ this.moves = 0;
+ this.isLead = false;
+ this.isOnline = true;
+ this.points = 0;
+ this.misMoves = 0;
+ }
+}
diff --git a/backEnd/games/data/points-data.mjs b/backEnd/games/data/points-data.mjs
new file mode 100644
index 0000000..152de03
--- /dev/null
+++ b/backEnd/games/data/points-data.mjs
@@ -0,0 +1,4 @@
+export const pointsData = [
+ 100, 80, 70, 60, 55, 45, 40, 35, 30, 27, 24, 21, 18, 16, 14, 12, 10, 8, 6, 5,
+ 4, 3, 2, 1,
+];
diff --git a/backEnd/games/data/seawar-player.mjs b/backEnd/games/data/seawar-player.mjs
new file mode 100644
index 0000000..eb0f0ad
--- /dev/null
+++ b/backEnd/games/data/seawar-player.mjs
@@ -0,0 +1,13 @@
+import { SEAWAR } from "../variables.mjs";
+
+import { Player } from "./player.mjs";
+
+export class SeaWarPlayer extends Player {
+ constructor(userName) {
+ super(userName);
+ this.gameMatrix = new Array(10)
+ .fill(0)
+ .map((_) => new Array(10).fill(SEAWAR.CLEAN));
+ this.ships = [];
+ }
+}
diff --git a/backEnd/games/data/winner.mjs b/backEnd/games/data/winner.mjs
new file mode 100644
index 0000000..a18d660
--- /dev/null
+++ b/backEnd/games/data/winner.mjs
@@ -0,0 +1,7 @@
+export class Winner {
+ constructor(userName, time, moves) {
+ this.userName = userName;
+ this.time = time;
+ this.moves = moves;
+ }
+}
diff --git a/backEnd/games/seawar/checker.mjs b/backEnd/games/seawar/checker.mjs
new file mode 100644
index 0000000..df9a3d5
--- /dev/null
+++ b/backEnd/games/seawar/checker.mjs
@@ -0,0 +1,101 @@
+import { SEAWAR } from "../variables.mjs";
+
+// eslint-disable-next-line no-extend-native
+Array.prototype.rotate = function rotate() {
+ const result = [];
+
+ for (let i = this.length - 1; i >= 0; i -= 1) {
+ for (let j = 0; j < this[i].length; j += 1) {
+ if (!result[j]) {
+ result[j] = [];
+ }
+
+ result[j].push(this[i][j]);
+ }
+ }
+
+ return result;
+};
+
+function findShips(gameMatrix) {
+ const ships = [0, 0, 0, 0, 0];
+
+ for (let i = 0; i < gameMatrix.length; i += 1) {
+ // eslint-disable-next-line no-restricted-syntax
+ for (const point of gameMatrix[i].join("").split("1")) {
+ if (point.length > ships.length - 1) {
+ return false;
+ }
+
+ ships[point.length] += 1;
+ }
+ }
+
+ return ships;
+}
+
+function checShipCount(gameMatrix) {
+ let ships = findShips(gameMatrix);
+
+ if (!ships) {
+ return false;
+ }
+
+ const rotMatrix = gameMatrix.rotate();
+ const rotShips = findShips(rotMatrix);
+
+ if (!rotShips) {
+ return false;
+ }
+
+ ships = ships.map((ship, i) => ship + rotShips[i]);
+
+ const otherShipsCellCount = 1 * 4 + 2 * 3 + 3 * 2;
+ ships[1] =
+ gameMatrix.flat().join("").split(SEAWAR.CLEAN.toString()).join("").length -
+ otherShipsCellCount;
+
+ return ships[1] === 4 && ships[2] === 3 && ships[3] === 2 && ships[4] === 1;
+}
+
+function checSpacesCount(gameMatrix) {
+ for (let i = 0; i < 10; i += 1) {
+ for (let j = 0; j < 10; j += 1) {
+ if (gameMatrix[i][j] === SEAWAR.SHIP) {
+ const hor =
+ (gameMatrix[i - 1] && gameMatrix[i - 1][j] === SEAWAR.SHIP) ||
+ (gameMatrix[i + 1] && gameMatrix[i + 1][j] === SEAWAR.SHIP);
+ const vert =
+ gameMatrix[i][j - 1] === SEAWAR.SHIP ||
+ gameMatrix[i][j + 1] === SEAWAR.SHIP;
+
+ if (hor && vert) {
+ return false;
+ }
+
+ if (
+ (gameMatrix[i - 1] && gameMatrix[i - 1][j - 1] === SEAWAR.SHIP) ||
+ (gameMatrix[i - 1] && gameMatrix[i - 1][j + 1] === SEAWAR.SHIP) ||
+ (gameMatrix[i + 1] && gameMatrix[i + 1][j - 1] === SEAWAR.SHIP) ||
+ (gameMatrix[i + 1] && gameMatrix[i + 1][j + 1] === SEAWAR.SHIP)
+ ) {
+ return false;
+ }
+ }
+ }
+ }
+
+ return true;
+}
+
+export function checkMatrix(gameMatrix) {
+ if (!checSpacesCount(gameMatrix)) {
+ return SEAWAR.MTX_WRONG_CELLS;
+ }
+
+ if (!checShipCount(gameMatrix)) {
+ return SEAWAR.MTX_WRONG_SHIPS;
+ }
+
+ return "Correct!";
+}
diff --git a/backEnd/games/seawar/seawar.mjs b/backEnd/games/seawar/seawar.mjs
new file mode 100644
index 0000000..1bf9e80
--- /dev/null
+++ b/backEnd/games/seawar/seawar.mjs
@@ -0,0 +1,259 @@
+import { v4 as uuidv4 } from "uuid";
+
+import { Game, games } from "../data/games.mjs";
+import { pointsData } from "../data/points-data.mjs";
+import { SeaWarPlayer } from "../data/seawar-player.mjs";
+import { GAME, SEAWAR } from "../variables.mjs";
+
+import { checkMatrix } from "./checker.mjs";
+// eslint-disable-next-line import/no-cycle
+import {
+ checkForKill,
+ checkPlayerForJoining,
+ createWinner,
+ fillShips,
+ isGameEnded,
+ makeAnswer,
+ sendDataForPlayers,
+} from "./seawar.utils.mjs";
+
+export function leaveSeaWarGame(data, ws) {
+ const { gameId } = data;
+ const userName = ws.id.split(":")[0];
+ ws.id = `${userName}:`;
+
+ const game = games[gameId];
+ if (!game) return ws.send(makeAnswer(GAME.ERR_WRONG_GAME_ID));
+
+ const index = game.players.findIndex((plr) => plr.userName === userName);
+
+ if (index === -1) {
+ return ws.send(makeAnswer(GAME.ERR_USER_NOT_FOUND));
+ }
+
+ game.players = game.players.filter((_, i) => i !== index);
+
+ if (game.isStarted) {
+ game.winner = {
+ player: game.players[0],
+ moves: game.players[0].moves,
+ };
+ }
+
+ if (game.players.length === 0) {
+ delete games[gameId];
+ } else {
+ return sendDataForPlayers(gameId);
+ }
+
+ return null;
+}
+
+export function createSeaWarGame(_data, ws) {
+ // Dissconnect player from other games
+ if (ws.id.split(":")[1] !== "") {
+ leaveSeaWarGame({ gameId: ws.id.split(":")[1] }, ws);
+ }
+
+ const player = ws.id.split(":")[0];
+ const gameId = uuidv4();
+ ws.id = `${player}:${gameId}`;
+ games[gameId] = new Game(SEAWAR.NAME);
+ const newPlayer = new SeaWarPlayer(player);
+ newPlayer.isOnline = true;
+ games[gameId].players.push(newPlayer);
+
+ sendDataForPlayers(gameId);
+}
+
+export function joinSeaWarGame(data, ws) {
+ const { gameId } = data;
+
+ const game = games[gameId];
+ if (!game) return ws.send(makeAnswer(GAME.ERR_WRONG_GAME_ID));
+
+ // Dissconnect player from other games
+ if (ws.id.split(":")[1] !== "" && ws.id.split(":")[1] !== gameId) {
+ leaveSeaWarGame({ gameId: ws.id.split(":")[1] }, ws);
+ }
+
+ const userName = ws.id.split(":")[0];
+ ws.id = `${userName}:${gameId}`;
+
+ const isJoined = checkPlayerForJoining(userName, game);
+
+ if (game.players.length >= game.playersCount && !isJoined) {
+ return ws.send(makeAnswer(GAME.ERR_GAME_IS_FULL));
+ }
+
+ if (!isJoined) {
+ const newPlayer = new SeaWarPlayer(userName);
+ newPlayer.isOnline = true;
+ game.players.push(newPlayer);
+ } else {
+ game.players.find((plr) => plr.userName === userName).isOnline = true;
+ }
+
+ return sendDataForPlayers(gameId);
+}
+
+export function startSeaWarGame(data, ws) {
+ const { gameId } = data;
+ const userName = ws.id.split(":")[0];
+
+ const game = games[gameId];
+ if (!game) return ws.send(makeAnswer(GAME.ERR_WRONG_GAME_ID));
+
+ if (userName !== game.players[0].userName) {
+ return ws.send(makeAnswer(GAME.ERR_WRONG_MAIN_PLAYER));
+ }
+
+ if (game.players.length < games.playersCount) {
+ return ws.send(makeAnswer(GAME.ERR_NOT_ENOUGH));
+ }
+
+ const mainPlayer = game.players[0];
+ const isMtxCorrect = checkMatrix(mainPlayer.gameMatrix);
+ mainPlayer.ships = fillShips(mainPlayer.gameMatrix);
+
+ if (isMtxCorrect !== SEAWAR.MTX_CORRECT) {
+ return ws.send(makeAnswer(isMtxCorrect));
+ }
+
+ game.players[0].isReady = true;
+ const isAllUsersReady = game.players.every((player) => player.isReady);
+ if (!isAllUsersReady) return ws.send(makeAnswer(GAME.ERR_NOT_ALL_READY));
+
+ if (game.winner) {
+ return ws.send(makeAnswer(GAME.GAME_ENDED));
+ }
+
+ game.isStarted = true;
+ game.players[0].isLead = true;
+
+ return sendDataForPlayers(gameId);
+}
+
+export function setSeaWarReady(data, ws) {
+ const { gameId } = data;
+ const userName = ws.id.split(":")[0];
+
+ const game = games[gameId];
+ if (!game) return ws.send(makeAnswer(GAME.ERR_WRONG_GAME_ID));
+
+ const player = game.players.find((plr) => plr.userName === userName);
+ if (!player) return ws.send(makeAnswer(GAME.ERR_USER_NOT_FOUND));
+
+ const isMtxCorrect = checkMatrix(player.gameMatrix);
+ player.ships = fillShips(player.gameMatrix);
+
+ if (isMtxCorrect !== SEAWAR.MTX_CORRECT) {
+ return ws.send(makeAnswer(isMtxCorrect));
+ }
+
+ player.isReady = true;
+
+ return sendDataForPlayers(gameId);
+}
+
+export function setSeaWarNotReady(data, ws) {
+ const { gameId } = data;
+ const userName = ws.id.split(":")[0];
+
+ const game = games[gameId];
+ if (!game) return ws.send(makeAnswer(GAME.ERR_WRONG_GAME_ID));
+
+ const player = game.players.find((plr) => plr.userName === userName);
+ if (!player) return ws.send(makeAnswer(GAME.ERR_USER_NOT_FOUND));
+
+ player.isReady = false;
+
+ return sendDataForPlayers(gameId);
+}
+
+export function setShipsPositions(data, ws) {
+ const { gameId, x, y } = data;
+ const userName = ws.id.split(":")[0];
+
+ const game = games[gameId];
+ if (!game) return ws.send(makeAnswer(GAME.ERR_WRONG_GAME_ID));
+
+ const player = game.players.find((plr) => plr.userName === userName);
+ if (!player) return ws.send(makeAnswer(GAME.ERR_USER_NOT_FOUND));
+
+ if (game.isStarted) {
+ return ws.send(makeAnswer(GAME.ERR_GAME_IS_STARTED));
+ }
+
+ if (player.gameMatrix[x][y] === SEAWAR.CLEAN) {
+ player.gameMatrix[x][y] = SEAWAR.SHIP;
+ } else {
+ player.gameMatrix[x][y] = SEAWAR.CLEAN;
+ }
+
+ return sendDataForPlayers(gameId);
+}
+
+export function getSeaWarGameData(data, ws) {
+ const { gameId } = data;
+ const userName = ws.id.split(":")[0];
+
+ const game = games[gameId];
+ if (!game) return ws.send(makeAnswer(GAME.ERR_WRONG_GAME_ID));
+
+ const player = game.players.find((plr) => plr.userName === userName);
+ if (!player) return ws.send(makeAnswer(GAME.ERR_USER_NOT_FOUND));
+
+ return sendDataForPlayers(gameId);
+}
+
+export function nextSeaWarStep(data, ws) {
+ const { gameId, x, y } = data;
+ const userName = ws.id.split(":")[0];
+
+ const game = games[gameId];
+ if (!game) return ws.send(makeAnswer(GAME.ERR_WRONG_GAME_ID));
+
+ const player = game.players.find((plr) => plr.userName === userName);
+ if (!player) return ws.send(makeAnswer(GAME.ERR_USER_NOT_FOUND));
+
+ if (player.isLead) {
+ const index = game.players.findIndex((plr) => plr === player);
+ const enemyIndex = index === 0 ? 1 : 0;
+ const enemy = game.players[enemyIndex];
+ const enemyCell = enemy.gameMatrix[x][y];
+
+ if (enemy.gameMatrix[x][y] > 0) {
+ enemy.gameMatrix[x][y] = -enemy.gameMatrix[x][y];
+ }
+
+ if (enemyCell === SEAWAR.CLEAN) {
+ player.isLead = false;
+ enemy.isLead = true;
+ player.misMoves += 1;
+ } else {
+ if (player.misMoves < pointsData.length) {
+ player.points += pointsData[player.misMoves];
+ enemy.points -= pointsData[enemy.misMoves + 2];
+ }
+
+ player.misMoves = 0;
+ checkForKill(enemy);
+
+ if (isGameEnded(enemy.gameMatrix)) {
+ // TODO: save to DB
+ game.winner = {
+ player,
+ moves: player.moves,
+ };
+ game.isStarted = false;
+ game.isLead = false;
+ createWinner(player);
+ }
+ }
+
+ player.moves += 1;
+ }
+
+ return sendDataForPlayers(gameId);
+}
diff --git a/backEnd/games/seawar/seawar.utils.mjs b/backEnd/games/seawar/seawar.utils.mjs
new file mode 100644
index 0000000..1e66b4a
--- /dev/null
+++ b/backEnd/games/seawar/seawar.utils.mjs
@@ -0,0 +1,165 @@
+// eslint-disable-next-line import/no-cycle
+import { GameData } from "../../data/game.mjs";
+import { User } from "../../data/User.mjs";
+import { Winner } from "../../data/winner.mjs";
+import { SeaWarGameData } from "../data/game-data.mjs";
+import { games } from "../data/games.mjs";
+import { SEAWAR } from "../variables.mjs";
+// eslint-disable-next-line import/no-cycle
+import { sendForUser } from "../ws/send-for-user.mjs";
+
+export const makeAnswer = (message) =>
+ JSON.stringify({ type: "message", message });
+
+const hideEnemyMatrix = (gameMatrix) =>
+ gameMatrix.map((mtx) => mtx.map((cell) => (cell > 0 ? 0 : cell)));
+
+export function getGameData(gameId, player) {
+ const { isStarted, isLead, winner, players, moves } = games[gameId];
+ const index = players.findIndex((plr) => plr === player);
+ const yourField = players[index].gameMatrix;
+ const enemyIndex = index === 0 ? 1 : 0;
+ let enemyField = players[enemyIndex]
+ ? hideEnemyMatrix(players[enemyIndex].gameMatrix)
+ : new Array(10).fill(new Array(10).fill(SEAWAR.CLEAN));
+ const enemyName = players[enemyIndex] ? players[enemyIndex].userName : null;
+ const isEnemyReady = players[enemyIndex]
+ ? players[enemyIndex].isReady
+ : false;
+ const isMainUser = index === 0;
+
+ if (winner && players[enemyIndex]) {
+ enemyField = players[enemyIndex].gameMatrix;
+ }
+
+ return new SeaWarGameData(
+ gameId,
+ player,
+ enemyName,
+ isEnemyReady,
+ isMainUser,
+ isStarted,
+ isLead,
+ winner,
+ yourField,
+ enemyField,
+ moves
+ );
+}
+
+export async function sendDataForPlayers(gameId) {
+ games[gameId].players.forEach((plr) => {
+ const data = getGameData(gameId, plr);
+ sendForUser(
+ plr.userName,
+ gameId,
+ JSON.stringify({ type: "game-data", data })
+ );
+ });
+}
+
+export const checkPlayerForJoining = (userName, game) =>
+ game.players.some((plr) => plr.userName === userName);
+
+const isOneShip = (matrix, x, y) =>
+ ((matrix[x - 1] && matrix[x - 1][y] === SEAWAR.CLEAN) || !matrix[x - 1]) &&
+ ((matrix[x + 1] && matrix[x + 1][y] === SEAWAR.CLEAN) || !matrix[x + 1]) &&
+ ((matrix[x] && matrix[x][y - 1] !== SEAWAR.SHIP) || !matrix[x][y - 1]) &&
+ ((matrix[x] && matrix[x][y + 1] !== SEAWAR.SHIP) || !matrix[x][y + 1]);
+
+export function fillShips(matrix) {
+ const ships = [];
+
+ for (let i = 0; i < 10; i += 1) {
+ let currentShipHor = { size: 0, cors: [] };
+ let currentShipVert = { size: 0, cors: [] };
+
+ for (let j = 0; j < 10; j += 1) {
+ // Hor
+ if (matrix[i][j] === SEAWAR.SHIP) {
+ currentShipHor.size += 1;
+ currentShipHor.cors.push([i, j]);
+ } else {
+ if (
+ currentShipHor.size === 1 &&
+ isOneShip(
+ matrix,
+ currentShipHor.cors[0][0],
+ currentShipHor.cors[0][1]
+ )
+ ) {
+ ships.push(currentShipHor);
+ }
+
+ if (currentShipHor.size > 1) {
+ ships.push(currentShipHor);
+ }
+
+ currentShipHor = { size: 0, cors: [] };
+ }
+
+ // Vert
+ if (matrix[j][i] === SEAWAR.SHIP) {
+ currentShipVert.size += 1;
+ currentShipVert.cors.push([j, i]);
+ } else {
+ if (currentShipVert.size > 1) {
+ ships.push(currentShipVert);
+ }
+
+ currentShipVert = { size: 0, cors: [] };
+ }
+ }
+
+ if (
+ currentShipHor.size === 1 &&
+ isOneShip(matrix, currentShipHor.cors[0][0], currentShipHor.cors[0][1])
+ ) {
+ ships.push(currentShipHor);
+ }
+
+ if (currentShipHor.size > 1) {
+ ships.push(currentShipHor);
+ }
+
+ if (currentShipVert.size > 1) {
+ ships.push(currentShipVert);
+ }
+ }
+
+ return ships;
+}
+
+function setMissPointsArround(matrix, x, y) {
+ for (let i = x - 1; i <= x + 1; i += 1) {
+ for (let j = y - 1; j <= y + 1; j += 1) {
+ if (matrix[i] && matrix[i][j] && matrix[i][j] > 0) {
+ matrix[i][j] = -matrix[i][j];
+ }
+ }
+ }
+}
+
+export function checkForKill(player) {
+ const { gameMatrix, ships } = player;
+ ships.forEach((ship) => {
+ const isKilled = ship.cors.every((cor) => gameMatrix[cor[0]][cor[1]] < 0);
+
+ if (isKilled) {
+ ship.cors.forEach((point) => {
+ setMissPointsArround(gameMatrix, point[0], point[1]);
+ });
+ }
+ });
+}
+
+export const createWinner = async (player) => {
+ new Winner({
+ points: player.points,
+ game: await GameData.findOne({ name: SEAWAR.NAME }),
+ user: await User.findOne({ userName: player.userName }),
+ }).save();
+};
+
+export const isGameEnded = (matrix) =>
+ matrix.flat().filter((cell) => cell === SEAWAR.SHIP).length === 0;
diff --git a/backEnd/games/variables.mjs b/backEnd/games/variables.mjs
new file mode 100644
index 0000000..c7a4709
--- /dev/null
+++ b/backEnd/games/variables.mjs
@@ -0,0 +1,30 @@
+export const GAME = {
+ ERR_USER_NOT_FOUND: "This user is not connected to the game",
+ ERR_NOT_ENOUGH: "Not enough players for start",
+ ERR_WRONG_MAIN_PLAYER: "You don't have permission to start the game",
+ ERR_NOT_ALL_READY: "Not all players are ready to start the game",
+ ERR_WRONG_GAME_ID: "Game not found!",
+ ERR_WRONG_TOKEN: "Wrong or expired token",
+ ERR_USER_IS_BANNED: "User is banned!",
+ ERR_GAME_IS_FULL: "Maximum number of players in the game",
+ ERR_GAME_IS_STARTED:
+ "The game is already started, you can not change the position of the ships",
+ ERR_SERVER: "Server error!",
+
+ GAME_ENDED: "Game is ended!",
+ WS_CONNECTED: "You are connected",
+};
+
+export const TIMEOUT = 30000;
+
+// SeaWar
+export const SEAWAR = {
+ NAME: "SeaBattle",
+ CLEAN: 1,
+ SHIP: 2,
+ MISS: 1,
+ HIT: 2,
+ MTX_CORRECT: "Correct!",
+ MTX_WRONG_SHIPS: "Wrong ships count",
+ MTX_WRONG_CELLS: "Wrong ships position",
+};
diff --git a/backEnd/games/ws/send-for-user.mjs b/backEnd/games/ws/send-for-user.mjs
new file mode 100644
index 0000000..88d7098
--- /dev/null
+++ b/backEnd/games/ws/send-for-user.mjs
@@ -0,0 +1,17 @@
+// eslint-disable-next-line import/no-cycle
+import { aWssSeaWar } from "../../server.mjs";
+
+export function sendForUser(player, gameId, message) {
+ if (typeof message !== "string") {
+ message = JSON.stringify(message);
+ }
+
+ aWssSeaWar.clients.forEach((client) => {
+ if (
+ client.id.split(":")[0] === player &&
+ client.id.split(":")[1] === gameId
+ ) {
+ client.send(message);
+ }
+ });
+}
diff --git a/backEnd/games/ws/ws-main.mjs b/backEnd/games/ws/ws-main.mjs
new file mode 100644
index 0000000..1a7433a
--- /dev/null
+++ b/backEnd/games/ws/ws-main.mjs
@@ -0,0 +1,106 @@
+import { checkUser } from "../../controllers/user-controller.mjs";
+import { User } from "../../data/User.mjs";
+import { logger } from "../../logger.mjs";
+import { games } from "../data/games.mjs";
+// eslint-disable-next-line import/no-cycle
+import {
+ createSeaWarGame,
+ joinSeaWarGame,
+ leaveSeaWarGame,
+ getSeaWarGameData,
+ nextSeaWarStep,
+ setSeaWarNotReady,
+ setSeaWarReady,
+ setShipsPositions,
+ startSeaWarGame,
+} from "../seawar/seawar.mjs";
+import { makeAnswer } from "../seawar/seawar.utils.mjs";
+import { GAME, TIMEOUT } from "../variables.mjs";
+
+const messageHandler = {
+ create: createSeaWarGame,
+ join: joinSeaWarGame,
+ leave: leaveSeaWarGame,
+ start: startSeaWarGame,
+ ready: setSeaWarReady,
+ "not-ready": setSeaWarNotReady,
+ set: setShipsPositions,
+ "get-data": getSeaWarGameData,
+ move: nextSeaWarStep,
+};
+
+async function wsConnect(ws, data) {
+ const { player, token } = data;
+
+ if (!(await checkUser(player, token))) {
+ return ws.send(makeAnswer(GAME.ERR_WRONG_TOKEN));
+ }
+
+ if ((await User.findOne({ userName: player })).banned) {
+ return ws.send(makeAnswer(GAME.ERR_USER_IS_BANNED));
+ }
+
+ ws.id = `${player}:`;
+
+ return ws.send(makeAnswer(GAME.WS_CONNECTED));
+}
+
+export async function seaWarSocket(ws) {
+ ws.on("message", async (msg) => {
+ try {
+ const { type, data } = JSON.parse(msg);
+
+ if (type === "ws-connect") {
+ await wsConnect(ws, data);
+ } else if (!messageHandler[type]) {
+ await ws.send(makeAnswer("Wrong message type!"));
+ } else {
+ if ((await User.findOne({ userName: ws.id.split(":")[0] })).banned) {
+ ws.send(makeAnswer(GAME.ERR_USER_IS_BANNED));
+ }
+
+ messageHandler[type](data, ws);
+ }
+ } catch (err) {
+ ws.send(makeAnswer(`${GAME.ERR_SERVER} ${err.message}`));
+ logger.error(err.message);
+ }
+ });
+ ws.on("close", () => {
+ try {
+ const [userName, gameId] = ws.id.split(":");
+ const game = games[gameId];
+
+ if (!game) return;
+ const player = game.players.find((plr) => plr.userName === userName);
+ player.isOnline = false;
+
+ if (gameId === "") return;
+ // eslint-disable-next-line consistent-return
+ setTimeout(() => {
+ try {
+ const resPlayer = game.players.find(
+ (plr) => plr.userName === userName
+ );
+
+ if (resPlayer.isOnline) {
+ return null;
+ }
+
+ if (!game) {
+ return null;
+ }
+
+ leaveSeaWarGame({ gameId }, ws);
+ game.players = game.players.filter(
+ (plr) => plr.userName !== userName
+ );
+ } catch {
+ /* empty */
+ }
+ }, TIMEOUT);
+ } catch {
+ /* empty */
+ }
+ });
+}
diff --git a/backEnd/logger.mjs b/backEnd/logger.mjs
new file mode 100644
index 0000000..0b0fc48
--- /dev/null
+++ b/backEnd/logger.mjs
@@ -0,0 +1,16 @@
+import winston from "winston";
+
+const { combine, timestamp, printf, colorize, align } = winston.format;
+
+export const logger = winston.createLogger({
+ level: process.env.LOG_LEVEL || "info",
+ format: combine(
+ colorize({ all: true }),
+ timestamp({
+ format: "YYYY-MM-DD hh:mm:ss.SSS A",
+ }),
+ align(),
+ printf((info) => `[${info.timestamp}] ${info.level}: ${info.message}`)
+ ),
+ transports: [new winston.transports.Console()],
+});
diff --git a/backEnd/mail/mail-creator.mjs b/backEnd/mail/mail-creator.mjs
new file mode 100644
index 0000000..9c44ad1
--- /dev/null
+++ b/backEnd/mail/mail-creator.mjs
@@ -0,0 +1,62 @@
+export const createMail = (isUserData, message, username, passwordOrURL) => {
+ const contentData = isUserData
+ ? `
${message}
+
+ Use your username and password to enter the game portal
+
+
User Name:
+
${username}
+
Password:
+
${passwordOrURL}
+
`
+ : `${message}
+
+ If you have not requested a password reset, please ignore this message. To reset your password, please click "Change Password" or copy the link below and open it in your browser.
+ `;
+
+ return `
+
+
+
+
+
+
+
+
+
Gaming Zone has the best free online games selection and offers the most fun experience to play alone or with friends.
+
+ ${contentData}
+
+
+
+
+
+ `;
+};
diff --git a/backEnd/mail/mail-service.js b/backEnd/mail/mail-service.js
new file mode 100644
index 0000000..0e22f80
--- /dev/null
+++ b/backEnd/mail/mail-service.js
@@ -0,0 +1,66 @@
+import dotenv from "dotenv";
+// eslint-disable-next-line import/no-extraneous-dependencies
+import nodemailer from "nodemailer";
+
+import { createMail } from "./mail-creator.mjs";
+
+dotenv.config();
+
+class MailService {
+ constructor() {
+ this.transporter = nodemailer.createTransport({
+ host: process.env.SMTP_HOST,
+ port: process.env.SMTP_PORT,
+ secure: false,
+ auth: {
+ user: process.env.SMTP_USER,
+ pass: process.env.SMTP_PASS,
+ },
+ tls: {
+ rejectUnauthorized: false,
+ },
+ });
+ }
+
+ async sendResetPassEMail(to, userName, resetLink) {
+ await this.transporter.sendMail({
+ from: process.env.SMTP_USER,
+ to,
+ subject: "RSGames.online: Password recovery",
+ text: "",
+ html: createMail(
+ false,
+ "Password recovery for RSGames.online",
+ userName,
+ resetLink
+ ),
+ });
+ }
+
+ async sendRegistrEmail(to, userName, password) {
+ await this.transporter.sendMail({
+ from: process.env.SMTP_USER,
+ to,
+ subject: "RSGames.online: Successful registration",
+ text: "",
+ html: createMail(true, "Welcome to RSGames.online!", userName, password),
+ });
+ }
+
+ async sendPassChangedEmail(to, userName, password) {
+ await this.transporter.sendMail({
+ from: process.env.SMTP_USER,
+ to,
+ subject: "RSGames.online: Password changed",
+ text: "",
+ html: createMail(
+ true,
+ "Password has been successfully changed!",
+ userName,
+ password
+ ),
+ });
+ }
+}
+
+export const mailService = new MailService();
diff --git a/backEnd/mail/mail.html b/backEnd/mail/mail.html
new file mode 100644
index 0000000..31625aa
--- /dev/null
+++ b/backEnd/mail/mail.html
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
Gaming Zone has the best free online games selection and offers the most fun experience to play alone or with friends.
+
+ ${contentData}
+
+
+
+
+
\ No newline at end of file
diff --git a/backEnd/middleware/admin-middleware.mjs b/backEnd/middleware/admin-middleware.mjs
new file mode 100644
index 0000000..6b0d914
--- /dev/null
+++ b/backEnd/middleware/admin-middleware.mjs
@@ -0,0 +1,32 @@
+import jsonwebtoken from "jsonwebtoken";
+
+export function adminMiddleware(statuses) {
+ // eslint-disable-next-line func-names, consistent-return
+ return function (req, res, next) {
+ if (req.method === "OPTIONS") {
+ next();
+ }
+
+ try {
+ const token = req.headers.authorization.split(" ")[1];
+
+ if (!token) {
+ return res.status(403).json({ message: "User not authorized" });
+ }
+
+ const { statuses: uStatuses } = jsonwebtoken.verify(
+ token,
+ process.env.KEY
+ );
+ const hasStatus = uStatuses.some((status) => statuses.includes(status));
+
+ if (!hasStatus) {
+ return res.status(405).json({ message: "You do not have permission" });
+ }
+
+ next();
+ } catch (err) {
+ return res.status(403).json({ message: "User not authorized" });
+ }
+ };
+}
diff --git a/backEnd/middleware/authorized-user.mjs b/backEnd/middleware/authorized-user.mjs
new file mode 100644
index 0000000..8c03943
--- /dev/null
+++ b/backEnd/middleware/authorized-user.mjs
@@ -0,0 +1,32 @@
+import jsonwebtoken from "jsonwebtoken";
+
+import { User } from "../data/User.mjs";
+
+// eslint-disable-next-line consistent-return
+export async function authorizedUser(req, res, next) {
+ if (req.method === "OPTIONS") {
+ next();
+ }
+
+ try {
+ const token = req.headers.authorization.split(" ")[1];
+
+ if (!token) {
+ return res.status(403).json({ message: "User not authorized" });
+ }
+
+ const data = jsonwebtoken.verify(token, process.env.KEY);
+ req.user = data;
+ const user = await User.findById(data.id);
+
+ if (!user) {
+ return res.status(403).json({ message: "User not authorized" });
+ }
+
+ req.userName = user ? user.userName : null;
+ req.banned = user ? user.banned : false;
+ next();
+ } catch (err) {
+ return res.status(403).json({ message: "User not authorized" });
+ }
+}
diff --git a/backEnd/middleware/baned-midleware.mjs b/backEnd/middleware/baned-midleware.mjs
new file mode 100644
index 0000000..f17cfe8
--- /dev/null
+++ b/backEnd/middleware/baned-midleware.mjs
@@ -0,0 +1,12 @@
+// eslint-disable-next-line consistent-return
+export function banedUser(req, res, next) {
+ try {
+ if (req.banned) {
+ return res.json({ message: "You are banned!" });
+ }
+
+ next();
+ } catch (err) {
+ return res.status(403).json({ message: "User not authorized" });
+ }
+}
diff --git a/backEnd/middleware/validator.mjs b/backEnd/middleware/validator.mjs
new file mode 100644
index 0000000..04c40b2
--- /dev/null
+++ b/backEnd/middleware/validator.mjs
@@ -0,0 +1,25 @@
+import { check } from "express-validator";
+
+export function validator() {
+ return [
+ check("username", "Username must not be empty").notEmpty(),
+ check("username", "Username must not be less than 3 characters").isLength({
+ min: 3,
+ }),
+ check(
+ "username",
+ "Username must not be longer than 32 characters"
+ ).isLength({
+ max: 32,
+ }),
+ check("password", "Password must not be less than 5 characters").isLength({
+ min: 5,
+ }),
+ check(
+ "password",
+ "Password must not be longer than 32 characters"
+ ).isLength({
+ max: 32,
+ }),
+ ];
+}
diff --git a/backEnd/router.mjs b/backEnd/router.mjs
new file mode 100644
index 0000000..96a11f2
--- /dev/null
+++ b/backEnd/router.mjs
@@ -0,0 +1,44 @@
+import bodyParser from "body-parser";
+import cors from "cors";
+import { Router } from "express";
+import { asyncMiddleware } from "middleware-async";
+
+import {
+ deleteUser,
+ getUsers,
+ getUser,
+ getUserByName,
+ login,
+ register,
+ resetpass,
+ setNewPass,
+ getNameForNewPass,
+ setUserStatus,
+ banUser,
+ changePass,
+} from "./controllers/user-controller.mjs";
+import { adminMiddleware } from "./middleware/admin-middleware.mjs";
+import { authorizedUser } from "./middleware/authorized-user.mjs";
+
+const jsonParser = bodyParser.json();
+
+export const router = new Router();
+
+router.use(cors());
+router.post("/forgotpass", jsonParser, resetpass); // {userName, email}
+router.put("/setpass", jsonParser, asyncMiddleware(authorizedUser), changePass); // {password, newPassword}
+router.post("/setpass", jsonParser, setNewPass); // {password, resetToken}
+router.get("/setpass", jsonParser, getNameForNewPass); // {?resetToken=...}
+router.post("/registr", jsonParser, register); // { userName, email, password }
+router.post("/login", jsonParser, login); // { userName, password }
+router.get("/users", adminMiddleware(["admin", "moderator"]), getUsers);
+router.get("/myuser", asyncMiddleware(authorizedUser), getUser);
+router.get("/user", adminMiddleware(["admin", "moderator"]), getUserByName);
+router.put("/user", jsonParser, adminMiddleware(["admin"]), setUserStatus);
+router.delete("/user", jsonParser, adminMiddleware(["admin"]), deleteUser); // { userName }
+router.get("/user/ban", adminMiddleware(["admin", "moderator"]), banUser(true));
+router.get(
+ "/user/unban",
+ adminMiddleware(["admin", "moderator"]),
+ banUser(false)
+);
diff --git a/backEnd/server.mjs b/backEnd/server.mjs
new file mode 100644
index 0000000..a82ef70
--- /dev/null
+++ b/backEnd/server.mjs
@@ -0,0 +1,87 @@
+import * as fs from "fs";
+import http from "http";
+import https from "https";
+
+import bodyParser from "body-parser";
+import cookieParser from "cookie-parser";
+import cors from "cors";
+import dotenv from "dotenv";
+import express from "express";
+import expressWs from "express-ws";
+import mongoose from "mongoose";
+import { WebSocketServer } from "ws";
+
+import { getGameData } from "./controllers/game-data-controller.mjs";
+import { capchaGenerator } from "./data/capcha.mjs";
+import { SEAWAR } from "./games/variables.mjs";
+// eslint-disable-next-line import/no-cycle
+import { seaWarSocket } from "./games/ws/ws-main.mjs";
+import { gameHttpRouter } from "./games.mjs";
+import { logger } from "./logger.mjs";
+import { router } from "./router.mjs";
+import { winRouter } from "./winners.mjs";
+
+dotenv.config();
+const app = express();
+expressWs(app);
+const port = Number(process.env.PORT) || 8888;
+const ports = Number(process.env.PORTS) || 8000;
+const pass = process.env.PASS || "temp_pass";
+const sslSrt = process.env.SSL_CRT || "backEnd/ssl/selfsigned.crt";
+const sslKey = process.env.SSL_KEY || "backEnd/ssl/selfsigned.key";
+
+app.use("/auth", router);
+app.use("/games", gameHttpRouter);
+app.use("/win", winRouter);
+app.use(express.urlencoded({ extended: true }));
+app.use(cookieParser());
+app.use(express.json());
+app.use(cors());
+
+const options = {
+ key: fs.readFileSync(sslKey, "utf8"),
+ cert: fs.readFileSync(sslSrt, "utf8"),
+};
+
+await mongoose.connect(
+ `mongodb+srv://rsgames:${pass}@cluster0.d9hevcc.mongodb.net/?retryWrites=true&w=majority`
+);
+https.createServer(options, app).listen(port, () => {
+ logger.info(`https server is runing at port ${port}`);
+});
+
+http.createServer(app).listen(ports, () => {
+ logger.info(`http server is runing at port ${ports}`);
+});
+
+app.get("/", (_req, res) => {
+ logger.info("Server is online");
+ res.send({ resp: "Server is online" });
+});
+
+app.get("/gameData/:name", getGameData);
+
+const jsonParser = bodyParser.json();
+
+app.get("/capcha", async (_req, res) => {
+ const capchaRes = await capchaGenerator.newCapcha();
+ res.json(capchaRes);
+});
+
+app.post("/capcha", jsonParser, (req, res) => {
+ const { capchaToken, capchaValue } = req.body;
+ const isCorrect = capchaGenerator.checkCorrectCapcha(
+ capchaToken,
+ capchaValue
+ );
+ res.json({ isCorrect });
+});
+
+const WS_SEAWAR_PORT = 8001;
+const server = https.createServer(options);
+
+export const aWssSeaWar = new WebSocketServer({ server });
+aWssSeaWar.on("connection", seaWarSocket);
+server.listen(WS_SEAWAR_PORT, () => {
+ logger.info(`${SEAWAR.NAME} web socket is runing at port ${WS_SEAWAR_PORT}`);
+});
diff --git a/backEnd/ssl/selfsigned.crt b/backEnd/ssl/selfsigned.crt
new file mode 100644
index 0000000..31ad00b
--- /dev/null
+++ b/backEnd/ssl/selfsigned.crt
@@ -0,0 +1,23 @@
+-----BEGIN CERTIFICATE-----
+MIIDzTCCArWgAwIBAgIUXF0gHhnQACVlKpEMopD0lvJbT0EwDQYJKoZIhvcNAQEL
+BQAwdjELMAkGA1UEBhMCS1oxEjAQBgNVBAcMCWthcmFnYW5kYTELMAkGA1UECgwC
+cnMxDDAKBgNVBAsMA21heDESMBAGA1UEAwwJbG9jYWxob3N0MSQwIgYJKoZIhvcN
+AQkBFhVmcmFraWVjMzYwMEBnbWFpbC5jb20wHhcNMjMwMjAxMDk1OTA4WhcNMjQw
+MjAxMDk1OTA4WjB2MQswCQYDVQQGEwJLWjESMBAGA1UEBwwJa2FyYWdhbmRhMQsw
+CQYDVQQKDAJyczEMMAoGA1UECwwDbWF4MRIwEAYDVQQDDAlsb2NhbGhvc3QxJDAi
+BgkqhkiG9w0BCQEWFWZyYWtpZWMzNjAwQGdtYWlsLmNvbTCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBALA71eR/oHfa4kZukZO+IbW3CSw2kAL2FdKbnoXg
+67UHaw378+B86/s4J2K+mpOxcUStAmG7YszOR5Jb7VfFjP4Rj1Ol00BQ77HXbqr7
+x6DhcMqauRDfu6wikY0UUy6VUsqkDNgpUV7mFOpk84IhrCLWKYc6EhUAIP1iIPPg
+rdRlmDaPxSM8rRMOMpkkGG5YGkg1wthYsHCiZmEaymoBajkV7Ty76LYXtLued8iS
+S7anC2ZnkgD8HhyB5GQIsDfl85TwAIW/l2ichdSxWyz7/DH+4D14Xu5ZZhJVQImq
+SgX9bkWn71yRvIvlja/1SdIDuUhQh7TdZ547Hz2altWimPMCAwEAAaNTMFEwHQYD
+VR0OBBYEFMvKoqnckGiKso5Xv/OCCHbCW0ewMB8GA1UdIwQYMBaAFMvKoqnckGiK
+so5Xv/OCCHbCW0ewMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEB
+AFMqgOY/wsU+APslGCcyaxsOWQ5v7z2iXFQAGhz/I2oB9Prf8+UekC+zsRQJe+y7
+SKToDvmEe6u+OLfuQR/W7vz8QTKbFv/Uy4tN/eTRFV3en3rwqKSlp0GHh5+lilkI
+FyEFRajdOCXrE85ncXDh3MXNu/gb1x/ww+iamriur3GOxz22mKSMibDwK7EE2zRm
+dNUIrZzrhKp3WOpsQhaTNFz4vz6vQpc91tMuuAl9Poq0NanPMF66WO8oF7sLBE97
+898lWrpd1trq7+V9X3aG43HB9aDaHBJm2a2gVTFFULv3wQUO6Ro2vl0ut/6ortGv
+D+hoEwgfr1WkzY/S0B/cRX8=
+-----END CERTIFICATE-----
diff --git a/backEnd/ssl/selfsigned.key b/backEnd/ssl/selfsigned.key
new file mode 100644
index 0000000..7d7e284
--- /dev/null
+++ b/backEnd/ssl/selfsigned.key
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCwO9Xkf6B32uJG
+bpGTviG1twksNpAC9hXSm56F4Ou1B2sN+/PgfOv7OCdivpqTsXFErQJhu2LMzkeS
+W+1XxYz+EY9TpdNAUO+x126q+8eg4XDKmrkQ37usIpGNFFMulVLKpAzYKVFe5hTq
+ZPOCIawi1imHOhIVACD9YiDz4K3UZZg2j8UjPK0TDjKZJBhuWBpINcLYWLBwomZh
+GspqAWo5Fe08u+i2F7S7nnfIkku2pwtmZ5IA/B4cgeRkCLA35fOU8ACFv5donIXU
+sVss+/wx/uA9eF7uWWYSVUCJqkoF/W5Fp+9ckbyL5Y2v9UnSA7lIUIe03WeeOx89
+mpbVopjzAgMBAAECggEAVH+sE845453Yhoq3VE6CnT0wsblLnY/ecMfa3zgz6+2t
+n9vhWA6tmxuWjtrzBMO8moAVt0SAn9B8MqnPCBmZe6xxu1q0Co+EDhJMZsEoO3Q8
+f3hmKbgMpQFCJpHLPHeuZaj426Ab+tN4zdYvh4KbpWxoJwVp7BXOu48UW7qrvj1Y
+Kfq5fIE49AmYAJda8Ic0NRTpbcPZ1olw5PW7wjgI8GPV6PXnlQN39mI0iUvwaJbA
+LR02WXw/S7YzoFv2sgjmcqqzs4Evrk8ihOIOMTry3+ov4wm6V5N7/Y+3xRfS4CgV
+v8F3hkfhegZj+WE3SXrAdpCJ5vo4qiCT/nbPFvsbAQKBgQDfJkjUeepAo5woVfTO
+sFFwGG6QwfIuHOhR1YZy+VtKsNg0JnLQ9tHJSMDVQXuQ3iShJZPEyZ3nNY03y+kJ
+yV5fP98unqBzRN90Q48Y4vlXBGDscmD/FCWuRiQGj4l5YDHrsy6K8fI47Mk3YnDl
+DOHTsPqCEmMxkzVHCTBf9u4mgQKBgQDKLXXQRHlQKdmm6usWBteDQBIoxSQXNV6H
+sLMjnjVDTUBRxQ3mr+yIOpPVMG0le/3ws93Vt0koEScTiKwcQJFu6LHGdGoK0KRF
+Vx+LoApZ8VRWq597R829Fae+rvXGdL4oderkfvZtX4Rffo9YhQQYkFA5y4locfDM
+1NIfntLNcwKBgQDBmtm9Xzkac9jcNhd77AX8F3Z2KY8Q6wu1VGieADJwjxZFyMX8
+/ufsly6W14V5nwJwvcWDCtnw68lmC4hYcVlrkmL0c7QJzkuA98yDbwmdsbLV8jat
+mLFIjppbBtXjdM5bDM7oxhm9wdKiNsp0L8UOgZIWoBVnwayLwTEzUW42AQKBgF83
+c8HnTb78Rr4+6wKPrFXrCeJbnjiz8NY02NlQfEM7EayxAm//sIUkGVWRHgZGU/1V
+qIcrb+/HzEB94JjZq+SxAHC3iO2Y/5SMiJXIhLeBWbgL0etMkM+ZcEv0uFmDx77k
+cgC07rfqATy8LSSCWMB8ztu5SPiAmOjO3jr4IM2TAoGAL4Ki1lNTA2+ETjWJaQb8
+4dobwJHCpFaqkiFyubjVFT5K7kMMjGHH8q4H6u7i0ATyLeB4t7gm+L7lFrbMMFiP
+C1ZVal/tMOgXfrhjsUWUvXa4r/TMGpESy+HrdF106fyzbAb/Fz4MWE0zCglQkxca
+AYzajcCLuKm2sMMX4U1sWBM=
+-----END PRIVATE KEY-----
diff --git a/backEnd/utils/comments-utils.mjs b/backEnd/utils/comments-utils.mjs
new file mode 100644
index 0000000..67efd44
--- /dev/null
+++ b/backEnd/utils/comments-utils.mjs
@@ -0,0 +1,33 @@
+import { Comment } from "../data/comment.mjs";
+import { GameData } from "../data/game.mjs";
+import { User } from "../data/User.mjs";
+
+export async function getCommentsForGame(name) {
+ const comments = await Promise.all(
+ (
+ await Comment.find()
+ ).map(async (comment) => {
+ const { text, raiting, date } = comment;
+ const user = await User.findById(comment.user);
+ const { userName } = user || { userName: "" };
+ const game = await GameData.findById(comment.game);
+ const { name: gameName } = game || { name: "" };
+
+ return { userName, gameName, text, raiting, date };
+ })
+ );
+
+ return comments.filter(
+ (comment) => (name ? name === comment.gameName : true) && comment.userName
+ );
+}
+
+export async function getGameRaiting(name) {
+ const comments = await getCommentsForGame(name);
+ if (comments.length === 0) return 0;
+
+ return (
+ comments.reduce((sum, comment) => sum + comment.raiting, 0) /
+ comments.length
+ );
+}
diff --git a/backEnd/winners.mjs b/backEnd/winners.mjs
new file mode 100644
index 0000000..1837ab8
--- /dev/null
+++ b/backEnd/winners.mjs
@@ -0,0 +1,15 @@
+import bodyParser from "body-parser";
+import cors from "cors";
+import { Router } from "express";
+import { asyncMiddleware } from "middleware-async";
+
+import { addWinner, getWinners } from "./controllers/win-controller.mjs";
+import { authorizedUser } from "./middleware/authorized-user.mjs";
+
+const jsonParser = bodyParser.json();
+
+export const winRouter = new Router();
+winRouter.use(cors());
+
+winRouter.post("/data", asyncMiddleware(authorizedUser), jsonParser, addWinner);
+winRouter.get("/data", asyncMiddleware(authorizedUser), getWinners);
diff --git a/docs/auth.md b/docs/auth.md
new file mode 100644
index 0000000..4c48dc2
--- /dev/null
+++ b/docs/auth.md
@@ -0,0 +1,342 @@
+# Регистрация и авторизация пользователя, Back End
+
+Основной адрес для запросов связанных с авторизацией:
+- глобально: `https://rsgames.online:8888/auth/...`
+- локально: `http://localhost:8000/auth/...`
+
+### Запросы на сервер :
+
+#### 1. Регистрация (registration)
+ - *address:* **/auth/regist/**
+ - *method:* `POST`,
+ - *body:*
+
+``` JSON
+{
+ "userName": "Vasya",
+ "email": "vasya.371@mail.ru",
+ "password": "123456"
+}
+```
+ - *successful response:* code: **200**
+``` JSON
+{
+ "message": "New User has been successfully created!"
+}
+```
+ - *unsuccessful response:* code: **400**
+``` JSON
+{
+ "message": "Password Changing Error"
+}
+```
+
+#### 2. **Авторизация** (login)
+ - *address:* **/auth/login/**
+ - *method:* `POST`,
+ - *body:*
+
+``` JSON
+{
+ "userName": "Vasya",
+ "password": "123456"
+}
+```
+ - *unsuccessful response:* code: **405**
+``` JSON
+{
+ "message": "Incorrect password for {userName}"
+}
+```
+ - *unsuccessful response:* code: **404**
+``` JSON
+{
+ "message": "User {userName} not found"
+}
+```
+ - *successful response:* code: **200**
+``` JSON
+{
+ "token": "eyJhbGciOiJOEzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjYzZGZ2Ma6lMmRiZjJjZGM0NTQzNzU0NiIsInN0YXR1c2VzIjpbImFkbWluIl0sImlhdCI6MTY3NTYyMTI3MSwiZX2wIjoxNjc1Nzk0MDcxfQ.DV-pTi3ICN65nh3HAoqI-A6HCg62OoufR8Bgw45oq8Y"
+}
+```
+Полученный токен используется для авторизации пользователя. (см. Токен пользователя)
+
+#### 3. **Получение списка пользователей** (users list)
+ - *address:* **/auth/users/**
+ - *method:* `GET`,
+ - *header:* `Authorization` with token
+ - *unsuccessful response:* code: **405**
+``` JSON
+{
+ "message": "You do not have permission"
+}
+```
+ - *unsuccessful response:* code: **405**
+``` JSON
+{
+ "message": "You do not have permission"
+}
+```
+ - *successful response:* code: **200**
+``` JSON
+[
+ {
+ "_id": "63dfd49b2571ef2e8ea3113d",
+ "userName": "Vasya",
+ "password": "$2A$07$isD5IKBkZasc8fUjEa9SGO4.btlmL3cq0FkT0m4scZpUMX3sHEOFu",
+ "status": [ "user" ],
+ "date": "2023-02-05T16:08:59.414Z",
+ "__v": 0
+ },
+ // ...
+]
+```
+Выводится список всех пользователей, команда доступна только пользователям со статусом admin
+
+#### 4. Запрос восстановления доступа (забыл пароль)
+ - *address:* **/auth/forgotpass/**
+ - *method:* `POST`,
+ - *body:*
+``` JSON
+{ "userName": "Vasya" }
+```
+или
+``` JSON
+{ "email": "vasya.371@mail.ru" }
+```
+ - *unsuccessful response:* code: **401**
+``` JSON
+{
+ "message": "Wrong Input Data"
+}
+```
+ - *unsuccessful response:* code: **404**
+``` JSON
+{
+ "message": "User not found"
+}
+```
+ - *unsuccessful response:* code: **400**
+``` JSON
+{
+ "message": "Reset Error"
+}
+```
+ - *successful response:* code: **200**
+``` JSON
+{
+ "message": "E-mail sended to vasya.371@mail.ru",
+ "resetToken": "8q7d3syf-q5gj-6ad6-1sb3-72sgx2d4djs1"
+}
+```
+После этого на e-mail указанный при регистрации пользователя _(vasya.371@mail.ru)_ будет отправлена ссылка для сброса пароля, формата:
+`https://rsgames.online/resetpass?resetToken=8q7d3syf-q5gj-6ad6-1sb3-72sgx2d4djs1`
+Используйте страницу `https://rsgames.online/resetpas` и query-параметр `resetToken` для сброса пароля. Используя для этого следующий запрос:
+
+#### 5. Восстановления доступа - новый пароль
+ - *address:* **/auth/setpass/**
+ - *method:* `POST`,
+ - *body:*
+``` JSON
+{
+ "password": "NewPassword",
+ "resetToken": "8q7d3syf-q5gj-6ad6-1sb3-72sgx2d4djs1"
+}
+```
+После выполнения запроса, при правильно указанном `resetToken` - пароль пользователя будет изменен на новый.
+ - *unsuccessful response:* code: **404**
+``` JSON
+{
+ "message": "User not found"
+}
+```
+ - *unsuccessful response:* code: **400**
+``` JSON
+{
+ "message": "Password Reset Error"
+}
+```
+ - *successful response:* code: **200**
+``` JSON
+{
+ "message": "Password has been changed!"
+}
+```
+
+#### 6. Удаление пользователя (доступно администратору)
+ - *address:* **/auth/user/**
+ - *method:* `DELETE`,
+ - *body:*
+``` JSON
+{
+ "userName": "Vasya"
+}
+```
+ - *unsuccessful response:* code: **404**
+``` JSON
+{
+ "message": "User not found"
+}
+```
+ - *unsuccessful response:* code: **400**
+``` JSON
+{
+ "message": "Failed to delete user"
+}
+```
+ - *successful response:* code: **204**
+
+#### 7. Получение данных о пользователе:
+ - *address:* **/auth/myuser/**
+ - *method:* `GET`,
+ - *header:* `Authorization` with token
+ - *unsuccessful response:* code: **403**
+``` JSON
+{
+ "message": "User not authorized"
+}
+```
+ - *unsuccessful response:* code: **400**
+``` JSON
+{
+ "message": "Failed to get users"
+}
+```
+ - *successful response:* code: **200**
+``` JSON
+{
+ "userName": "Vasya",
+ "email": "vasya.371@mail.ru",
+ "status": [
+ "admin"
+ ],
+ "banned": false,
+ "date": "2023-02-06T09:07:46.283Z"
+}
+```
+
+#### 8. Изменение статуса пользователя (доступно администратору)
+ - *address:* **/auth/user/**
+ - *method:* `PUT`,
+ - *body:*
+``` JSON
+{
+ "userName": "Vasya"
+}
+```
+ - *unsuccessful response:* code: **405**
+``` JSON
+{
+ "message": "You do not have permission"
+}
+```
+ - *unsuccessful response:* code: **400**
+``` JSON
+{
+ "message": "Failed to set new status"
+}
+```
+ - *successful response:* code: **200**
+``` JSON
+{
+ "message": "Status changed",
+ "user":
+}
+```
+Изменяет заменяет массив статусов пользователя на новый.
+
+#### 9. Получение данных о другом пользователе (доступно администратору и модератору):
+ - *address:* **/auth/user?userName={userName}**
+ - *method:* `GET`,
+ - *header:* `Authorization` with token
+ - *unsuccessful response:* code: **403**
+``` JSON
+{
+ "message": "User not authorized"
+}
+```
+ - *unsuccessful response:* code: **400**
+``` JSON
+{
+ "message": "Failed to get user"
+}
+```
+ - *successful response:* code: **200**
+``` JSON
+{
+ "userName": "Vasya",
+ "email": "vasya.371@mail.ru",
+ "status": [
+ "admin"
+ ],
+ "banned": false,
+ "date": "2023-02-06T09:07:46.283Z"
+}
+```
+
+#### 10. Забанить пользователя (доступно администратору и модератору):
+ - *address:* **/auth/user/ban?userName={userName}**
+ - *method:* `GET`,
+ - *header:* `Authorization` with token
+ - *successful response:* code: **200**
+``` JSON
+{
+ "message": "User Vasya has been banned"
+}
+```
+
+#### 11. Разбанить пользователя (доступно администратору и модератору):
+ - *address:* **/auth/user/unban?userName={userName}**
+ - *method:* `GET`,
+ - *header:* `Authorization` with token
+ - *successful response:* code: **200**
+``` JSON
+{
+ "message": "User Vasya has been unbanned"
+}
+```
+
+#### 12. Регистрация (registration)
+ - *address:* **/auth/setpass/**
+ - *method:* `PUT`,
+ - *header:* `Authorization` with token
+ - *body:*
+
+``` JSON
+{
+ "password": "123456",
+ "newPassword": "654321",
+}
+```
+ - *successful response:* code: **200**
+``` JSON
+{
+ "message": "Password has been changed!"
+}
+```
+ - *unsuccessful response:* code: **404**
+``` JSON
+{
+ "message": "User {userName} not found"
+}
+```
+ - *unsuccessful response:* code: **405**
+``` JSON
+{
+ "message": "Incorrect password for ${userName}"
+}
+```
+ - *unsuccessful response:* code: **400**
+``` JSON
+{
+ "message": "Incorrect password for ${userName}"
+}
+```
+
+
+## Токен пользователя
+Для авторизированного пользователя, чтобы сообщить серверу, какой пользователь отправляет запросы, нужно отправлять на сервер запросы с заголовком __"Authorization"__ тогда сервер сможет корректно обрабатывать запросы:
+ - *Header Name:* `Authorization`
+ - *Header Value:* `Bearer {user-token-value}`
+Значение полученного токена - `user-token-value`, пишется без `{` и `}` :)
diff --git a/docs/comments.md b/docs/comments.md
new file mode 100644
index 0000000..2e15c8c
--- /dev/null
+++ b/docs/comments.md
@@ -0,0 +1,99 @@
+# Работа с отзывами (комментариями), Back End
+
+Основной адрес для запросов связанных с отзывами (комментариями):
+
+- глобально: `https://rsgames.online:8888/games/comments`
+
+- локально: `http://localhost:8000/games/comments`
+
+### Запросы на сервер :
+
+#### 1. Получить список комментариев
+- *address:* **/games/comments[?gameName={gameName}]**
+- *method:* `GET`
+- *successful response:* code: **200**
+``` JSON
+[
+ {
+ "userName": "Jerubrin",
+ "gameName": "Sea War",
+ "text": "Мега крутая игра! Очень понравилось писать к ней бэк ночами :D",
+ "raiting": 5,
+ "date": "2023-02-12T18:02:49.520Z"
+ },
+ //...
+]
+```
+- *unsuccessful response:* code: **400**
+``` JSON
+{
+ "message": "Faild to get commets"
+}
+```
+`gameName` - опциональный query-параметр, если задать имя игры, то будут выведены комментарии связанные с этой игрой, если его опустить - будут выведены все комментарии для всех игр.
+
+#### 2. Добавить/изменить отзыв (комментарий)
+- *address:* **/games/comments?gameName={gameName}**
+- *method:* `POST`,
+- *header:* `Authorization` with token
+- *body:*
+``` JSON
+{
+ "text": "Текст отзыва",
+ "raiting": 5,
+}
+```
+Не одно из полей не является обязательным, имя пользователя для комментария получается из токена авторизации.
+* `text` - по умолчанию задается как "No comment..."
+* `raiting` - по умолчанию 5
+
+- *successful response:* code: **200**
+``` JSON
+{
+ "user": "Test",
+ "game": "Sea War",
+ "text": "No comment...",
+ "raiting": 4,
+ "date": "2023-02-12T19:03:51.959Z"
+}
+```
+- *unsuccessful response:* code: **401**
+``` JSON
+{
+ "message": "Wrong User Name"
+}
+```
+- *unsuccessful response:* code: **401**
+``` JSON
+{
+ "message": "Wrong Game Name"
+}
+```
+- *unsuccessful response:* code: **400**
+``` JSON
+{
+ "message": "Faild to save commet"
+}
+```
+Пользователь может оставить только 1 отзыв, если отзыв уже был оставлен, и отправляется еще 1 запрос от того-же пользователя - происходит редактирование отзыва.
+
+#### 3. Удаление отзыва (комментария)
+ - *adress:* **/games/comments?gameName={gameName}**
+ - *method:* `DELETE`,
+ - *header:* `Authorization` with token
+ - *successful response:* code: **204**
+
+**Внимание:** Если не задать `gameName` - произойдет удаление всех комментариев пользователя
+
+ - *unsuccessful response:* code: **404**
+``` JSON
+{
+ "message": "Comment not found"
+}
+```
+ - *unsuccessful response:* code: **400**
+``` JSON
+{
+ "message": "Faild to delete commet"
+}
+```
diff --git a/docs/games.md b/docs/games.md
new file mode 100644
index 0000000..530aec8
--- /dev/null
+++ b/docs/games.md
@@ -0,0 +1,185 @@
+# Работа со списком игр, Back End
+
+Основной адрес для запросов связанных с авторизацией:
+
+- глобально: `https://rsgames.online:8888/games/...`
+
+- локально: `http://localhost:8000/games/...`
+
+### Запросы на сервер :
+
+#### 1. Получить список всех игр
+- *address:* **/games/all/**
+- *method:* `GET`
+- *successful response:* code: **200**
+``` JSON
+[
+ {
+ "_id": "",
+ "name": "Название игры",
+ "image": "url_to_picture",
+ "descriptionRu": "Описание",
+ "descriptionEn": "Description",
+ "rulesRu": "Правила",
+ "rulesEn": "Rules",
+ "comments": [],
+ "raiting": 5
+ },
+ //...
+]
+```
+- *unsuccessful response:* code: **404**
+``` JSON
+{
+ "message": "Games not found!"
+}
+```
+- *unsuccessful response:* code: **400**
+``` JSON
+{
+ "message": "Failed to get games list"
+}
+```
+
+#### 2. Получить описание игры:
+- *address:* **/games/data?name={GameName}**
+- *method:* `GET`
+- *successful response:* code: **200**
+``` JSON
+{
+ "_id": "",
+ "name": "Название игры",
+ "image": "url_to_picture",
+ "descriptionRu": "Описание",
+ "descriptionEn": "Description",
+ "rulesRu": "Правила",
+ "rulesEn": "Rules",
+ "comments": [],
+ "raiting": 5
+}
+```
+- *unsuccessful response:* code: **404**
+``` JSON
+{
+ "message": "Game not found!"
+}
+```
+- *unsuccessful response:* code: **400**
+``` JSON
+{
+ "message": "Failed to get game"
+}
+```
+
+#### 3. Добавить игру (только для администратора)
+- *address:* **/games/data/**
+- *method:* `POST`,
+- *header:* `Authorization` with token
+- *body:*
+``` JSON
+{
+ "name": "Название игры",
+ "image": "url_to_picture",
+ "descriptionRu": "Описание",
+ "descriptionEn": "Description",
+ "rulesRu": "Правила",
+ "rulesEn": "Rules",
+ "raiting": 5
+}
+```
+Обязательное поле `name` - название игры, остальные поля могут быть заполнены значением по умолчанию.
+- *successful response:* code: **200**
+``` JSON
+{
+ "_id": "",
+ "name": "Название игры",
+ "image": "url_to_picture",
+ "descriptionRu": "Описание",
+ "descriptionEn": "Description",
+ "rulesRu": "Правила",
+ "rulesEn": "Rules",
+ "comments": [],
+ "raiting": 5
+}
+```
+- *unsuccessful response:* code: **400**
+``` JSON
+{
+ "message": "Failed to add game"
+}
+```
+
+#### 4. Изменить игру (только для администратора)
+- *address:* **/games/data/**
+- *method:* `PUT`,
+- *header:* `Authorization` with token
+- *body:*
+``` JSON
+{
+ "name": "Новое Название игры",
+ "image": "new_url_to_picture",
+ "descriptionRu": "Новое Описание",
+ "descriptionEn": "New Description",
+ "rulesRu": "Новые Правила",
+ "rulesEn": "New Rules",
+ "raiting": 3
+}
+```
+Здесь нет обязательных полей, будут изменены только поля, оправленные в теле запроса. Можно изменять описание, правила, рейтинг и название игры.
+- *successful response:* code: **200**
+``` JSON
+{
+ "_id": "",
+ "name": "Название игры",
+ "image": "url_to_picture",
+ "descriptionRu": "Описание",
+ "descriptionEn": "Description",
+ "rulesRu": "Правила",
+ "rulesEn": "Rules",
+ "comments": [],
+ "raiting": 5
+}
+```
+- *unsuccessful response:* code: **400**
+``` JSON
+{
+ "message": "Failed to add game"
+}
+```
+
+#### 5. Получить список созданных мултиплеер-игр
+- *address:* **/games/list?name={gameName}**
+- *method:* `GET`
+Название игры пишется слитно, без пробелов.
+- *successful response:* code: **200**
+``` JSON
+[
+ {
+ "name": "SeaWar",
+ "gameId": "",
+ "player": "Vasya",
+ "maxPlayers": 2,
+ "playersInGame": 1
+ },
+ //...
+]
+```
+* name - название игры
+* gameId - идентификатор игры, используется для подключения к игре
+* player - имя "главного" игрока (создателя)
+* maxPlayers - максимальное количество игроков в игре
+* playersInGame - текущее кол-во игроков в игре
+В массиве отображаются только не начатые и не законченные игры, после нажатия кнопки "старт" - игра не будет отображаться в списке игр.
+
+- *unsuccessful response:* code: **404**
+``` JSON
+{
+ "message": "Games not found!"
+}
+```
+- *unsuccessful response:* code: **400**
+``` JSON
+{
+ "message": "Failed to get games list"
+}
+```
\ No newline at end of file
diff --git a/docs/seawar.md b/docs/seawar.md
new file mode 100644
index 0000000..bd1231e
--- /dev/null
+++ b/docs/seawar.md
@@ -0,0 +1,236 @@
+# Морской бой Back-End :
+
+Нужно установить WebSocket соединение по адресу:
+
+- глобально: `wss://rsgames.online:8001/` или локально: `wss://localhost:8001/`
+- отправить сообщение со своим `token`'ом (см. авторизацию), которы при правильной авторизации хранится в cookie, он должен `userName` пользователя:
+```JSON
+{
+ "type": "ws-connect",
+ "data": {
+ "player": "Jerubrin",
+ "token": "{auth-token}"
+ }
+}
+```
+- ответное сообщение: в случае успеха:
+```
+{
+ "type": "message",
+ "message": "You are connected"
+}
+```
+- ответное сообщение: в случае ошибки авторизации:
+
+```JSON
+{
+ "type": "message",
+ "message": "Wrong or expired token"
+}
+```
+** **
+
+## Сообщения для обмена данными с сервером игры:
+Сообщения получаемые в ответ описаны в разделе "Сообщения получаемые с сервера". Они возвращаются при каждом успешном действии каждого из игроков подключенных к игре.
+
+#### 1. Создание игры:
+```JSON
+{
+ "type": "create",
+ "data": null
+}
+```
+#### 2. Подключение к игре:
+```JSON
+{
+ "type": "join",
+ "data": {
+ "gameId": "{gameId}"
+ }
+}
+```
+Если игрок уже __был подключен к игре__, то его данные сохраняются, можно использовать, если пользователь перезагрузил страницу или потерял соединение с сервером.
+`gameId` лучше всего хранить в `query-параметрах`
+
+#### 3. Покинуть игру:
+```JSON
+{
+ "type": "leave",
+ "data": {
+ "gameId": "{gameId}"
+ }
+}
+```
+Поле этого игрок удаляется из списка игроков и теряет все данные. Если игра началась - победа достается оставшемуся игроку.
+
+#### 4. Начать игру:
+```JSON
+{
+ "type": "start",
+ "data": {
+ "gameId": "{gameId}"
+ }
+}
+```
+Начать игру может только создатель игры, (если игрок создал игру, к нему подключился 2-й игрок, то после выхода 1-го игрока, создателем становится 2-й игрок.
+Для начала игры, у второго игрока должен быть статус **"готов"** (`isReady`)
+
+#### 5. Готов к игре:
+```JSON
+{
+ "type": "ready",
+ "data": {
+ "gameId": "{gameId}"
+ }
+}
+```
+Выставить статус **"готов"** (`isReady`) у 2-го игрока. Без этого 1-й игрок не сможет начать игру.
+
+#### 6. Не готов к игре:
+```JSON
+{
+ "type": "not-ready",
+ "data": {
+ "gameId": "{gameId}"
+ }
+}
+```
+Убрать статус **"готов"** (`isReady`) у 2-го игрока.
+
+#### 7. Задать позицию своих кораблей
+```JSON
+{
+ "type": "set",
+ "data": {
+ "gameId": "{gameId}",
+ "x": <координата-X>,
+ "y": <координата-Y>
+ }
+}
+```
+- `x`, `y` - координаты, которые задаются. Каждое сообщение меняет состояние ячейки на противоположное, как `toggle` (если в ячейке было пусто - там будет ячейка корабля, если была ячейка корабля - она будет изменена на пустую)
+- не работает во время игры.
+
+#### 8. Ход (атаковать противника):
+```JSON
+{
+ "type": "move",
+ "data": {
+ "gameId": "{gameId}",
+ "x": <координата-X>,
+ "y": <координата-Y>
+ }
+}
+```
+- `x`, `y` - координаты по которым производится атака противника.
+- работает только во-время игры.
+
+** **
+## Сообщения получаемые с сервера:
+- Ответное сообщение сданными игры:
+``` JSON
+{
+ "type": "game-data",
+ "data":
+}
+```
+- Либо сообщение об ошибке:
+``` JSON
+{
+ "type": "message",
+ "data": ""
+}
+```
+#### Объект класса `GameData`
+``` JSON
+{
+ "gameId": "",
+ "isStarted": true | false,
+ "isMainUser": true | false,
+ "player": ,
+ "enemyName": "" | null,
+ "isEnemyReady": true | false,
+ "enemyField": ,
+ "yourField": ,
+ "winner": { userName, moves } | null
+}
+```
+- `gameId` - идентификатор игры генерируется при создании.
+- `isStarted` - началась ли игра?
+- `moves` - количество сделанных ходов.
+- `isMainUser` - является ли игрок создателем игры (ему доступна кнопка "старт/начать", когда другой игрок выставил режим "готов" (`isReady`)
+- `player` - Объект с данными текущего игрока.
+- `enemyName` - имя игрока-противника
+- `isEnemyReady` - готов ли противник начать игру.
+- `yourField` - матрица **10х10** с данными в вашем поле, значения полей:
+ - `2` - клетка содержит корабль
+ - `1` - пустая клетка
+ - `0` - не известно (пустая клетка).
+ - `-1` - клетка была атакована - мимо
+ - `-2` клетка была атакована - попал
+- `enemyField` - матрица **10х10** с данными о поле противника (данные те-же, что и у `yourField` только скрыты положения кораблей и "дырок" противника)
+- `winner` - данные победителя, если значение `null` - игра еще не закончена.
+ - `userName` - имя победителя
+ - `moves` - кол-во ходов
+#### Объект класса `SeaWarPlayer`
+``` JSON
+{
+ "isLead": false,
+ "isReady": false,
+ "moves": 0,
+ "ships": Array[],
+ "userName": ""
+}
+```
+- `userName` - имя игрока
+- `isLead` - доступно ли игроку сделать ход
+- `isReady` - готов ли игрок к игре
+- `moves` - кол-во сделанных ходов
+- `ships` - массив с объектами класса `Ship`
+
+#### Объект класса `Ship`
+Доступны только когда статус `isReady: true` и/или игра началась
+Пример корабля:
+``` JSON
+{
+ "size": 2,
+ "cors": [
+ [1, 1],
+ [1, 2]
+ ]
+}
+```
+- `size` - размер корабля
+- `cors` - массив с координатами точек корабля.
+
+## Сообщения об ошибках получаемые с сервера:
+``` JSON
+{
+ "type": "message",
+ "data": ""
+}
+```
+Все возможные сообщения от игры и сообщения об ошибках:
+``` JS
+{
+ ERR_USER_NOT_FOUND: "This user is not connected to the game",
+ ERR_NOT_ENOUGH: "Not enough players for start",
+ ERR_WRONG_MAIN_PLAYER: "You don't have permission to start the game",
+ ERR_NOT_ALL_READY: "Not all players are ready to start the game",
+ ERR_WRONG_GAME_ID: "Game not found!",
+ ERR_SERVER: "Server error!",
+ ERR_WRONG_TOKEN: "Wrong or expired token",
+ ERR_GAME_IS_FULL: "Maximum number of players in the game",
+ ERR_GAME_IS_STARTED: "The game is already started, you can not change the position of the ships",
+ USER_CONNECT: "User has joined the game",
+ USER_DISCONNECT: "The user has disconnected from the game",
+ USER_IS_READY: "User is ready to play",
+ USER_IS_NOT_READY: "User is not ready to play",
+ GAME_STARTED: "Game is started!",
+ GAME_ENDED: "Game is ended!",
+ WS_CONNECTED: "You are connected",
+ WS_CREATED: "Game has been created!",
+ MTX_WRONG_SHIPS: "Wrong ships count",
+ MTX_WRONG_CELLS: "Wrong ships position",
+}
+```
\ No newline at end of file
diff --git a/docs/win.md b/docs/win.md
new file mode 100644
index 0000000..51c5b66
--- /dev/null
+++ b/docs/win.md
@@ -0,0 +1,144 @@
+# Работа с победителями, Back End
+
+
+Основной адрес для запросов связанных с авторизацией:
+
+- глобально: `https://rsgames.online:8888/games/...`
+
+- локально: `http://localhost:8000/games/...`
+
+## Запросы на сервер :
+
+### 1. Получить список всех побед текущего пользователя:
+- *address:* **/win/data/**
+- *method:* `GET`
+- *header:* `Authorization` with token
+- *successful response:* code: **200**
+``` JSON
+[
+ {
+ "_id": "",
+ "userName": "Vasya",
+ "gameName": "Chapayev"
+ "points": 190,
+ "date": "2023-02-17T05:36:18.842Z",
+ "position": 4
+ }
+ // ...
+]
+```
+Возвращаемые значения:
+ * __userName__ - Имя пользователя.
+ * __gameName__ - Название игры.
+ * __points__ - Кол-во максимальных баллов в игре (рекорд).
+ * __date__ - дата рекорда.
+ * __position__ - позиция в общем рейтинге.
+
+- *unsuccessful response:* code: **405**
+``` JSON
+{
+ "message": "User not authorized"
+}
+```
+- *unsuccessful response:* code: **400**
+``` JSON
+{
+ "message": "Failed to add winner"
+}
+```
+
+### 2. Получить список всех победителей игры (по рейтингу):
+- *address:* **/win/data?game={gameName}**
+- *method:* `GET`
+- *header:* `Authorization` with token
+- *successful response:* code: **200**
+``` JSON
+[
+ {
+ "_id": "",
+ "userName": "Vasya",
+ "gameName": "Chapayev",
+ "points": 200,
+ "date": "2023-02-17T05:36:40.990Z"
+ },
+ {
+ "_id": "",
+ "userName": "Zoya",
+ "gameName": "Chapayev",
+ "points": 190,
+ "date": "2023-02-17T05:36:18.842Z"
+ }
+ // ...
+]
+```
+Возвращаемые значения:
+ * __userName__ - Имя пользователя.
+ * __gameName__ - Название игры.
+ * __points__ - Кол-во максимальных баллов в игре (рекорд).
+ * __date__ - дата рекорда.
+
+- *unsuccessful response:* code: **405**
+``` JSON
+{
+ "message": "User not authorized"
+}
+```
+- *unsuccessful response:* code: **404**
+``` JSON
+{
+ "message": "Game not found"
+}
+```
+- *unsuccessful response:* code: **400**
+``` JSON
+{
+ "message": "Failed to add winner"
+}
+```
+
+### 3. Создать нового победителя:
+- *address:* **/win/data/**
+- *method:* `POST`
+- *header:* `Authorization` with token
+- *body:*
+``` JSON
+{
+ "game": "Chapayev",
+ "points": 1000000
+}
+```
+- *successful response:* code: **200**
+``` JSON
+{
+ "_id": "",
+ "userName": "Vasya",
+ "gameName": "SeaBattle",
+ "points": 220,
+ "date": "2023-02-17T11:29:29.325Z"
+}
+```
+Возвращаемые значения:
+ * __userName__ - Имя пользователя.
+ * __gameName__ - Название игры.
+ * __points__ - Кол-во максимальных баллов в игре (рекорд).
+ * __date__ - дата рекорда.
+
+
+- *unsuccessful response:* code: **405**
+``` JSON
+{
+ "message": "User not authorized"
+}
+```
+- *unsuccessful response:* code: **404**
+``` JSON
+{
+ "message": "Game not found"
+}
+```
+- *unsuccessful response:* code: **400**
+``` JSON
+{
+ "message": "Failed to add winner"
+}
+```
\ No newline at end of file
diff --git a/features.md b/features.md
new file mode 100644
index 0000000..671c2e2
--- /dev/null
+++ b/features.md
@@ -0,0 +1,86 @@
+## 1. [Ссылка на задание](https://github.com/rolling-scopes-school/tasks/blob/master/tasks/rsclone/rsclone.md)
+## 2. Скриншот результата выполнения задания
+## 3. [Ссылка](https://rsgames.online/) на задеплоенную версию вашего приложения или сайта.
+ - [rsgames.online](https://rsgames.online/)
+## 4. 27.02.2023 / 28.02.2023.
+## 5.Ваша самопроверка с предварительной оценкой:
+
+## Обеще количество баллов 620:
+
+### Приложение : 180 баллов
+* [x] Использован роутинг без перезагрузки страницы (SPA): __(+30)__
+* [x] Есть возможность переключения языков __(+10)__
+* [x] Приложение выполнено в едином стиле __(+5)__
+* [x] Приложение работает на телефоне/планшете/PC __(+20)__
+* [x] Реализована кастомизация приложения(цветовые схемы) __(+5)__
+* [x] Возможность оставлять отзывы и выставлять рейтинг к играм __(+20)__
+* [x] Реализована страница пользователя __(+10)__
+* [x] Реализована страница с играми __(+10)__
+* [x] Реализованы различные уровни доступа ( незарегистрированный пользователь, пользователь, модератор, админ) __(+10)__
+* [x] Реализованная возможность изменять права доступа для аднимитратора (нет возможности убрать право доступа "admin" у 4 основных пользователя: Admin, Max, Olya, Jerubrin) __(+5)__
+* [x] Возможность банить пользователей __(+5)__
+* [x] Возможность удалять пользователей (нет возможности убрать удалить 4 основных пользователя: Admin, Max, Olya, Jerubrin) __(+5)__
+* [x] Аутентификация пользователя __(+10)__
+* [x] Восстановление и изменение пароля пользователя __(+10)__
+* [x] Реализованы различные модальные окна __(+10)__
+* [x] Анимирование всех интерактивных элементов __(+5)__
+* [x] Реализованно ограницение к играм, для пользователей со статусом "banned" __(+10)__
+
+### Игры внутри приложения:250 баллов
+
+#### 1. Морской бой (100 баллов)
+ * [x] Реализована игра онлайн между соперниками (WebSocket) __(+30)__
+ * [x] Возможность подключения к различным играм __(+15)__
+ * [x] Анимации кораблей __(+10)__
+ * [x] Сохранение игры(возможность перезагружать страницу во время игры) __(+10)__
+ * [x] Подсказки во время игры __(+10)__
+ * [x] Проверка правильности расположения кораблей __(+10)__
+ * [x] Победные баллы за сбитые корабли противника __(+10)__
+ * [x] При окончании игры, итоговый бал записывается в таблицу рекордов __(+5)__
+
+#### 2. Тетрис (100 баллов)
+ * [x] Реализованны механика игры (фигурки постепенно падают, не перекрвают друг-друга) __(+30)__
+ * [x] Реализованны различные фигуры __(+15)__
+ * [x] Различные цвета фигур __(+10)__
+ * [x] Управление с помощью клавиатуры __(+15)__
+ * [x] Управление с помощью мыши или сенсорного экрана __(+10)__
+ * [x] Возможность перезапустить игру __(+5)__
+ * [x] Начисление баллов за собранные линии __(+10)__
+ * [x] При окончании игры, итоговый бал записывается в таблицу рекордов __(+5)__
+
+#### 3. Игра на память (50 баллов)
+ * [x] Выбор сложности игры __(+10)__
+ * [x] Анимации при верном ответе __(+10)__
+ * [x] Начисление баллов за верные ответы __(+10)__
+ * [x] Возможность перезапустить игру __(+5)__
+ * [x] Анимирование переворотов карточек __(+10)__
+ * [x] При окончании игры, итоговый бал записывается в таблицу рекордов __(+5)__
+
+### Серверная часть 190 баллов
+
+ * Использован REST API __(+10)__
+ * Реализован nodejs и express __(+30)__
+ * Подключение и работа с БД __(+15)__
+ * Используется ORM(mongoose) __(+15)__
+ * Реализованна логика сортировки победителей (в игре и кабинете пользователя) __(+10)__
+ * использование JWT токенов для авторизации __(+10)__
+ * Реализована работа с WebSocket __(+20)__
+ * Реализована аутентификация в WebSocket __(+10)__
+ * Реализована распределелие клиентов в WebSocket (может проходить одновременно несколько игр, сообщения отправляются правильным пользователям) __(+15)__
+ * Реализованна рассылка email-сообщений при создании пользователя, сброса и изменении пароля __(+15)__
+ * Используется email-клиент с собственным доменном __(+10)__
+ * Email-сообщения имеют inline стили (сообщения имеют свою верстку) __(+10)__
+ * Сервер отдаёт корректные ответы, отдаёт HTTP ошибки с нормальными body, по которым можно понять, что произошло, пишет читаемые логи __(+20)__
+
+### Дополнительно, для проверяющего:
+
+#### Пользователь Admin
+Для проверки возможностей администратора используйте пользователя **Admin** (пароль: **admin123**)
+ - Большая просьба не совершать "разрушительных" действий, основные аккаунты защищены от критических изменений на стороне сервера, но не стоит банить и удалять всех остальных пользователей, для проверки - лучше создайте несколько своих пользователей. Спасибо за адекватность.
+#### Backend
+Backend доступен по адресу: [https://rsgames.online:8888/](https://rsgames.online:8888/) все комманды и описание взаимодействия с ними доступны в README.md файле репозитория.
+
+#### Развернуть проект на локальной машине
+Для запуска проекта локально - нужны специальные параметры в `.env` файле, для получения локальных параметров. Для получения `.env` файла с параметрами - обратитесь к [jerubrin](https://discord.com/users/263367696136142849)
+После получания файла с параметрами, положите его в корень проекта (имя фала должно быть именно `.env`), затем выполните комманду: `npm run dev-all`.
+После запуска, можете открыть проек локально: [http://localhost:5173/RsClone](http://localhost:5173/RsClone), backend будет доступен по адресу: [https://localhost:8888/](https://localhost:8888/) или [http://localhost:8000/](http://localhost:8000/)
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..b150dbe
--- /dev/null
+++ b/index.html
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+ RS Games Online - Gaming Zone
+
+
+
+
+
+
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..3abe247
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,15869 @@
+{
+ "name": "rsclone",
+ "version": "0.0.0",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "rsclone",
+ "version": "0.0.0",
+ "dependencies": {
+ "@fortawesome/fontawesome-svg-core": "^6.2.1",
+ "@fortawesome/free-regular-svg-icons": "^6.2.1",
+ "@fortawesome/free-solid-svg-icons": "^6.2.1",
+ "@fortawesome/react-fontawesome": "^0.2.0",
+ "@reduxjs/toolkit": "^1.9.2",
+ "@types/express-ws": "^3.0.1",
+ "@types/ws": "^8.5.4",
+ "bcryptjs": "^2.4.3",
+ "body-parser": "^1.20.1",
+ "clsx": "^1.2.1",
+ "cookie-parser": "^1.4.6",
+ "cors": "^2.8.5",
+ "dotenv": "^16.0.3",
+ "ejs": "^3.1.8",
+ "express": "^4.18.2",
+ "express-validator": "^6.14.3",
+ "express-ws": "^5.0.2",
+ "formik": "^2.2.9",
+ "gh-pages": "^5.0.0",
+ "jsonwebtoken": "^9.0.0",
+ "middleware-async": "^1.3.5",
+ "mongoose": "^6.9.0",
+ "node-captcha-generator": "^0.0.1",
+ "nodemailer": "^6.9.1",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "react-redux": "^8.0.5",
+ "react-router-dom": "^6.8.0",
+ "uuid": "^9.0.0",
+ "winston": "^3.8.2",
+ "ws": "^8.12.1",
+ "yup": "^0.32.11",
+ "zustand": "^4.3.2"
+ },
+ "devDependencies": {
+ "@types/react": "^18.0.26",
+ "@types/react-dom": "^18.0.9",
+ "@typescript-eslint/eslint-plugin": "^5.50.0",
+ "@typescript-eslint/parser": "^5.50.0",
+ "@vitejs/plugin-react": "^3.0.0",
+ "eslint": "^8.33.0",
+ "eslint-config-airbnb": "^19.0.4",
+ "eslint-config-prettier": "^8.6.0",
+ "eslint-config-standard-with-typescript": "^33.0.0",
+ "eslint-plugin-import": "^2.27.5",
+ "eslint-plugin-n": "^15.6.1",
+ "eslint-plugin-prettier": "^4.2.1",
+ "eslint-plugin-promise": "^6.1.1",
+ "eslint-plugin-react": "^7.32.2",
+ "eslint-plugin-react-hooks": "^4.6.0",
+ "ml-matrix": "^6.10.4",
+ "nodemon": "^2.0.20",
+ "prettier": "^2.8.3",
+ "sass": "^1.57.1",
+ "typescript": "^4.9.5",
+ "vite": "^4.0.0"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
+ "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.1.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@aws-crypto/ie11-detection": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz",
+ "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-crypto/sha256-browser": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz",
+ "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==",
+ "optional": true,
+ "dependencies": {
+ "@aws-crypto/ie11-detection": "^3.0.0",
+ "@aws-crypto/sha256-js": "^3.0.0",
+ "@aws-crypto/supports-web-crypto": "^3.0.0",
+ "@aws-crypto/util": "^3.0.0",
+ "@aws-sdk/types": "^3.222.0",
+ "@aws-sdk/util-locate-window": "^3.0.0",
+ "@aws-sdk/util-utf8-browser": "^3.0.0",
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-crypto/sha256-js": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz",
+ "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==",
+ "optional": true,
+ "dependencies": {
+ "@aws-crypto/util": "^3.0.0",
+ "@aws-sdk/types": "^3.222.0",
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-crypto/supports-web-crypto": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz",
+ "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-crypto/util": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz",
+ "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/types": "^3.222.0",
+ "@aws-sdk/util-utf8-browser": "^3.0.0",
+ "tslib": "^1.11.1"
+ }
+ },
+ "node_modules/@aws-sdk/abort-controller": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.257.0.tgz",
+ "integrity": "sha512-ekWy391lOerS0ZECdhp/c+X7AToJIpfNrCPjuj3bKr+GMQYckGsYsdbm6AUD4sxBmfvuaQmVniSXWovaxwcFcQ==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/abort-controller/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/client-cognito-identity": {
+ "version": "3.264.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.264.0.tgz",
+ "integrity": "sha512-afOpX6/xKLKRjkbgzfuy9fxCVP+LXCiirjBxhEtpUbKjVOwvShbQXfCPDlG40s5HF485mmR9t0KADoy0El5WsA==",
+ "optional": true,
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/client-sts": "3.264.0",
+ "@aws-sdk/config-resolver": "3.259.0",
+ "@aws-sdk/credential-provider-node": "3.264.0",
+ "@aws-sdk/fetch-http-handler": "3.257.0",
+ "@aws-sdk/hash-node": "3.257.0",
+ "@aws-sdk/invalid-dependency": "3.257.0",
+ "@aws-sdk/middleware-content-length": "3.257.0",
+ "@aws-sdk/middleware-endpoint": "3.264.0",
+ "@aws-sdk/middleware-host-header": "3.257.0",
+ "@aws-sdk/middleware-logger": "3.257.0",
+ "@aws-sdk/middleware-recursion-detection": "3.257.0",
+ "@aws-sdk/middleware-retry": "3.259.0",
+ "@aws-sdk/middleware-serde": "3.257.0",
+ "@aws-sdk/middleware-signing": "3.257.0",
+ "@aws-sdk/middleware-stack": "3.257.0",
+ "@aws-sdk/middleware-user-agent": "3.257.0",
+ "@aws-sdk/node-config-provider": "3.259.0",
+ "@aws-sdk/node-http-handler": "3.257.0",
+ "@aws-sdk/protocol-http": "3.257.0",
+ "@aws-sdk/smithy-client": "3.261.0",
+ "@aws-sdk/types": "3.257.0",
+ "@aws-sdk/url-parser": "3.257.0",
+ "@aws-sdk/util-base64": "3.208.0",
+ "@aws-sdk/util-body-length-browser": "3.188.0",
+ "@aws-sdk/util-body-length-node": "3.208.0",
+ "@aws-sdk/util-defaults-mode-browser": "3.261.0",
+ "@aws-sdk/util-defaults-mode-node": "3.261.0",
+ "@aws-sdk/util-endpoints": "3.257.0",
+ "@aws-sdk/util-retry": "3.257.0",
+ "@aws-sdk/util-user-agent-browser": "3.257.0",
+ "@aws-sdk/util-user-agent-node": "3.259.0",
+ "@aws-sdk/util-utf8": "3.254.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-cognito-identity/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/client-sso": {
+ "version": "3.264.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.264.0.tgz",
+ "integrity": "sha512-p+7sYpRcdv9omnnsPhD/vOFuZ1SpfV62ZgistBK/RDsQg2W9SIWQRW1KPt7gOCQ0nwp4efntw4Sle0LjS7ykxg==",
+ "optional": true,
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/config-resolver": "3.259.0",
+ "@aws-sdk/fetch-http-handler": "3.257.0",
+ "@aws-sdk/hash-node": "3.257.0",
+ "@aws-sdk/invalid-dependency": "3.257.0",
+ "@aws-sdk/middleware-content-length": "3.257.0",
+ "@aws-sdk/middleware-endpoint": "3.264.0",
+ "@aws-sdk/middleware-host-header": "3.257.0",
+ "@aws-sdk/middleware-logger": "3.257.0",
+ "@aws-sdk/middleware-recursion-detection": "3.257.0",
+ "@aws-sdk/middleware-retry": "3.259.0",
+ "@aws-sdk/middleware-serde": "3.257.0",
+ "@aws-sdk/middleware-stack": "3.257.0",
+ "@aws-sdk/middleware-user-agent": "3.257.0",
+ "@aws-sdk/node-config-provider": "3.259.0",
+ "@aws-sdk/node-http-handler": "3.257.0",
+ "@aws-sdk/protocol-http": "3.257.0",
+ "@aws-sdk/smithy-client": "3.261.0",
+ "@aws-sdk/types": "3.257.0",
+ "@aws-sdk/url-parser": "3.257.0",
+ "@aws-sdk/util-base64": "3.208.0",
+ "@aws-sdk/util-body-length-browser": "3.188.0",
+ "@aws-sdk/util-body-length-node": "3.208.0",
+ "@aws-sdk/util-defaults-mode-browser": "3.261.0",
+ "@aws-sdk/util-defaults-mode-node": "3.261.0",
+ "@aws-sdk/util-endpoints": "3.257.0",
+ "@aws-sdk/util-retry": "3.257.0",
+ "@aws-sdk/util-user-agent-browser": "3.257.0",
+ "@aws-sdk/util-user-agent-node": "3.259.0",
+ "@aws-sdk/util-utf8": "3.254.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-sso-oidc": {
+ "version": "3.264.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.264.0.tgz",
+ "integrity": "sha512-82hGEbfsD4lBGIF1q8o82jTNSgBCcBpfFsvA+ltZf0bh4ChIWOi4vVvg8G+zVQN1mm/Rj8vWYO/D0tNF8OSyWw==",
+ "optional": true,
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/config-resolver": "3.259.0",
+ "@aws-sdk/fetch-http-handler": "3.257.0",
+ "@aws-sdk/hash-node": "3.257.0",
+ "@aws-sdk/invalid-dependency": "3.257.0",
+ "@aws-sdk/middleware-content-length": "3.257.0",
+ "@aws-sdk/middleware-endpoint": "3.264.0",
+ "@aws-sdk/middleware-host-header": "3.257.0",
+ "@aws-sdk/middleware-logger": "3.257.0",
+ "@aws-sdk/middleware-recursion-detection": "3.257.0",
+ "@aws-sdk/middleware-retry": "3.259.0",
+ "@aws-sdk/middleware-serde": "3.257.0",
+ "@aws-sdk/middleware-stack": "3.257.0",
+ "@aws-sdk/middleware-user-agent": "3.257.0",
+ "@aws-sdk/node-config-provider": "3.259.0",
+ "@aws-sdk/node-http-handler": "3.257.0",
+ "@aws-sdk/protocol-http": "3.257.0",
+ "@aws-sdk/smithy-client": "3.261.0",
+ "@aws-sdk/types": "3.257.0",
+ "@aws-sdk/url-parser": "3.257.0",
+ "@aws-sdk/util-base64": "3.208.0",
+ "@aws-sdk/util-body-length-browser": "3.188.0",
+ "@aws-sdk/util-body-length-node": "3.208.0",
+ "@aws-sdk/util-defaults-mode-browser": "3.261.0",
+ "@aws-sdk/util-defaults-mode-node": "3.261.0",
+ "@aws-sdk/util-endpoints": "3.257.0",
+ "@aws-sdk/util-retry": "3.257.0",
+ "@aws-sdk/util-user-agent-browser": "3.257.0",
+ "@aws-sdk/util-user-agent-node": "3.259.0",
+ "@aws-sdk/util-utf8": "3.254.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-sso-oidc/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/client-sso/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/client-sts": {
+ "version": "3.264.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.264.0.tgz",
+ "integrity": "sha512-sco1jREkDdds4Z3V19Vlu/YpBHSzeEt1KFqOPnbjFw7pSakRNzpyWmLLxOwWjwgGKt6pSF3Aw0ZOMYsAUDc5qQ==",
+ "optional": true,
+ "dependencies": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/config-resolver": "3.259.0",
+ "@aws-sdk/credential-provider-node": "3.264.0",
+ "@aws-sdk/fetch-http-handler": "3.257.0",
+ "@aws-sdk/hash-node": "3.257.0",
+ "@aws-sdk/invalid-dependency": "3.257.0",
+ "@aws-sdk/middleware-content-length": "3.257.0",
+ "@aws-sdk/middleware-endpoint": "3.264.0",
+ "@aws-sdk/middleware-host-header": "3.257.0",
+ "@aws-sdk/middleware-logger": "3.257.0",
+ "@aws-sdk/middleware-recursion-detection": "3.257.0",
+ "@aws-sdk/middleware-retry": "3.259.0",
+ "@aws-sdk/middleware-sdk-sts": "3.257.0",
+ "@aws-sdk/middleware-serde": "3.257.0",
+ "@aws-sdk/middleware-signing": "3.257.0",
+ "@aws-sdk/middleware-stack": "3.257.0",
+ "@aws-sdk/middleware-user-agent": "3.257.0",
+ "@aws-sdk/node-config-provider": "3.259.0",
+ "@aws-sdk/node-http-handler": "3.257.0",
+ "@aws-sdk/protocol-http": "3.257.0",
+ "@aws-sdk/smithy-client": "3.261.0",
+ "@aws-sdk/types": "3.257.0",
+ "@aws-sdk/url-parser": "3.257.0",
+ "@aws-sdk/util-base64": "3.208.0",
+ "@aws-sdk/util-body-length-browser": "3.188.0",
+ "@aws-sdk/util-body-length-node": "3.208.0",
+ "@aws-sdk/util-defaults-mode-browser": "3.261.0",
+ "@aws-sdk/util-defaults-mode-node": "3.261.0",
+ "@aws-sdk/util-endpoints": "3.257.0",
+ "@aws-sdk/util-retry": "3.257.0",
+ "@aws-sdk/util-user-agent-browser": "3.257.0",
+ "@aws-sdk/util-user-agent-node": "3.259.0",
+ "@aws-sdk/util-utf8": "3.254.0",
+ "fast-xml-parser": "4.0.11",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/client-sts/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/config-resolver": {
+ "version": "3.259.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.259.0.tgz",
+ "integrity": "sha512-gViMRsc4Ye6+nzJ0OYTZIT8m4glIAdtugN2Sr/t6P2iJW5X0bSL/EcbcHBgsve1lHjeGPeyzVkT7UnyGOZ5Z/A==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/signature-v4": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "@aws-sdk/util-config-provider": "3.208.0",
+ "@aws-sdk/util-middleware": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/config-resolver/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/credential-provider-cognito-identity": {
+ "version": "3.264.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.264.0.tgz",
+ "integrity": "sha512-0L4offTpZJrX4PkoUI5KXPlG3uaofbmew+tgPphKd+ns3tzhLsltPMixS/04J5qXEfwMCHwvDgSpCenKsUo/wg==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/client-cognito-identity": "3.264.0",
+ "@aws-sdk/property-provider": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/credential-provider-env": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.257.0.tgz",
+ "integrity": "sha512-GsmBi5Di6hk1JAi1iB6/LCY8o+GmlCvJoB7wuoVmXI3VxRVwptUVjuj8EtJbIrVGrF9dSuIRPCzUoSuzEzYGlg==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/property-provider": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-env/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/credential-provider-imds": {
+ "version": "3.259.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.259.0.tgz",
+ "integrity": "sha512-yCxoYWZAaDrCUEWxRfrpB0Mp1cFgJEMYW8T6GIb/+DQ5QLpZmorgaVD/j90QXupqFrR5tlxwuskBIkdD2E9YNg==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/node-config-provider": "3.259.0",
+ "@aws-sdk/property-provider": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "@aws-sdk/url-parser": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-imds/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/credential-provider-ini": {
+ "version": "3.264.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.264.0.tgz",
+ "integrity": "sha512-UU5NNlfn+Go+5PLBzyTH1YE3r/pgykpE4QYFon87sCnEQnQH9xmlRTW1f1cBSQ9kivbFZd2/C2X3qhB3fe2JfA==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/credential-provider-env": "3.257.0",
+ "@aws-sdk/credential-provider-imds": "3.259.0",
+ "@aws-sdk/credential-provider-process": "3.257.0",
+ "@aws-sdk/credential-provider-sso": "3.264.0",
+ "@aws-sdk/credential-provider-web-identity": "3.257.0",
+ "@aws-sdk/property-provider": "3.257.0",
+ "@aws-sdk/shared-ini-file-loader": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-ini/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/credential-provider-node": {
+ "version": "3.264.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.264.0.tgz",
+ "integrity": "sha512-DPzL7oawcILs5Mduim9Z8SVeJaUpaDRVbUIrBHsMBu+N7Zuqtzr+0ckHc1bEi3iYq2QUCk5pH5vpQaZYkMlbtw==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/credential-provider-env": "3.257.0",
+ "@aws-sdk/credential-provider-imds": "3.259.0",
+ "@aws-sdk/credential-provider-ini": "3.264.0",
+ "@aws-sdk/credential-provider-process": "3.257.0",
+ "@aws-sdk/credential-provider-sso": "3.264.0",
+ "@aws-sdk/credential-provider-web-identity": "3.257.0",
+ "@aws-sdk/property-provider": "3.257.0",
+ "@aws-sdk/shared-ini-file-loader": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-node/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/credential-provider-process": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.257.0.tgz",
+ "integrity": "sha512-xK8uYeNXaclaBCGrLi4z2pxPRngqLf5BM5jg2fn57zqvlL9V5gJF972FehrVBL0bfp1/laG0ZJtD2K2sapyWAw==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/property-provider": "3.257.0",
+ "@aws-sdk/shared-ini-file-loader": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-process/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/credential-provider-sso": {
+ "version": "3.264.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.264.0.tgz",
+ "integrity": "sha512-CJuAlqIIJap6LXoqimvEAnYZ7Kb5pTbiS3e+aY+fajO3OPujmQpHuiY8kOmscjwZ4ErJdEskivcTGwXph0dPZQ==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/client-sso": "3.264.0",
+ "@aws-sdk/property-provider": "3.257.0",
+ "@aws-sdk/shared-ini-file-loader": "3.257.0",
+ "@aws-sdk/token-providers": "3.264.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-sso/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/credential-provider-web-identity": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.257.0.tgz",
+ "integrity": "sha512-Cm0uvRv4JuIbD0Kp3W0J/vwjADIyCx8HoZi5yg+QIi5nilocuTQ3ajvLeuPVSvFvdy+yaxSc5FxNXquWt7Mngw==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/property-provider": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/credential-providers": {
+ "version": "3.264.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.264.0.tgz",
+ "integrity": "sha512-4iSr1Z7Uf8uDraQ7JYoMotVLhmnGFAGsH559KBPxuxjMjg2lku9GA5V1zw7SNV8FEcj+Sh5HrpJvJ7P1kA+YjA==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/client-cognito-identity": "3.264.0",
+ "@aws-sdk/client-sso": "3.264.0",
+ "@aws-sdk/client-sts": "3.264.0",
+ "@aws-sdk/credential-provider-cognito-identity": "3.264.0",
+ "@aws-sdk/credential-provider-env": "3.257.0",
+ "@aws-sdk/credential-provider-imds": "3.259.0",
+ "@aws-sdk/credential-provider-ini": "3.264.0",
+ "@aws-sdk/credential-provider-node": "3.264.0",
+ "@aws-sdk/credential-provider-process": "3.257.0",
+ "@aws-sdk/credential-provider-sso": "3.264.0",
+ "@aws-sdk/credential-provider-web-identity": "3.257.0",
+ "@aws-sdk/property-provider": "3.257.0",
+ "@aws-sdk/shared-ini-file-loader": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/credential-providers/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/fetch-http-handler": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.257.0.tgz",
+ "integrity": "sha512-zOF+RzQ+wfF7tq7tGUdPcqUTh3+k2f8KCVJE07A8kCopVq4nBu4NH6Eq29Tjpwdya3YlKvE+kFssuQRRRRex+Q==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/protocol-http": "3.257.0",
+ "@aws-sdk/querystring-builder": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "@aws-sdk/util-base64": "3.208.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@aws-sdk/fetch-http-handler/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/hash-node": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.257.0.tgz",
+ "integrity": "sha512-W/USUuea5Ep3OJ2U7Ve8/5KN1YsDun2WzOFUxc1PyxXP5pW6OgC15/op0e+bmWPG851clvp5S8ZuroUr3aKi3Q==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/types": "3.257.0",
+ "@aws-sdk/util-buffer-from": "3.208.0",
+ "@aws-sdk/util-utf8": "3.254.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/hash-node/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/invalid-dependency": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.257.0.tgz",
+ "integrity": "sha512-T68SAPRNMEhpke0wlxURgogL7q0B8dfqZsSeS20BVR/lksJxLse9+pbmCDxiu1RrXoEIsEwl5rbLN+Hw8BFFYw==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@aws-sdk/invalid-dependency/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/is-array-buffer": {
+ "version": "3.201.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz",
+ "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/is-array-buffer/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/middleware-content-length": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.257.0.tgz",
+ "integrity": "sha512-yiawbV2azm6QnMY1L2ypG8PDRdjOcEIvFmT0T7y0F49rfbKJOu21j1ONAoCkLrINK6kMqcD5JSQLVCoURxiTxQ==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/protocol-http": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-content-length/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/middleware-endpoint": {
+ "version": "3.264.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.264.0.tgz",
+ "integrity": "sha512-H9JEAug3Oo3IA2wZIplVVF6NtauCIjICXWgbNbA8Im+I2KPe0jWtOdtQv4U+tqHe9T4zIixaCM3gjUBld+FoOA==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/middleware-serde": "3.257.0",
+ "@aws-sdk/protocol-http": "3.257.0",
+ "@aws-sdk/signature-v4": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "@aws-sdk/url-parser": "3.257.0",
+ "@aws-sdk/util-config-provider": "3.208.0",
+ "@aws-sdk/util-middleware": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-endpoint/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/middleware-host-header": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.257.0.tgz",
+ "integrity": "sha512-gEi9AJdJfRfU8Qr6HK1hfhxTzyV3Giq4B/h7um99hIFAT/GCg9xiPvAOKPo6UeuiKEv3b7RpSL4s6cBvnJMJBA==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/protocol-http": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-host-header/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/middleware-logger": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.257.0.tgz",
+ "integrity": "sha512-8RDXW/VbMKBsXDfcCLmROZcWKyrekyiPa3J1aIaBy0tq9o4xpGoXw/lwwIrNVvISAFslb57rteup34bfn6ta6w==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-logger/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/middleware-recursion-detection": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.257.0.tgz",
+ "integrity": "sha512-rUCih6zHh8k9Edf5N5Er4s508FYbwLM0MWTD2axzlj9TjLqEQ9OKED3wHaLffXSDzodd3oTAfJCLPbWQyoZ3ZQ==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/protocol-http": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/middleware-retry": {
+ "version": "3.259.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.259.0.tgz",
+ "integrity": "sha512-pVh1g8e84MAi7eVtWLiiiCtn82LzxOP7+LxTRHatmgIeN22yGQBZILliPDJypUPvDYlwxI1ekiK+oPTcte0Uww==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/protocol-http": "3.257.0",
+ "@aws-sdk/service-error-classification": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "@aws-sdk/util-middleware": "3.257.0",
+ "@aws-sdk/util-retry": "3.257.0",
+ "tslib": "^2.3.1",
+ "uuid": "^8.3.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-retry/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/middleware-retry/node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "optional": true,
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-sdk-sts": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.257.0.tgz",
+ "integrity": "sha512-d6IJCLRi3O2tm4AFK60WNhIwmMmspj1WzKR1q1TaoPzoREPG2xg+Am18wZBRkCyYuRPPrbizmkvAmAJiUolMAw==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/middleware-signing": "3.257.0",
+ "@aws-sdk/property-provider": "3.257.0",
+ "@aws-sdk/protocol-http": "3.257.0",
+ "@aws-sdk/signature-v4": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-sdk-sts/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/middleware-serde": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.257.0.tgz",
+ "integrity": "sha512-/JasfXPWFq24mnCrx9fxW/ISBSp07RJwhsF14qzm8Qy3Z0z470C+QRM6otTwAkYuuVt1wuLjja5agq3Jtzq7dQ==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-serde/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/middleware-signing": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.257.0.tgz",
+ "integrity": "sha512-hCH3D83LHmm6nqmtNrGTWZCVjsQXrGHIXbd17/qrw7aPFvcAhsiiCncGFP+XsUXEKa2ZqcSNMUyPrx69ofNRZQ==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/property-provider": "3.257.0",
+ "@aws-sdk/protocol-http": "3.257.0",
+ "@aws-sdk/signature-v4": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "@aws-sdk/util-middleware": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-signing/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/middleware-stack": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.257.0.tgz",
+ "integrity": "sha512-awg2F0SvwACBaw4HIObK8pQGfSqAc4Vy+YFzWSfZNVC35oRO6RsRdKHVU99lRC0LrT2Ptmfghl2DMPSrRDbvlQ==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-stack/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/middleware-user-agent": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.257.0.tgz",
+ "integrity": "sha512-37rt75LZyD0UWpbcFuxEGqwF3DZKSixQPl7AsDe6q3KtrO5gGQB+diH5vbY0txNNYyv5IK9WMwvY73mVmoWRmw==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/protocol-http": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/middleware-user-agent/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/node-config-provider": {
+ "version": "3.259.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.259.0.tgz",
+ "integrity": "sha512-DUOqr71oonBvM6yKPdhDBmraqgXHCFrVWFw7hc5ZNxL2wS/EsbKfGPJp+C+SUgpn1upIWPNnh/bNoLAbBkcLsA==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/property-provider": "3.257.0",
+ "@aws-sdk/shared-ini-file-loader": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/node-config-provider/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/node-http-handler": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.257.0.tgz",
+ "integrity": "sha512-8KnWHVVwaGKyTlkTU9BSOAiSovNDoagxemU2l10QqBbzUCVpljCUMUkABEGRJ1yoQCl6DJ7RtNkAyZ8Ne/E15A==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/abort-controller": "3.257.0",
+ "@aws-sdk/protocol-http": "3.257.0",
+ "@aws-sdk/querystring-builder": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/node-http-handler/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/property-provider": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.257.0.tgz",
+ "integrity": "sha512-3rUbRAcF0GZ5PhDiXhS4yREfZ5hOEtvYEa9S/19OdM5eoypOaLU5XnFcCKfnccSP8SkdgpJujzxOMRWNWadlAQ==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/property-provider/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/protocol-http": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.257.0.tgz",
+ "integrity": "sha512-xt7LGOgZIvbLS3418AYQLacOqx+mo5j4mPiIMz7f6AaUg+/fBUgESVsncKDqxbEJVwwCXSka8Ca0cntJmoeMSw==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/protocol-http/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/querystring-builder": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.257.0.tgz",
+ "integrity": "sha512-mZHWLP7XIkzx1GIXO5WfX/iJ+aY9TWs02RE9FkdL2+by0HEMR65L3brQTbU1mIBJ7BjaPwYH24dljUOSABX7yg==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/types": "3.257.0",
+ "@aws-sdk/util-uri-escape": "3.201.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/querystring-builder/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/querystring-parser": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.257.0.tgz",
+ "integrity": "sha512-UDrE1dEwWrWT8dG2VCrGYrPxCWOkZ1fPTPkjpkR4KZEdQDZBqU5gYZF2xPj8Nz7pjQVHFuW2wFm3XYEk56GEjg==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/querystring-parser/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/service-error-classification": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.257.0.tgz",
+ "integrity": "sha512-FAyR0XsueGkkqDtkP03cTJQk52NdQ9sZelLynmmlGPUP75LApRPvFe1riKrou6+LsDbwVNVffj6mbDfIcOhaOw==",
+ "optional": true,
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/shared-ini-file-loader": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.257.0.tgz",
+ "integrity": "sha512-HNjC1+Wx3xHiJc+CP14GhIdVhfQGSjroAsWseRxAhONocA9Fl1ZX4hx7+sA5c9nOoMVOovi6ivJ/6lCRPTDRrQ==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/shared-ini-file-loader/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/signature-v4": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.257.0.tgz",
+ "integrity": "sha512-aLQQN59X/D0+ShzPD3Anj5ntdMA/RFeNLOUCDyDvremViGi6yxUS98usQ/8bG5Rq0sW2GGMdbFUFmrDvqdiqEQ==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/is-array-buffer": "3.201.0",
+ "@aws-sdk/types": "3.257.0",
+ "@aws-sdk/util-hex-encoding": "3.201.0",
+ "@aws-sdk/util-middleware": "3.257.0",
+ "@aws-sdk/util-uri-escape": "3.201.0",
+ "@aws-sdk/util-utf8": "3.254.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/signature-v4/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/smithy-client": {
+ "version": "3.261.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.261.0.tgz",
+ "integrity": "sha512-j8XQEa3caZUVFVZfhJjaskw80O/tB+IXu84HMN44N7UkXaCFHirUsNjTDztJhnVXf/gKXzIqUqprfRnOvwLtIg==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/middleware-stack": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/smithy-client/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/token-providers": {
+ "version": "3.264.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.264.0.tgz",
+ "integrity": "sha512-1N54FCdBJRqrwFWHUoDpGI0rKhI29Or9ZwGjjcBzKzLhz5sEF/DEhuID7h1/KKEkXdQ0+lmXOFGMMrahrMpOow==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/client-sso-oidc": "3.264.0",
+ "@aws-sdk/property-provider": "3.257.0",
+ "@aws-sdk/shared-ini-file-loader": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/token-providers/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/types": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.257.0.tgz",
+ "integrity": "sha512-LmqXuBQBGeaGi/3Rp7XiEX1B5IPO2UUfBVvu0wwGqVsmstT0SbOVDZGPmxygACbm64n+PRx3uTSDefRfoiWYZg==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/types/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/url-parser": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.257.0.tgz",
+ "integrity": "sha512-Qe/AcFe/NFZHa6cN2afXEQn9ehXxh57dWGdRjfjd2lQqNV4WW1R2pl2Tm1ZJ1dwuCNLJi4NHLMk8lrD3QQ8rdg==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/querystring-parser": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@aws-sdk/url-parser/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/util-base64": {
+ "version": "3.208.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz",
+ "integrity": "sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/util-buffer-from": "3.208.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-base64/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/util-body-length-browser": {
+ "version": "3.188.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz",
+ "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@aws-sdk/util-body-length-browser/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/util-body-length-node": {
+ "version": "3.208.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz",
+ "integrity": "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-body-length-node/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/util-buffer-from": {
+ "version": "3.208.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz",
+ "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/is-array-buffer": "3.201.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-buffer-from/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/util-config-provider": {
+ "version": "3.208.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz",
+ "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-config-provider/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/util-defaults-mode-browser": {
+ "version": "3.261.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.261.0.tgz",
+ "integrity": "sha512-lX3X1NfzQVV6cakepGV24uRcqevlDnQ8VgaCV8dhnw1FVThueFigyoFaUA02+uRXbV9KIbNWkEvweNtm2wvyDw==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/property-provider": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "bowser": "^2.11.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-defaults-mode-browser/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/util-defaults-mode-node": {
+ "version": "3.261.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.261.0.tgz",
+ "integrity": "sha512-4AK6yu4bOmHSocUdbGoEHbNXB09UA58ON2HBHY4NxMBuFBAd9XB2tYiyhce+Cm+o+lHbS8oQnw0VZw16WMzzew==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/config-resolver": "3.259.0",
+ "@aws-sdk/credential-provider-imds": "3.259.0",
+ "@aws-sdk/node-config-provider": "3.259.0",
+ "@aws-sdk/property-provider": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-defaults-mode-node/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/util-endpoints": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.257.0.tgz",
+ "integrity": "sha512-3bvmRn5XGYzPPWjLuvHBKdJOb+fijnb8Ungu9bfXnTYFsng/ndHUWeHC22O/p8w3OWoRYUIMaZHxdxe27BFozg==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-endpoints/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/util-hex-encoding": {
+ "version": "3.201.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz",
+ "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-hex-encoding/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/util-locate-window": {
+ "version": "3.208.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz",
+ "integrity": "sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-locate-window/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/util-middleware": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.257.0.tgz",
+ "integrity": "sha512-F9ieon8B8eGVs5tyZtAIG3DZEObDvujkspho0qRbUTHUosM0ylJLsMU800fmC/uRHLRrZvb/RSp59+kNDwSAMw==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-middleware/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/util-retry": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.257.0.tgz",
+ "integrity": "sha512-l9TOsOAYtZxwW3q5fQKW4rsD9t2HVaBfQ4zBamHkNTfB4vBVvCnz4oxkvSvA2MlxCA6am+K1K/oj917Tpqk53g==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/service-error-classification": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-retry/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/util-uri-escape": {
+ "version": "3.201.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz",
+ "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-uri-escape/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/util-user-agent-browser": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.257.0.tgz",
+ "integrity": "sha512-YdavWK6/8Cw6mypEgysGGX/dT9p9qnzFbnN5PQsUY+JJk2Nx8fKFydjGiQ+6rWPeW17RAv9mmbboh9uPVWxVlw==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/types": "3.257.0",
+ "bowser": "^2.11.0",
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@aws-sdk/util-user-agent-browser/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/util-user-agent-node": {
+ "version": "3.259.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.259.0.tgz",
+ "integrity": "sha512-R0VTmNs+ySDDebU98BUbsLyeIM5YmAEr9esPpy15XfSy3AWmAeru8nLlztdaLilHZzLIDzvM2t7NGk/FzZFCvA==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/node-config-provider": "3.259.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "aws-crt": ">=1.0.0"
+ },
+ "peerDependenciesMeta": {
+ "aws-crt": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@aws-sdk/util-user-agent-node/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/util-utf8": {
+ "version": "3.254.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.254.0.tgz",
+ "integrity": "sha512-14Kso/eIt5/qfIBmhEL9L1IfyUqswjSTqO2mY7KOzUZ9SZbwn3rpxmtkhmATkRjD7XIlLKaxBkI7tU9Zjzj8Kw==",
+ "optional": true,
+ "dependencies": {
+ "@aws-sdk/util-buffer-from": "3.208.0",
+ "tslib": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@aws-sdk/util-utf8-browser": {
+ "version": "3.259.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz",
+ "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.3.1"
+ }
+ },
+ "node_modules/@aws-sdk/util-utf8-browser/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@aws-sdk/util-utf8/node_modules/tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
+ "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.20.14",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.14.tgz",
+ "integrity": "sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.20.12",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz",
+ "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.1.0",
+ "@babel/code-frame": "^7.18.6",
+ "@babel/generator": "^7.20.7",
+ "@babel/helper-compilation-targets": "^7.20.7",
+ "@babel/helper-module-transforms": "^7.20.11",
+ "@babel/helpers": "^7.20.7",
+ "@babel/parser": "^7.20.7",
+ "@babel/template": "^7.20.7",
+ "@babel/traverse": "^7.20.12",
+ "@babel/types": "^7.20.7",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.2",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.20.14",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz",
+ "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.20.7",
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "jsesc": "^2.5.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
+ "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
+ "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/helper-compilation-targets": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz",
+ "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.20.5",
+ "@babel/helper-validator-option": "^7.18.6",
+ "browserslist": "^4.21.3",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-environment-visitor": {
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz",
+ "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-function-name": {
+ "version": "7.19.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz",
+ "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.18.10",
+ "@babel/types": "^7.19.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-hoist-variables": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz",
+ "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz",
+ "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.20.11",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz",
+ "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-module-imports": "^7.18.6",
+ "@babel/helper-simple-access": "^7.20.2",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "@babel/helper-validator-identifier": "^7.19.1",
+ "@babel/template": "^7.20.7",
+ "@babel/traverse": "^7.20.10",
+ "@babel/types": "^7.20.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.20.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz",
+ "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-simple-access": {
+ "version": "7.20.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz",
+ "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.20.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz",
+ "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.19.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz",
+ "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.19.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
+ "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz",
+ "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.20.13",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz",
+ "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.20.7",
+ "@babel/traverse": "^7.20.13",
+ "@babel/types": "^7.20.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
+ "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.18.6",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.20.13",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz",
+ "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==",
+ "dev": true,
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz",
+ "integrity": "sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
+ "version": "7.19.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz",
+ "integrity": "sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.19.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.20.13",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz",
+ "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==",
+ "dependencies": {
+ "regenerator-runtime": "^0.13.11"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz",
+ "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.18.6",
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.20.13",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz",
+ "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.18.6",
+ "@babel/generator": "^7.20.7",
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-function-name": "^7.19.0",
+ "@babel/helper-hoist-variables": "^7.18.6",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "@babel/parser": "^7.20.13",
+ "@babel/types": "^7.20.7",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz",
+ "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.19.4",
+ "@babel/helper-validator-identifier": "^7.19.1",
+ "to-fast-properties": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@colors/colors": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
+ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
+ "engines": {
+ "node": ">=0.1.90"
+ }
+ },
+ "node_modules/@dabh/diagnostics": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz",
+ "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==",
+ "dependencies": {
+ "colorspace": "1.1.x",
+ "enabled": "2.0.x",
+ "kuler": "^2.0.0"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz",
+ "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz",
+ "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz",
+ "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz",
+ "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz",
+ "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz",
+ "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz",
+ "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz",
+ "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz",
+ "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz",
+ "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz",
+ "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz",
+ "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz",
+ "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz",
+ "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz",
+ "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz",
+ "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz",
+ "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz",
+ "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz",
+ "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz",
+ "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz",
+ "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz",
+ "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz",
+ "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.4.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@fortawesome/fontawesome-common-types": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.2.1.tgz",
+ "integrity": "sha512-Sz07mnQrTekFWLz5BMjOzHl/+NooTdW8F8kDQxjWwbpOJcnoSg4vUDng8d/WR1wOxM0O+CY9Zw0nR054riNYtQ==",
+ "hasInstallScript": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@fortawesome/fontawesome-svg-core": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.2.1.tgz",
+ "integrity": "sha512-HELwwbCz6C1XEcjzyT1Jugmz2NNklMrSPjZOWMlc+ZsHIVk+XOvOXLGGQtFBwSyqfJDNgRq4xBCwWOaZ/d9DEA==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "@fortawesome/fontawesome-common-types": "6.2.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@fortawesome/free-regular-svg-icons": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.2.1.tgz",
+ "integrity": "sha512-wiqcNDNom75x+pe88FclpKz7aOSqS2lOivZeicMV5KRwOAeypxEYWAK/0v+7r+LrEY30+qzh8r2XDaEHvoLsMA==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "@fortawesome/fontawesome-common-types": "6.2.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@fortawesome/free-solid-svg-icons": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.2.1.tgz",
+ "integrity": "sha512-oKuqrP5jbfEPJWTij4sM+/RvgX+RMFwx3QZCZcK9PrBDgxC35zuc7AOFsyMjMd/PIFPeB2JxyqDr5zs/DZFPPw==",
+ "hasInstallScript": true,
+ "dependencies": {
+ "@fortawesome/fontawesome-common-types": "6.2.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@fortawesome/react-fontawesome": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz",
+ "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==",
+ "dependencies": {
+ "prop-types": "^15.8.1"
+ },
+ "peerDependencies": {
+ "@fortawesome/fontawesome-svg-core": "~1 || ~6",
+ "react": ">=16.3"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.11.8",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
+ "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^1.2.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "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/@jridgewell/gen-mapping": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
+ "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/set-array": "^1.0.0",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "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/@jridgewell/sourcemap-codec": {
+ "version": "1.4.14",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+ "dev": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.17",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
+ "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "3.1.0",
+ "@jridgewell/sourcemap-codec": "1.4.14"
+ }
+ },
+ "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/@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/@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/@reduxjs/toolkit": {
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.2.tgz",
+ "integrity": "sha512-5ZAZ7hwAKWSii5T6NTPmgIBUqyVdlDs+6JjThz6J6dmHLDm6zCzv2OjHIFAi3Vvs1qjmXU0bm6eBojukYXjVMQ==",
+ "dependencies": {
+ "immer": "^9.0.16",
+ "redux": "^4.2.0",
+ "redux-thunk": "^2.4.2",
+ "reselect": "^4.1.7"
+ },
+ "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.3.1",
+ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.3.1.tgz",
+ "integrity": "sha512-+eun1Wtf72RNRSqgU7qM2AMX/oHp+dnx7BHk1qhK5ZHzdHTUU4LA1mGG1vT+jMc8sbhG3orvsfOmryjzx2PzQw==",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@types/body-parser": {
+ "version": "1.19.2",
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
+ "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==",
+ "dependencies": {
+ "@types/connect": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/connect": {
+ "version": "3.4.35",
+ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
+ "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/express": {
+ "version": "4.17.17",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz",
+ "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==",
+ "dependencies": {
+ "@types/body-parser": "*",
+ "@types/express-serve-static-core": "^4.17.33",
+ "@types/qs": "*",
+ "@types/serve-static": "*"
+ }
+ },
+ "node_modules/@types/express-serve-static-core": {
+ "version": "4.17.33",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz",
+ "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==",
+ "dependencies": {
+ "@types/node": "*",
+ "@types/qs": "*",
+ "@types/range-parser": "*"
+ }
+ },
+ "node_modules/@types/express-ws": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@types/express-ws/-/express-ws-3.0.1.tgz",
+ "integrity": "sha512-VguRXzcpPBF0IggIGpUoM65cZJDfMQxoc6dKoCz1yLzcwcXW7ft60yhq3ygKhyEhEIQFtLrWjyz4AJ1qjmzCFw==",
+ "dependencies": {
+ "@types/express": "*",
+ "@types/express-serve-static-core": "*",
+ "@types/ws": "*"
+ }
+ },
+ "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/@types/json-schema": {
+ "version": "7.0.11",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
+ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
+ "dev": true
+ },
+ "node_modules/@types/json5": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
+ "dev": true
+ },
+ "node_modules/@types/lodash": {
+ "version": "4.14.191",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz",
+ "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ=="
+ },
+ "node_modules/@types/mime": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz",
+ "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA=="
+ },
+ "node_modules/@types/node": {
+ "version": "18.11.19",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.19.tgz",
+ "integrity": "sha512-YUgMWAQBWLObABqrvx8qKO1enAvBUdjZOAWQ5grBAkp5LQv45jBvYKZ3oFS9iKRCQyFjqw6iuEa1vmFqtxYLZw=="
+ },
+ "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/qs": {
+ "version": "6.9.7",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
+ "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw=="
+ },
+ "node_modules/@types/range-parser": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
+ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw=="
+ },
+ "node_modules/@types/react": {
+ "version": "18.0.27",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.27.tgz",
+ "integrity": "sha512-3vtRKHgVxu3Jp9t718R9BuzoD4NcQ8YJ5XRzsSKxNDiDonD2MXIT1TmSkenxuCycZJoQT5d2vE8LwWJxBC1gmA==",
+ "dependencies": {
+ "@types/prop-types": "*",
+ "@types/scheduler": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "18.0.10",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.10.tgz",
+ "integrity": "sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg==",
+ "devOptional": true,
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/scheduler": {
+ "version": "0.16.2",
+ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
+ "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew=="
+ },
+ "node_modules/@types/semver": {
+ "version": "7.3.13",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz",
+ "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==",
+ "dev": true
+ },
+ "node_modules/@types/serve-static": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz",
+ "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==",
+ "dependencies": {
+ "@types/mime": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/triple-beam": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.2.tgz",
+ "integrity": "sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g=="
+ },
+ "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/@types/webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog=="
+ },
+ "node_modules/@types/whatwg-url": {
+ "version": "8.2.2",
+ "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz",
+ "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==",
+ "dependencies": {
+ "@types/node": "*",
+ "@types/webidl-conversions": "*"
+ }
+ },
+ "node_modules/@types/ws": {
+ "version": "8.5.4",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz",
+ "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "5.50.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.50.0.tgz",
+ "integrity": "sha512-vwksQWSFZiUhgq3Kv7o1Jcj0DUNylwnIlGvKvLLYsq8pAWha6/WCnXUeaSoNNha/K7QSf2+jvmkxggC1u3pIwQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "5.50.0",
+ "@typescript-eslint/type-utils": "5.50.0",
+ "@typescript-eslint/utils": "5.50.0",
+ "debug": "^4.3.4",
+ "grapheme-splitter": "^1.0.4",
+ "ignore": "^5.2.0",
+ "natural-compare-lite": "^1.4.0",
+ "regexpp": "^3.2.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/eslint-plugin/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/@typescript-eslint/eslint-plugin/node_modules/semver": {
+ "version": "7.3.8",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/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/@typescript-eslint/parser": {
+ "version": "5.50.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.50.0.tgz",
+ "integrity": "sha512-KCcSyNaogUDftK2G9RXfQyOCt51uB5yqC6pkUYqhYh8Kgt+DwR5M0EwEAxGPy/+DH6hnmKeGsNhiZRQxjH71uQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "5.50.0",
+ "@typescript-eslint/types": "5.50.0",
+ "@typescript-eslint/typescript-estree": "5.50.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "5.50.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz",
+ "integrity": "sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.50.0",
+ "@typescript-eslint/visitor-keys": "5.50.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "5.50.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.50.0.tgz",
+ "integrity": "sha512-dcnXfZ6OGrNCO7E5UY/i0ktHb7Yx1fV6fnQGGrlnfDhilcs6n19eIRcvLBqx6OQkrPaFlDPk3OJ0WlzQfrV0bQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "5.50.0",
+ "@typescript-eslint/utils": "5.50.0",
+ "debug": "^4.3.4",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "5.50.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.50.0.tgz",
+ "integrity": "sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==",
+ "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/typescript-estree": {
+ "version": "5.50.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.50.0.tgz",
+ "integrity": "sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.50.0",
+ "@typescript-eslint/visitor-keys": "5.50.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/typescript-estree/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/@typescript-eslint/typescript-estree/node_modules/semver": {
+ "version": "7.3.8",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/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/@typescript-eslint/utils": {
+ "version": "5.50.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.50.0.tgz",
+ "integrity": "sha512-v/AnUFImmh8G4PH0NDkf6wA8hujNNcrwtecqW4vtQ1UOSNBaZl49zP1SHoZ/06e+UiwzHpgb5zP5+hwlYYWYAw==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "@types/semver": "^7.3.12",
+ "@typescript-eslint/scope-manager": "5.50.0",
+ "@typescript-eslint/types": "5.50.0",
+ "@typescript-eslint/typescript-estree": "5.50.0",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^3.0.0",
+ "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/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/@typescript-eslint/utils/node_modules/semver": {
+ "version": "7.3.8",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/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/@typescript-eslint/visitor-keys": {
+ "version": "5.50.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz",
+ "integrity": "sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.50.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/@vitejs/plugin-react": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-3.0.1.tgz",
+ "integrity": "sha512-mx+QvYwIbbpOIJw+hypjnW1lAbKDHtWK5ibkF/V1/oMBu8HU/chb+SnqJDAsLq1+7rGqjktCEomMTM5KShzUKQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.20.7",
+ "@babel/plugin-transform-react-jsx-self": "^7.18.6",
+ "@babel/plugin-transform-react-jsx-source": "^7.19.6",
+ "magic-string": "^0.27.0",
+ "react-refresh": "^0.14.0"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.0.0"
+ }
+ },
+ "node_modules/abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+ "dev": true
+ },
+ "node_modules/accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.8.2",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
+ "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "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/aria-query": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz",
+ "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "deep-equal": "^2.0.5"
+ }
+ },
+ "node_modules/array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
+ },
+ "node_modules/array-includes": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz",
+ "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "get-intrinsic": "^1.1.3",
+ "is-string": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/array-uniq": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+ "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/array.prototype.flat": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz",
+ "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flatmap": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz",
+ "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.tosorted": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz",
+ "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "es-shim-unscopables": "^1.0.0",
+ "get-intrinsic": "^1.1.3"
+ }
+ },
+ "node_modules/asn1": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
+ "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
+ "dependencies": {
+ "safer-buffer": "~2.1.0"
+ }
+ },
+ "node_modules/assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/ast-types-flow": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
+ "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/async": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
+ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
+ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/aws4": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz",
+ "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg=="
+ },
+ "node_modules/axe-core": {
+ "version": "4.6.3",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz",
+ "integrity": "sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg==",
+ "dev": true,
+ "peer": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/axobject-query": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz",
+ "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "deep-equal": "^2.0.5"
+ }
+ },
+ "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=="
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "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/bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
+ "dependencies": {
+ "tweetnacl": "^0.14.3"
+ }
+ },
+ "node_modules/bcryptjs": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
+ "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ=="
+ },
+ "node_modules/bignumber.js": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.4.0.tgz",
+ "integrity": "sha512-uw4ra6Cv483Op/ebM0GBKKfxZlSmn6NgFRby5L3yGTlunLj53KQgndDlqy2WVFOwgvurocApYkSud0aO+mvrpQ==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/bmp-js": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.3.tgz",
+ "integrity": "sha512-epsm3Z92j5xwek9p97pVw3KbsNc0F4QnbYh+N93SpbJYuHFQQ/UAh6K+bKFGyLePH3Hudtl/Sa95Quqp0gX8IQ=="
+ },
+ "node_modules/body-parser": {
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
+ "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "content-type": "~1.0.4",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "on-finished": "2.4.1",
+ "qs": "6.11.0",
+ "raw-body": "2.5.1",
+ "type-is": "~1.6.18",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/body-parser/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/body-parser/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ },
+ "node_modules/bowser": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz",
+ "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==",
+ "optional": true
+ },
+ "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==",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "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/browserslist": {
+ "version": "4.21.5",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz",
+ "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001449",
+ "electron-to-chromium": "^1.4.284",
+ "node-releases": "^2.0.8",
+ "update-browserslist-db": "^1.0.10"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/bson": {
+ "version": "4.7.2",
+ "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz",
+ "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==",
+ "dependencies": {
+ "buffer": "^5.6.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "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": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/buffer-equal": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz",
+ "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/buffer-equal-constant-time": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="
+ },
+ "node_modules/builtins": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz",
+ "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==",
+ "dev": true,
+ "dependencies": {
+ "semver": "^7.0.0"
+ }
+ },
+ "node_modules/builtins/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/builtins/node_modules/semver": {
+ "version": "7.3.8",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/builtins/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/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "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/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/caniuse-lite": {
+ "version": "1.0.30001449",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001449.tgz",
+ "integrity": "sha512-CPB+UL9XMT/Av+pJxCKGhdx+yg1hzplvFJQlJ2n68PyQGMz9L/E2zCyLdOL8uasbouTUgnPl+y0tccI/se+BEw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ }
+ ]
+ },
+ "node_modules/caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
+ },
+ "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/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "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/color": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
+ "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==",
+ "dependencies": {
+ "color-convert": "^1.9.3",
+ "color-string": "^1.6.0"
+ }
+ },
+ "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/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/color-string": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
+ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+ "dependencies": {
+ "color-name": "^1.0.0",
+ "simple-swizzle": "^0.2.2"
+ }
+ },
+ "node_modules/colorspace": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz",
+ "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==",
+ "dependencies": {
+ "color": "^3.1.3",
+ "text-hex": "1.0.x"
+ }
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+ },
+ "node_modules/commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+ },
+ "node_modules/confusing-browser-globals": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz",
+ "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==",
+ "dev": true
+ },
+ "node_modules/content-disposition": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "dependencies": {
+ "safe-buffer": "5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "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/cookie": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
+ "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-parser": {
+ "version": "1.4.6",
+ "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz",
+ "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==",
+ "dependencies": {
+ "cookie": "0.4.1",
+ "cookie-signature": "1.0.6"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/cookie-parser/node_modules/cookie": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
+ "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
+ },
+ "node_modules/cors": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+ "dependencies": {
+ "object-assign": "^4",
+ "vary": "^1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "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/csstype": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz",
+ "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw=="
+ },
+ "node_modules/damerau-levenshtein": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
+ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
+ "dependencies": {
+ "assert-plus": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "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/deep-equal": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz",
+ "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "es-get-iterator": "^1.1.2",
+ "get-intrinsic": "^1.1.3",
+ "is-arguments": "^1.1.1",
+ "is-array-buffer": "^3.0.1",
+ "is-date-object": "^1.0.5",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.2",
+ "isarray": "^2.0.5",
+ "object-is": "^1.1.5",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.4",
+ "regexp.prototype.flags": "^1.4.3",
+ "side-channel": "^1.0.4",
+ "which-boxed-primitive": "^1.0.2",
+ "which-collection": "^1.0.1",
+ "which-typed-array": "^1.1.9"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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/deepmerge": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz",
+ "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz",
+ "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
+ "dev": true,
+ "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/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "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/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/dom-walk": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
+ "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="
+ },
+ "node_modules/dotenv": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz",
+ "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/ecc-jsbn": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+ "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
+ "dependencies": {
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "node_modules/ecdsa-sig-formatter": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
+ },
+ "node_modules/ejs": {
+ "version": "3.1.8",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz",
+ "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==",
+ "dependencies": {
+ "jake": "^10.8.5"
+ },
+ "bin": {
+ "ejs": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.284",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
+ "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==",
+ "dev": true
+ },
+ "node_modules/email-addresses": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-5.0.0.tgz",
+ "integrity": "sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw=="
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/enabled": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz",
+ "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ=="
+ },
+ "node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.21.1",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz",
+ "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==",
+ "dev": true,
+ "dependencies": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "es-set-tostringtag": "^2.0.1",
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "function.prototype.name": "^1.1.5",
+ "get-intrinsic": "^1.1.3",
+ "get-symbol-description": "^1.0.0",
+ "globalthis": "^1.0.3",
+ "gopd": "^1.0.1",
+ "has": "^1.0.3",
+ "has-property-descriptors": "^1.0.0",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.4",
+ "is-array-buffer": "^3.0.1",
+ "is-callable": "^1.2.7",
+ "is-negative-zero": "^2.0.2",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.2",
+ "is-string": "^1.0.7",
+ "is-typed-array": "^1.1.10",
+ "is-weakref": "^1.0.2",
+ "object-inspect": "^1.12.2",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.4",
+ "regexp.prototype.flags": "^1.4.3",
+ "safe-regex-test": "^1.0.0",
+ "string.prototype.trimend": "^1.0.6",
+ "string.prototype.trimstart": "^1.0.6",
+ "typed-array-length": "^1.0.4",
+ "unbox-primitive": "^1.0.2",
+ "which-typed-array": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-get-iterator": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz",
+ "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.3",
+ "has-symbols": "^1.0.3",
+ "is-arguments": "^1.1.1",
+ "is-map": "^2.0.2",
+ "is-set": "^2.0.2",
+ "is-string": "^1.0.7",
+ "isarray": "^2.0.5",
+ "stop-iteration-iterator": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz",
+ "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.1.3",
+ "has": "^1.0.3",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-shim-unscopables": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
+ "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==",
+ "dev": true,
+ "dependencies": {
+ "has": "^1.0.3"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "dependencies": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es6-promise": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz",
+ "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg=="
+ },
+ "node_modules/esbuild": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz",
+ "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/android-arm": "0.16.17",
+ "@esbuild/android-arm64": "0.16.17",
+ "@esbuild/android-x64": "0.16.17",
+ "@esbuild/darwin-arm64": "0.16.17",
+ "@esbuild/darwin-x64": "0.16.17",
+ "@esbuild/freebsd-arm64": "0.16.17",
+ "@esbuild/freebsd-x64": "0.16.17",
+ "@esbuild/linux-arm": "0.16.17",
+ "@esbuild/linux-arm64": "0.16.17",
+ "@esbuild/linux-ia32": "0.16.17",
+ "@esbuild/linux-loong64": "0.16.17",
+ "@esbuild/linux-mips64el": "0.16.17",
+ "@esbuild/linux-ppc64": "0.16.17",
+ "@esbuild/linux-riscv64": "0.16.17",
+ "@esbuild/linux-s390x": "0.16.17",
+ "@esbuild/linux-x64": "0.16.17",
+ "@esbuild/netbsd-x64": "0.16.17",
+ "@esbuild/openbsd-x64": "0.16.17",
+ "@esbuild/sunos-x64": "0.16.17",
+ "@esbuild/win32-arm64": "0.16.17",
+ "@esbuild/win32-ia32": "0.16.17",
+ "@esbuild/win32-x64": "0.16.17"
+ }
+ },
+ "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/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
+ },
+ "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/eslint": {
+ "version": "8.33.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.33.0.tgz",
+ "integrity": "sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==",
+ "dev": true,
+ "dependencies": {
+ "@eslint/eslintrc": "^1.4.1",
+ "@humanwhocodes/config-array": "^0.11.8",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "ajv": "^6.10.0",
+ "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.1.1",
+ "eslint-utils": "^3.0.0",
+ "eslint-visitor-keys": "^3.3.0",
+ "espree": "^9.4.0",
+ "esquery": "^1.4.0",
+ "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",
+ "grapheme-splitter": "^1.0.4",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-sdsl": "^4.1.4",
+ "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.1",
+ "regexpp": "^3.2.0",
+ "strip-ansi": "^6.0.1",
+ "strip-json-comments": "^3.1.0",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-config-airbnb": {
+ "version": "19.0.4",
+ "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz",
+ "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==",
+ "dev": true,
+ "dependencies": {
+ "eslint-config-airbnb-base": "^15.0.0",
+ "object.assign": "^4.1.2",
+ "object.entries": "^1.1.5"
+ },
+ "engines": {
+ "node": "^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^7.32.0 || ^8.2.0",
+ "eslint-plugin-import": "^2.25.3",
+ "eslint-plugin-jsx-a11y": "^6.5.1",
+ "eslint-plugin-react": "^7.28.0",
+ "eslint-plugin-react-hooks": "^4.3.0"
+ }
+ },
+ "node_modules/eslint-config-airbnb-base": {
+ "version": "15.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz",
+ "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==",
+ "dev": true,
+ "dependencies": {
+ "confusing-browser-globals": "^1.0.10",
+ "object.assign": "^4.1.2",
+ "object.entries": "^1.1.5",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^7.32.0 || ^8.2.0",
+ "eslint-plugin-import": "^2.25.2"
+ }
+ },
+ "node_modules/eslint-config-prettier": {
+ "version": "8.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz",
+ "integrity": "sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==",
+ "dev": true,
+ "bin": {
+ "eslint-config-prettier": "bin/cli.js"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint-config-standard": {
+ "version": "17.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz",
+ "integrity": "sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==",
+ "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"
+ }
+ ],
+ "peerDependencies": {
+ "eslint": "^8.0.1",
+ "eslint-plugin-import": "^2.25.2",
+ "eslint-plugin-n": "^15.0.0",
+ "eslint-plugin-promise": "^6.0.0"
+ }
+ },
+ "node_modules/eslint-config-standard-with-typescript": {
+ "version": "33.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-33.0.0.tgz",
+ "integrity": "sha512-HOLmCMF91yYizfEms00jkmEoKvCCEIUOO6ArGZ9BNYL8yczF23fz/orsG6pN84f97cfo8c0kdREHzEO+uMA2zw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/parser": "^5.0.0",
+ "eslint-config-standard": "17.0.0"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/eslint-plugin": "^5.0.0",
+ "eslint": "^8.0.1",
+ "eslint-plugin-import": "^2.25.2",
+ "eslint-plugin-n": "^15.0.0",
+ "eslint-plugin-promise": "^6.0.0",
+ "typescript": "*"
+ }
+ },
+ "node_modules/eslint-import-resolver-node": {
+ "version": "0.3.7",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz",
+ "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^3.2.7",
+ "is-core-module": "^2.11.0",
+ "resolve": "^1.22.1"
+ }
+ },
+ "node_modules/eslint-import-resolver-node/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-module-utils": {
+ "version": "2.7.4",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz",
+ "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^3.2.7"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-module-utils/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-es": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz",
+ "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==",
+ "dev": true,
+ "dependencies": {
+ "eslint-utils": "^2.0.0",
+ "regexpp": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=4.19.1"
+ }
+ },
+ "node_modules/eslint-plugin-es/node_modules/eslint-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+ "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ }
+ },
+ "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/eslint-plugin-import": {
+ "version": "2.27.5",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz",
+ "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==",
+ "dev": true,
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "array.prototype.flatmap": "^1.3.1",
+ "debug": "^3.2.7",
+ "doctrine": "^2.1.0",
+ "eslint-import-resolver-node": "^0.3.7",
+ "eslint-module-utils": "^2.7.4",
+ "has": "^1.0.3",
+ "is-core-module": "^2.11.0",
+ "is-glob": "^4.0.3",
+ "minimatch": "^3.1.2",
+ "object.values": "^1.1.6",
+ "resolve": "^1.22.1",
+ "semver": "^6.3.0",
+ "tsconfig-paths": "^3.14.1"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-jsx-a11y": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz",
+ "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "@babel/runtime": "^7.20.7",
+ "aria-query": "^5.1.3",
+ "array-includes": "^3.1.6",
+ "array.prototype.flatmap": "^1.3.1",
+ "ast-types-flow": "^0.0.7",
+ "axe-core": "^4.6.2",
+ "axobject-query": "^3.1.1",
+ "damerau-levenshtein": "^1.0.8",
+ "emoji-regex": "^9.2.2",
+ "has": "^1.0.3",
+ "jsx-ast-utils": "^3.3.3",
+ "language-tags": "=1.0.5",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.6",
+ "object.fromentries": "^2.0.6",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
+ }
+ },
+ "node_modules/eslint-plugin-n": {
+ "version": "15.6.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.6.1.tgz",
+ "integrity": "sha512-R9xw9OtCRxxaxaszTQmQAlPgM+RdGjaL1akWuY/Fv9fRAi8Wj4CUKc6iYVG8QNRjRuo8/BqVYIpfqberJUEacA==",
+ "dev": true,
+ "dependencies": {
+ "builtins": "^5.0.1",
+ "eslint-plugin-es": "^4.1.0",
+ "eslint-utils": "^3.0.0",
+ "ignore": "^5.1.1",
+ "is-core-module": "^2.11.0",
+ "minimatch": "^3.1.2",
+ "resolve": "^1.22.1",
+ "semver": "^7.3.8"
+ },
+ "engines": {
+ "node": ">=12.22.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-n/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/eslint-plugin-n/node_modules/semver": {
+ "version": "7.3.8",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-plugin-n/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/eslint-plugin-prettier": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz",
+ "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==",
+ "dev": true,
+ "dependencies": {
+ "prettier-linter-helpers": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.28.0",
+ "prettier": ">=2.0.0"
+ },
+ "peerDependenciesMeta": {
+ "eslint-config-prettier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-promise": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz",
+ "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-react": {
+ "version": "7.32.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz",
+ "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==",
+ "dev": true,
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flatmap": "^1.3.1",
+ "array.prototype.tosorted": "^1.1.1",
+ "doctrine": "^2.1.0",
+ "estraverse": "^5.3.0",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.6",
+ "object.fromentries": "^2.0.6",
+ "object.hasown": "^1.1.2",
+ "object.values": "^1.1.6",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.4",
+ "semver": "^6.3.0",
+ "string.prototype.matchall": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
+ }
+ },
+ "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/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/resolve": {
+ "version": "2.0.0-next.4",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz",
+ "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.9.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/eslint-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/eslint-scope/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/eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^2.0.0"
+ },
+ "engines": {
+ "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=5"
+ }
+ },
+ "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "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/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/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.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+ "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/eslint/node_modules/globals": {
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "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/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/espree": {
+ "version": "9.4.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz",
+ "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.8.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "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/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/exif-parser": {
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz",
+ "integrity": "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw=="
+ },
+ "node_modules/express": {
+ "version": "4.18.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
+ "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
+ "dependencies": {
+ "accepts": "~1.3.8",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.20.1",
+ "content-disposition": "0.5.4",
+ "content-type": "~1.0.4",
+ "cookie": "0.5.0",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "1.2.0",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "merge-descriptors": "1.0.1",
+ "methods": "~1.1.2",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "~2.0.7",
+ "qs": "6.11.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.2.1",
+ "send": "0.18.0",
+ "serve-static": "1.15.0",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/express-validator": {
+ "version": "6.14.3",
+ "resolved": "https://registry.npmjs.org/express-validator/-/express-validator-6.14.3.tgz",
+ "integrity": "sha512-c4b9NMdhskfcLbH/FchsSfCt4Vb14gKzcotG9zLS+VoOJDox57aGhCL+kmAu7cl+ytaSed+HD5jdJhel8DQsdg==",
+ "dependencies": {
+ "lodash": "^4.17.21",
+ "validator": "^13.7.0"
+ },
+ "engines": {
+ "node": ">= 8.0.0"
+ }
+ },
+ "node_modules/express-ws": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/express-ws/-/express-ws-5.0.2.tgz",
+ "integrity": "sha512-0uvmuk61O9HXgLhGl3QhNSEtRsQevtmbL94/eILaliEADZBHZOQUAiHFrGPrgsjikohyrmSG5g+sCfASTt0lkQ==",
+ "dependencies": {
+ "ws": "^7.4.6"
+ },
+ "engines": {
+ "node": ">=4.5.0"
+ },
+ "peerDependencies": {
+ "express": "^4.0.0 || ^5.0.0-alpha.1"
+ }
+ },
+ "node_modules/express-ws/node_modules/ws": {
+ "version": "7.5.9",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
+ "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/express/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/express/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ },
+ "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/extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
+ "engines": [
+ "node >=0.6.0"
+ ]
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+ },
+ "node_modules/fast-diff": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
+ "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
+ "dev": true
+ },
+ "node_modules/fast-glob": {
+ "version": "3.2.12",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
+ "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
+ "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/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+ },
+ "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/fast-xml-parser": {
+ "version": "4.0.11",
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz",
+ "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==",
+ "optional": true,
+ "dependencies": {
+ "strnum": "^1.0.5"
+ },
+ "bin": {
+ "fxparser": "src/cli/cli.js"
+ },
+ "funding": {
+ "type": "paypal",
+ "url": "https://paypal.me/naturalintelligence"
+ }
+ },
+ "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/fecha": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz",
+ "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw=="
+ },
+ "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/file-type": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz",
+ "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/filelist": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
+ "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
+ "dependencies": {
+ "minimatch": "^5.0.1"
+ }
+ },
+ "node_modules/filelist/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/filelist/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/filename-reserved-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
+ "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/filenamify": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz",
+ "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==",
+ "dependencies": {
+ "filename-reserved-regex": "^2.0.0",
+ "strip-outer": "^1.0.1",
+ "trim-repeated": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.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/finalhandler": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
+ "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "statuses": "2.0.1",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/finalhandler/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/finalhandler/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ },
+ "node_modules/find-cache-dir": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
+ "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
+ "dependencies": {
+ "commondir": "^1.0.1",
+ "make-dir": "^3.0.2",
+ "pkg-dir": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "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/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/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/fn.name": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
+ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw=="
+ },
+ "node_modules/for-each": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+ "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "dev": true,
+ "dependencies": {
+ "is-callable": "^1.1.3"
+ }
+ },
+ "node_modules/forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 0.12"
+ }
+ },
+ "node_modules/formik": {
+ "version": "2.2.9",
+ "resolved": "https://registry.npmjs.org/formik/-/formik-2.2.9.tgz",
+ "integrity": "sha512-LQLcISMmf1r5at4/gyJigGn0gOwFbeEAlji+N9InZF6LIMXnFNkO42sCI8Jt84YZggpD4cPWObAZaxpEFtSzNA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://opencollective.com/formik"
+ }
+ ],
+ "dependencies": {
+ "deepmerge": "^2.1.1",
+ "hoist-non-react-statics": "^3.3.0",
+ "lodash": "^4.17.21",
+ "lodash-es": "^4.17.21",
+ "react-fast-compare": "^2.0.1",
+ "tiny-warning": "^1.0.2",
+ "tslib": "^1.10.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0"
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "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=="
+ },
+ "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/function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "node_modules/function.prototype.name": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
+ "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.19.0",
+ "functions-have-names": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz",
+ "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==",
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-symbol-description": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
+ "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
+ "dependencies": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "node_modules/gh-pages": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-5.0.0.tgz",
+ "integrity": "sha512-Nqp1SjkPIB94Xw/3yYNTUL+G2dxlhjvv1zeN/4kMC1jfViTEqhtVz/Ba1zSXHuvXCN9ADNS1dN4r5/J/nZWEQQ==",
+ "dependencies": {
+ "async": "^3.2.4",
+ "commander": "^2.18.0",
+ "email-addresses": "^5.0.0",
+ "filenamify": "^4.3.0",
+ "find-cache-dir": "^3.3.1",
+ "fs-extra": "^8.1.0",
+ "globby": "^6.1.0"
+ },
+ "bin": {
+ "gh-pages": "bin/gh-pages.js",
+ "gh-pages-clean": "bin/gh-pages-clean.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/gh-pages/node_modules/array-union": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+ "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==",
+ "dependencies": {
+ "array-uniq": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/gh-pages/node_modules/globby": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
+ "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==",
+ "dependencies": {
+ "array-union": "^1.0.1",
+ "glob": "^7.0.3",
+ "object-assign": "^4.0.1",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/global": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
+ "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
+ "dependencies": {
+ "min-document": "^2.19.0",
+ "process": "^0.11.10"
+ }
+ },
+ "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/globalthis": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
+ "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "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/gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.1.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.10",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
+ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="
+ },
+ "node_modules/grapheme-splitter": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
+ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
+ "dev": true
+ },
+ "node_modules/har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/har-validator": {
+ "version": "5.1.5",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+ "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+ "deprecated": "this library is no longer supported",
+ "dependencies": {
+ "ajv": "^6.12.3",
+ "har-schema": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "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/has-bigints": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
+ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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/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==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.1.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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/has-tostringtag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
+ "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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/http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "dependencies": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/http-signature": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
+ "dependencies": {
+ "assert-plus": "^1.0.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
+ },
+ "engines": {
+ "node": ">=0.8",
+ "npm": ">=1.3.7"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "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/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/ignore-by-default": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
+ "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==",
+ "dev": true
+ },
+ "node_modules/immer": {
+ "version": "9.0.19",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.19.tgz",
+ "integrity": "sha512-eY+Y0qcsB4TZKwgQzLaE/lqYMlKhv5J9dyd2RhhtGhNo2njPXDqU9XPfcNfa3MIDsdtZt5KlkIsirlo4dHsWdQ==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/immer"
+ }
+ },
+ "node_modules/immutable": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.2.tgz",
+ "integrity": "sha512-fTMKDwtbvO5tldky9QZ2fMX7slR0mYpY5nbnFWYp0fOzDhHqhgIw9KoYgxLWsoNTS9ZHGauHj18DTyEw6BK3Og==",
+ "dev": true
+ },
+ "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/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/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "node_modules/internal-slot": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz",
+ "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.1.3",
+ "has": "^1.0.3",
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/ip": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
+ "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ=="
+ },
+ "node_modules/ip-regex": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz",
+ "integrity": "sha512-HjpCHTuxbR/6jWJroc/VN+npo5j0T4Vv2TAI5qdEHQx7hsL767MeccGFSsLtF694EiZKTSEqgoeU6DtGFCcuqQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/is-any-array": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-any-array/-/is-any-array-2.0.0.tgz",
+ "integrity": "sha512-WdPV58rT3aOWXvvyuBydnCq4S2BM1Yz8shKxlEpk/6x+GX202XRvXOycEFtNgnHVLoc46hpexPFx8Pz1/sMS0w==",
+ "dev": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz",
+ "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.3",
+ "is-typed-array": "^1.1.10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
+ },
+ "node_modules/is-bigint": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "dev": true,
+ "dependencies": {
+ "has-bigints": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
+ "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
+ "dev": true,
+ "dependencies": {
+ "has": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-function": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz",
+ "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ=="
+ },
+ "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/is-map": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
+ "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==",
+ "dev": true,
+ "peer": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
+ "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
+ "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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/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==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-set": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
+ "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==",
+ "dev": true,
+ "peer": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
+ "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.10",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz",
+ "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==",
+ "dev": true,
+ "dependencies": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
+ },
+ "node_modules/is-weakmap": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
+ "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
+ "dev": true,
+ "peer": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakref": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
+ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakset": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz",
+ "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true,
+ "peer": true
+ },
+ "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/isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="
+ },
+ "node_modules/jake": {
+ "version": "10.8.5",
+ "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz",
+ "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==",
+ "dependencies": {
+ "async": "^3.2.3",
+ "chalk": "^4.0.2",
+ "filelist": "^1.0.1",
+ "minimatch": "^3.0.4"
+ },
+ "bin": {
+ "jake": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jake/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==",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/jake/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "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/jake/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==",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/jake/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=="
+ },
+ "node_modules/jake/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==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jake/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==",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jimp": {
+ "version": "0.2.28",
+ "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.2.28.tgz",
+ "integrity": "sha512-9HT7DA279xkTlry2oG30s6AtOUglNiY2UdyYpj0yNI4/NBv8PmdNC0gcldgMU4HqvbUlrM3+v+6GaHnTkH23JQ==",
+ "dependencies": {
+ "bignumber.js": "^2.1.0",
+ "bmp-js": "0.0.3",
+ "es6-promise": "^3.0.2",
+ "exif-parser": "^0.1.9",
+ "file-type": "^3.1.0",
+ "jpeg-js": "^0.2.0",
+ "load-bmfont": "^1.2.3",
+ "mime": "^1.3.4",
+ "mkdirp": "0.5.1",
+ "pixelmatch": "^4.0.0",
+ "pngjs": "^3.0.0",
+ "read-chunk": "^1.0.1",
+ "request": "^2.65.0",
+ "stream-to-buffer": "^0.1.0",
+ "tinycolor2": "^1.1.2",
+ "url-regex": "^3.0.0"
+ }
+ },
+ "node_modules/jpeg-js": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.2.0.tgz",
+ "integrity": "sha512-Ni9PffhJtYtdD7VwxH6V2MnievekGfUefosGCHadog0/jAevRu6HPjYeMHbUemn0IPE8d4wGa8UsOGsX+iKy2g=="
+ },
+ "node_modules/js-sdsl": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz",
+ "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==",
+ "dev": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/js-sdsl"
+ }
+ },
+ "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/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/jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
+ },
+ "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/json-schema": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
+ },
+ "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=="
+ },
+ "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/json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="
+ },
+ "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/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/jsonwebtoken": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz",
+ "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==",
+ "dependencies": {
+ "jws": "^3.2.2",
+ "lodash": "^4.17.21",
+ "ms": "^2.1.1",
+ "semver": "^7.3.8"
+ },
+ "engines": {
+ "node": ">=12",
+ "npm": ">=6"
+ }
+ },
+ "node_modules/jsonwebtoken/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==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jsonwebtoken/node_modules/semver": {
+ "version": "7.3.8",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jsonwebtoken/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ },
+ "node_modules/jsprim": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
+ "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
+ "dependencies": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.4.0",
+ "verror": "1.10.0"
+ },
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
+ "node_modules/jsx-ast-utils": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz",
+ "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==",
+ "dev": true,
+ "dependencies": {
+ "array-includes": "^3.1.5",
+ "object.assign": "^4.1.3"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/jwa": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+ "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+ "dependencies": {
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/jws": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+ "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+ "dependencies": {
+ "jwa": "^1.4.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "node_modules/kareem": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz",
+ "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/kuler": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
+ "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A=="
+ },
+ "node_modules/language-subtag-registry": {
+ "version": "0.3.22",
+ "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz",
+ "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/language-tags": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz",
+ "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "language-subtag-registry": "~0.3.2"
+ }
+ },
+ "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/load-bmfont": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.1.tgz",
+ "integrity": "sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==",
+ "dependencies": {
+ "buffer-equal": "0.0.1",
+ "mime": "^1.3.4",
+ "parse-bmfont-ascii": "^1.0.3",
+ "parse-bmfont-binary": "^1.0.5",
+ "parse-bmfont-xml": "^1.1.4",
+ "phin": "^2.9.1",
+ "xhr": "^2.0.1",
+ "xtend": "^4.0.0"
+ }
+ },
+ "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/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "node_modules/lodash-es": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
+ "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
+ },
+ "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/logform": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz",
+ "integrity": "sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==",
+ "dependencies": {
+ "@colors/colors": "1.5.0",
+ "@types/triple-beam": "^1.3.2",
+ "fecha": "^4.2.0",
+ "ms": "^2.1.1",
+ "safe-stable-stringify": "^2.3.1",
+ "triple-beam": "^1.3.0"
+ }
+ },
+ "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/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/magic-string": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz",
+ "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.13"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dependencies": {
+ "semver": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/memory-pager": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
+ "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
+ "optional": true
+ },
+ "node_modules/merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
+ },
+ "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/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "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/middleware-async": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/middleware-async/-/middleware-async-1.3.5.tgz",
+ "integrity": "sha512-lprF7UUdDV+0EfREXARoNJUExNkupIMPzqgQaJnfUvxYH4iJuInJsDcE2r4vY9ec6wJ6vg63XWImCkKk4n1e4A=="
+ },
+ "node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/min-document": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
+ "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==",
+ "dependencies": {
+ "dom-walk": "^0.1.0"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
+ "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==",
+ "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)",
+ "dependencies": {
+ "minimist": "0.0.8"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/mkdirp/node_modules/minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q=="
+ },
+ "node_modules/ml-array-max": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/ml-array-max/-/ml-array-max-1.2.4.tgz",
+ "integrity": "sha512-BlEeg80jI0tW6WaPyGxf5Sa4sqvcyY6lbSn5Vcv44lp1I2GR6AWojfUvLnGTNsIXrZ8uqWmo8VcG1WpkI2ONMQ==",
+ "dev": true,
+ "dependencies": {
+ "is-any-array": "^2.0.0"
+ }
+ },
+ "node_modules/ml-array-min": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/ml-array-min/-/ml-array-min-1.2.3.tgz",
+ "integrity": "sha512-VcZ5f3VZ1iihtrGvgfh/q0XlMobG6GQ8FsNyQXD3T+IlstDv85g8kfV0xUG1QPRO/t21aukaJowDzMTc7j5V6Q==",
+ "dev": true,
+ "dependencies": {
+ "is-any-array": "^2.0.0"
+ }
+ },
+ "node_modules/ml-array-rescale": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/ml-array-rescale/-/ml-array-rescale-1.3.7.tgz",
+ "integrity": "sha512-48NGChTouvEo9KBctDfHC3udWnQKNKEWN0ziELvY3KG25GR5cA8K8wNVzracsqSW1QEkAXjTNx+ycgAv06/1mQ==",
+ "dev": true,
+ "dependencies": {
+ "is-any-array": "^2.0.0",
+ "ml-array-max": "^1.2.4",
+ "ml-array-min": "^1.2.3"
+ }
+ },
+ "node_modules/ml-matrix": {
+ "version": "6.10.4",
+ "resolved": "https://registry.npmjs.org/ml-matrix/-/ml-matrix-6.10.4.tgz",
+ "integrity": "sha512-rUyEhfNPzqFsltYwvjNeYQXlYEaVea3KgzcJKJteQUj2WVAGFx9fLNRjtMR9mg2B6bd5buxlmkZmxM4hmO+SKg==",
+ "dev": true,
+ "dependencies": {
+ "is-any-array": "^2.0.0",
+ "ml-array-rescale": "^1.3.7"
+ }
+ },
+ "node_modules/mongodb": {
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.13.0.tgz",
+ "integrity": "sha512-+taZ/bV8d1pYuHL4U+gSwkhmDrwkWbH1l4aah4YpmpscMwgFBkufIKxgP/G7m87/NUuQzc2Z75ZTI7ZOyqZLbw==",
+ "dependencies": {
+ "bson": "^4.7.0",
+ "mongodb-connection-string-url": "^2.5.4",
+ "socks": "^2.7.1"
+ },
+ "engines": {
+ "node": ">=12.9.0"
+ },
+ "optionalDependencies": {
+ "@aws-sdk/credential-providers": "^3.186.0",
+ "saslprep": "^1.0.3"
+ }
+ },
+ "node_modules/mongodb-connection-string-url": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz",
+ "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==",
+ "dependencies": {
+ "@types/whatwg-url": "^8.2.1",
+ "whatwg-url": "^11.0.0"
+ }
+ },
+ "node_modules/mongoose": {
+ "version": "6.9.0",
+ "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.9.0.tgz",
+ "integrity": "sha512-5tu6+trwjk5TIH6b6iYgAwmzZ0RNOxFoqXQb9h21Oi45DeM1rWM/niHxJ4ROqBISDfQMwRvLSABHTsyn3AzoFQ==",
+ "dependencies": {
+ "bson": "^4.7.0",
+ "kareem": "2.5.1",
+ "mongodb": "4.13.0",
+ "mpath": "0.9.0",
+ "mquery": "4.0.3",
+ "ms": "2.1.3",
+ "sift": "16.0.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mongoose"
+ }
+ },
+ "node_modules/mongoose/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ },
+ "node_modules/mpath": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz",
+ "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/mquery": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz",
+ "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==",
+ "dependencies": {
+ "debug": "4.x"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "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/nanoclone": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz",
+ "integrity": "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA=="
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
+ "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
+ "dev": true,
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "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/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/node-captcha-generator": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/node-captcha-generator/-/node-captcha-generator-0.0.1.tgz",
+ "integrity": "sha512-ecTkwWSPADpmeAzNODVNWJOKECQnaYGMhkmEdtYjpBcBIsQY73nIcJcVzEHb3Nn6bqSCcT/VY9YsaxbANLX4HA==",
+ "dependencies": {
+ "jimp": "^0.2.24",
+ "lodash": "^4.13.1"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.9",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.9.tgz",
+ "integrity": "sha512-2xfmOrRkGogbTK9R6Leda0DGiXeY3p2NJpy4+gNCffdUvV6mdEJnaDEic1i3Ec2djAo8jWYoJMR5PB0MSMpxUA==",
+ "dev": true
+ },
+ "node_modules/nodemailer": {
+ "version": "6.9.1",
+ "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.1.tgz",
+ "integrity": "sha512-qHw7dOiU5UKNnQpXktdgQ1d3OFgRAekuvbJLcdG5dnEo/GtcTHRYM7+UfJARdOFU9WUQO8OiIamgWPmiSFHYAA==",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/nodemon": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz",
+ "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==",
+ "dev": true,
+ "dependencies": {
+ "chokidar": "^3.5.2",
+ "debug": "^3.2.7",
+ "ignore-by-default": "^1.0.1",
+ "minimatch": "^3.1.2",
+ "pstree.remy": "^1.1.8",
+ "semver": "^5.7.1",
+ "simple-update-notifier": "^1.0.7",
+ "supports-color": "^5.5.0",
+ "touch": "^3.1.0",
+ "undefsafe": "^2.0.5"
+ },
+ "bin": {
+ "nodemon": "bin/nodemon.js"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/nodemon"
+ }
+ },
+ "node_modules/nodemon/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/nodemon/node_modules/semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/nopt": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
+ "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==",
+ "dev": true,
+ "dependencies": {
+ "abbrev": "1"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/oauth-sign": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "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/object-inspect": {
+ "version": "1.12.3",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
+ "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
+ "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "has-symbols": "^1.0.3",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz",
+ "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.fromentries": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz",
+ "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.hasown": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz",
+ "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.values": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz",
+ "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/one-time": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz",
+ "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==",
+ "dependencies": {
+ "fn.name": "1.x.x"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "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/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/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "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/parse-bmfont-ascii": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz",
+ "integrity": "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="
+ },
+ "node_modules/parse-bmfont-binary": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz",
+ "integrity": "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="
+ },
+ "node_modules/parse-bmfont-xml": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz",
+ "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==",
+ "dependencies": {
+ "xml-parse-from-string": "^1.0.0",
+ "xml2js": "^0.4.5"
+ }
+ },
+ "node_modules/parse-headers": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz",
+ "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA=="
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "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==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "node_modules/path-to-regexp": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
+ },
+ "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/performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="
+ },
+ "node_modules/phin": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz",
+ "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA=="
+ },
+ "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/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/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==",
+ "dependencies": {
+ "pinkie": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pixelmatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz",
+ "integrity": "sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==",
+ "dependencies": {
+ "pngjs": "^3.0.0"
+ },
+ "bin": {
+ "pixelmatch": "bin/pixelmatch"
+ }
+ },
+ "node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pngjs": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz",
+ "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.21",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz",
+ "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.4",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "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/prettier": {
+ "version": "2.8.3",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.3.tgz",
+ "integrity": "sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw==",
+ "dev": true,
+ "bin": {
+ "prettier": "bin-prettier.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/prettier-linter-helpers": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+ "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+ "dev": true,
+ "dependencies": {
+ "fast-diff": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+ "engines": {
+ "node": ">= 0.6.0"
+ }
+ },
+ "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/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/property-expr": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz",
+ "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA=="
+ },
+ "node_modules/proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "dependencies": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/psl": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
+ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
+ },
+ "node_modules/pstree.remy": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
+ "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
+ "dev": true
+ },
+ "node_modules/punycode": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+ "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+ "dependencies": {
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "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/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
+ "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/react": {
+ "version": "18.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-fast-compare": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz",
+ "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw=="
+ },
+ "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-redux": {
+ "version": "8.0.5",
+ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.0.5.tgz",
+ "integrity": "sha512-Q2f6fCKxPFpkXt1qNRZdEDLlScsDWyrgSj0mliK59qU6W5gvBiKkdMEG2lJzhd1rCctf0hb6EtePPLZ2e0m1uw==",
+ "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"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ },
+ "react-native": {
+ "optional": true
+ },
+ "redux": {
+ "optional": true
+ }
+ }
+ },
+ "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-router": {
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.8.0.tgz",
+ "integrity": "sha512-760bk7y3QwabduExtudhWbd88IBbuD1YfwzpuDUAlJUJ7laIIcqhMvdhSVh1Fur1PE8cGl84L0dxhR3/gvHF7A==",
+ "dependencies": {
+ "@remix-run/router": "1.3.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "react": ">=16.8"
+ }
+ },
+ "node_modules/react-router-dom": {
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.8.0.tgz",
+ "integrity": "sha512-hQouduSTywGJndE86CXJ2h7YEy4HYC6C/uh19etM+79FfQ6cFFFHnHyDlzO4Pq0eBUI96E4qVE5yUjA00yJZGQ==",
+ "dependencies": {
+ "@remix-run/router": "1.3.1",
+ "react-router": "6.8.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "react": ">=16.8",
+ "react-dom": ">=16.8"
+ }
+ },
+ "node_modules/read-chunk": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-1.0.1.tgz",
+ "integrity": "sha512-5NLTTdX45dKFtG8CX5pKmvS9V5u9wBE+gkklN7xhDuhq3pA2I4O7ALfKxosCMcLHOhkxj6GNacZhfXtp5nlCdg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz",
+ "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.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/regenerator-runtime": {
+ "version": "0.13.11",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
+ "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3",
+ "functions-have-names": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regexpp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ }
+ },
+ "node_modules/request": {
+ "version": "2.88.2",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+ "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
+ "dependencies": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.3.2",
+ "har-validator": "~5.1.3",
+ "http-signature": "~1.2.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.5.0",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/request/node_modules/qs": {
+ "version": "6.5.3",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
+ "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/request/node_modules/uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+ "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
+ "bin": {
+ "uuid": "bin/uuid"
+ }
+ },
+ "node_modules/reselect": {
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz",
+ "integrity": "sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A=="
+ },
+ "node_modules/resolve": {
+ "version": "1.22.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+ "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.9.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/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/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/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/rollup": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.12.0.tgz",
+ "integrity": "sha512-4MZ8kA2HNYahIjz63rzrMMRvDqQDeS9LoriJvMuV0V6zIGysP36e9t4yObUfwdT9h/szXoHQideICftcdZklWg==",
+ "dev": true,
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=14.18.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "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/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
+ "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.3",
+ "is-regex": "^1.1.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-stable-stringify": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.2.tgz",
+ "integrity": "sha512-gMxvPJYhP0O9n2pvcfYfIuYgbledAOJFcqRThtPRmjscaipiwcwPPKLytpVzMkG2HAN87Qmo2d4PtGiri1dSLA==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "node_modules/saslprep": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
+ "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
+ "optional": true,
+ "dependencies": {
+ "sparse-bitfield": "^3.0.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/sass": {
+ "version": "1.57.1",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.57.1.tgz",
+ "integrity": "sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw==",
+ "dev": true,
+ "dependencies": {
+ "chokidar": ">=3.0.0 <4.0.0",
+ "immutable": "^4.0.0",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ },
+ "bin": {
+ "sass": "sass.js"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/sax": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+ },
+ "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": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/send": {
+ "version": "0.18.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
+ "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
+ "dependencies": {
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/send/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/send/node_modules/debug/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ },
+ "node_modules/send/node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ },
+ "node_modules/serve-static": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
+ "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
+ "dependencies": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.18.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
+ },
+ "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/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/side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/sift": {
+ "version": "16.0.1",
+ "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz",
+ "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ=="
+ },
+ "node_modules/simple-swizzle": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+ "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
+ "dependencies": {
+ "is-arrayish": "^0.3.1"
+ }
+ },
+ "node_modules/simple-update-notifier": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz",
+ "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==",
+ "dev": true,
+ "dependencies": {
+ "semver": "~7.0.0"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/simple-update-notifier/node_modules/semver": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
+ "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "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/smart-buffer": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
+ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+ "engines": {
+ "node": ">= 6.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/socks": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz",
+ "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==",
+ "dependencies": {
+ "ip": "^2.0.0",
+ "smart-buffer": "^4.2.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/sparse-bitfield": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
+ "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
+ "optional": true,
+ "dependencies": {
+ "memory-pager": "^1.0.2"
+ }
+ },
+ "node_modules/sshpk": {
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
+ "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
+ "dependencies": {
+ "asn1": "~0.2.3",
+ "assert-plus": "^1.0.0",
+ "bcrypt-pbkdf": "^1.0.0",
+ "dashdash": "^1.12.0",
+ "ecc-jsbn": "~0.1.1",
+ "getpass": "^0.1.1",
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.0.2",
+ "tweetnacl": "~0.14.0"
+ },
+ "bin": {
+ "sshpk-conv": "bin/sshpk-conv",
+ "sshpk-sign": "bin/sshpk-sign",
+ "sshpk-verify": "bin/sshpk-verify"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/stop-iteration-iterator": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz",
+ "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "internal-slot": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/stream-to": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/stream-to/-/stream-to-0.2.2.tgz",
+ "integrity": "sha512-Kg1BSDTwgGiVMtTCJNlo7kk/xzL33ZuZveEBRt6rXw+f1WLK/8kmz2NVCT/Qnv0JkV85JOHcLhD82mnXsR3kPw==",
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/stream-to-buffer": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz",
+ "integrity": "sha512-Da4WoKaZyu3nf+bIdIifh7IPkFjARBnBK+pYqn0EUJqksjV9afojjaCCHUemH30Jmu7T2qcKvlZm2ykN38uzaw==",
+ "dependencies": {
+ "stream-to": "~0.2.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string.prototype.matchall": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz",
+ "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "get-intrinsic": "^1.1.3",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.3",
+ "regexp.prototype.flags": "^1.4.3",
+ "side-channel": "^1.0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz",
+ "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz",
+ "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "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/strip-outer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz",
+ "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==",
+ "dependencies": {
+ "escape-string-regexp": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/strnum": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
+ "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==",
+ "optional": true
+ },
+ "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/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==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/text-hex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
+ "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg=="
+ },
+ "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/tiny-warning": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz",
+ "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
+ },
+ "node_modules/tinycolor2": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz",
+ "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw=="
+ },
+ "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/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/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/toposort": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz",
+ "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg=="
+ },
+ "node_modules/touch": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
+ "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
+ "dev": true,
+ "dependencies": {
+ "nopt": "~1.0.10"
+ },
+ "bin": {
+ "nodetouch": "bin/nodetouch.js"
+ }
+ },
+ "node_modules/tough-cookie": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+ "dependencies": {
+ "psl": "^1.1.28",
+ "punycode": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
+ "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
+ "dependencies": {
+ "punycode": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/trim-repeated": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
+ "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==",
+ "dependencies": {
+ "escape-string-regexp": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/triple-beam": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz",
+ "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw=="
+ },
+ "node_modules/tsconfig-paths": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz",
+ "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.1",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "node_modules/tsconfig-paths/node_modules/json5": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ },
+ "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/tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
+ },
+ "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/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/type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
+ "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "is-typed-array": "^1.1.9"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "4.9.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
+ "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=4.2.0"
+ }
+ },
+ "node_modules/unbox-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.0.3",
+ "which-boxed-primitive": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/undefsafe": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
+ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
+ "dev": true
+ },
+ "node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
+ "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "browserslist-lint": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/url-regex": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz",
+ "integrity": "sha512-dQ9cJzMou5OKr6ZzfvwJkCq3rC72PNXhqz0v3EIhF4a3Np+ujr100AhUx2cKx5ei3iymoJpJrPB3sVSEMdqAeg==",
+ "dependencies": {
+ "ip-regex": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ },
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
+ "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/validator": {
+ "version": "13.9.0",
+ "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz",
+ "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
+ "engines": [
+ "node >=0.6.0"
+ ],
+ "dependencies": {
+ "assert-plus": "^1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "^1.2.0"
+ }
+ },
+ "node_modules/vite": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-4.0.4.tgz",
+ "integrity": "sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==",
+ "dev": true,
+ "dependencies": {
+ "esbuild": "^0.16.3",
+ "postcss": "^8.4.20",
+ "resolve": "^1.22.1",
+ "rollup": "^3.7.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ },
+ "peerDependencies": {
+ "@types/node": ">= 14",
+ "less": "*",
+ "sass": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/whatwg-url": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
+ "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
+ "dependencies": {
+ "tr46": "^3.0.0",
+ "webidl-conversions": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "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/which-boxed-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "dev": true,
+ "dependencies": {
+ "is-bigint": "^1.0.1",
+ "is-boolean-object": "^1.1.0",
+ "is-number-object": "^1.0.4",
+ "is-string": "^1.0.5",
+ "is-symbol": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-collection": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
+ "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "is-map": "^2.0.1",
+ "is-set": "^2.0.1",
+ "is-weakmap": "^2.0.1",
+ "is-weakset": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz",
+ "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==",
+ "dev": true,
+ "dependencies": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-tostringtag": "^1.0.0",
+ "is-typed-array": "^1.1.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/winston": {
+ "version": "3.8.2",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-3.8.2.tgz",
+ "integrity": "sha512-MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew==",
+ "dependencies": {
+ "@colors/colors": "1.5.0",
+ "@dabh/diagnostics": "^2.0.2",
+ "async": "^3.2.3",
+ "is-stream": "^2.0.0",
+ "logform": "^2.4.0",
+ "one-time": "^1.0.0",
+ "readable-stream": "^3.4.0",
+ "safe-stable-stringify": "^2.3.1",
+ "stack-trace": "0.0.x",
+ "triple-beam": "^1.3.0",
+ "winston-transport": "^4.5.0"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/winston-transport": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz",
+ "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==",
+ "dependencies": {
+ "logform": "^2.3.2",
+ "readable-stream": "^3.6.0",
+ "triple-beam": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 6.4.0"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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=="
+ },
+ "node_modules/ws": {
+ "version": "8.12.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz",
+ "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/xhr": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz",
+ "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==",
+ "dependencies": {
+ "global": "~4.4.0",
+ "is-function": "^1.0.1",
+ "parse-headers": "^2.0.0",
+ "xtend": "^4.0.0"
+ }
+ },
+ "node_modules/xml-parse-from-string": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz",
+ "integrity": "sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g=="
+ },
+ "node_modules/xml2js": {
+ "version": "0.4.23",
+ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
+ "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
+ "dependencies": {
+ "sax": ">=0.6.0",
+ "xmlbuilder": "~11.0.0"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/xmlbuilder": {
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
+ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "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/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/yup": {
+ "version": "0.32.11",
+ "resolved": "https://registry.npmjs.org/yup/-/yup-0.32.11.tgz",
+ "integrity": "sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==",
+ "dependencies": {
+ "@babel/runtime": "^7.15.4",
+ "@types/lodash": "^4.14.175",
+ "lodash": "^4.17.21",
+ "lodash-es": "^4.17.21",
+ "nanoclone": "^0.2.1",
+ "property-expr": "^2.0.4",
+ "toposort": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/zustand": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.3.2.tgz",
+ "integrity": "sha512-rd4haDmlwMTVWVqwvgy00ny8rtti/klRoZjFbL/MAcDnmD5qSw/RZc+Vddstdv90M5Lv6RPgWvm1Hivyn0QgJw==",
+ "dependencies": {
+ "use-sync-external-store": "1.2.0"
+ },
+ "engines": {
+ "node": ">=12.7.0"
+ },
+ "peerDependencies": {
+ "immer": ">=9.0",
+ "react": ">=16.8"
+ },
+ "peerDependenciesMeta": {
+ "immer": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ }
+ }
+ }
+ },
+ "dependencies": {
+ "@ampproject/remapping": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
+ "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/gen-mapping": "^0.1.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ },
+ "@aws-crypto/ie11-detection": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz",
+ "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==",
+ "optional": true,
+ "requires": {
+ "tslib": "^1.11.1"
+ }
+ },
+ "@aws-crypto/sha256-browser": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz",
+ "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==",
+ "optional": true,
+ "requires": {
+ "@aws-crypto/ie11-detection": "^3.0.0",
+ "@aws-crypto/sha256-js": "^3.0.0",
+ "@aws-crypto/supports-web-crypto": "^3.0.0",
+ "@aws-crypto/util": "^3.0.0",
+ "@aws-sdk/types": "^3.222.0",
+ "@aws-sdk/util-locate-window": "^3.0.0",
+ "@aws-sdk/util-utf8-browser": "^3.0.0",
+ "tslib": "^1.11.1"
+ }
+ },
+ "@aws-crypto/sha256-js": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz",
+ "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==",
+ "optional": true,
+ "requires": {
+ "@aws-crypto/util": "^3.0.0",
+ "@aws-sdk/types": "^3.222.0",
+ "tslib": "^1.11.1"
+ }
+ },
+ "@aws-crypto/supports-web-crypto": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz",
+ "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==",
+ "optional": true,
+ "requires": {
+ "tslib": "^1.11.1"
+ }
+ },
+ "@aws-crypto/util": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz",
+ "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/types": "^3.222.0",
+ "@aws-sdk/util-utf8-browser": "^3.0.0",
+ "tslib": "^1.11.1"
+ }
+ },
+ "@aws-sdk/abort-controller": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.257.0.tgz",
+ "integrity": "sha512-ekWy391lOerS0ZECdhp/c+X7AToJIpfNrCPjuj3bKr+GMQYckGsYsdbm6AUD4sxBmfvuaQmVniSXWovaxwcFcQ==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/client-cognito-identity": {
+ "version": "3.264.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.264.0.tgz",
+ "integrity": "sha512-afOpX6/xKLKRjkbgzfuy9fxCVP+LXCiirjBxhEtpUbKjVOwvShbQXfCPDlG40s5HF485mmR9t0KADoy0El5WsA==",
+ "optional": true,
+ "requires": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/client-sts": "3.264.0",
+ "@aws-sdk/config-resolver": "3.259.0",
+ "@aws-sdk/credential-provider-node": "3.264.0",
+ "@aws-sdk/fetch-http-handler": "3.257.0",
+ "@aws-sdk/hash-node": "3.257.0",
+ "@aws-sdk/invalid-dependency": "3.257.0",
+ "@aws-sdk/middleware-content-length": "3.257.0",
+ "@aws-sdk/middleware-endpoint": "3.264.0",
+ "@aws-sdk/middleware-host-header": "3.257.0",
+ "@aws-sdk/middleware-logger": "3.257.0",
+ "@aws-sdk/middleware-recursion-detection": "3.257.0",
+ "@aws-sdk/middleware-retry": "3.259.0",
+ "@aws-sdk/middleware-serde": "3.257.0",
+ "@aws-sdk/middleware-signing": "3.257.0",
+ "@aws-sdk/middleware-stack": "3.257.0",
+ "@aws-sdk/middleware-user-agent": "3.257.0",
+ "@aws-sdk/node-config-provider": "3.259.0",
+ "@aws-sdk/node-http-handler": "3.257.0",
+ "@aws-sdk/protocol-http": "3.257.0",
+ "@aws-sdk/smithy-client": "3.261.0",
+ "@aws-sdk/types": "3.257.0",
+ "@aws-sdk/url-parser": "3.257.0",
+ "@aws-sdk/util-base64": "3.208.0",
+ "@aws-sdk/util-body-length-browser": "3.188.0",
+ "@aws-sdk/util-body-length-node": "3.208.0",
+ "@aws-sdk/util-defaults-mode-browser": "3.261.0",
+ "@aws-sdk/util-defaults-mode-node": "3.261.0",
+ "@aws-sdk/util-endpoints": "3.257.0",
+ "@aws-sdk/util-retry": "3.257.0",
+ "@aws-sdk/util-user-agent-browser": "3.257.0",
+ "@aws-sdk/util-user-agent-node": "3.259.0",
+ "@aws-sdk/util-utf8": "3.254.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/client-sso": {
+ "version": "3.264.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.264.0.tgz",
+ "integrity": "sha512-p+7sYpRcdv9omnnsPhD/vOFuZ1SpfV62ZgistBK/RDsQg2W9SIWQRW1KPt7gOCQ0nwp4efntw4Sle0LjS7ykxg==",
+ "optional": true,
+ "requires": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/config-resolver": "3.259.0",
+ "@aws-sdk/fetch-http-handler": "3.257.0",
+ "@aws-sdk/hash-node": "3.257.0",
+ "@aws-sdk/invalid-dependency": "3.257.0",
+ "@aws-sdk/middleware-content-length": "3.257.0",
+ "@aws-sdk/middleware-endpoint": "3.264.0",
+ "@aws-sdk/middleware-host-header": "3.257.0",
+ "@aws-sdk/middleware-logger": "3.257.0",
+ "@aws-sdk/middleware-recursion-detection": "3.257.0",
+ "@aws-sdk/middleware-retry": "3.259.0",
+ "@aws-sdk/middleware-serde": "3.257.0",
+ "@aws-sdk/middleware-stack": "3.257.0",
+ "@aws-sdk/middleware-user-agent": "3.257.0",
+ "@aws-sdk/node-config-provider": "3.259.0",
+ "@aws-sdk/node-http-handler": "3.257.0",
+ "@aws-sdk/protocol-http": "3.257.0",
+ "@aws-sdk/smithy-client": "3.261.0",
+ "@aws-sdk/types": "3.257.0",
+ "@aws-sdk/url-parser": "3.257.0",
+ "@aws-sdk/util-base64": "3.208.0",
+ "@aws-sdk/util-body-length-browser": "3.188.0",
+ "@aws-sdk/util-body-length-node": "3.208.0",
+ "@aws-sdk/util-defaults-mode-browser": "3.261.0",
+ "@aws-sdk/util-defaults-mode-node": "3.261.0",
+ "@aws-sdk/util-endpoints": "3.257.0",
+ "@aws-sdk/util-retry": "3.257.0",
+ "@aws-sdk/util-user-agent-browser": "3.257.0",
+ "@aws-sdk/util-user-agent-node": "3.259.0",
+ "@aws-sdk/util-utf8": "3.254.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/client-sso-oidc": {
+ "version": "3.264.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.264.0.tgz",
+ "integrity": "sha512-82hGEbfsD4lBGIF1q8o82jTNSgBCcBpfFsvA+ltZf0bh4ChIWOi4vVvg8G+zVQN1mm/Rj8vWYO/D0tNF8OSyWw==",
+ "optional": true,
+ "requires": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/config-resolver": "3.259.0",
+ "@aws-sdk/fetch-http-handler": "3.257.0",
+ "@aws-sdk/hash-node": "3.257.0",
+ "@aws-sdk/invalid-dependency": "3.257.0",
+ "@aws-sdk/middleware-content-length": "3.257.0",
+ "@aws-sdk/middleware-endpoint": "3.264.0",
+ "@aws-sdk/middleware-host-header": "3.257.0",
+ "@aws-sdk/middleware-logger": "3.257.0",
+ "@aws-sdk/middleware-recursion-detection": "3.257.0",
+ "@aws-sdk/middleware-retry": "3.259.0",
+ "@aws-sdk/middleware-serde": "3.257.0",
+ "@aws-sdk/middleware-stack": "3.257.0",
+ "@aws-sdk/middleware-user-agent": "3.257.0",
+ "@aws-sdk/node-config-provider": "3.259.0",
+ "@aws-sdk/node-http-handler": "3.257.0",
+ "@aws-sdk/protocol-http": "3.257.0",
+ "@aws-sdk/smithy-client": "3.261.0",
+ "@aws-sdk/types": "3.257.0",
+ "@aws-sdk/url-parser": "3.257.0",
+ "@aws-sdk/util-base64": "3.208.0",
+ "@aws-sdk/util-body-length-browser": "3.188.0",
+ "@aws-sdk/util-body-length-node": "3.208.0",
+ "@aws-sdk/util-defaults-mode-browser": "3.261.0",
+ "@aws-sdk/util-defaults-mode-node": "3.261.0",
+ "@aws-sdk/util-endpoints": "3.257.0",
+ "@aws-sdk/util-retry": "3.257.0",
+ "@aws-sdk/util-user-agent-browser": "3.257.0",
+ "@aws-sdk/util-user-agent-node": "3.259.0",
+ "@aws-sdk/util-utf8": "3.254.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/client-sts": {
+ "version": "3.264.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.264.0.tgz",
+ "integrity": "sha512-sco1jREkDdds4Z3V19Vlu/YpBHSzeEt1KFqOPnbjFw7pSakRNzpyWmLLxOwWjwgGKt6pSF3Aw0ZOMYsAUDc5qQ==",
+ "optional": true,
+ "requires": {
+ "@aws-crypto/sha256-browser": "3.0.0",
+ "@aws-crypto/sha256-js": "3.0.0",
+ "@aws-sdk/config-resolver": "3.259.0",
+ "@aws-sdk/credential-provider-node": "3.264.0",
+ "@aws-sdk/fetch-http-handler": "3.257.0",
+ "@aws-sdk/hash-node": "3.257.0",
+ "@aws-sdk/invalid-dependency": "3.257.0",
+ "@aws-sdk/middleware-content-length": "3.257.0",
+ "@aws-sdk/middleware-endpoint": "3.264.0",
+ "@aws-sdk/middleware-host-header": "3.257.0",
+ "@aws-sdk/middleware-logger": "3.257.0",
+ "@aws-sdk/middleware-recursion-detection": "3.257.0",
+ "@aws-sdk/middleware-retry": "3.259.0",
+ "@aws-sdk/middleware-sdk-sts": "3.257.0",
+ "@aws-sdk/middleware-serde": "3.257.0",
+ "@aws-sdk/middleware-signing": "3.257.0",
+ "@aws-sdk/middleware-stack": "3.257.0",
+ "@aws-sdk/middleware-user-agent": "3.257.0",
+ "@aws-sdk/node-config-provider": "3.259.0",
+ "@aws-sdk/node-http-handler": "3.257.0",
+ "@aws-sdk/protocol-http": "3.257.0",
+ "@aws-sdk/smithy-client": "3.261.0",
+ "@aws-sdk/types": "3.257.0",
+ "@aws-sdk/url-parser": "3.257.0",
+ "@aws-sdk/util-base64": "3.208.0",
+ "@aws-sdk/util-body-length-browser": "3.188.0",
+ "@aws-sdk/util-body-length-node": "3.208.0",
+ "@aws-sdk/util-defaults-mode-browser": "3.261.0",
+ "@aws-sdk/util-defaults-mode-node": "3.261.0",
+ "@aws-sdk/util-endpoints": "3.257.0",
+ "@aws-sdk/util-retry": "3.257.0",
+ "@aws-sdk/util-user-agent-browser": "3.257.0",
+ "@aws-sdk/util-user-agent-node": "3.259.0",
+ "@aws-sdk/util-utf8": "3.254.0",
+ "fast-xml-parser": "4.0.11",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/config-resolver": {
+ "version": "3.259.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.259.0.tgz",
+ "integrity": "sha512-gViMRsc4Ye6+nzJ0OYTZIT8m4glIAdtugN2Sr/t6P2iJW5X0bSL/EcbcHBgsve1lHjeGPeyzVkT7UnyGOZ5Z/A==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/signature-v4": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "@aws-sdk/util-config-provider": "3.208.0",
+ "@aws-sdk/util-middleware": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/credential-provider-cognito-identity": {
+ "version": "3.264.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.264.0.tgz",
+ "integrity": "sha512-0L4offTpZJrX4PkoUI5KXPlG3uaofbmew+tgPphKd+ns3tzhLsltPMixS/04J5qXEfwMCHwvDgSpCenKsUo/wg==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/client-cognito-identity": "3.264.0",
+ "@aws-sdk/property-provider": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/credential-provider-env": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.257.0.tgz",
+ "integrity": "sha512-GsmBi5Di6hk1JAi1iB6/LCY8o+GmlCvJoB7wuoVmXI3VxRVwptUVjuj8EtJbIrVGrF9dSuIRPCzUoSuzEzYGlg==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/property-provider": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/credential-provider-imds": {
+ "version": "3.259.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.259.0.tgz",
+ "integrity": "sha512-yCxoYWZAaDrCUEWxRfrpB0Mp1cFgJEMYW8T6GIb/+DQ5QLpZmorgaVD/j90QXupqFrR5tlxwuskBIkdD2E9YNg==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/node-config-provider": "3.259.0",
+ "@aws-sdk/property-provider": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "@aws-sdk/url-parser": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/credential-provider-ini": {
+ "version": "3.264.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.264.0.tgz",
+ "integrity": "sha512-UU5NNlfn+Go+5PLBzyTH1YE3r/pgykpE4QYFon87sCnEQnQH9xmlRTW1f1cBSQ9kivbFZd2/C2X3qhB3fe2JfA==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/credential-provider-env": "3.257.0",
+ "@aws-sdk/credential-provider-imds": "3.259.0",
+ "@aws-sdk/credential-provider-process": "3.257.0",
+ "@aws-sdk/credential-provider-sso": "3.264.0",
+ "@aws-sdk/credential-provider-web-identity": "3.257.0",
+ "@aws-sdk/property-provider": "3.257.0",
+ "@aws-sdk/shared-ini-file-loader": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/credential-provider-node": {
+ "version": "3.264.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.264.0.tgz",
+ "integrity": "sha512-DPzL7oawcILs5Mduim9Z8SVeJaUpaDRVbUIrBHsMBu+N7Zuqtzr+0ckHc1bEi3iYq2QUCk5pH5vpQaZYkMlbtw==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/credential-provider-env": "3.257.0",
+ "@aws-sdk/credential-provider-imds": "3.259.0",
+ "@aws-sdk/credential-provider-ini": "3.264.0",
+ "@aws-sdk/credential-provider-process": "3.257.0",
+ "@aws-sdk/credential-provider-sso": "3.264.0",
+ "@aws-sdk/credential-provider-web-identity": "3.257.0",
+ "@aws-sdk/property-provider": "3.257.0",
+ "@aws-sdk/shared-ini-file-loader": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/credential-provider-process": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.257.0.tgz",
+ "integrity": "sha512-xK8uYeNXaclaBCGrLi4z2pxPRngqLf5BM5jg2fn57zqvlL9V5gJF972FehrVBL0bfp1/laG0ZJtD2K2sapyWAw==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/property-provider": "3.257.0",
+ "@aws-sdk/shared-ini-file-loader": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/credential-provider-sso": {
+ "version": "3.264.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.264.0.tgz",
+ "integrity": "sha512-CJuAlqIIJap6LXoqimvEAnYZ7Kb5pTbiS3e+aY+fajO3OPujmQpHuiY8kOmscjwZ4ErJdEskivcTGwXph0dPZQ==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/client-sso": "3.264.0",
+ "@aws-sdk/property-provider": "3.257.0",
+ "@aws-sdk/shared-ini-file-loader": "3.257.0",
+ "@aws-sdk/token-providers": "3.264.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/credential-provider-web-identity": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.257.0.tgz",
+ "integrity": "sha512-Cm0uvRv4JuIbD0Kp3W0J/vwjADIyCx8HoZi5yg+QIi5nilocuTQ3ajvLeuPVSvFvdy+yaxSc5FxNXquWt7Mngw==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/property-provider": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/credential-providers": {
+ "version": "3.264.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.264.0.tgz",
+ "integrity": "sha512-4iSr1Z7Uf8uDraQ7JYoMotVLhmnGFAGsH559KBPxuxjMjg2lku9GA5V1zw7SNV8FEcj+Sh5HrpJvJ7P1kA+YjA==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/client-cognito-identity": "3.264.0",
+ "@aws-sdk/client-sso": "3.264.0",
+ "@aws-sdk/client-sts": "3.264.0",
+ "@aws-sdk/credential-provider-cognito-identity": "3.264.0",
+ "@aws-sdk/credential-provider-env": "3.257.0",
+ "@aws-sdk/credential-provider-imds": "3.259.0",
+ "@aws-sdk/credential-provider-ini": "3.264.0",
+ "@aws-sdk/credential-provider-node": "3.264.0",
+ "@aws-sdk/credential-provider-process": "3.257.0",
+ "@aws-sdk/credential-provider-sso": "3.264.0",
+ "@aws-sdk/credential-provider-web-identity": "3.257.0",
+ "@aws-sdk/property-provider": "3.257.0",
+ "@aws-sdk/shared-ini-file-loader": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/fetch-http-handler": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.257.0.tgz",
+ "integrity": "sha512-zOF+RzQ+wfF7tq7tGUdPcqUTh3+k2f8KCVJE07A8kCopVq4nBu4NH6Eq29Tjpwdya3YlKvE+kFssuQRRRRex+Q==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/protocol-http": "3.257.0",
+ "@aws-sdk/querystring-builder": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "@aws-sdk/util-base64": "3.208.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/hash-node": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.257.0.tgz",
+ "integrity": "sha512-W/USUuea5Ep3OJ2U7Ve8/5KN1YsDun2WzOFUxc1PyxXP5pW6OgC15/op0e+bmWPG851clvp5S8ZuroUr3aKi3Q==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/types": "3.257.0",
+ "@aws-sdk/util-buffer-from": "3.208.0",
+ "@aws-sdk/util-utf8": "3.254.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/invalid-dependency": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.257.0.tgz",
+ "integrity": "sha512-T68SAPRNMEhpke0wlxURgogL7q0B8dfqZsSeS20BVR/lksJxLse9+pbmCDxiu1RrXoEIsEwl5rbLN+Hw8BFFYw==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/is-array-buffer": {
+ "version": "3.201.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.201.0.tgz",
+ "integrity": "sha512-UPez5qLh3dNgt0DYnPD/q0mVJY84rA17QE26hVNOW3fAji8W2wrwrxdacWOxyXvlxWsVRcKmr+lay1MDqpAMfg==",
+ "optional": true,
+ "requires": {
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/middleware-content-length": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.257.0.tgz",
+ "integrity": "sha512-yiawbV2azm6QnMY1L2ypG8PDRdjOcEIvFmT0T7y0F49rfbKJOu21j1ONAoCkLrINK6kMqcD5JSQLVCoURxiTxQ==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/protocol-http": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/middleware-endpoint": {
+ "version": "3.264.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.264.0.tgz",
+ "integrity": "sha512-H9JEAug3Oo3IA2wZIplVVF6NtauCIjICXWgbNbA8Im+I2KPe0jWtOdtQv4U+tqHe9T4zIixaCM3gjUBld+FoOA==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/middleware-serde": "3.257.0",
+ "@aws-sdk/protocol-http": "3.257.0",
+ "@aws-sdk/signature-v4": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "@aws-sdk/url-parser": "3.257.0",
+ "@aws-sdk/util-config-provider": "3.208.0",
+ "@aws-sdk/util-middleware": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/middleware-host-header": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.257.0.tgz",
+ "integrity": "sha512-gEi9AJdJfRfU8Qr6HK1hfhxTzyV3Giq4B/h7um99hIFAT/GCg9xiPvAOKPo6UeuiKEv3b7RpSL4s6cBvnJMJBA==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/protocol-http": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/middleware-logger": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.257.0.tgz",
+ "integrity": "sha512-8RDXW/VbMKBsXDfcCLmROZcWKyrekyiPa3J1aIaBy0tq9o4xpGoXw/lwwIrNVvISAFslb57rteup34bfn6ta6w==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/middleware-recursion-detection": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.257.0.tgz",
+ "integrity": "sha512-rUCih6zHh8k9Edf5N5Er4s508FYbwLM0MWTD2axzlj9TjLqEQ9OKED3wHaLffXSDzodd3oTAfJCLPbWQyoZ3ZQ==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/protocol-http": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/middleware-retry": {
+ "version": "3.259.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.259.0.tgz",
+ "integrity": "sha512-pVh1g8e84MAi7eVtWLiiiCtn82LzxOP7+LxTRHatmgIeN22yGQBZILliPDJypUPvDYlwxI1ekiK+oPTcte0Uww==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/protocol-http": "3.257.0",
+ "@aws-sdk/service-error-classification": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "@aws-sdk/util-middleware": "3.257.0",
+ "@aws-sdk/util-retry": "3.257.0",
+ "tslib": "^2.3.1",
+ "uuid": "^8.3.2"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ },
+ "uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/middleware-sdk-sts": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.257.0.tgz",
+ "integrity": "sha512-d6IJCLRi3O2tm4AFK60WNhIwmMmspj1WzKR1q1TaoPzoREPG2xg+Am18wZBRkCyYuRPPrbizmkvAmAJiUolMAw==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/middleware-signing": "3.257.0",
+ "@aws-sdk/property-provider": "3.257.0",
+ "@aws-sdk/protocol-http": "3.257.0",
+ "@aws-sdk/signature-v4": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/middleware-serde": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.257.0.tgz",
+ "integrity": "sha512-/JasfXPWFq24mnCrx9fxW/ISBSp07RJwhsF14qzm8Qy3Z0z470C+QRM6otTwAkYuuVt1wuLjja5agq3Jtzq7dQ==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/middleware-signing": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.257.0.tgz",
+ "integrity": "sha512-hCH3D83LHmm6nqmtNrGTWZCVjsQXrGHIXbd17/qrw7aPFvcAhsiiCncGFP+XsUXEKa2ZqcSNMUyPrx69ofNRZQ==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/property-provider": "3.257.0",
+ "@aws-sdk/protocol-http": "3.257.0",
+ "@aws-sdk/signature-v4": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "@aws-sdk/util-middleware": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/middleware-stack": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.257.0.tgz",
+ "integrity": "sha512-awg2F0SvwACBaw4HIObK8pQGfSqAc4Vy+YFzWSfZNVC35oRO6RsRdKHVU99lRC0LrT2Ptmfghl2DMPSrRDbvlQ==",
+ "optional": true,
+ "requires": {
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/middleware-user-agent": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.257.0.tgz",
+ "integrity": "sha512-37rt75LZyD0UWpbcFuxEGqwF3DZKSixQPl7AsDe6q3KtrO5gGQB+diH5vbY0txNNYyv5IK9WMwvY73mVmoWRmw==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/protocol-http": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/node-config-provider": {
+ "version": "3.259.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.259.0.tgz",
+ "integrity": "sha512-DUOqr71oonBvM6yKPdhDBmraqgXHCFrVWFw7hc5ZNxL2wS/EsbKfGPJp+C+SUgpn1upIWPNnh/bNoLAbBkcLsA==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/property-provider": "3.257.0",
+ "@aws-sdk/shared-ini-file-loader": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/node-http-handler": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.257.0.tgz",
+ "integrity": "sha512-8KnWHVVwaGKyTlkTU9BSOAiSovNDoagxemU2l10QqBbzUCVpljCUMUkABEGRJ1yoQCl6DJ7RtNkAyZ8Ne/E15A==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/abort-controller": "3.257.0",
+ "@aws-sdk/protocol-http": "3.257.0",
+ "@aws-sdk/querystring-builder": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/property-provider": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.257.0.tgz",
+ "integrity": "sha512-3rUbRAcF0GZ5PhDiXhS4yREfZ5hOEtvYEa9S/19OdM5eoypOaLU5XnFcCKfnccSP8SkdgpJujzxOMRWNWadlAQ==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/protocol-http": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.257.0.tgz",
+ "integrity": "sha512-xt7LGOgZIvbLS3418AYQLacOqx+mo5j4mPiIMz7f6AaUg+/fBUgESVsncKDqxbEJVwwCXSka8Ca0cntJmoeMSw==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/querystring-builder": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.257.0.tgz",
+ "integrity": "sha512-mZHWLP7XIkzx1GIXO5WfX/iJ+aY9TWs02RE9FkdL2+by0HEMR65L3brQTbU1mIBJ7BjaPwYH24dljUOSABX7yg==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/types": "3.257.0",
+ "@aws-sdk/util-uri-escape": "3.201.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/querystring-parser": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.257.0.tgz",
+ "integrity": "sha512-UDrE1dEwWrWT8dG2VCrGYrPxCWOkZ1fPTPkjpkR4KZEdQDZBqU5gYZF2xPj8Nz7pjQVHFuW2wFm3XYEk56GEjg==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/service-error-classification": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.257.0.tgz",
+ "integrity": "sha512-FAyR0XsueGkkqDtkP03cTJQk52NdQ9sZelLynmmlGPUP75LApRPvFe1riKrou6+LsDbwVNVffj6mbDfIcOhaOw==",
+ "optional": true
+ },
+ "@aws-sdk/shared-ini-file-loader": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.257.0.tgz",
+ "integrity": "sha512-HNjC1+Wx3xHiJc+CP14GhIdVhfQGSjroAsWseRxAhONocA9Fl1ZX4hx7+sA5c9nOoMVOovi6ivJ/6lCRPTDRrQ==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/signature-v4": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.257.0.tgz",
+ "integrity": "sha512-aLQQN59X/D0+ShzPD3Anj5ntdMA/RFeNLOUCDyDvremViGi6yxUS98usQ/8bG5Rq0sW2GGMdbFUFmrDvqdiqEQ==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/is-array-buffer": "3.201.0",
+ "@aws-sdk/types": "3.257.0",
+ "@aws-sdk/util-hex-encoding": "3.201.0",
+ "@aws-sdk/util-middleware": "3.257.0",
+ "@aws-sdk/util-uri-escape": "3.201.0",
+ "@aws-sdk/util-utf8": "3.254.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/smithy-client": {
+ "version": "3.261.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.261.0.tgz",
+ "integrity": "sha512-j8XQEa3caZUVFVZfhJjaskw80O/tB+IXu84HMN44N7UkXaCFHirUsNjTDztJhnVXf/gKXzIqUqprfRnOvwLtIg==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/middleware-stack": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/token-providers": {
+ "version": "3.264.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.264.0.tgz",
+ "integrity": "sha512-1N54FCdBJRqrwFWHUoDpGI0rKhI29Or9ZwGjjcBzKzLhz5sEF/DEhuID7h1/KKEkXdQ0+lmXOFGMMrahrMpOow==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/client-sso-oidc": "3.264.0",
+ "@aws-sdk/property-provider": "3.257.0",
+ "@aws-sdk/shared-ini-file-loader": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/types": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.257.0.tgz",
+ "integrity": "sha512-LmqXuBQBGeaGi/3Rp7XiEX1B5IPO2UUfBVvu0wwGqVsmstT0SbOVDZGPmxygACbm64n+PRx3uTSDefRfoiWYZg==",
+ "optional": true,
+ "requires": {
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/url-parser": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.257.0.tgz",
+ "integrity": "sha512-Qe/AcFe/NFZHa6cN2afXEQn9ehXxh57dWGdRjfjd2lQqNV4WW1R2pl2Tm1ZJ1dwuCNLJi4NHLMk8lrD3QQ8rdg==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/querystring-parser": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/util-base64": {
+ "version": "3.208.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64/-/util-base64-3.208.0.tgz",
+ "integrity": "sha512-PQniZph5A6N7uuEOQi+1hnMz/FSOK/8kMFyFO+4DgA1dZ5pcKcn5wiFwHkcTb/BsgVqQa3Jx0VHNnvhlS8JyTg==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/util-buffer-from": "3.208.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/util-body-length-browser": {
+ "version": "3.188.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.188.0.tgz",
+ "integrity": "sha512-8VpnwFWXhnZ/iRSl9mTf+VKOX9wDE8QtN4bj9pBfxwf90H1X7E8T6NkiZD3k+HubYf2J94e7DbeHs7fuCPW5Qg==",
+ "optional": true,
+ "requires": {
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/util-body-length-node": {
+ "version": "3.208.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.208.0.tgz",
+ "integrity": "sha512-3zj50e5g7t/MQf53SsuuSf0hEELzMtD8RX8C76f12OSRo2Bca4FLLYHe0TZbxcfQHom8/hOaeZEyTyMogMglqg==",
+ "optional": true,
+ "requires": {
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/util-buffer-from": {
+ "version": "3.208.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.208.0.tgz",
+ "integrity": "sha512-7L0XUixNEFcLUGPeBF35enCvB9Xl+K6SQsmbrPk1P3mlV9mguWSDQqbOBwY1Ir0OVbD6H/ZOQU7hI/9RtRI0Zw==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/is-array-buffer": "3.201.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/util-config-provider": {
+ "version": "3.208.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.208.0.tgz",
+ "integrity": "sha512-DSRqwrERUsT34ug+anlMBIFooBEGwM8GejC7q00Y/9IPrQy50KnG5PW2NiTjuLKNi7pdEOlwTSEocJE15eDZIg==",
+ "optional": true,
+ "requires": {
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/util-defaults-mode-browser": {
+ "version": "3.261.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.261.0.tgz",
+ "integrity": "sha512-lX3X1NfzQVV6cakepGV24uRcqevlDnQ8VgaCV8dhnw1FVThueFigyoFaUA02+uRXbV9KIbNWkEvweNtm2wvyDw==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/property-provider": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "bowser": "^2.11.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/util-defaults-mode-node": {
+ "version": "3.261.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.261.0.tgz",
+ "integrity": "sha512-4AK6yu4bOmHSocUdbGoEHbNXB09UA58ON2HBHY4NxMBuFBAd9XB2tYiyhce+Cm+o+lHbS8oQnw0VZw16WMzzew==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/config-resolver": "3.259.0",
+ "@aws-sdk/credential-provider-imds": "3.259.0",
+ "@aws-sdk/node-config-provider": "3.259.0",
+ "@aws-sdk/property-provider": "3.257.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/util-endpoints": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.257.0.tgz",
+ "integrity": "sha512-3bvmRn5XGYzPPWjLuvHBKdJOb+fijnb8Ungu9bfXnTYFsng/ndHUWeHC22O/p8w3OWoRYUIMaZHxdxe27BFozg==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/util-hex-encoding": {
+ "version": "3.201.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.201.0.tgz",
+ "integrity": "sha512-7t1vR1pVxKx0motd3X9rI3m/xNp78p3sHtP5yo4NP4ARpxyJ0fokBomY8ScaH2D/B+U5o9ARxldJUdMqyBlJcA==",
+ "optional": true,
+ "requires": {
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/util-locate-window": {
+ "version": "3.208.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.208.0.tgz",
+ "integrity": "sha512-iua1A2+P7JJEDHVgvXrRJSvsnzG7stYSGQnBVphIUlemwl6nN5D+QrgbjECtrbxRz8asYFHSzhdhECqN+tFiBg==",
+ "optional": true,
+ "requires": {
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/util-middleware": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.257.0.tgz",
+ "integrity": "sha512-F9ieon8B8eGVs5tyZtAIG3DZEObDvujkspho0qRbUTHUosM0ylJLsMU800fmC/uRHLRrZvb/RSp59+kNDwSAMw==",
+ "optional": true,
+ "requires": {
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/util-retry": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.257.0.tgz",
+ "integrity": "sha512-l9TOsOAYtZxwW3q5fQKW4rsD9t2HVaBfQ4zBamHkNTfB4vBVvCnz4oxkvSvA2MlxCA6am+K1K/oj917Tpqk53g==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/service-error-classification": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/util-uri-escape": {
+ "version": "3.201.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.201.0.tgz",
+ "integrity": "sha512-TeTWbGx4LU2c5rx0obHeDFeO9HvwYwQtMh1yniBz00pQb6Qt6YVOETVQikRZ+XRQwEyCg/dA375UplIpiy54mA==",
+ "optional": true,
+ "requires": {
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/util-user-agent-browser": {
+ "version": "3.257.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.257.0.tgz",
+ "integrity": "sha512-YdavWK6/8Cw6mypEgysGGX/dT9p9qnzFbnN5PQsUY+JJk2Nx8fKFydjGiQ+6rWPeW17RAv9mmbboh9uPVWxVlw==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/types": "3.257.0",
+ "bowser": "^2.11.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/util-user-agent-node": {
+ "version": "3.259.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.259.0.tgz",
+ "integrity": "sha512-R0VTmNs+ySDDebU98BUbsLyeIM5YmAEr9esPpy15XfSy3AWmAeru8nLlztdaLilHZzLIDzvM2t7NGk/FzZFCvA==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/node-config-provider": "3.259.0",
+ "@aws-sdk/types": "3.257.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/util-utf8": {
+ "version": "3.254.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8/-/util-utf8-3.254.0.tgz",
+ "integrity": "sha512-14Kso/eIt5/qfIBmhEL9L1IfyUqswjSTqO2mY7KOzUZ9SZbwn3rpxmtkhmATkRjD7XIlLKaxBkI7tU9Zjzj8Kw==",
+ "optional": true,
+ "requires": {
+ "@aws-sdk/util-buffer-from": "3.208.0",
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@aws-sdk/util-utf8-browser": {
+ "version": "3.259.0",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz",
+ "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==",
+ "optional": true,
+ "requires": {
+ "tslib": "^2.3.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
+ "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==",
+ "optional": true
+ }
+ }
+ },
+ "@babel/code-frame": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
+ "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.18.6"
+ }
+ },
+ "@babel/compat-data": {
+ "version": "7.20.14",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.14.tgz",
+ "integrity": "sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==",
+ "dev": true
+ },
+ "@babel/core": {
+ "version": "7.20.12",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz",
+ "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==",
+ "dev": true,
+ "requires": {
+ "@ampproject/remapping": "^2.1.0",
+ "@babel/code-frame": "^7.18.6",
+ "@babel/generator": "^7.20.7",
+ "@babel/helper-compilation-targets": "^7.20.7",
+ "@babel/helper-module-transforms": "^7.20.11",
+ "@babel/helpers": "^7.20.7",
+ "@babel/parser": "^7.20.7",
+ "@babel/template": "^7.20.7",
+ "@babel/traverse": "^7.20.12",
+ "@babel/types": "^7.20.7",
+ "convert-source-map": "^1.7.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.2",
+ "semver": "^6.3.0"
+ }
+ },
+ "@babel/generator": {
+ "version": "7.20.14",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz",
+ "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.20.7",
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "jsesc": "^2.5.1"
+ },
+ "dependencies": {
+ "@jridgewell/gen-mapping": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
+ "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ }
+ }
+ },
+ "@babel/helper-compilation-targets": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz",
+ "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==",
+ "dev": true,
+ "requires": {
+ "@babel/compat-data": "^7.20.5",
+ "@babel/helper-validator-option": "^7.18.6",
+ "browserslist": "^4.21.3",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.0"
+ }
+ },
+ "@babel/helper-environment-visitor": {
+ "version": "7.18.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz",
+ "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==",
+ "dev": true
+ },
+ "@babel/helper-function-name": {
+ "version": "7.19.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz",
+ "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==",
+ "dev": true,
+ "requires": {
+ "@babel/template": "^7.18.10",
+ "@babel/types": "^7.19.0"
+ }
+ },
+ "@babel/helper-hoist-variables": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz",
+ "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.18.6"
+ }
+ },
+ "@babel/helper-module-imports": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz",
+ "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.18.6"
+ }
+ },
+ "@babel/helper-module-transforms": {
+ "version": "7.20.11",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz",
+ "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-module-imports": "^7.18.6",
+ "@babel/helper-simple-access": "^7.20.2",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "@babel/helper-validator-identifier": "^7.19.1",
+ "@babel/template": "^7.20.7",
+ "@babel/traverse": "^7.20.10",
+ "@babel/types": "^7.20.7"
+ }
+ },
+ "@babel/helper-plugin-utils": {
+ "version": "7.20.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz",
+ "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==",
+ "dev": true
+ },
+ "@babel/helper-simple-access": {
+ "version": "7.20.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz",
+ "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.20.2"
+ }
+ },
+ "@babel/helper-split-export-declaration": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz",
+ "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.18.6"
+ }
+ },
+ "@babel/helper-string-parser": {
+ "version": "7.19.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz",
+ "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==",
+ "dev": true
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.19.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
+ "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
+ "dev": true
+ },
+ "@babel/helper-validator-option": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz",
+ "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==",
+ "dev": true
+ },
+ "@babel/helpers": {
+ "version": "7.20.13",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz",
+ "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==",
+ "dev": true,
+ "requires": {
+ "@babel/template": "^7.20.7",
+ "@babel/traverse": "^7.20.13",
+ "@babel/types": "^7.20.7"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
+ "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.18.6",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@babel/parser": {
+ "version": "7.20.13",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz",
+ "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==",
+ "dev": true
+ },
+ "@babel/plugin-transform-react-jsx-self": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz",
+ "integrity": "sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.18.6"
+ }
+ },
+ "@babel/plugin-transform-react-jsx-source": {
+ "version": "7.19.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz",
+ "integrity": "sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.19.0"
+ }
+ },
+ "@babel/runtime": {
+ "version": "7.20.13",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz",
+ "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==",
+ "requires": {
+ "regenerator-runtime": "^0.13.11"
+ }
+ },
+ "@babel/template": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz",
+ "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.18.6",
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7"
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.20.13",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz",
+ "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.18.6",
+ "@babel/generator": "^7.20.7",
+ "@babel/helper-environment-visitor": "^7.18.9",
+ "@babel/helper-function-name": "^7.19.0",
+ "@babel/helper-hoist-variables": "^7.18.6",
+ "@babel/helper-split-export-declaration": "^7.18.6",
+ "@babel/parser": "^7.20.13",
+ "@babel/types": "^7.20.7",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0"
+ }
+ },
+ "@babel/types": {
+ "version": "7.20.7",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz",
+ "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-string-parser": "^7.19.4",
+ "@babel/helper-validator-identifier": "^7.19.1",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "@colors/colors": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
+ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ=="
+ },
+ "@dabh/diagnostics": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz",
+ "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==",
+ "requires": {
+ "colorspace": "1.1.x",
+ "enabled": "2.0.x",
+ "kuler": "^2.0.0"
+ }
+ },
+ "@esbuild/android-arm": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz",
+ "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/android-arm64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz",
+ "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/android-x64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz",
+ "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/darwin-arm64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz",
+ "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/darwin-x64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz",
+ "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/freebsd-arm64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz",
+ "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/freebsd-x64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz",
+ "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-arm": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz",
+ "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-arm64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz",
+ "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-ia32": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz",
+ "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-loong64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz",
+ "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-mips64el": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz",
+ "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-ppc64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz",
+ "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-riscv64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz",
+ "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-s390x": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz",
+ "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-x64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz",
+ "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/netbsd-x64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz",
+ "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/openbsd-x64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz",
+ "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/sunos-x64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz",
+ "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/win32-arm64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz",
+ "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/win32-ia32": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz",
+ "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/win32-x64": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz",
+ "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==",
+ "dev": true,
+ "optional": true
+ },
+ "@eslint/eslintrc": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz",
+ "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.4.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"
+ },
+ "dependencies": {
+ "globals": {
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.20.2"
+ }
+ }
+ }
+ },
+ "@fortawesome/fontawesome-common-types": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.2.1.tgz",
+ "integrity": "sha512-Sz07mnQrTekFWLz5BMjOzHl/+NooTdW8F8kDQxjWwbpOJcnoSg4vUDng8d/WR1wOxM0O+CY9Zw0nR054riNYtQ=="
+ },
+ "@fortawesome/fontawesome-svg-core": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.2.1.tgz",
+ "integrity": "sha512-HELwwbCz6C1XEcjzyT1Jugmz2NNklMrSPjZOWMlc+ZsHIVk+XOvOXLGGQtFBwSyqfJDNgRq4xBCwWOaZ/d9DEA==",
+ "requires": {
+ "@fortawesome/fontawesome-common-types": "6.2.1"
+ }
+ },
+ "@fortawesome/free-regular-svg-icons": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.2.1.tgz",
+ "integrity": "sha512-wiqcNDNom75x+pe88FclpKz7aOSqS2lOivZeicMV5KRwOAeypxEYWAK/0v+7r+LrEY30+qzh8r2XDaEHvoLsMA==",
+ "requires": {
+ "@fortawesome/fontawesome-common-types": "6.2.1"
+ }
+ },
+ "@fortawesome/free-solid-svg-icons": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.2.1.tgz",
+ "integrity": "sha512-oKuqrP5jbfEPJWTij4sM+/RvgX+RMFwx3QZCZcK9PrBDgxC35zuc7AOFsyMjMd/PIFPeB2JxyqDr5zs/DZFPPw==",
+ "requires": {
+ "@fortawesome/fontawesome-common-types": "6.2.1"
+ }
+ },
+ "@fortawesome/react-fontawesome": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz",
+ "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==",
+ "requires": {
+ "prop-types": "^15.8.1"
+ }
+ },
+ "@humanwhocodes/config-array": {
+ "version": "0.11.8",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
+ "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==",
+ "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
+ },
+ "@jridgewell/gen-mapping": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
+ "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/set-array": "^1.0.0",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ },
+ "@jridgewell/resolve-uri": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+ "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+ "dev": true
+ },
+ "@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.14",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+ "dev": true
+ },
+ "@jridgewell/trace-mapping": {
+ "version": "0.3.17",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
+ "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/resolve-uri": "3.1.0",
+ "@jridgewell/sourcemap-codec": "1.4.14"
+ }
+ },
+ "@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"
+ }
+ },
+ "@reduxjs/toolkit": {
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.2.tgz",
+ "integrity": "sha512-5ZAZ7hwAKWSii5T6NTPmgIBUqyVdlDs+6JjThz6J6dmHLDm6zCzv2OjHIFAi3Vvs1qjmXU0bm6eBojukYXjVMQ==",
+ "requires": {
+ "immer": "^9.0.16",
+ "redux": "^4.2.0",
+ "redux-thunk": "^2.4.2",
+ "reselect": "^4.1.7"
+ }
+ },
+ "@remix-run/router": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.3.1.tgz",
+ "integrity": "sha512-+eun1Wtf72RNRSqgU7qM2AMX/oHp+dnx7BHk1qhK5ZHzdHTUU4LA1mGG1vT+jMc8sbhG3orvsfOmryjzx2PzQw=="
+ },
+ "@types/body-parser": {
+ "version": "1.19.2",
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz",
+ "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==",
+ "requires": {
+ "@types/connect": "*",
+ "@types/node": "*"
+ }
+ },
+ "@types/connect": {
+ "version": "3.4.35",
+ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
+ "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/express": {
+ "version": "4.17.17",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz",
+ "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==",
+ "requires": {
+ "@types/body-parser": "*",
+ "@types/express-serve-static-core": "^4.17.33",
+ "@types/qs": "*",
+ "@types/serve-static": "*"
+ }
+ },
+ "@types/express-serve-static-core": {
+ "version": "4.17.33",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz",
+ "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==",
+ "requires": {
+ "@types/node": "*",
+ "@types/qs": "*",
+ "@types/range-parser": "*"
+ }
+ },
+ "@types/express-ws": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@types/express-ws/-/express-ws-3.0.1.tgz",
+ "integrity": "sha512-VguRXzcpPBF0IggIGpUoM65cZJDfMQxoc6dKoCz1yLzcwcXW7ft60yhq3ygKhyEhEIQFtLrWjyz4AJ1qjmzCFw==",
+ "requires": {
+ "@types/express": "*",
+ "@types/express-serve-static-core": "*",
+ "@types/ws": "*"
+ }
+ },
+ "@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/json-schema": {
+ "version": "7.0.11",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
+ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
+ "dev": true
+ },
+ "@types/json5": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
+ "dev": true
+ },
+ "@types/lodash": {
+ "version": "4.14.191",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz",
+ "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ=="
+ },
+ "@types/mime": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz",
+ "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA=="
+ },
+ "@types/node": {
+ "version": "18.11.19",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.19.tgz",
+ "integrity": "sha512-YUgMWAQBWLObABqrvx8qKO1enAvBUdjZOAWQ5grBAkp5LQv45jBvYKZ3oFS9iKRCQyFjqw6iuEa1vmFqtxYLZw=="
+ },
+ "@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/qs": {
+ "version": "6.9.7",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz",
+ "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw=="
+ },
+ "@types/range-parser": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz",
+ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw=="
+ },
+ "@types/react": {
+ "version": "18.0.27",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.27.tgz",
+ "integrity": "sha512-3vtRKHgVxu3Jp9t718R9BuzoD4NcQ8YJ5XRzsSKxNDiDonD2MXIT1TmSkenxuCycZJoQT5d2vE8LwWJxBC1gmA==",
+ "requires": {
+ "@types/prop-types": "*",
+ "@types/scheduler": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "@types/react-dom": {
+ "version": "18.0.10",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.10.tgz",
+ "integrity": "sha512-E42GW/JA4Qv15wQdqJq8DL4JhNpB3prJgjgapN3qJT9K2zO5IIAQh4VXvCEDupoqAwnz0cY4RlXeC/ajX5SFHg==",
+ "devOptional": true,
+ "requires": {
+ "@types/react": "*"
+ }
+ },
+ "@types/scheduler": {
+ "version": "0.16.2",
+ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
+ "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew=="
+ },
+ "@types/semver": {
+ "version": "7.3.13",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz",
+ "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==",
+ "dev": true
+ },
+ "@types/serve-static": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz",
+ "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==",
+ "requires": {
+ "@types/mime": "*",
+ "@types/node": "*"
+ }
+ },
+ "@types/triple-beam": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.2.tgz",
+ "integrity": "sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g=="
+ },
+ "@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=="
+ },
+ "@types/webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog=="
+ },
+ "@types/whatwg-url": {
+ "version": "8.2.2",
+ "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz",
+ "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==",
+ "requires": {
+ "@types/node": "*",
+ "@types/webidl-conversions": "*"
+ }
+ },
+ "@types/ws": {
+ "version": "8.5.4",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz",
+ "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@typescript-eslint/eslint-plugin": {
+ "version": "5.50.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.50.0.tgz",
+ "integrity": "sha512-vwksQWSFZiUhgq3Kv7o1Jcj0DUNylwnIlGvKvLLYsq8pAWha6/WCnXUeaSoNNha/K7QSf2+jvmkxggC1u3pIwQ==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/scope-manager": "5.50.0",
+ "@typescript-eslint/type-utils": "5.50.0",
+ "@typescript-eslint/utils": "5.50.0",
+ "debug": "^4.3.4",
+ "grapheme-splitter": "^1.0.4",
+ "ignore": "^5.2.0",
+ "natural-compare-lite": "^1.4.0",
+ "regexpp": "^3.2.0",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.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"
+ }
+ },
+ "semver": {
+ "version": "7.3.8",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.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
+ }
+ }
+ },
+ "@typescript-eslint/parser": {
+ "version": "5.50.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.50.0.tgz",
+ "integrity": "sha512-KCcSyNaogUDftK2G9RXfQyOCt51uB5yqC6pkUYqhYh8Kgt+DwR5M0EwEAxGPy/+DH6hnmKeGsNhiZRQxjH71uQ==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/scope-manager": "5.50.0",
+ "@typescript-eslint/types": "5.50.0",
+ "@typescript-eslint/typescript-estree": "5.50.0",
+ "debug": "^4.3.4"
+ }
+ },
+ "@typescript-eslint/scope-manager": {
+ "version": "5.50.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz",
+ "integrity": "sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.50.0",
+ "@typescript-eslint/visitor-keys": "5.50.0"
+ }
+ },
+ "@typescript-eslint/type-utils": {
+ "version": "5.50.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.50.0.tgz",
+ "integrity": "sha512-dcnXfZ6OGrNCO7E5UY/i0ktHb7Yx1fV6fnQGGrlnfDhilcs6n19eIRcvLBqx6OQkrPaFlDPk3OJ0WlzQfrV0bQ==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/typescript-estree": "5.50.0",
+ "@typescript-eslint/utils": "5.50.0",
+ "debug": "^4.3.4",
+ "tsutils": "^3.21.0"
+ }
+ },
+ "@typescript-eslint/types": {
+ "version": "5.50.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.50.0.tgz",
+ "integrity": "sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w==",
+ "dev": true
+ },
+ "@typescript-eslint/typescript-estree": {
+ "version": "5.50.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.50.0.tgz",
+ "integrity": "sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.50.0",
+ "@typescript-eslint/visitor-keys": "5.50.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.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"
+ }
+ },
+ "semver": {
+ "version": "7.3.8",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.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
+ }
+ }
+ },
+ "@typescript-eslint/utils": {
+ "version": "5.50.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.50.0.tgz",
+ "integrity": "sha512-v/AnUFImmh8G4PH0NDkf6wA8hujNNcrwtecqW4vtQ1UOSNBaZl49zP1SHoZ/06e+UiwzHpgb5zP5+hwlYYWYAw==",
+ "dev": true,
+ "requires": {
+ "@types/json-schema": "^7.0.9",
+ "@types/semver": "^7.3.12",
+ "@typescript-eslint/scope-manager": "5.50.0",
+ "@typescript-eslint/types": "5.50.0",
+ "@typescript-eslint/typescript-estree": "5.50.0",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^3.0.0",
+ "semver": "^7.3.7"
+ },
+ "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"
+ }
+ },
+ "semver": {
+ "version": "7.3.8",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.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
+ }
+ }
+ },
+ "@typescript-eslint/visitor-keys": {
+ "version": "5.50.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz",
+ "integrity": "sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.50.0",
+ "eslint-visitor-keys": "^3.3.0"
+ }
+ },
+ "@vitejs/plugin-react": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-3.0.1.tgz",
+ "integrity": "sha512-mx+QvYwIbbpOIJw+hypjnW1lAbKDHtWK5ibkF/V1/oMBu8HU/chb+SnqJDAsLq1+7rGqjktCEomMTM5KShzUKQ==",
+ "dev": true,
+ "requires": {
+ "@babel/core": "^7.20.7",
+ "@babel/plugin-transform-react-jsx-self": "^7.18.6",
+ "@babel/plugin-transform-react-jsx-source": "^7.19.6",
+ "magic-string": "^0.27.0",
+ "react-refresh": "^0.14.0"
+ }
+ },
+ "abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+ "dev": true
+ },
+ "accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "requires": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ }
+ },
+ "acorn": {
+ "version": "8.8.2",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
+ "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
+ "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==",
+ "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": "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"
+ }
+ },
+ "anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "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
+ },
+ "aria-query": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz",
+ "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "deep-equal": "^2.0.5"
+ }
+ },
+ "array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
+ },
+ "array-includes": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz",
+ "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "get-intrinsic": "^1.1.3",
+ "is-string": "^1.0.7"
+ }
+ },
+ "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
+ },
+ "array-uniq": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+ "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q=="
+ },
+ "array.prototype.flat": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz",
+ "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "es-shim-unscopables": "^1.0.0"
+ }
+ },
+ "array.prototype.flatmap": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz",
+ "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "es-shim-unscopables": "^1.0.0"
+ }
+ },
+ "array.prototype.tosorted": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz",
+ "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "es-shim-unscopables": "^1.0.0",
+ "get-intrinsic": "^1.1.3"
+ }
+ },
+ "asn1": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
+ "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
+ "requires": {
+ "safer-buffer": "~2.1.0"
+ }
+ },
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="
+ },
+ "ast-types-flow": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
+ "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==",
+ "dev": true,
+ "peer": true
+ },
+ "async": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
+ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "available-typed-arrays": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
+ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
+ "dev": true
+ },
+ "aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA=="
+ },
+ "aws4": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz",
+ "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg=="
+ },
+ "axe-core": {
+ "version": "4.6.3",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz",
+ "integrity": "sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg==",
+ "dev": true,
+ "peer": true
+ },
+ "axobject-query": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz",
+ "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "deep-equal": "^2.0.5"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ },
+ "base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
+ "requires": {
+ "tweetnacl": "^0.14.3"
+ }
+ },
+ "bcryptjs": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
+ "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ=="
+ },
+ "bignumber.js": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.4.0.tgz",
+ "integrity": "sha512-uw4ra6Cv483Op/ebM0GBKKfxZlSmn6NgFRby5L3yGTlunLj53KQgndDlqy2WVFOwgvurocApYkSud0aO+mvrpQ=="
+ },
+ "binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true
+ },
+ "bmp-js": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.3.tgz",
+ "integrity": "sha512-epsm3Z92j5xwek9p97pVw3KbsNc0F4QnbYh+N93SpbJYuHFQQ/UAh6K+bKFGyLePH3Hudtl/Sa95Quqp0gX8IQ=="
+ },
+ "body-parser": {
+ "version": "1.20.1",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
+ "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
+ "requires": {
+ "bytes": "3.1.2",
+ "content-type": "~1.0.4",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "on-finished": "2.4.1",
+ "qs": "6.11.0",
+ "raw-body": "2.5.1",
+ "type-is": "~1.6.18",
+ "unpipe": "1.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ }
+ }
+ },
+ "bowser": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz",
+ "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==",
+ "optional": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "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"
+ }
+ },
+ "browserslist": {
+ "version": "4.21.5",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz",
+ "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==",
+ "dev": true,
+ "requires": {
+ "caniuse-lite": "^1.0.30001449",
+ "electron-to-chromium": "^1.4.284",
+ "node-releases": "^2.0.8",
+ "update-browserslist-db": "^1.0.10"
+ }
+ },
+ "bson": {
+ "version": "4.7.2",
+ "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.2.tgz",
+ "integrity": "sha512-Ry9wCtIZ5kGqkJoi6aD8KjxFZEx78guTQDnpXWiNthsxzrxAK/i8E6pCHAIZTbaEFWcOCvbecMukfK7XUvyLpQ==",
+ "requires": {
+ "buffer": "^5.6.0"
+ }
+ },
+ "buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "requires": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "buffer-equal": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz",
+ "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA=="
+ },
+ "buffer-equal-constant-time": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="
+ },
+ "builtins": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz",
+ "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==",
+ "dev": true,
+ "requires": {
+ "semver": "^7.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"
+ }
+ },
+ "semver": {
+ "version": "7.3.8",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.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
+ }
+ }
+ },
+ "bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
+ },
+ "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"
+ }
+ },
+ "callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true
+ },
+ "caniuse-lite": {
+ "version": "1.0.30001449",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001449.tgz",
+ "integrity": "sha512-CPB+UL9XMT/Av+pJxCKGhdx+yg1hzplvFJQlJ2n68PyQGMz9L/E2zCyLdOL8uasbouTUgnPl+y0tccI/se+BEw==",
+ "dev": true
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
+ },
+ "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"
+ }
+ },
+ "chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "requires": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "fsevents": "~2.3.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "dependencies": {
+ "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"
+ }
+ }
+ }
+ },
+ "clsx": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz",
+ "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg=="
+ },
+ "color": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
+ "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==",
+ "requires": {
+ "color-convert": "^1.9.3",
+ "color-string": "^1.6.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==",
+ "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=="
+ },
+ "color-string": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
+ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+ "requires": {
+ "color-name": "^1.0.0",
+ "simple-swizzle": "^0.2.2"
+ }
+ },
+ "colorspace": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz",
+ "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==",
+ "requires": {
+ "color": "^3.1.3",
+ "text-hex": "1.0.x"
+ }
+ },
+ "combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+ },
+ "commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+ },
+ "confusing-browser-globals": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz",
+ "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==",
+ "dev": true
+ },
+ "content-disposition": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "requires": {
+ "safe-buffer": "5.2.1"
+ }
+ },
+ "content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="
+ },
+ "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
+ },
+ "cookie": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
+ "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="
+ },
+ "cookie-parser": {
+ "version": "1.4.6",
+ "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz",
+ "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==",
+ "requires": {
+ "cookie": "0.4.1",
+ "cookie-signature": "1.0.6"
+ },
+ "dependencies": {
+ "cookie": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
+ "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA=="
+ }
+ }
+ },
+ "cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
+ },
+ "cors": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+ "requires": {
+ "object-assign": "^4",
+ "vary": "^1"
+ }
+ },
+ "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"
+ }
+ },
+ "csstype": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz",
+ "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw=="
+ },
+ "damerau-levenshtein": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
+ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
+ "dev": true,
+ "peer": true
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
+ "requires": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "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"
+ }
+ },
+ "deep-equal": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz",
+ "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "es-get-iterator": "^1.1.2",
+ "get-intrinsic": "^1.1.3",
+ "is-arguments": "^1.1.1",
+ "is-array-buffer": "^3.0.1",
+ "is-date-object": "^1.0.5",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.2",
+ "isarray": "^2.0.5",
+ "object-is": "^1.1.5",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.4",
+ "regexp.prototype.flags": "^1.4.3",
+ "side-channel": "^1.0.4",
+ "which-boxed-primitive": "^1.0.2",
+ "which-collection": "^1.0.1",
+ "which-typed-array": "^1.1.9"
+ }
+ },
+ "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
+ },
+ "deepmerge": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz",
+ "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA=="
+ },
+ "define-properties": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz",
+ "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
+ "dev": true,
+ "requires": {
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ }
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
+ },
+ "depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
+ },
+ "destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
+ },
+ "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"
+ }
+ },
+ "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"
+ }
+ },
+ "dom-walk": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
+ "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="
+ },
+ "dotenv": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz",
+ "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ=="
+ },
+ "ecc-jsbn": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+ "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
+ "requires": {
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "ecdsa-sig-formatter": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
+ },
+ "ejs": {
+ "version": "3.1.8",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz",
+ "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==",
+ "requires": {
+ "jake": "^10.8.5"
+ }
+ },
+ "electron-to-chromium": {
+ "version": "1.4.284",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
+ "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==",
+ "dev": true
+ },
+ "email-addresses": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-5.0.0.tgz",
+ "integrity": "sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw=="
+ },
+ "emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true,
+ "peer": true
+ },
+ "enabled": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz",
+ "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ=="
+ },
+ "encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
+ },
+ "es-abstract": {
+ "version": "1.21.1",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz",
+ "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==",
+ "dev": true,
+ "requires": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "es-set-tostringtag": "^2.0.1",
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "function.prototype.name": "^1.1.5",
+ "get-intrinsic": "^1.1.3",
+ "get-symbol-description": "^1.0.0",
+ "globalthis": "^1.0.3",
+ "gopd": "^1.0.1",
+ "has": "^1.0.3",
+ "has-property-descriptors": "^1.0.0",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.4",
+ "is-array-buffer": "^3.0.1",
+ "is-callable": "^1.2.7",
+ "is-negative-zero": "^2.0.2",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.2",
+ "is-string": "^1.0.7",
+ "is-typed-array": "^1.1.10",
+ "is-weakref": "^1.0.2",
+ "object-inspect": "^1.12.2",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.4",
+ "regexp.prototype.flags": "^1.4.3",
+ "safe-regex-test": "^1.0.0",
+ "string.prototype.trimend": "^1.0.6",
+ "string.prototype.trimstart": "^1.0.6",
+ "typed-array-length": "^1.0.4",
+ "unbox-primitive": "^1.0.2",
+ "which-typed-array": "^1.1.9"
+ }
+ },
+ "es-get-iterator": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz",
+ "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.3",
+ "has-symbols": "^1.0.3",
+ "is-arguments": "^1.1.1",
+ "is-map": "^2.0.2",
+ "is-set": "^2.0.2",
+ "is-string": "^1.0.7",
+ "isarray": "^2.0.5",
+ "stop-iteration-iterator": "^1.0.0"
+ }
+ },
+ "es-set-tostringtag": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz",
+ "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==",
+ "dev": true,
+ "requires": {
+ "get-intrinsic": "^1.1.3",
+ "has": "^1.0.3",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "es-shim-unscopables": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
+ "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "es6-promise": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz",
+ "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg=="
+ },
+ "esbuild": {
+ "version": "0.16.17",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz",
+ "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==",
+ "dev": true,
+ "requires": {
+ "@esbuild/android-arm": "0.16.17",
+ "@esbuild/android-arm64": "0.16.17",
+ "@esbuild/android-x64": "0.16.17",
+ "@esbuild/darwin-arm64": "0.16.17",
+ "@esbuild/darwin-x64": "0.16.17",
+ "@esbuild/freebsd-arm64": "0.16.17",
+ "@esbuild/freebsd-x64": "0.16.17",
+ "@esbuild/linux-arm": "0.16.17",
+ "@esbuild/linux-arm64": "0.16.17",
+ "@esbuild/linux-ia32": "0.16.17",
+ "@esbuild/linux-loong64": "0.16.17",
+ "@esbuild/linux-mips64el": "0.16.17",
+ "@esbuild/linux-ppc64": "0.16.17",
+ "@esbuild/linux-riscv64": "0.16.17",
+ "@esbuild/linux-s390x": "0.16.17",
+ "@esbuild/linux-x64": "0.16.17",
+ "@esbuild/netbsd-x64": "0.16.17",
+ "@esbuild/openbsd-x64": "0.16.17",
+ "@esbuild/sunos-x64": "0.16.17",
+ "@esbuild/win32-arm64": "0.16.17",
+ "@esbuild/win32-ia32": "0.16.17",
+ "@esbuild/win32-x64": "0.16.17"
+ }
+ },
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true
+ },
+ "escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
+ },
+ "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=="
+ },
+ "eslint": {
+ "version": "8.33.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.33.0.tgz",
+ "integrity": "sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA==",
+ "dev": true,
+ "requires": {
+ "@eslint/eslintrc": "^1.4.1",
+ "@humanwhocodes/config-array": "^0.11.8",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "ajv": "^6.10.0",
+ "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.1.1",
+ "eslint-utils": "^3.0.0",
+ "eslint-visitor-keys": "^3.3.0",
+ "espree": "^9.4.0",
+ "esquery": "^1.4.0",
+ "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",
+ "grapheme-splitter": "^1.0.4",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-sdsl": "^4.1.4",
+ "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.1",
+ "regexpp": "^3.2.0",
+ "strip-ansi": "^6.0.1",
+ "strip-json-comments": "^3.1.0",
+ "text-table": "^0.2.0"
+ },
+ "dependencies": {
+ "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"
+ }
+ },
+ "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
+ },
+ "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.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+ "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ }
+ },
+ "globals": {
+ "version": "13.20.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+ "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+ "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
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "eslint-config-airbnb": {
+ "version": "19.0.4",
+ "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz",
+ "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==",
+ "dev": true,
+ "requires": {
+ "eslint-config-airbnb-base": "^15.0.0",
+ "object.assign": "^4.1.2",
+ "object.entries": "^1.1.5"
+ }
+ },
+ "eslint-config-airbnb-base": {
+ "version": "15.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz",
+ "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==",
+ "dev": true,
+ "requires": {
+ "confusing-browser-globals": "^1.0.10",
+ "object.assign": "^4.1.2",
+ "object.entries": "^1.1.5",
+ "semver": "^6.3.0"
+ }
+ },
+ "eslint-config-prettier": {
+ "version": "8.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.6.0.tgz",
+ "integrity": "sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==",
+ "dev": true,
+ "requires": {}
+ },
+ "eslint-config-standard": {
+ "version": "17.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz",
+ "integrity": "sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==",
+ "dev": true,
+ "requires": {}
+ },
+ "eslint-config-standard-with-typescript": {
+ "version": "33.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-33.0.0.tgz",
+ "integrity": "sha512-HOLmCMF91yYizfEms00jkmEoKvCCEIUOO6ArGZ9BNYL8yczF23fz/orsG6pN84f97cfo8c0kdREHzEO+uMA2zw==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/parser": "^5.0.0",
+ "eslint-config-standard": "17.0.0"
+ }
+ },
+ "eslint-import-resolver-node": {
+ "version": "0.3.7",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz",
+ "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==",
+ "dev": true,
+ "requires": {
+ "debug": "^3.2.7",
+ "is-core-module": "^2.11.0",
+ "resolve": "^1.22.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ }
+ }
+ },
+ "eslint-module-utils": {
+ "version": "2.7.4",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz",
+ "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==",
+ "dev": true,
+ "requires": {
+ "debug": "^3.2.7"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ }
+ }
+ },
+ "eslint-plugin-es": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz",
+ "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==",
+ "dev": true,
+ "requires": {
+ "eslint-utils": "^2.0.0",
+ "regexpp": "^3.0.0"
+ },
+ "dependencies": {
+ "eslint-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+ "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^1.1.0"
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-plugin-import": {
+ "version": "2.27.5",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz",
+ "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==",
+ "dev": true,
+ "requires": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "array.prototype.flatmap": "^1.3.1",
+ "debug": "^3.2.7",
+ "doctrine": "^2.1.0",
+ "eslint-import-resolver-node": "^0.3.7",
+ "eslint-module-utils": "^2.7.4",
+ "has": "^1.0.3",
+ "is-core-module": "^2.11.0",
+ "is-glob": "^4.0.3",
+ "minimatch": "^3.1.2",
+ "object.values": "^1.1.6",
+ "resolve": "^1.22.1",
+ "semver": "^6.3.0",
+ "tsconfig-paths": "^3.14.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ }
+ }
+ },
+ "eslint-plugin-jsx-a11y": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz",
+ "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "@babel/runtime": "^7.20.7",
+ "aria-query": "^5.1.3",
+ "array-includes": "^3.1.6",
+ "array.prototype.flatmap": "^1.3.1",
+ "ast-types-flow": "^0.0.7",
+ "axe-core": "^4.6.2",
+ "axobject-query": "^3.1.1",
+ "damerau-levenshtein": "^1.0.8",
+ "emoji-regex": "^9.2.2",
+ "has": "^1.0.3",
+ "jsx-ast-utils": "^3.3.3",
+ "language-tags": "=1.0.5",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.6",
+ "object.fromentries": "^2.0.6",
+ "semver": "^6.3.0"
+ }
+ },
+ "eslint-plugin-n": {
+ "version": "15.6.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.6.1.tgz",
+ "integrity": "sha512-R9xw9OtCRxxaxaszTQmQAlPgM+RdGjaL1akWuY/Fv9fRAi8Wj4CUKc6iYVG8QNRjRuo8/BqVYIpfqberJUEacA==",
+ "dev": true,
+ "requires": {
+ "builtins": "^5.0.1",
+ "eslint-plugin-es": "^4.1.0",
+ "eslint-utils": "^3.0.0",
+ "ignore": "^5.1.1",
+ "is-core-module": "^2.11.0",
+ "minimatch": "^3.1.2",
+ "resolve": "^1.22.1",
+ "semver": "^7.3.8"
+ },
+ "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"
+ }
+ },
+ "semver": {
+ "version": "7.3.8",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.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
+ }
+ }
+ },
+ "eslint-plugin-prettier": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz",
+ "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==",
+ "dev": true,
+ "requires": {
+ "prettier-linter-helpers": "^1.0.0"
+ }
+ },
+ "eslint-plugin-promise": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz",
+ "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==",
+ "dev": true,
+ "requires": {}
+ },
+ "eslint-plugin-react": {
+ "version": "7.32.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz",
+ "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==",
+ "dev": true,
+ "requires": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flatmap": "^1.3.1",
+ "array.prototype.tosorted": "^1.1.1",
+ "doctrine": "^2.1.0",
+ "estraverse": "^5.3.0",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.6",
+ "object.fromentries": "^2.0.6",
+ "object.hasown": "^1.1.2",
+ "object.values": "^1.1.6",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.4",
+ "semver": "^6.3.0",
+ "string.prototype.matchall": "^4.0.8"
+ },
+ "dependencies": {
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
+ "resolve": {
+ "version": "2.0.0-next.4",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz",
+ "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==",
+ "dev": true,
+ "requires": {
+ "is-core-module": "^2.9.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ }
+ }
+ }
+ },
+ "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-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"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^2.0.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+ "dev": true
+ },
+ "espree": {
+ "version": "9.4.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz",
+ "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==",
+ "dev": true,
+ "requires": {
+ "acorn": "^8.8.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.3.0"
+ }
+ },
+ "esquery": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+ "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
+ },
+ "etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
+ },
+ "exif-parser": {
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz",
+ "integrity": "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw=="
+ },
+ "express": {
+ "version": "4.18.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
+ "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
+ "requires": {
+ "accepts": "~1.3.8",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.20.1",
+ "content-disposition": "0.5.4",
+ "content-type": "~1.0.4",
+ "cookie": "0.5.0",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "1.2.0",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "merge-descriptors": "1.0.1",
+ "methods": "~1.1.2",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "~2.0.7",
+ "qs": "6.11.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.2.1",
+ "send": "0.18.0",
+ "serve-static": "1.15.0",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ }
+ }
+ },
+ "express-validator": {
+ "version": "6.14.3",
+ "resolved": "https://registry.npmjs.org/express-validator/-/express-validator-6.14.3.tgz",
+ "integrity": "sha512-c4b9NMdhskfcLbH/FchsSfCt4Vb14gKzcotG9zLS+VoOJDox57aGhCL+kmAu7cl+ytaSed+HD5jdJhel8DQsdg==",
+ "requires": {
+ "lodash": "^4.17.21",
+ "validator": "^13.7.0"
+ }
+ },
+ "express-ws": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/express-ws/-/express-ws-5.0.2.tgz",
+ "integrity": "sha512-0uvmuk61O9HXgLhGl3QhNSEtRsQevtmbL94/eILaliEADZBHZOQUAiHFrGPrgsjikohyrmSG5g+sCfASTt0lkQ==",
+ "requires": {
+ "ws": "^7.4.6"
+ },
+ "dependencies": {
+ "ws": {
+ "version": "7.5.9",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
+ "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
+ "requires": {}
+ }
+ }
+ },
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+ },
+ "extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g=="
+ },
+ "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=="
+ },
+ "fast-diff": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz",
+ "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "3.2.12",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
+ "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
+ "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"
+ },
+ "dependencies": {
+ "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"
+ }
+ }
+ }
+ },
+ "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=="
+ },
+ "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
+ },
+ "fast-xml-parser": {
+ "version": "4.0.11",
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.0.11.tgz",
+ "integrity": "sha512-4aUg3aNRR/WjQAcpceODG1C3x3lFANXRo8+1biqfieHmg9pyMt7qB4lQV/Ta6sJCTbA5vfD8fnA8S54JATiFUA==",
+ "optional": true,
+ "requires": {
+ "strnum": "^1.0.5"
+ }
+ },
+ "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"
+ }
+ },
+ "fecha": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz",
+ "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw=="
+ },
+ "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"
+ }
+ },
+ "file-type": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz",
+ "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA=="
+ },
+ "filelist": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
+ "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
+ "requires": {
+ "minimatch": "^5.0.1"
+ },
+ "dependencies": {
+ "brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "requires": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "requires": {
+ "brace-expansion": "^2.0.1"
+ }
+ }
+ }
+ },
+ "filename-reserved-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
+ "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ=="
+ },
+ "filenamify": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz",
+ "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==",
+ "requires": {
+ "filename-reserved-regex": "^2.0.0",
+ "strip-outer": "^1.0.1",
+ "trim-repeated": "^1.0.0"
+ }
+ },
+ "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"
+ }
+ },
+ "finalhandler": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
+ "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
+ "requires": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "statuses": "2.0.1",
+ "unpipe": "~1.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ }
+ }
+ },
+ "find-cache-dir": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
+ "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
+ "requires": {
+ "commondir": "^1.0.1",
+ "make-dir": "^3.0.2",
+ "pkg-dir": "^4.1.0"
+ }
+ },
+ "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
+ },
+ "fn.name": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
+ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw=="
+ },
+ "for-each": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+ "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.3"
+ }
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw=="
+ },
+ "form-data": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "formik": {
+ "version": "2.2.9",
+ "resolved": "https://registry.npmjs.org/formik/-/formik-2.2.9.tgz",
+ "integrity": "sha512-LQLcISMmf1r5at4/gyJigGn0gOwFbeEAlji+N9InZF6LIMXnFNkO42sCI8Jt84YZggpD4cPWObAZaxpEFtSzNA==",
+ "requires": {
+ "deepmerge": "^2.1.1",
+ "hoist-non-react-statics": "^3.3.0",
+ "lodash": "^4.17.21",
+ "lodash-es": "^4.17.21",
+ "react-fast-compare": "^2.0.1",
+ "tiny-warning": "^1.0.2",
+ "tslib": "^1.10.0"
+ }
+ },
+ "forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
+ },
+ "fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
+ },
+ "fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+ "requires": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+ },
+ "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
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ },
+ "function.prototype.name": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
+ "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.19.0",
+ "functions-have-names": "^1.2.2"
+ }
+ },
+ "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==",
+ "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
+ },
+ "get-intrinsic": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz",
+ "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==",
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.3"
+ }
+ },
+ "get-symbol-description": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
+ "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.1"
+ }
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
+ "requires": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "gh-pages": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-5.0.0.tgz",
+ "integrity": "sha512-Nqp1SjkPIB94Xw/3yYNTUL+G2dxlhjvv1zeN/4kMC1jfViTEqhtVz/Ba1zSXHuvXCN9ADNS1dN4r5/J/nZWEQQ==",
+ "requires": {
+ "async": "^3.2.4",
+ "commander": "^2.18.0",
+ "email-addresses": "^5.0.0",
+ "filenamify": "^4.3.0",
+ "find-cache-dir": "^3.3.1",
+ "fs-extra": "^8.1.0",
+ "globby": "^6.1.0"
+ },
+ "dependencies": {
+ "array-union": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+ "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==",
+ "requires": {
+ "array-uniq": "^1.0.1"
+ }
+ },
+ "globby": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
+ "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==",
+ "requires": {
+ "array-union": "^1.0.1",
+ "glob": "^7.0.3",
+ "object-assign": "^4.0.1",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ }
+ }
+ }
+ },
+ "glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "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"
+ }
+ },
+ "global": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
+ "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
+ "requires": {
+ "min-document": "^2.19.0",
+ "process": "^0.11.10"
+ }
+ },
+ "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
+ },
+ "globalthis": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
+ "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3"
+ }
+ },
+ "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"
+ }
+ },
+ "gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "dev": true,
+ "requires": {
+ "get-intrinsic": "^1.1.3"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.2.10",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
+ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="
+ },
+ "grapheme-splitter": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
+ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
+ "dev": true
+ },
+ "har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q=="
+ },
+ "har-validator": {
+ "version": "5.1.5",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+ "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+ "requires": {
+ "ajv": "^6.12.3",
+ "har-schema": "^2.0.0"
+ }
+ },
+ "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-bigints": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
+ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+ "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
+ },
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.2"
+ }
+ },
+ "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=="
+ }
+ }
+ },
+ "http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "requires": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ }
+ },
+ "http-signature": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
+ }
+ },
+ "iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
+ "ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
+ },
+ "ignore": {
+ "version": "5.2.4",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+ "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
+ "dev": true
+ },
+ "ignore-by-default": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
+ "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==",
+ "dev": true
+ },
+ "immer": {
+ "version": "9.0.19",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.19.tgz",
+ "integrity": "sha512-eY+Y0qcsB4TZKwgQzLaE/lqYMlKhv5J9dyd2RhhtGhNo2njPXDqU9XPfcNfa3MIDsdtZt5KlkIsirlo4dHsWdQ=="
+ },
+ "immutable": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.2.tgz",
+ "integrity": "sha512-fTMKDwtbvO5tldky9QZ2fMX7slR0mYpY5nbnFWYp0fOzDhHqhgIw9KoYgxLWsoNTS9ZHGauHj18DTyEw6BK3Og==",
+ "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==",
+ "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=="
+ },
+ "internal-slot": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz",
+ "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==",
+ "dev": true,
+ "requires": {
+ "get-intrinsic": "^1.1.3",
+ "has": "^1.0.3",
+ "side-channel": "^1.0.4"
+ }
+ },
+ "ip": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
+ "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ=="
+ },
+ "ip-regex": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz",
+ "integrity": "sha512-HjpCHTuxbR/6jWJroc/VN+npo5j0T4Vv2TAI5qdEHQx7hsL767MeccGFSsLtF694EiZKTSEqgoeU6DtGFCcuqQ=="
+ },
+ "ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
+ },
+ "is-any-array": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-any-array/-/is-any-array-2.0.0.tgz",
+ "integrity": "sha512-WdPV58rT3aOWXvvyuBydnCq4S2BM1Yz8shKxlEpk/6x+GX202XRvXOycEFtNgnHVLoc46hpexPFx8Pz1/sMS0w==",
+ "dev": true
+ },
+ "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==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-array-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz",
+ "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.3",
+ "is-typed-array": "^1.1.10"
+ }
+ },
+ "is-arrayish": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
+ },
+ "is-bigint": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "dev": true,
+ "requires": {
+ "has-bigints": "^1.0.1"
+ }
+ },
+ "is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "^2.0.0"
+ }
+ },
+ "is-boolean-object": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "dev": true
+ },
+ "is-core-module": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
+ "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "has-tostringtag": "^1.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-function": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz",
+ "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ=="
+ },
+ "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-map": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
+ "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==",
+ "dev": true,
+ "peer": true
+ },
+ "is-negative-zero": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
+ "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
+ "dev": true
+ },
+ "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
+ },
+ "is-number-object": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
+ "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+ "dev": true,
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "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
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-set": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
+ "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==",
+ "dev": true,
+ "peer": true
+ },
+ "is-shared-array-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
+ "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2"
+ }
+ },
+ "is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="
+ },
+ "is-string": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "dev": true,
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-symbol": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.2"
+ }
+ },
+ "is-typed-array": {
+ "version": "1.1.10",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz",
+ "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==",
+ "dev": true,
+ "requires": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
+ },
+ "is-weakmap": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
+ "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
+ "dev": true,
+ "peer": true
+ },
+ "is-weakref": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
+ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2"
+ }
+ },
+ "is-weakset": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz",
+ "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.1"
+ }
+ },
+ "isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true,
+ "peer": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="
+ },
+ "jake": {
+ "version": "10.8.5",
+ "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz",
+ "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==",
+ "requires": {
+ "async": "^3.2.3",
+ "chalk": "^4.0.2",
+ "filelist": "^1.0.1",
+ "minimatch": "^3.0.4"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "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==",
+ "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=="
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+ },
+ "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==",
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "jimp": {
+ "version": "0.2.28",
+ "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.2.28.tgz",
+ "integrity": "sha512-9HT7DA279xkTlry2oG30s6AtOUglNiY2UdyYpj0yNI4/NBv8PmdNC0gcldgMU4HqvbUlrM3+v+6GaHnTkH23JQ==",
+ "requires": {
+ "bignumber.js": "^2.1.0",
+ "bmp-js": "0.0.3",
+ "es6-promise": "^3.0.2",
+ "exif-parser": "^0.1.9",
+ "file-type": "^3.1.0",
+ "jpeg-js": "^0.2.0",
+ "load-bmfont": "^1.2.3",
+ "mime": "^1.3.4",
+ "mkdirp": "0.5.1",
+ "pixelmatch": "^4.0.0",
+ "pngjs": "^3.0.0",
+ "read-chunk": "^1.0.1",
+ "request": "^2.65.0",
+ "stream-to-buffer": "^0.1.0",
+ "tinycolor2": "^1.1.2",
+ "url-regex": "^3.0.0"
+ }
+ },
+ "jpeg-js": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.2.0.tgz",
+ "integrity": "sha512-Ni9PffhJtYtdD7VwxH6V2MnievekGfUefosGCHadog0/jAevRu6HPjYeMHbUemn0IPE8d4wGa8UsOGsX+iKy2g=="
+ },
+ "js-sdsl": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz",
+ "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==",
+ "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=="
+ },
+ "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"
+ }
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
+ },
+ "jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true
+ },
+ "json-schema": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
+ },
+ "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=="
+ },
+ "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
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="
+ },
+ "json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "jsonwebtoken": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz",
+ "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==",
+ "requires": {
+ "jws": "^3.2.2",
+ "lodash": "^4.17.21",
+ "ms": "^2.1.1",
+ "semver": "^7.3.8"
+ },
+ "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==",
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "semver": {
+ "version": "7.3.8",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ }
+ }
+ },
+ "jsprim": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
+ "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
+ "requires": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.4.0",
+ "verror": "1.10.0"
+ }
+ },
+ "jsx-ast-utils": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz",
+ "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==",
+ "dev": true,
+ "requires": {
+ "array-includes": "^3.1.5",
+ "object.assign": "^4.1.3"
+ }
+ },
+ "jwa": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+ "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+ "requires": {
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "jws": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+ "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+ "requires": {
+ "jwa": "^1.4.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "kareem": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz",
+ "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA=="
+ },
+ "kuler": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
+ "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A=="
+ },
+ "language-subtag-registry": {
+ "version": "0.3.22",
+ "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz",
+ "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==",
+ "dev": true,
+ "peer": true
+ },
+ "language-tags": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz",
+ "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "language-subtag-registry": "~0.3.2"
+ }
+ },
+ "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"
+ }
+ },
+ "load-bmfont": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.1.tgz",
+ "integrity": "sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==",
+ "requires": {
+ "buffer-equal": "0.0.1",
+ "mime": "^1.3.4",
+ "parse-bmfont-ascii": "^1.0.3",
+ "parse-bmfont-binary": "^1.0.5",
+ "parse-bmfont-xml": "^1.1.4",
+ "phin": "^2.9.1",
+ "xhr": "^2.0.1",
+ "xtend": "^4.0.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": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "lodash-es": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
+ "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
+ },
+ "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
+ },
+ "logform": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz",
+ "integrity": "sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==",
+ "requires": {
+ "@colors/colors": "1.5.0",
+ "@types/triple-beam": "^1.3.2",
+ "fecha": "^4.2.0",
+ "ms": "^2.1.1",
+ "safe-stable-stringify": "^2.3.1",
+ "triple-beam": "^1.3.0"
+ }
+ },
+ "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"
+ }
+ },
+ "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"
+ }
+ },
+ "magic-string": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz",
+ "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/sourcemap-codec": "^1.4.13"
+ }
+ },
+ "make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "requires": {
+ "semver": "^6.0.0"
+ }
+ },
+ "media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
+ },
+ "memory-pager": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
+ "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
+ "optional": true
+ },
+ "merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
+ },
+ "merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true
+ },
+ "methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="
+ },
+ "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"
+ }
+ },
+ "middleware-async": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/middleware-async/-/middleware-async-1.3.5.tgz",
+ "integrity": "sha512-lprF7UUdDV+0EfREXARoNJUExNkupIMPzqgQaJnfUvxYH4iJuInJsDcE2r4vY9ec6wJ6vg63XWImCkKk4n1e4A=="
+ },
+ "mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
+ },
+ "mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
+ },
+ "mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "requires": {
+ "mime-db": "1.52.0"
+ }
+ },
+ "min-document": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
+ "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==",
+ "requires": {
+ "dom-walk": "^0.1.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
+ "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha512-SknJC52obPfGQPnjIkXbmA6+5H15E+fR+E4iR2oQ3zzCLbd7/ONua69R/Gw7AgkTLsRG+r5fzksYwWe1AgTyWA==",
+ "requires": {
+ "minimist": "0.0.8"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q=="
+ }
+ }
+ },
+ "ml-array-max": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/ml-array-max/-/ml-array-max-1.2.4.tgz",
+ "integrity": "sha512-BlEeg80jI0tW6WaPyGxf5Sa4sqvcyY6lbSn5Vcv44lp1I2GR6AWojfUvLnGTNsIXrZ8uqWmo8VcG1WpkI2ONMQ==",
+ "dev": true,
+ "requires": {
+ "is-any-array": "^2.0.0"
+ }
+ },
+ "ml-array-min": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/ml-array-min/-/ml-array-min-1.2.3.tgz",
+ "integrity": "sha512-VcZ5f3VZ1iihtrGvgfh/q0XlMobG6GQ8FsNyQXD3T+IlstDv85g8kfV0xUG1QPRO/t21aukaJowDzMTc7j5V6Q==",
+ "dev": true,
+ "requires": {
+ "is-any-array": "^2.0.0"
+ }
+ },
+ "ml-array-rescale": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/ml-array-rescale/-/ml-array-rescale-1.3.7.tgz",
+ "integrity": "sha512-48NGChTouvEo9KBctDfHC3udWnQKNKEWN0ziELvY3KG25GR5cA8K8wNVzracsqSW1QEkAXjTNx+ycgAv06/1mQ==",
+ "dev": true,
+ "requires": {
+ "is-any-array": "^2.0.0",
+ "ml-array-max": "^1.2.4",
+ "ml-array-min": "^1.2.3"
+ }
+ },
+ "ml-matrix": {
+ "version": "6.10.4",
+ "resolved": "https://registry.npmjs.org/ml-matrix/-/ml-matrix-6.10.4.tgz",
+ "integrity": "sha512-rUyEhfNPzqFsltYwvjNeYQXlYEaVea3KgzcJKJteQUj2WVAGFx9fLNRjtMR9mg2B6bd5buxlmkZmxM4hmO+SKg==",
+ "dev": true,
+ "requires": {
+ "is-any-array": "^2.0.0",
+ "ml-array-rescale": "^1.3.7"
+ }
+ },
+ "mongodb": {
+ "version": "4.13.0",
+ "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.13.0.tgz",
+ "integrity": "sha512-+taZ/bV8d1pYuHL4U+gSwkhmDrwkWbH1l4aah4YpmpscMwgFBkufIKxgP/G7m87/NUuQzc2Z75ZTI7ZOyqZLbw==",
+ "requires": {
+ "@aws-sdk/credential-providers": "^3.186.0",
+ "bson": "^4.7.0",
+ "mongodb-connection-string-url": "^2.5.4",
+ "saslprep": "^1.0.3",
+ "socks": "^2.7.1"
+ }
+ },
+ "mongodb-connection-string-url": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz",
+ "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==",
+ "requires": {
+ "@types/whatwg-url": "^8.2.1",
+ "whatwg-url": "^11.0.0"
+ }
+ },
+ "mongoose": {
+ "version": "6.9.0",
+ "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-6.9.0.tgz",
+ "integrity": "sha512-5tu6+trwjk5TIH6b6iYgAwmzZ0RNOxFoqXQb9h21Oi45DeM1rWM/niHxJ4ROqBISDfQMwRvLSABHTsyn3AzoFQ==",
+ "requires": {
+ "bson": "^4.7.0",
+ "kareem": "2.5.1",
+ "mongodb": "4.13.0",
+ "mpath": "0.9.0",
+ "mquery": "4.0.3",
+ "ms": "2.1.3",
+ "sift": "16.0.1"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ }
+ }
+ },
+ "mpath": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz",
+ "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew=="
+ },
+ "mquery": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/mquery/-/mquery-4.0.3.tgz",
+ "integrity": "sha512-J5heI+P08I6VJ2Ky3+33IpCdAvlYGTSUjwTPxkAr8i8EoduPMBX2OY/wa3IKZIQl7MU4SbFk8ndgSKyB/cl1zA==",
+ "requires": {
+ "debug": "4.x"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "nanoclone": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz",
+ "integrity": "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA=="
+ },
+ "nanoid": {
+ "version": "3.3.4",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
+ "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
+ "dev": true
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "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
+ },
+ "negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
+ },
+ "node-captcha-generator": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/node-captcha-generator/-/node-captcha-generator-0.0.1.tgz",
+ "integrity": "sha512-ecTkwWSPADpmeAzNODVNWJOKECQnaYGMhkmEdtYjpBcBIsQY73nIcJcVzEHb3Nn6bqSCcT/VY9YsaxbANLX4HA==",
+ "requires": {
+ "jimp": "^0.2.24",
+ "lodash": "^4.13.1"
+ }
+ },
+ "node-releases": {
+ "version": "2.0.9",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.9.tgz",
+ "integrity": "sha512-2xfmOrRkGogbTK9R6Leda0DGiXeY3p2NJpy4+gNCffdUvV6mdEJnaDEic1i3Ec2djAo8jWYoJMR5PB0MSMpxUA==",
+ "dev": true
+ },
+ "nodemailer": {
+ "version": "6.9.1",
+ "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.1.tgz",
+ "integrity": "sha512-qHw7dOiU5UKNnQpXktdgQ1d3OFgRAekuvbJLcdG5dnEo/GtcTHRYM7+UfJARdOFU9WUQO8OiIamgWPmiSFHYAA=="
+ },
+ "nodemon": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz",
+ "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==",
+ "dev": true,
+ "requires": {
+ "chokidar": "^3.5.2",
+ "debug": "^3.2.7",
+ "ignore-by-default": "^1.0.1",
+ "minimatch": "^3.1.2",
+ "pstree.remy": "^1.1.8",
+ "semver": "^5.7.1",
+ "simple-update-notifier": "^1.0.7",
+ "supports-color": "^5.5.0",
+ "touch": "^3.1.0",
+ "undefsafe": "^2.0.5"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ }
+ }
+ },
+ "nopt": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
+ "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==",
+ "dev": true,
+ "requires": {
+ "abbrev": "1"
+ }
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+ },
+ "oauth-sign": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
+ },
+ "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=="
+ },
+ "object-inspect": {
+ "version": "1.12.3",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
+ "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g=="
+ },
+ "object-is": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
+ "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
+ "dev": true,
+ "peer": true,
+ "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==",
+ "dev": true
+ },
+ "object.assign": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
+ "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "has-symbols": "^1.0.3",
+ "object-keys": "^1.1.1"
+ }
+ },
+ "object.entries": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz",
+ "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ }
+ },
+ "object.fromentries": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz",
+ "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ }
+ },
+ "object.hasown": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz",
+ "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ }
+ },
+ "object.values": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz",
+ "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ }
+ },
+ "on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "one-time": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz",
+ "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==",
+ "requires": {
+ "fn.name": "1.x.x"
+ }
+ },
+ "optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "requires": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ }
+ },
+ "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"
+ }
+ },
+ "p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
+ },
+ "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"
+ }
+ },
+ "parse-bmfont-ascii": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz",
+ "integrity": "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA=="
+ },
+ "parse-bmfont-binary": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz",
+ "integrity": "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA=="
+ },
+ "parse-bmfont-xml": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz",
+ "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==",
+ "requires": {
+ "xml-parse-from-string": "^1.0.0",
+ "xml2js": "^0.4.5"
+ }
+ },
+ "parse-headers": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz",
+ "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA=="
+ },
+ "parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
+ },
+ "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=="
+ },
+ "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=="
+ },
+ "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
+ },
+ "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==",
+ "dev": true
+ },
+ "path-to-regexp": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
+ },
+ "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
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="
+ },
+ "phin": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz",
+ "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA=="
+ },
+ "picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true
+ },
+ "picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg=="
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==",
+ "requires": {
+ "pinkie": "^2.0.0"
+ }
+ },
+ "pixelmatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz",
+ "integrity": "sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==",
+ "requires": {
+ "pngjs": "^3.0.0"
+ }
+ },
+ "pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "requires": {
+ "find-up": "^4.0.0"
+ },
+ "dependencies": {
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
+ "p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "requires": {
+ "p-limit": "^2.2.0"
+ }
+ }
+ }
+ },
+ "pngjs": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz",
+ "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w=="
+ },
+ "postcss": {
+ "version": "8.4.21",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz",
+ "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==",
+ "dev": true,
+ "requires": {
+ "nanoid": "^3.3.4",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ }
+ },
+ "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
+ },
+ "prettier": {
+ "version": "2.8.3",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.3.tgz",
+ "integrity": "sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw==",
+ "dev": true
+ },
+ "prettier-linter-helpers": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+ "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+ "dev": true,
+ "requires": {
+ "fast-diff": "^1.1.2"
+ }
+ },
+ "process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="
+ },
+ "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": {
+ "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=="
+ }
+ }
+ },
+ "property-expr": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz",
+ "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA=="
+ },
+ "proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "requires": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ }
+ },
+ "psl": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
+ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
+ },
+ "pstree.remy": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
+ "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+ "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA=="
+ },
+ "qs": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+ "requires": {
+ "side-channel": "^1.0.4"
+ }
+ },
+ "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
+ },
+ "range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
+ },
+ "raw-body": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
+ "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
+ "requires": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ }
+ },
+ "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-fast-compare": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz",
+ "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw=="
+ },
+ "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-redux": {
+ "version": "8.0.5",
+ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.0.5.tgz",
+ "integrity": "sha512-Q2f6fCKxPFpkXt1qNRZdEDLlScsDWyrgSj0mliK59qU6W5gvBiKkdMEG2lJzhd1rCctf0hb6EtePPLZ2e0m1uw==",
+ "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"
+ }
+ },
+ "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-router": {
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.8.0.tgz",
+ "integrity": "sha512-760bk7y3QwabduExtudhWbd88IBbuD1YfwzpuDUAlJUJ7laIIcqhMvdhSVh1Fur1PE8cGl84L0dxhR3/gvHF7A==",
+ "requires": {
+ "@remix-run/router": "1.3.1"
+ }
+ },
+ "react-router-dom": {
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.8.0.tgz",
+ "integrity": "sha512-hQouduSTywGJndE86CXJ2h7YEy4HYC6C/uh19etM+79FfQ6cFFFHnHyDlzO4Pq0eBUI96E4qVE5yUjA00yJZGQ==",
+ "requires": {
+ "@remix-run/router": "1.3.1",
+ "react-router": "6.8.0"
+ }
+ },
+ "read-chunk": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-1.0.1.tgz",
+ "integrity": "sha512-5NLTTdX45dKFtG8CX5pKmvS9V5u9wBE+gkklN7xhDuhq3pA2I4O7ALfKxosCMcLHOhkxj6GNacZhfXtp5nlCdg=="
+ },
+ "readable-stream": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.1.tgz",
+ "integrity": "sha512-+rQmrWMYGA90yenhTYsLWAsLsqVC8osOw6PKE1HDYiO0gdPeKe/xDHNzIAIn4C91YQ6oenEhfYqqc1883qHbjQ==",
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ },
+ "readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "requires": {
+ "picomatch": "^2.2.1"
+ }
+ },
+ "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": {}
+ },
+ "regenerator-runtime": {
+ "version": "0.13.11",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
+ },
+ "regexp.prototype.flags": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
+ "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3",
+ "functions-have-names": "^1.2.2"
+ }
+ },
+ "regexpp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+ "dev": true
+ },
+ "request": {
+ "version": "2.88.2",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+ "requires": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.3.2",
+ "har-validator": "~5.1.3",
+ "http-signature": "~1.2.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.5.0",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
+ },
+ "dependencies": {
+ "qs": {
+ "version": "6.5.3",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
+ "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA=="
+ },
+ "uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
+ }
+ }
+ },
+ "reselect": {
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz",
+ "integrity": "sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A=="
+ },
+ "resolve": {
+ "version": "1.22.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+ "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+ "dev": true,
+ "requires": {
+ "is-core-module": "^2.9.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==",
+ "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"
+ }
+ },
+ "rollup": {
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.12.0.tgz",
+ "integrity": "sha512-4MZ8kA2HNYahIjz63rzrMMRvDqQDeS9LoriJvMuV0V6zIGysP36e9t4yObUfwdT9h/szXoHQideICftcdZklWg==",
+ "dev": true,
+ "requires": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "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"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+ },
+ "safe-regex-test": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
+ "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.3",
+ "is-regex": "^1.1.4"
+ }
+ },
+ "safe-stable-stringify": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.2.tgz",
+ "integrity": "sha512-gMxvPJYhP0O9n2pvcfYfIuYgbledAOJFcqRThtPRmjscaipiwcwPPKLytpVzMkG2HAN87Qmo2d4PtGiri1dSLA=="
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "saslprep": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
+ "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
+ "optional": true,
+ "requires": {
+ "sparse-bitfield": "^3.0.3"
+ }
+ },
+ "sass": {
+ "version": "1.57.1",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.57.1.tgz",
+ "integrity": "sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw==",
+ "dev": true,
+ "requires": {
+ "chokidar": ">=3.0.0 <4.0.0",
+ "immutable": "^4.0.0",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ }
+ },
+ "sax": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+ },
+ "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": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+ },
+ "send": {
+ "version": "0.18.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
+ "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
+ "requires": {
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "2.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ }
+ }
+ },
+ "ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ }
+ }
+ },
+ "serve-static": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
+ "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
+ "requires": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.18.0"
+ }
+ },
+ "setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
+ },
+ "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
+ },
+ "side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "requires": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ }
+ },
+ "sift": {
+ "version": "16.0.1",
+ "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz",
+ "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ=="
+ },
+ "simple-swizzle": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+ "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
+ "requires": {
+ "is-arrayish": "^0.3.1"
+ }
+ },
+ "simple-update-notifier": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz",
+ "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==",
+ "dev": true,
+ "requires": {
+ "semver": "~7.0.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
+ "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
+ "dev": true
+ }
+ }
+ },
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true
+ },
+ "smart-buffer": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
+ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="
+ },
+ "socks": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz",
+ "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==",
+ "requires": {
+ "ip": "^2.0.0",
+ "smart-buffer": "^4.2.0"
+ }
+ },
+ "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==",
+ "dev": true
+ },
+ "sparse-bitfield": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
+ "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
+ "optional": true,
+ "requires": {
+ "memory-pager": "^1.0.2"
+ }
+ },
+ "sshpk": {
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
+ "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
+ "requires": {
+ "asn1": "~0.2.3",
+ "assert-plus": "^1.0.0",
+ "bcrypt-pbkdf": "^1.0.0",
+ "dashdash": "^1.12.0",
+ "ecc-jsbn": "~0.1.1",
+ "getpass": "^0.1.1",
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.0.2",
+ "tweetnacl": "~0.14.0"
+ }
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg=="
+ },
+ "statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
+ },
+ "stop-iteration-iterator": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz",
+ "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "internal-slot": "^1.0.4"
+ }
+ },
+ "stream-to": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/stream-to/-/stream-to-0.2.2.tgz",
+ "integrity": "sha512-Kg1BSDTwgGiVMtTCJNlo7kk/xzL33ZuZveEBRt6rXw+f1WLK/8kmz2NVCT/Qnv0JkV85JOHcLhD82mnXsR3kPw=="
+ },
+ "stream-to-buffer": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz",
+ "integrity": "sha512-Da4WoKaZyu3nf+bIdIifh7IPkFjARBnBK+pYqn0EUJqksjV9afojjaCCHUemH30Jmu7T2qcKvlZm2ykN38uzaw==",
+ "requires": {
+ "stream-to": "~0.2.0"
+ }
+ },
+ "string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "requires": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "string.prototype.matchall": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz",
+ "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "get-intrinsic": "^1.1.3",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.3",
+ "regexp.prototype.flags": "^1.4.3",
+ "side-channel": "^1.0.4"
+ }
+ },
+ "string.prototype.trimend": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz",
+ "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ }
+ },
+ "string.prototype.trimstart": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz",
+ "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4"
+ }
+ },
+ "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-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true
+ },
+ "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
+ },
+ "strip-outer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz",
+ "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==",
+ "requires": {
+ "escape-string-regexp": "^1.0.2"
+ }
+ },
+ "strnum": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
+ "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==",
+ "optional": 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"
+ }
+ },
+ "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==",
+ "dev": true
+ },
+ "text-hex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
+ "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg=="
+ },
+ "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
+ },
+ "tiny-warning": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz",
+ "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
+ },
+ "tinycolor2": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz",
+ "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw=="
+ },
+ "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
+ },
+ "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"
+ }
+ },
+ "toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
+ },
+ "toposort": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz",
+ "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg=="
+ },
+ "touch": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
+ "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
+ "dev": true,
+ "requires": {
+ "nopt": "~1.0.10"
+ }
+ },
+ "tough-cookie": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+ "requires": {
+ "psl": "^1.1.28",
+ "punycode": "^2.1.1"
+ }
+ },
+ "tr46": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
+ "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
+ "requires": {
+ "punycode": "^2.1.1"
+ }
+ },
+ "trim-repeated": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
+ "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==",
+ "requires": {
+ "escape-string-regexp": "^1.0.2"
+ }
+ },
+ "triple-beam": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz",
+ "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw=="
+ },
+ "tsconfig-paths": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz",
+ "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==",
+ "dev": true,
+ "requires": {
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.1",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ },
+ "dependencies": {
+ "json5": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ }
+ }
+ },
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ },
+ "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"
+ }
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="
+ },
+ "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
+ },
+ "type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "requires": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ }
+ },
+ "typed-array-length": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
+ "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "is-typed-array": "^1.1.9"
+ }
+ },
+ "typescript": {
+ "version": "4.9.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
+ "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
+ "dev": true
+ },
+ "unbox-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.0.3",
+ "which-boxed-primitive": "^1.0.2"
+ }
+ },
+ "undefsafe": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
+ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
+ "dev": true
+ },
+ "universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
+ },
+ "update-browserslist-db": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
+ "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
+ "dev": true,
+ "requires": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ }
+ },
+ "uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "url-regex": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz",
+ "integrity": "sha512-dQ9cJzMou5OKr6ZzfvwJkCq3rC72PNXhqz0v3EIhF4a3Np+ujr100AhUx2cKx5ei3iymoJpJrPB3sVSEMdqAeg==",
+ "requires": {
+ "ip-regex": "^1.0.1"
+ }
+ },
+ "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": {}
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ },
+ "utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="
+ },
+ "uuid": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz",
+ "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg=="
+ },
+ "validator": {
+ "version": "13.9.0",
+ "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz",
+ "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA=="
+ },
+ "vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
+ },
+ "verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "^1.2.0"
+ }
+ },
+ "vite": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-4.0.4.tgz",
+ "integrity": "sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==",
+ "dev": true,
+ "requires": {
+ "esbuild": "^0.16.3",
+ "fsevents": "~2.3.2",
+ "postcss": "^8.4.20",
+ "resolve": "^1.22.1",
+ "rollup": "^3.7.0"
+ }
+ },
+ "webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="
+ },
+ "whatwg-url": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
+ "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
+ "requires": {
+ "tr46": "^3.0.0",
+ "webidl-conversions": "^7.0.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"
+ }
+ },
+ "which-boxed-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "dev": true,
+ "requires": {
+ "is-bigint": "^1.0.1",
+ "is-boolean-object": "^1.1.0",
+ "is-number-object": "^1.0.4",
+ "is-string": "^1.0.5",
+ "is-symbol": "^1.0.3"
+ }
+ },
+ "which-collection": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
+ "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
+ "dev": true,
+ "peer": true,
+ "requires": {
+ "is-map": "^2.0.1",
+ "is-set": "^2.0.1",
+ "is-weakmap": "^2.0.1",
+ "is-weakset": "^2.0.1"
+ }
+ },
+ "which-typed-array": {
+ "version": "1.1.9",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz",
+ "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==",
+ "dev": true,
+ "requires": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-tostringtag": "^1.0.0",
+ "is-typed-array": "^1.1.10"
+ }
+ },
+ "winston": {
+ "version": "3.8.2",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-3.8.2.tgz",
+ "integrity": "sha512-MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew==",
+ "requires": {
+ "@colors/colors": "1.5.0",
+ "@dabh/diagnostics": "^2.0.2",
+ "async": "^3.2.3",
+ "is-stream": "^2.0.0",
+ "logform": "^2.4.0",
+ "one-time": "^1.0.0",
+ "readable-stream": "^3.4.0",
+ "safe-stable-stringify": "^2.3.1",
+ "stack-trace": "0.0.x",
+ "triple-beam": "^1.3.0",
+ "winston-transport": "^4.5.0"
+ }
+ },
+ "winston-transport": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz",
+ "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==",
+ "requires": {
+ "logform": "^2.3.2",
+ "readable-stream": "^3.6.0",
+ "triple-beam": "^1.3.0"
+ }
+ },
+ "word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ },
+ "ws": {
+ "version": "8.12.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz",
+ "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==",
+ "requires": {}
+ },
+ "xhr": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz",
+ "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==",
+ "requires": {
+ "global": "~4.4.0",
+ "is-function": "^1.0.1",
+ "parse-headers": "^2.0.0",
+ "xtend": "^4.0.0"
+ }
+ },
+ "xml-parse-from-string": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz",
+ "integrity": "sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g=="
+ },
+ "xml2js": {
+ "version": "0.4.23",
+ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
+ "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
+ "requires": {
+ "sax": ">=0.6.0",
+ "xmlbuilder": "~11.0.0"
+ }
+ },
+ "xmlbuilder": {
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
+ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="
+ },
+ "xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
+ },
+ "yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "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
+ },
+ "yup": {
+ "version": "0.32.11",
+ "resolved": "https://registry.npmjs.org/yup/-/yup-0.32.11.tgz",
+ "integrity": "sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==",
+ "requires": {
+ "@babel/runtime": "^7.15.4",
+ "@types/lodash": "^4.14.175",
+ "lodash": "^4.17.21",
+ "lodash-es": "^4.17.21",
+ "nanoclone": "^0.2.1",
+ "property-expr": "^2.0.4",
+ "toposort": "^2.0.2"
+ }
+ },
+ "zustand": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.3.2.tgz",
+ "integrity": "sha512-rd4haDmlwMTVWVqwvgy00ny8rtti/klRoZjFbL/MAcDnmD5qSw/RZc+Vddstdv90M5Lv6RPgWvm1Hivyn0QgJw==",
+ "requires": {
+ "use-sync-external-store": "1.2.0"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..5940caf
--- /dev/null
+++ b/package.json
@@ -0,0 +1,75 @@
+{
+ "name": "rsclone",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite --host",
+ "server": "node backEnd/server.mjs",
+ "dev-server": "nodemon backEnd/server.mjs",
+ "dev-all": "nodemon backEnd/server.mjs | vite --host",
+ "build": "tsc && vite build",
+ "preview": "vite preview",
+ "lint": "npx eslint .",
+ "lint:fix": "npx eslint . --fix",
+ "deploy": "gh-pages -d dist"
+ },
+ "dependencies": {
+ "@fortawesome/fontawesome-svg-core": "^6.2.1",
+ "@fortawesome/free-regular-svg-icons": "^6.2.1",
+ "@fortawesome/free-solid-svg-icons": "^6.2.1",
+ "@fortawesome/react-fontawesome": "^0.2.0",
+ "@reduxjs/toolkit": "^1.9.2",
+ "@types/express-ws": "^3.0.1",
+ "@types/ws": "^8.5.4",
+ "bcryptjs": "^2.4.3",
+ "body-parser": "^1.20.1",
+ "clsx": "^1.2.1",
+ "cookie-parser": "^1.4.6",
+ "cors": "^2.8.5",
+ "dotenv": "^16.0.3",
+ "ejs": "^3.1.8",
+ "express": "^4.18.2",
+ "express-validator": "^6.14.3",
+ "express-ws": "^5.0.2",
+ "formik": "^2.2.9",
+ "gh-pages": "^5.0.0",
+ "jsonwebtoken": "^9.0.0",
+ "middleware-async": "^1.3.5",
+ "mongoose": "^6.9.0",
+ "node-captcha-generator": "^0.0.1",
+ "nodemailer": "^6.9.1",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0",
+ "react-redux": "^8.0.5",
+ "react-router-dom": "^6.8.0",
+ "uuid": "^9.0.0",
+ "winston": "^3.8.2",
+ "ws": "^8.12.1",
+ "yup": "^0.32.11",
+ "zustand": "^4.3.2"
+ },
+ "devDependencies": {
+ "@types/react": "^18.0.26",
+ "@types/react-dom": "^18.0.9",
+ "@typescript-eslint/eslint-plugin": "^5.50.0",
+ "@typescript-eslint/parser": "^5.50.0",
+ "@vitejs/plugin-react": "^3.0.0",
+ "eslint": "^8.33.0",
+ "eslint-config-airbnb": "^19.0.4",
+ "eslint-config-prettier": "^8.6.0",
+ "eslint-config-standard-with-typescript": "^33.0.0",
+ "eslint-plugin-import": "^2.27.5",
+ "eslint-plugin-n": "^15.6.1",
+ "eslint-plugin-prettier": "^4.2.1",
+ "eslint-plugin-promise": "^6.1.1",
+ "eslint-plugin-react": "^7.32.2",
+ "eslint-plugin-react-hooks": "^4.6.0",
+ "ml-matrix": "^6.10.4",
+ "nodemon": "^2.0.20",
+ "prettier": "^2.8.3",
+ "sass": "^1.57.1",
+ "typescript": "^4.9.5",
+ "vite": "^4.0.0"
+ }
+}
diff --git a/public/images/GamingZoneText.png b/public/images/GamingZoneText.png
new file mode 100644
index 0000000..a5ba12a
Binary files /dev/null and b/public/images/GamingZoneText.png differ
diff --git a/public/images/admin.png b/public/images/admin.png
new file mode 100644
index 0000000..2a4604b
Binary files /dev/null and b/public/images/admin.png differ
diff --git a/public/images/day-and-night.png b/public/images/day-and-night.png
new file mode 100644
index 0000000..a388ce4
Binary files /dev/null and b/public/images/day-and-night.png differ
diff --git a/public/images/joystick.png b/public/images/joystick.png
new file mode 100644
index 0000000..750cc18
Binary files /dev/null and b/public/images/joystick.png differ
diff --git a/public/images/logo.png b/public/images/logo.png
new file mode 100644
index 0000000..d8e3165
Binary files /dev/null and b/public/images/logo.png differ
diff --git a/public/images/logo/gamingzone.png b/public/images/logo/gamingzone.png
new file mode 100644
index 0000000..24481f4
Binary files /dev/null and b/public/images/logo/gamingzone.png differ
diff --git a/public/images/main.png b/public/images/main.png
new file mode 100644
index 0000000..105bd1a
Binary files /dev/null and b/public/images/main.png differ
diff --git a/public/images/user.png b/public/images/user.png
new file mode 100644
index 0000000..55d1e7c
Binary files /dev/null and b/public/images/user.png differ
diff --git a/public/images/video-game.png b/public/images/video-game.png
new file mode 100644
index 0000000..3077af9
Binary files /dev/null and b/public/images/video-game.png differ
diff --git a/public/vite.svg b/public/vite.svg
new file mode 100644
index 0000000..e7b8dfb
--- /dev/null
+++ b/public/vite.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/App.scss b/src/App.scss
new file mode 100644
index 0000000..efa6cd0
--- /dev/null
+++ b/src/App.scss
@@ -0,0 +1,65 @@
+@import url('https://fonts.googleapis.com/css2?family=Russo+One&display=swap');
+
+#root {
+ font-family: 'Roboto', sans-serif;
+ padding: 0;
+ width: 100%;
+ margin: 0 auto;
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+}
+
+body,
+h1,
+h2,
+h3,
+h4,
+p,
+ul[class],
+ol[class],
+li,
+figure,
+figcaption,
+blockquote,
+dl,
+dd {
+ margin: 0;
+}
+
+.App {
+ min-height: calc(100vh - 160px);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.darkApp{
+ min-height: calc(100vh - 160px);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-color: #141227;
+ color: #fffef0;;
+}
+
+@media screen and (max-width: 640px) {
+ .App {
+ min-height: calc(100vh - 150px);
+ }
+ .darkApp {
+ min-height: calc(100vh - 150px);
+ }
+}
+
+@media screen and (max-width: 480px) {
+ .App {
+ min-height: calc(100vh - 316px);
+ }
+ .darkApp {
+ min-height: calc(100vh - 316px);
+ }
+}
\ No newline at end of file
diff --git a/src/App.tsx b/src/App.tsx
new file mode 100644
index 0000000..3cd8b76
--- /dev/null
+++ b/src/App.tsx
@@ -0,0 +1,38 @@
+import { Routes, Route } from "react-router-dom";
+
+import "./App.scss";
+import Games from "./Pages/Games/Games";
+import MainPage from "./Pages/MainPage";
+import MemoryGame from "./Pages/MemoryGame/MemoryGame";
+import NotFound from "./Pages/NotFound/NotFound";
+import PreviewPage from "./Pages/PreviewPage/PreviewPage";
+import { CreateGame } from "./Pages/SeaBattle/CreateGame";
+import { SeaBattle } from "./Pages/SeaBattle/SeaBattle";
+import Tetris from "./Pages/Tetris";
+import UserPage from "./Pages/UserPage/UserPage";
+import themeStore from "./store/theme";
+
+const App = () => {
+ const isDark = themeStore((state) => state.isDark);
+
+ document.addEventListener("pinch-zoom", (e) => e.preventDefault());
+
+ return (
+
+
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+ } />
+
+
+ );
+};
+
+export default App;
diff --git a/src/Components/Authentication/ChangePass/index.tsx b/src/Components/Authentication/ChangePass/index.tsx
new file mode 100644
index 0000000..f38ecae
--- /dev/null
+++ b/src/Components/Authentication/ChangePass/index.tsx
@@ -0,0 +1,110 @@
+import { useFormik } from "formik";
+import type { FC } from "react";
+import { useState } from "react";
+import * as yup from "yup";
+
+import { changePassword } from "../../../controller/Auth";
+import { MESSAGES_EN, MESSAGES_RU } from "../../../data/restMsgs";
+import useUserStore from "../../../store";
+import languageStore from "../../../store/language";
+import useStatusStore from "../../../store/load-status";
+import Button from "../../common/Button";
+import Input from "../../common/Input";
+
+import "../style.scss";
+
+interface ChangePassProps {
+ setModalClosed: () => void;
+}
+
+const ChangePass: FC = ({ setModalClosed }) => {
+ const [errorMsg, setErrorMsg] = useState(null);
+ const { userName } = useUserStore();
+
+ const { setStatus } = useStatusStore();
+ const { isEn } = languageStore();
+
+ const schema = yup.object().shape({
+ password: yup.string().required(),
+ newPassword: yup.string().required(),
+ confirmPassword: yup
+ .string()
+ .equals(
+ [yup.ref("newPassword")],
+ isEn
+ ? "Должен совподать с полем Новый пароль"
+ : "Should be equal to New password"
+ ),
+ });
+
+ const inputsProps = [
+ {
+ key: "password",
+ label: isEn ? "Пароль" : "Password",
+ type: "password",
+ placeholder: isEn ? "Пароль" : "Password",
+ },
+ {
+ key: "newPassword",
+ label: isEn ? "Новый пароль" : "New password",
+ type: "password",
+ placeholder: isEn ? "Новый пароль" : "New password",
+ },
+ {
+ key: "confirmPassword",
+ label: "Confirm password",
+ type: "password",
+ placeholder: "Confirm password",
+ },
+ ] as const;
+
+ const { values, handleChange, handleBlur, handleSubmit, errors, touched } =
+ useFormik({
+ initialValues: {
+ password: "",
+ newPassword: "",
+ confirmPassword: "",
+ },
+ validationSchema: schema,
+ onSubmit: (data) => {
+ setStatus({ isLoading: true, message: "" });
+ changePassword(data)
+ .then(({ message }) => setStatus({ isLoading: false, message }))
+ .then(setModalClosed)
+ .catch(({ message }) => {
+ setStatus({ isLoading: false, message: "" });
+ const msg = isEn ? MESSAGES_RU[message] : MESSAGES_EN[message];
+ setErrorMsg(msg);
+ });
+ },
+ });
+
+ return (
+
+
Change password for {userName}:
+
+
+ );
+};
+
+export default ChangePass;
diff --git a/src/Components/Authentication/Forgot/forgot.utils.ts b/src/Components/Authentication/Forgot/forgot.utils.ts
new file mode 100644
index 0000000..849a3da
--- /dev/null
+++ b/src/Components/Authentication/Forgot/forgot.utils.ts
@@ -0,0 +1,7 @@
+export const isEmail = (str: string) => {
+ try {
+ return str.split("@")[1].includes(".");
+ } catch {
+ return false;
+ }
+};
diff --git a/src/Components/Authentication/Forgot/index.tsx b/src/Components/Authentication/Forgot/index.tsx
new file mode 100644
index 0000000..82962dd
--- /dev/null
+++ b/src/Components/Authentication/Forgot/index.tsx
@@ -0,0 +1,109 @@
+import { useFormik } from "formik";
+import type { FC } from "react";
+import { useState } from "react";
+import * as yup from "yup";
+
+import { forgotPassword } from "../../../controller/Auth";
+import { MESSAGES_EN, MESSAGES_RU } from "../../../data/restMsgs";
+import languageStore from "../../../store/language";
+import useStatusStore from "../../../store/load-status";
+import Button from "../../common/Button";
+import Input from "../../common/Input";
+import HelperText from "../HelperText";
+
+import "../style.scss";
+import { isEmail } from "./forgot.utils";
+
+const schema = yup.object().shape({
+ userName: yup.string().min(3).max(30).required(),
+});
+
+const inputsProps = [
+ {
+ key: "userName",
+ labelEn: "Name or Email",
+ labelRu: "Имя или Почта",
+ placeholderEn: "Name or Email",
+ placeholderRu: "Имя или почта",
+ type: "text",
+ },
+] as const;
+
+interface ForgotPassProps {
+ setSignInModalOpened: () => void;
+}
+
+const ForgotPass: FC = ({ setSignInModalOpened }) => {
+ const [errorMsg, setErrorMsg] = useState(null);
+ const { isEn } = languageStore();
+ const { setStatus } = useStatusStore();
+
+ const { values, handleChange, handleBlur, handleSubmit, errors, touched } =
+ useFormik({
+ initialValues: {
+ userName: "",
+ },
+ validationSchema: schema,
+ onSubmit: (data) => {
+ setStatus({ isLoading: true, message: "" });
+
+ const newData = isEmail(data.userName)
+ ? { email: data.userName }
+ : { userName: data.userName };
+
+ forgotPassword(newData)
+ .then(({ message }) => {
+ setStatus({ isLoading: false, message });
+ })
+ .catch((err) => {
+ setStatus({ isLoading: false, message: "" });
+ const msg = isEn
+ ? MESSAGES_RU[err.message]
+ : MESSAGES_EN[err.message];
+ setErrorMsg(msg);
+ });
+ },
+ });
+
+ return (
+
+
+ {isEn ? "Забыли пароль :" : "Forgot password:"}
+
+
+
+ );
+};
+
+export default ForgotPass;
diff --git a/src/Components/Authentication/HelperText/index.tsx b/src/Components/Authentication/HelperText/index.tsx
new file mode 100644
index 0000000..d71e997
--- /dev/null
+++ b/src/Components/Authentication/HelperText/index.tsx
@@ -0,0 +1,19 @@
+import type { FC } from "react";
+import "./style.scss";
+
+interface HelperTextProps {
+ text: string;
+ linkText: string;
+ onClick: () => void;
+}
+
+const HelperText: FC = ({ text, linkText, onClick }) => (
+
+ {text}
+
+ {` ${linkText}`}
+
+
+);
+
+export default HelperText;
diff --git a/src/Components/Authentication/HelperText/style.scss b/src/Components/Authentication/HelperText/style.scss
new file mode 100644
index 0000000..93c6ea5
--- /dev/null
+++ b/src/Components/Authentication/HelperText/style.scss
@@ -0,0 +1,22 @@
+.helper-text {
+ font-size: 16px;
+ line-height: 18px;
+ text-align: center;
+
+ &__link {
+ color: #764ba2;
+ cursor: pointer;
+ font-weight: 800;
+ font-size: 16px;
+ background: transparent;
+ border: none;
+ padding-left: 4px;
+
+ &:hover,
+ &:focus {
+ color: #462a62;
+ border: none;
+ outline: unset;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Components/Authentication/Reset/index.tsx b/src/Components/Authentication/Reset/index.tsx
new file mode 100644
index 0000000..a52ba98
--- /dev/null
+++ b/src/Components/Authentication/Reset/index.tsx
@@ -0,0 +1,124 @@
+import { useFormik } from "formik";
+import type { FC } from "react";
+import { useState, useEffect } from "react";
+import * as yup from "yup";
+
+import {
+ getUserNameByResetToken,
+ setNewPassword,
+} from "../../../controller/Auth";
+import { MESSAGES_EN, MESSAGES_RU } from "../../../data/restMsgs";
+import languageStore from "../../../store/language";
+import useStatusStore from "../../../store/load-status";
+import Button from "../../common/Button";
+import Input from "../../common/Input";
+
+import "../style.scss";
+
+const schema = yup.object().shape({
+ password: yup.string().required(),
+ confirmPassword: yup
+ .string()
+ .equals([yup.ref("password")], "Should be equal to password"),
+});
+
+const inputsProps = [
+ {
+ key: "password",
+ labelEn: "Password",
+ labelRu: "Пароль",
+ type: "password",
+ placeholderEn: "Password",
+ placeholderRu: "Пароль",
+ },
+ {
+ key: "confirmPassword",
+ labelEn: "Confirm password",
+ labelRu: "Подтвердить пароль",
+ type: "password",
+ placeholderEn: "Confirm password",
+ placeholderRu: "Подтвердить пароль",
+ },
+] as const;
+
+interface ResetPassProps {
+ resetToken: string;
+}
+
+const ResetPass: FC = ({ resetToken }) => {
+ const [errorMsg, setErrorMsg] = useState(null);
+ const [userName, setUserName] = useState("");
+ const { isEn } = languageStore();
+ const { setStatus } = useStatusStore();
+
+ useEffect(() => {
+ setStatus({ isLoading: true, message: "" });
+ getUserNameByResetToken(resetToken)
+ .then((resp) => {
+ const resUserName = resp.userName ?? "";
+ setUserName(resUserName);
+ setStatus({ isLoading: false, message: "" });
+ })
+ .catch((error) => {
+ try {
+ const { message } = JSON.parse(error);
+ setStatus({ isLoading: false, message });
+ } catch {
+ setStatus({ isLoading: false, message: error.message });
+ }
+ });
+ }, []);
+
+ const { values, handleChange, handleBlur, handleSubmit, errors, touched } =
+ useFormik({
+ initialValues: {
+ userName: "",
+ password: "",
+ confirmPassword: "",
+ },
+ validationSchema: schema,
+ onSubmit: (data) => {
+ setStatus({ isLoading: true, message: "" });
+ const { password } = data;
+ setNewPassword({ resetToken, password })
+ .then(({ message }) => setStatus({ isLoading: false, message }))
+ .catch(({ message }) => {
+ const msg = isEn ? MESSAGES_RU[message] : MESSAGES_EN[message];
+ setErrorMsg(msg);
+ });
+ },
+ });
+
+ return (
+
+
+ {isEn ? "Пароль для" : "Set password for"} {userName}:
+
+
+
+ );
+};
+
+export default ResetPass;
diff --git a/src/Components/Authentication/SignIn/index.tsx b/src/Components/Authentication/SignIn/index.tsx
new file mode 100644
index 0000000..72b34bb
--- /dev/null
+++ b/src/Components/Authentication/SignIn/index.tsx
@@ -0,0 +1,133 @@
+import { useFormik } from "formik";
+import type { FC } from "react";
+import { useState } from "react";
+import * as yup from "yup";
+
+import { authLogin, checkUserToken } from "../../../controller/Auth";
+import type { Values } from "../../../data/authData";
+import { MESSAGES_EN, MESSAGES_RU } from "../../../data/restMsgs";
+import useUserStore from "../../../store";
+import languageStore from "../../../store/language";
+import useStatusStore from "../../../store/load-status";
+import Button from "../../common/Button";
+import Input from "../../common/Input";
+import HelperText from "../HelperText";
+
+import "../style.scss";
+
+const schema = yup.object().shape({
+ userName: yup.string().min(3).max(30).required(),
+ password: yup.string().required(),
+});
+
+const inputsProps = [
+ {
+ key: "userName",
+ labelEn: "Name",
+ labelRu: "Имя",
+ placeholderEn: "Username",
+ placeholderRu: "Имя пользователя",
+ type: "text",
+ },
+ {
+ key: "password",
+ labelEn: "Password",
+ labelRu: "Пароль",
+ placeholderEn: "Password",
+ placeholderRu: "Пароль",
+ type: "password",
+ },
+] as const;
+
+interface SignInProps {
+ setSignInModalOpened: () => void;
+ setModalClosed: () => void;
+ setForgotOpened: () => void;
+}
+
+const SignIn: FC = ({
+ setSignInModalOpened,
+ setModalClosed,
+ setForgotOpened,
+}) => {
+ const setUser = useUserStore((state) => state.setUser);
+ const { isEn } = languageStore();
+ const [errorMsg, setErrorMsg] = useState(null);
+ const { setStatus } = useStatusStore();
+
+ const { values, handleChange, handleBlur, handleSubmit, errors, touched } =
+ useFormik({
+ initialValues: {
+ userName: "",
+ password: "",
+ },
+ validationSchema: schema,
+ onSubmit: (data: Values) => {
+ setStatus({ isLoading: true, message: "" });
+ authLogin(data)
+ .then(() => checkUserToken())
+ .then((userData) => {
+ setUser(userData);
+ setStatus({
+ isLoading: false,
+ message: "You are logged in",
+ });
+ setModalClosed();
+ })
+ .catch((error) => {
+ setStatus({ isLoading: false, message: "" });
+
+ if (error.message) {
+ const msg = isEn
+ ? MESSAGES_RU[error.message]
+ : MESSAGES_EN[error.message];
+ setErrorMsg(msg);
+ } else {
+ const msg = isEn ? MESSAGES_RU[error] : MESSAGES_EN[error];
+ setErrorMsg(msg);
+ }
+ });
+ },
+ });
+
+ return (
+
+
{isEn ? "Войти" : "Sign In"}
+
+
+ );
+};
+
+export default SignIn;
diff --git a/src/Components/Authentication/SignUp/index.tsx b/src/Components/Authentication/SignUp/index.tsx
new file mode 100644
index 0000000..3b62e8d
--- /dev/null
+++ b/src/Components/Authentication/SignUp/index.tsx
@@ -0,0 +1,161 @@
+import { useFormik } from "formik";
+import type { FC } from "react";
+import { useState } from "react";
+import * as yup from "yup";
+
+import {
+ authLogin,
+ checkUserToken,
+ createUser,
+} from "../../../controller/Auth";
+import { MESSAGES_EN, MESSAGES_RU } from "../../../data/restMsgs";
+import useUserStore from "../../../store";
+import languageStore from "../../../store/language";
+import useStatusStore from "../../../store/load-status";
+import Button from "../../common/Button";
+import Input from "../../common/Input";
+import HelperText from "../HelperText";
+
+import "../style.scss";
+
+const schema = yup.object().shape({
+ userName: yup.string().min(3).max(30).required(),
+ email: yup.string().email().required(),
+ password: yup.string().required(),
+ confirmPassword: yup
+ .string()
+ .equals([yup.ref("password")], "Should be equal to password"),
+});
+
+const inputsProps = [
+ {
+ key: "userName",
+ labelEn: "Name",
+ labelRu: "Имя",
+ type: "text",
+ placeholderEn: "Username",
+ placeholderRu: "Имя пользователя",
+ },
+ {
+ key: "email",
+ labelEn: "Email",
+ labelRu: "Почта",
+ type: "email",
+ placeholderEn: "Email",
+ placeholderRu: "Почта",
+ },
+ {
+ key: "password",
+ labelEn: "Password",
+ labelRu: "Пароль",
+ type: "password",
+ placeholderEn: "Password",
+ placeholderRu: "Пароль",
+ },
+ {
+ key: "confirmPassword",
+ labelEn: "Confirm password",
+ labelRu: "Подтвердить пароль",
+ type: "password",
+ placeholderEn: "Confirm password",
+ placeholderRu: "Подтвердить пароль",
+ },
+] as const;
+
+interface SignUpProps {
+ setSignInModalOpened: () => void;
+ setModalClosed: () => void;
+ setForgotOpened: () => void;
+}
+
+const SignUp: FC = ({
+ setSignInModalOpened,
+ setModalClosed,
+ setForgotOpened,
+}) => {
+ const setUser = useUserStore((state) => state.setUser);
+
+ const [errorMsg, setErrorMsg] = useState("");
+ const { isEn } = languageStore();
+ const { setStatus } = useStatusStore();
+
+ const { values, handleChange, handleBlur, handleSubmit, touched, errors } =
+ useFormik({
+ initialValues: {
+ userName: "",
+ email: "",
+ password: "",
+ confirmPassword: "",
+ },
+ validationSchema: schema,
+ onSubmit: (data) => {
+ setStatus({ isLoading: true, message: "" });
+
+ createUser(data)
+ .then(() => authLogin(data))
+ .then(() => checkUserToken())
+ .then((userDetails) => {
+ setStatus({
+ isLoading: false,
+ message: "You have successfully registered!",
+ });
+ setUser(userDetails);
+ setModalClosed();
+ })
+ .catch((error) => {
+ try {
+ setStatus({ isLoading: false, message: "" });
+ const { message } = JSON.parse(error);
+ const msg = isEn ? MESSAGES_RU[message] : MESSAGES_EN[message];
+ setErrorMsg(msg);
+ } catch {
+ const msg = isEn
+ ? MESSAGES_RU[error.message]
+ : MESSAGES_EN[error.message];
+ setErrorMsg(msg);
+ }
+ });
+ },
+ });
+
+ return (
+
+
{isEn ? "Войти" : "Sign Up"}
+
+
+ );
+};
+
+export default SignUp;
diff --git a/src/Components/Authentication/index.tsx b/src/Components/Authentication/index.tsx
new file mode 100644
index 0000000..97ccbad
--- /dev/null
+++ b/src/Components/Authentication/index.tsx
@@ -0,0 +1,112 @@
+/* eslint-disable prettier/prettier */
+import type { FC } from "react";
+import { useEffect, useState } from "react";
+
+import useUserStore from "../../store";
+import languageStore from "../../store/language";
+import useStatusStore from "../../store/load-status";
+import Modal from "../common/Modal";
+
+import ForgotPass from "./Forgot";
+import ResetPass from "./Reset";
+import SignIn from "./SignIn";
+import SignUp from "./SignUp";
+
+interface AuthenticationModalProps {
+ setModalClosed: () => void;
+}
+
+enum authWindow {
+ login,
+ registr,
+ forgot,
+ reset,
+ setPass,
+}
+
+const AuthenticationModal: FC = ({
+ setModalClosed,
+}) => {
+ const urlSearchParams = new URLSearchParams(window.location.search);
+ const resetToken = urlSearchParams.get("resetToken");
+ const setPass = urlSearchParams.get("setPass");
+
+ const [windowVisible, setWindowVisible] = useState(
+ resetToken
+ ? authWindow.reset
+ : setPass
+ ? authWindow.setPass
+ : authWindow.login
+ );
+
+ const { message } = useStatusStore();
+
+ const { userName } = useUserStore();
+
+ const { isEn } = languageStore();
+
+ useEffect(() => {
+ if (message) {
+ setModalClosed();
+
+ if (
+ windowVisible === authWindow.reset ||
+ windowVisible === authWindow.setPass
+ ) {
+ window.location.search = "";
+ }
+ }
+ }, [message]);
+
+ useEffect(() => {
+ if (userName === "") {
+ setModalClosed();
+
+ if (windowVisible === authWindow.setPass) {
+ window.location.search = "";
+ }
+ }
+ }, [userName]);
+
+ return (
+
+ {windowVisible === authWindow.login && (
+ {
+ setWindowVisible(authWindow.registr);
+ }}
+ setForgotOpened={() => {
+ setWindowVisible(authWindow.forgot);
+ }}
+ />
+ )}
+ {windowVisible === authWindow.registr && (
+ {
+ setWindowVisible(authWindow.login);
+ }}
+ setForgotOpened={() => {
+ setWindowVisible(authWindow.forgot);
+ }}
+ />
+ )}
+ {windowVisible === authWindow.forgot && (
+ {
+ setWindowVisible(authWindow.login);
+ }}
+ />
+ )}
+ {windowVisible === authWindow.reset && (
+
+ )}
+
+ );
+};
+
+export default AuthenticationModal;
diff --git a/src/Components/Authentication/style.scss b/src/Components/Authentication/style.scss
new file mode 100644
index 0000000..40aae8e
--- /dev/null
+++ b/src/Components/Authentication/style.scss
@@ -0,0 +1,33 @@
+.authentication {
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+
+ &__title {
+ color: #4f4c6b;
+ font-size: 24px;
+ font-weight: 600;
+ margin-bottom: 20px;
+ }
+
+ &__content {
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ }
+
+ &__button {
+ max-width: 300px;
+ margin: 0 auto;
+ margin-top: 20px;
+ }
+
+ &__error{
+ color: #ba4d4d;
+ padding-bottom: 8px;
+ text-align: center;
+ font-weight: 700;
+ }
+}
\ No newline at end of file
diff --git a/src/Components/Authentication/utils.tsx b/src/Components/Authentication/utils.tsx
new file mode 100644
index 0000000..949c778
--- /dev/null
+++ b/src/Components/Authentication/utils.tsx
@@ -0,0 +1,16 @@
+import { useEffect } from "react";
+import { useNavigate } from "react-router-dom";
+
+import useUserStore from "../../store";
+
+export const CheckForLogin = () => {
+ const { userName, fetched } = useUserStore();
+ const navigate = useNavigate();
+
+ useEffect(() => {
+ if (!userName && fetched) navigate("/");
+ }, [fetched, userName]);
+
+ // eslint-disable-next-line react/jsx-no-useless-fragment
+ return <>>;
+};
diff --git a/src/Components/Footer/index.tsx b/src/Components/Footer/index.tsx
new file mode 100644
index 0000000..1fe2721
--- /dev/null
+++ b/src/Components/Footer/index.tsx
@@ -0,0 +1,38 @@
+import { type FC } from "react";
+
+import languageStore from "../../store/language";
+import themeStore from "../../store/theme";
+import "./style.scss";
+
+const Footer: FC = () => {
+ const theme = themeStore((state) => state.isDark);
+ const { isEn } = languageStore();
+
+ return (
+
+ © 2023
+
+
+
+
+
+ );
+};
+
+export default Footer;
diff --git a/src/Components/Footer/style.scss b/src/Components/Footer/style.scss
new file mode 100644
index 0000000..c135efa
--- /dev/null
+++ b/src/Components/Footer/style.scss
@@ -0,0 +1,81 @@
+.footer {
+ height: 80px;
+ padding: 10px 40px;
+ width: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ box-shadow: 0px -5px 5px -5px #f6e7ea;
+ background: #180428;
+
+ &__logo {
+ width: 80px;
+ cursor: pointer;
+ transition: all .2s;
+
+ &:hover {
+ transform: scale(1.1);
+ }
+ }
+
+ &__year {
+ color: #b1aecb9f;
+ font-weight: 600;
+ }
+
+ &__content {
+ display: flex;
+ gap: 10px;
+ color: #7e6dd1;
+ font-weight: 700;
+ font-size: 16px;
+
+ a {
+ cursor: pointer;
+ text-align: center;
+ }
+ }
+}
+
+@media screen and (max-width: 700px) {
+ .footer {
+ padding: 20px 16px;
+ flex-direction: column;
+ align-items: start;
+ gap: 24px;
+ height: auto;
+
+ &__year {
+ order: 2;
+ }
+
+ &__content {
+ flex-direction: column;
+ align-items: start;
+ text-align: center;
+ p {
+ display: none;
+ }
+ order: 1;
+ }
+
+ &__logo {
+ width: 80px;
+ margin-bottom: 10px;
+ }
+ }
+}
+.dark{
+ background-color: #1a1421;
+ color: #fffef0;
+ box-shadow: 0px -5px 5px -5px #212e43f9;
+ .footer__content{
+ color: #fffef0;
+ }
+ .footer__year{
+ color: #fffef085;
+ }
+ a {
+ color: #bdd1f485;
+ }
+}
\ No newline at end of file
diff --git a/src/Components/Header/Lang/LangComp.module.scss b/src/Components/Header/Lang/LangComp.module.scss
new file mode 100644
index 0000000..c2c55af
--- /dev/null
+++ b/src/Components/Header/Lang/LangComp.module.scss
@@ -0,0 +1,69 @@
+@keyframes change1{
+ from{
+ transform: translate(0px);
+ }
+ to{
+ transform: translate(-30px);
+ }
+}
+@keyframes change2{
+ from{
+ transform: translate(0px);
+ }
+ to{
+ transform: translate(25px);
+ }
+}
+@keyframes change3{
+ from{
+ transform: translate(30px);
+ }
+ to{
+ transform: translate(0px);
+ }
+}
+@keyframes change4{
+ from{
+ transform: translate(-30px);
+ }
+ to{
+ transform: translate(0px);
+ }
+}
+.main{
+ display: flex;
+ gap: 5px;
+ font-size: 16px;
+ font-weight: 600;
+ color: #fff;
+ padding: 5px;
+ background-image: linear-gradient(to right, #667eea, #764ba2);
+ border-radius: 20px;
+ align-items: center;
+ font-family: 'Ceviche One', cursive;
+ cursor: pointer;
+ &:hover{
+ box-shadow: 0 0 5px 0 #764ba2 inset, 0 0 5px 2px #667eea;
+ }
+ &__icon{
+ width: 26px;
+ height: 26px;
+ animation: change3 0.4s ease-in-out ;
+ animation-fill-mode:forwards;
+ z-index: 3;
+ }
+ &__text{
+ animation: change4 0.4s ease-in-out ;
+ animation-fill-mode:forwards;
+ }
+}
+.animate1{
+ animation: change1 0.4s ease-in-out ;
+ animation-fill-mode:forwards
+}
+.animate2{
+ width: 26px;
+ height: 26px;
+ animation: change2 0.4s ease-in-out ;
+ animation-fill-mode:forwards
+}
\ No newline at end of file
diff --git a/src/Components/Header/Lang/LangComp.tsx b/src/Components/Header/Lang/LangComp.tsx
new file mode 100644
index 0000000..95c2f8a
--- /dev/null
+++ b/src/Components/Header/Lang/LangComp.tsx
@@ -0,0 +1,29 @@
+import enIcon from "../../../assets/langIcons/english.png";
+import ruIcon from "../../../assets/langIcons/russian.png";
+import languageStore from "../../../store/language";
+
+import styles from "./LangComp.module.scss";
+
+export const LS_LANG = "rs-games-online__lang";
+
+export const LangComp = () => {
+ const { isEn, setLang } = languageStore();
+
+ const changeLang = () => {
+ localStorage.setItem(LS_LANG, (!isEn).toString());
+ setLang(!isEn);
+ };
+
+ return (
+
+
+
+ {isEn ? "Ru" : "En"}
+
+
+ );
+};
diff --git a/src/Components/Header/Logo/index.tsx b/src/Components/Header/Logo/index.tsx
new file mode 100644
index 0000000..c465bf9
--- /dev/null
+++ b/src/Components/Header/Logo/index.tsx
@@ -0,0 +1,16 @@
+import { type FC } from "react";
+import "./style.scss";
+import { useNavigate } from "react-router-dom";
+
+const Logo: FC = () => {
+ const navigate = useNavigate();
+
+ return (
+ navigate("/")}>
+
+
Gaming Zone
+
+ );
+};
+
+export default Logo;
diff --git a/src/Components/Header/Logo/style.scss b/src/Components/Header/Logo/style.scss
new file mode 100644
index 0000000..de82208
--- /dev/null
+++ b/src/Components/Header/Logo/style.scss
@@ -0,0 +1,39 @@
+.logo {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ cursor: pointer;
+
+ &__image {
+ width: 60px;
+ height: 60px;
+ }
+
+ &__text {
+ font-family: 'Ceviche One', cursive;
+ font-size: 36px;
+ font-weight: 600;
+ color: #7e6dd1;
+ }
+}
+
+@media screen and (max-width: 640px) {
+ .logo {
+ img {
+ width: 40px;
+ height: 40px;
+ }
+ &__text {
+ font-family: 'Ceviche One', cursive;
+ font-size: 30px;
+ font-weight: 600;
+ color: #7e6dd1;
+ }
+ }
+}
+
+@media screen and (max-width: 580px) {
+ .logo__text {
+ display: none;
+ }
+}
\ No newline at end of file
diff --git a/src/Components/Header/User/index.tsx b/src/Components/Header/User/index.tsx
new file mode 100644
index 0000000..5137731
--- /dev/null
+++ b/src/Components/Header/User/index.tsx
@@ -0,0 +1,48 @@
+import { type FC } from "react";
+import { useNavigate } from "react-router-dom";
+
+import { logoutUser } from "../../../controller/Auth";
+import type { userSetter } from "../../../store";
+import { nullUser } from "../../../store";
+import languageStore from "../../../store/language";
+import "./style.scss";
+
+interface UserProps {
+ username: string;
+ image?: string;
+ setUser: userSetter;
+}
+
+const User: FC = ({ username, setUser, image }) => {
+ const { isEn } = languageStore();
+ const navigate = useNavigate();
+
+ return (
+
+
navigate(`/user/${username}`)}
+ className="user__click"
+ >
+
+
{username}
+
+
+
{
+ logoutUser();
+ setUser(nullUser);
+ }}
+ >
+ {isEn ? "Выйти" : "Logout"}
+
+
+ );
+};
+
+export default User;
diff --git a/src/Components/Header/User/style.scss b/src/Components/Header/User/style.scss
new file mode 100644
index 0000000..fe40ff5
--- /dev/null
+++ b/src/Components/Header/User/style.scss
@@ -0,0 +1,77 @@
+.user {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+
+ &__image {
+ width: 50px;
+ height: 50px;
+ border-radius: 50%;
+ background-size: contain;
+ background-repeat: no-repeat;
+ background-position: center;
+ }
+
+ &__text {
+ font-family: 'Russo One', sans-serif;
+ font-size: 22px;
+ font-weight: 600;
+ color: #4f4c6b;
+ max-width: 170px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ }
+ &__click{
+ display: flex;
+ align-items: center;
+ gap: 5px;
+ cursor: pointer;
+ border-radius: 20px;
+ &:hover{
+ box-shadow: 0 0 5px 0 #764ba2 inset, 0 0 5px 2px #667eea;
+ }
+ }
+}
+
+@media screen and (max-width: 860px) {
+ .user {
+ &__image {
+ width: 38px;
+ height: 38px;
+ }
+
+ &__text {
+ font-size: 18px;
+ max-width: 140px;
+ }
+ button {
+ padding: 8px 12px;
+ }
+ }
+}
+
+@media screen and (max-width: 740px) {
+ .user {
+ &__text {
+ font-size: 18px;
+ max-width: 140px;
+ display: none;
+ }
+ button {
+ padding: 8px 12px;
+ }
+ }
+}
+
+@media screen and (max-width: 480px) {
+ .user {
+ gap: 8px;
+
+ button {
+ padding: 10px 9px;
+ font-size: 1em;
+ // background: none;
+ // color: #4f4496;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Components/Header/index.tsx b/src/Components/Header/index.tsx
new file mode 100644
index 0000000..6fd1827
--- /dev/null
+++ b/src/Components/Header/index.tsx
@@ -0,0 +1,90 @@
+/* eslint-disable jsx-a11y/no-noninteractive-element-interactions */
+import { useEffect, useState, type FC } from "react";
+
+import { checkUserToken } from "../../controller/Auth";
+import useUserStore, { nullUser } from "../../store";
+// eslint-disable-next-line import/named
+import languageStore from "../../store/language";
+import themeStore, { LS_THEME } from "../../store/theme";
+import AuthenticationModal from "../Authentication";
+import Button from "../common/Button";
+
+import { LangComp } from "./Lang/LangComp";
+import Logo from "./Logo";
+import User from "./User";
+
+import "./style.scss";
+
+const Header: FC = () => {
+ const [isModalClosed, setModalClosed] = useState(true);
+ const [rotate, setRotate] = useState(false);
+ const { userName, image, setUser } = useUserStore();
+ const { isEn } = languageStore();
+ const theme = themeStore((state) => state.isDark);
+ const changeTheme = themeStore((state) => state.setTheme);
+
+ const urlSearchParams = new URLSearchParams(window.location.search);
+ const resetToken = urlSearchParams.get("resetToken");
+ const setPass = urlSearchParams.get("setPass");
+
+ const handler = () => {
+ localStorage.setItem(LS_THEME, (!theme).toString());
+ changeTheme(!theme);
+ setRotate(true);
+ setTimeout(() => setRotate(false), 700);
+ };
+
+ useEffect(() => {
+ if (resetToken || setPass) {
+ setModalClosed(false);
+ }
+ }, []);
+
+ useEffect(() => {
+ checkUserToken()
+ .then((userData) => {
+ setUser({
+ userName: userData.userName,
+ image: userData.image,
+ status: userData.status,
+ banned: userData.banned,
+ email: userData.email,
+ });
+ })
+ .catch(() => {
+ setUser(nullUser);
+ });
+ }, []);
+
+ return (
+
+
+
+
+
+ {userName ? (
+
+ ) : (
+
setModalClosed(false)}>
+ {isEn ? "Войти" : "Sign in"}
+
+ )}
+
+ {!isModalClosed && (
+ {
+ setModalClosed(true);
+ window.location.search = "";
+ }}
+ />
+ )}
+
+ );
+};
+
+export default Header;
diff --git a/src/Components/Header/style.scss b/src/Components/Header/style.scss
new file mode 100644
index 0000000..e975f4a
--- /dev/null
+++ b/src/Components/Header/style.scss
@@ -0,0 +1,58 @@
+@keyframes rotate{
+ from{
+ transform: rotate(0deg);
+ }
+ to{
+ transform: rotate(-360deg);
+ }
+}
+
+.header {
+ width: 100%;
+ max-height: 80px;
+ height: 80px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 10px 40px;
+ box-shadow: 0 5px 5px -5px #f6e7ea;
+ color: white;
+ background: #f3f3f3;
+
+ &__content {
+ display: flex;
+ align-items: center;
+ gap: 20px;
+ }
+
+ &__theme {
+ width: 40px;
+ cursor: pointer;
+ &:hover {
+ opacity: 0.85;
+ }
+ }
+
+ &__rotate{
+ width: 40px;
+ cursor: pointer;
+ animation: rotate 0.7s ease-in-out;
+ }
+}
+
+.dark{
+ background-color: #0d0c10;
+ color: #bdd1f4;
+ .user__text {
+ color: #bdd1f4;
+ }
+}
+
+@media screen and (max-width: 480px) {
+ .header {
+ padding: 10px 8px;
+ &__content {
+ gap: 14px;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Components/Loading/Lodaing.tsx b/src/Components/Loading/Lodaing.tsx
new file mode 100644
index 0000000..4fd9503
--- /dev/null
+++ b/src/Components/Loading/Lodaing.tsx
@@ -0,0 +1,20 @@
+import useStatusStore from "../../store/load-status";
+
+import "./style.scss";
+
+const Loading = () => {
+ const status = useStatusStore();
+
+ return (
+
+ );
+};
+
+export default Loading;
diff --git a/src/Components/Loading/style.scss b/src/Components/Loading/style.scss
new file mode 100644
index 0000000..c34cfa4
--- /dev/null
+++ b/src/Components/Loading/style.scss
@@ -0,0 +1,52 @@
+.loading {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ z-index: 10;
+ background-color: #8f96b447;
+}
+
+.loading_hide {
+ display: none;
+}
+
+.lds-ring {
+ display: inline-block;
+ position: relative;
+ width: 80px;
+ height: 80px;
+}
+.lds-ring div {
+ box-sizing: border-box;
+ display: block;
+ position: absolute;
+ width: 64px;
+ height: 64px;
+ margin: 8px;
+ border: 8px solid #667eea;
+ border-radius: 50%;
+ animation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;
+ border-color: #764ba2 transparent transparent transparent;
+}
+.lds-ring div:nth-child(1) {
+ animation-delay: -0.45s;
+}
+.lds-ring div:nth-child(2) {
+ animation-delay: -0.3s;
+}
+.lds-ring div:nth-child(3) {
+ animation-delay: -0.15s;
+}
+@keyframes lds-ring {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(360deg);
+ }
+}
diff --git a/src/Components/MemoryGame/CardComponent.module.scss b/src/Components/MemoryGame/CardComponent.module.scss
new file mode 100644
index 0000000..319075c
--- /dev/null
+++ b/src/Components/MemoryGame/CardComponent.module.scss
@@ -0,0 +1,209 @@
+@keyframes win {
+ from{
+ transform:rotateY(180deg) scale(1);
+ }
+ to{
+ transform:rotateY(180deg) scale(1.16);
+ }
+}
+
+$card-width:150px;
+$card-height:220px;
+
+.card{
+ border: 1px stolid teal;
+ border-radius: 15px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: $card-width;
+ height: $card-height;
+ position: relative;
+ transition: 0.6s;
+ &__win{
+ box-shadow: 0 0 3px 5px green;
+ animation: win 0.2s linear;
+ }
+ &__face{
+ transform: rotateY(180deg);
+ position: absolute;
+ z-index: -1;
+ width: $card-width;
+ height: $card-height;
+ border-radius: 15px;
+ background-size: cover;
+ }
+ &__shirt{
+ border-radius: 15px;
+ position: absolute;
+ width: $card-width;
+ height: $card-height;
+ background-image: url('../../assets/cars/shirt.jfif');
+ background-size: cover;
+ }
+}
+.card_open{
+ transform: rotateY(180deg);
+ &__face{
+ z-index: 2;
+ transform: rotateY(180deg);
+ width: $card-width;
+ height: $card-height;
+ border-radius: 15px;
+ background-size: cover;
+ }
+ &__shirt{
+ background-image: none;
+ }
+}
+
+
+@media screen and (max-width: 680px) {
+ $card-width:135px; // 150
+ $card-height:198px; // 220
+
+ .card{
+ width: $card-width;
+ height: $card-height;
+
+ &__face{
+ width: $card-width;
+ height: $card-height;
+ }
+ &__shirt{
+ width: $card-width;
+ height: $card-height;
+ }
+ }
+ .card_open{
+ &__face{
+ width: $card-width;
+ height: $card-height;
+ }
+ }
+}
+
+@media screen and (max-width: 600px) {
+ $card-width:120px; // 150
+ $card-height:176px; // 220
+
+ .card{
+ width: $card-width;
+ height: $card-height;
+
+ &__face{
+ width: $card-width;
+ height: $card-height;
+ }
+ &__shirt{
+ width: $card-width;
+ height: $card-height;
+ }
+ }
+ .card_open{
+ &__face{
+ width: $card-width;
+ height: $card-height;
+ }
+ }
+}
+
+@media screen and (max-width: 550px) {
+ $card-width:105px; // 150
+ $card-height:154px; // 220
+
+ .card{
+ width: $card-width;
+ height: $card-height;
+
+ &__face{
+ width: $card-width;
+ height: $card-height;
+ }
+ &__shirt{
+ width: $card-width;
+ height: $card-height;
+ }
+ }
+ .card_open{
+ &__face{
+ width: $card-width;
+ height: $card-height;
+ }
+ }
+}
+
+@media screen and (max-width: 485px) {
+ $card-width:90px; // 150
+ $card-height:132px; // 220
+
+ .card{
+ width: $card-width;
+ height: $card-height;
+
+ &__face{
+ width: $card-width;
+ height: $card-height;
+ }
+ &__shirt{
+ width: $card-width;
+ height: $card-height;
+ }
+ }
+ .card_open{
+ &__face{
+ width: $card-width;
+ height: $card-height;
+ }
+ }
+}
+
+@media screen and (max-width: 420px) {
+ $card-width: 75px; // 150
+ $card-height: 110px; // 220
+
+ .card{
+ width: $card-width;
+ height: $card-height;
+
+ &__face{
+ width: $card-width;
+ height: $card-height;
+ }
+ &__shirt{
+ width: $card-width;
+ height: $card-height;
+ }
+ }
+ .card_open{
+ &__face{
+ width: $card-width;
+ height: $card-height;
+ }
+ }
+}
+
+@media screen and (max-width: 358px) {
+ $card-width: 60px; // 150
+ $card-height: 88px; // 220
+
+ .card{
+ width: $card-width;
+ height: $card-height;
+
+ &__face{
+ width: $card-width;
+ height: $card-height;
+ }
+ &__shirt{
+ width: $card-width;
+ height: $card-height;
+ }
+ }
+ .card_open{
+ &__face{
+ width: $card-width;
+ height: $card-height;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Components/MemoryGame/CardComponent.tsx b/src/Components/MemoryGame/CardComponent.tsx
new file mode 100644
index 0000000..8be033e
--- /dev/null
+++ b/src/Components/MemoryGame/CardComponent.tsx
@@ -0,0 +1,73 @@
+import { useEffect, useRef, useState } from "react";
+
+import styles from "./CardComponent.module.scss";
+import { type IProps } from "./Interfaces";
+
+const CardComponent = ({
+ card,
+ onPress,
+ countTry,
+ pairs,
+ clickCount,
+ startGame,
+ inGame,
+}: IProps) => {
+ const [isOpen, setIsOpen] = useState(false);
+ const canClick = useRef(false);
+
+ const handler = () => {
+ if (inGame) {
+ if (canClick.current && pairs < 2) {
+ setIsOpen(true);
+ onPress(card.id);
+ canClick.current = false;
+ }
+ }
+ };
+
+ useEffect(() => {
+ if (!card.hasPair && countTry !== 0) {
+ setTimeout(() => {
+ setIsOpen(false);
+ canClick.current = true;
+ clickCount(0);
+ }, 700);
+ }
+ }, [countTry]);
+
+ useEffect(() => {
+ if (startGame) {
+ setIsOpen(true);
+ canClick.current = false;
+ }
+
+ if (!startGame) {
+ setIsOpen(false);
+ canClick.current = true;
+ }
+ }, [startGame]);
+
+ return (
+
+ );
+};
+
+export default CardComponent;
diff --git a/src/Components/MemoryGame/Data.ts b/src/Components/MemoryGame/Data.ts
new file mode 100644
index 0000000..f1c0438
--- /dev/null
+++ b/src/Components/MemoryGame/Data.ts
@@ -0,0 +1,30 @@
+import audi from "../../assets/cars/audi.jfif";
+import bmw from "../../assets/cars/bmw.jfif";
+import dodje from "../../assets/cars/dodje.jfif";
+import ferrari from "../../assets/cars/ferrari.jfif";
+import lambo from "../../assets/cars/lambo.jfif";
+import maserati from "../../assets/cars/maserati.jfif";
+import mers from "../../assets/cars/mers.jfif";
+import porshe from "../../assets/cars/porshe.jfif";
+import zhiga from "../../assets/cars/zhiga.jfif";
+
+export const cardsArr = [
+ { id: 1, name: "Circle", hasPair: false, img: porshe },
+ { id: 2, name: "Circle", hasPair: false, img: porshe },
+ { id: 3, name: "Square", hasPair: false, img: bmw },
+ { id: 4, name: "Square", hasPair: false, img: bmw },
+ { id: 5, name: "Star", hasPair: false, img: dodje },
+ { id: 6, name: "Star", hasPair: false, img: dodje },
+ { id: 7, name: "Triangle", hasPair: false, img: lambo },
+ { id: 8, name: "Triangle", hasPair: false, img: lambo },
+ { id: 9, name: "5", hasPair: false, img: maserati },
+ { id: 10, name: "5", hasPair: false, img: maserati },
+ { id: 11, name: "6", hasPair: false, img: mers },
+ { id: 12, name: "6", hasPair: false, img: mers },
+ { id: 13, name: "10", hasPair: false, img: ferrari },
+ { id: 14, name: "10", hasPair: false, img: ferrari },
+ { id: 15, name: "11", hasPair: false, img: audi },
+ { id: 16, name: "11", hasPair: false, img: audi },
+ { id: 17, name: "12", hasPair: false, img: zhiga },
+ { id: 18, name: "12", hasPair: false, img: zhiga },
+];
diff --git a/src/Components/MemoryGame/Interfaces.ts b/src/Components/MemoryGame/Interfaces.ts
new file mode 100644
index 0000000..c4bf187
--- /dev/null
+++ b/src/Components/MemoryGame/Interfaces.ts
@@ -0,0 +1,16 @@
+export interface ICard {
+ id: number;
+ name: string;
+ hasPair: boolean;
+ img: string;
+}
+
+export interface IProps {
+ card: ICard;
+ onPress: (id: number) => void;
+ countTry: number;
+ pairs: number;
+ clickCount: React.Dispatch>;
+ startGame: boolean;
+ inGame: boolean;
+}
diff --git a/src/Components/Message/PopMessage.tsx b/src/Components/Message/PopMessage.tsx
new file mode 100644
index 0000000..64af5f1
--- /dev/null
+++ b/src/Components/Message/PopMessage.tsx
@@ -0,0 +1,34 @@
+import { useEffect } from "react";
+
+import { MESSAGES_EN, MESSAGES_RU } from "../../data/restMsgs";
+import languageStore from "../../store/language";
+import useStatusStore from "../../store/load-status";
+
+import "./style.scss";
+
+const MSG_TIMEOUT = 2000;
+
+const PopupMessage = () => {
+ const status = useStatusStore();
+
+ const { isEn } = languageStore();
+
+ useEffect(() => {
+ setTimeout(() => {
+ if (!status.message) return;
+ status.setStatus({ isLoading: false, message: "" });
+ }, MSG_TIMEOUT);
+ }, [status]);
+
+ return (
+
+
+
+ {isEn ? MESSAGES_RU[status.message] : MESSAGES_EN[status.message]}
+
+
+
+ );
+};
+
+export default PopupMessage;
diff --git a/src/Components/Message/style.scss b/src/Components/Message/style.scss
new file mode 100644
index 0000000..b33e42c
--- /dev/null
+++ b/src/Components/Message/style.scss
@@ -0,0 +1,36 @@
+
+.pop-message {
+ position: fixed;
+ display: flex;
+ width: 100vw;
+ height: 100vh;
+ top: 0;
+ left: 0;
+ background: #8f96b447;
+ z-index: 5;
+
+ &_hide {
+ display: none;
+ }
+
+ // .pop-message__background
+ &__background {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ margin: auto;
+ max-width: 90vw;
+ width: 320px;
+ height: 10vh;
+ border-radius: 10px;
+ font-size: 18px;
+ font-weight: 700;
+ background: linear-gradient(to right,#667eea,#764ba2);
+ }
+
+ // .pop-message__wrapper
+ &__wrapper {
+ display: flex;
+ text-align: center;
+ }
+}
\ No newline at end of file
diff --git a/src/Components/MultiGames/CreateGamesList.module.scss b/src/Components/MultiGames/CreateGamesList.module.scss
new file mode 100644
index 0000000..8430fdb
--- /dev/null
+++ b/src/Components/MultiGames/CreateGamesList.module.scss
@@ -0,0 +1,109 @@
+@import url('https://fonts.googleapis.com/css2?family=Righteous&display=swap');
+
+.main {
+ display: flex;
+ flex-direction: column;
+ background: linear-gradient(
+ 180deg,
+ #7e6dd100 0%,
+ #464b906a 100%,
+ );
+ width: 100%;
+ padding: 20px 0;
+ display: flex;
+ gap: 20px;
+ flex-direction: column;
+ align-items: center;
+ justify-content: space-between;
+ font-family: "Lucida Sans", "Lucida Sans Regular", "Lucida Grande", "Lucida Sans Unicode", Geneva, Verdana, sans-serif;
+ font-size: .8em;
+ &_gamesWrapper {
+ display: flex;
+ flex-wrap: wrap;
+ width: calc(100vw - 32px);
+ background: #ffffff38;
+ border-radius: 8px;
+ padding: 24px 12px;
+ gap: 20px
+ }
+ &_item {
+ display: flex;
+ flex-direction: column;
+ justify-content: space-around;
+ width: 220px;
+ height: 120px;
+ padding: 10px;
+ font-family: 'Righteous', cursive;
+ transition: all .3s;
+ background: linear-gradient(
+ 120deg,
+ #7e6dd1 0%,
+ #262c7d 100%,
+ );
+ border-radius: 12px;
+ box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
+ color: #ffffffe7;
+ &:hover{
+ background-color: rgba(255, 68, 0, 0.459);
+ background: linear-gradient(
+ 30deg,
+ rgba(213, 65, 11, 0.661) 0%,
+ rgba(218, 118, 12, 0.459) 100%,
+ );
+ cursor: pointer;
+ }
+ }
+ &_userName {
+ font-size: 1.7em;
+ font-family: "Russo One", sans-serif;
+ }
+ &_usersCount {
+ display: flex;
+ flex-direction: column;
+ font-size: 1.4em;
+ align-items: center;
+ }
+ &_usersIcon {
+ background: url(../../assets/svg/users.svg) center no-repeat;
+ background-size: contain;
+ width: 20px;
+ height: 20px;
+ }
+ &_header{
+ display: flex;
+ gap: 20px;
+ font-family: "Lucida Sans", "Lucida Sans Regular", "Lucida Grande", "Lucida Sans Unicode", Geneva, Verdana, sans-serif;
+ align-items: center;
+ }
+ &_icon{
+ cursor: pointer;
+ transition: 0.7s;
+ }
+ &_rotate{
+ animation: rotate 1s ease-in-out;
+ }
+ &_noGames {
+ width: 100%;
+ padding: 30px;
+ opacity: .6;
+ font-size: 1.6em;
+ text-align: center;
+ }
+}
+
+@media screen and (max-width: 520px) {
+ .main_gamesWrapper {
+ justify-content: center;
+ }
+ .main_usersCount {
+ flex-direction: row;
+ gap: 8px
+ }
+ .main_item {
+ flex-direction: row;
+ justify-content: space-between;
+ padding: 8px 20px;
+ height: auto;
+ width: 100%;
+ }
+}
\ No newline at end of file
diff --git a/src/Components/MultiGames/CreateGamesList.tsx b/src/Components/MultiGames/CreateGamesList.tsx
new file mode 100644
index 0000000..c8977ee
--- /dev/null
+++ b/src/Components/MultiGames/CreateGamesList.tsx
@@ -0,0 +1,75 @@
+import { faRefresh } from "@fortawesome/free-solid-svg-icons";
+import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+import { useState, useEffect } from "react";
+
+import { BACKEND_URL } from "../../data/authData";
+import languageStore from "../../store/language";
+import useStatusStore from "../../store/load-status";
+
+import styles from "./CreateGamesList.module.scss";
+
+interface IGames {
+ gameId: string;
+ maxPlayers: number;
+ name: string;
+ player: string;
+ playersInGame: number;
+}
+interface IProps {
+ gameName: string | undefined;
+ joinGame: (id: string) => void;
+}
+
+export const CreateGamesList = ({ gameName, joinGame }: IProps) => {
+ const [gamesArr, setGamesArr] = useState([]);
+ const [degree, setDegree] = useState(0);
+ const { setStatus } = useStatusStore();
+ const { isEn } = languageStore();
+
+ const getGames = () => {
+ fetch(`${BACKEND_URL}/games/list?name=${gameName}`)
+ .then((response) => response.json())
+ .then((data) => setGamesArr(data))
+ .catch(({ message }) => setStatus({ isLoading: false, message }));
+ setDegree((prev) => prev + 360);
+ };
+
+ useEffect(() => {
+ getGames();
+ }, []);
+
+ return (
+
+
+ {isEn ? "Список доступных игр" : "List of create games"}
+
+
+
+ {gamesArr.length !== 0 ? (
+ gamesArr.map((game) => (
+
joinGame(game.gameId)}
+ >
+
{game.player}
+
+
+ {game.playersInGame} / {game.maxPlayers}
+
+
+ ))
+ ) : (
+
+ {isEn ? "Созданных игр пока нет" : "Not avalaible games"}
+
+ )}
+
+
+ );
+};
diff --git a/src/Components/SeaBattle/Board.ts b/src/Components/SeaBattle/Board.ts
new file mode 100644
index 0000000..7023290
--- /dev/null
+++ b/src/Components/SeaBattle/Board.ts
@@ -0,0 +1,76 @@
+import { Ship, Miss, Damage, Mark } from "./Ship";
+// eslint disable max-classes-per-file
+interface Marked {
+ color: string;
+ id: number;
+ name: string;
+}
+
+export class Cell {
+ board: Board;
+
+ x: number;
+
+ y: number;
+
+ mark: Marked;
+
+ id: number;
+
+ constructor(board: Board, x: number, y: number, mark: Marked) {
+ this.board = board;
+ this.x = x;
+ this.y = y;
+ this.mark = mark;
+ this.id = Math.random() * 10;
+ }
+}
+
+export class Board {
+ cells: Cell[][] = [];
+
+ initCells() {
+ for (let i = 0; i < 10; i += 1) {
+ const row: Cell[] = [];
+
+ for (let j = 0; j < 10; j += 1) {
+ row.push(
+ new Cell(this, j, i, {
+ color: "",
+ id: 0,
+ name: "",
+ })
+ );
+ }
+
+ this.cells.push(row);
+ }
+ }
+
+ getCopy() {
+ const newBoard = new Board();
+ newBoard.cells = this.cells;
+
+ return newBoard;
+ }
+
+ getCell(x: number, y: number) {
+ return this.cells[y][x];
+ }
+
+ createShip(x: number, y: number) {
+ new Ship(this.getCell(x, y));
+ }
+
+ miss(x: number, y: number) {
+ new Miss(this.getCell(x, y));
+ }
+
+ damage(x: number, y: number) {
+ new Damage(this.getCell(x, y));
+ }
+
+ empty(x: number, y: number) {
+ new Mark(this.getCell(x, y));
+ }
+}
diff --git a/src/Components/SeaBattle/Cell.module.scss b/src/Components/SeaBattle/Cell.module.scss
new file mode 100644
index 0000000..a1a09ac
--- /dev/null
+++ b/src/Components/SeaBattle/Cell.module.scss
@@ -0,0 +1,50 @@
+@keyframes rotate {
+ from{
+ transform: rotate(0deg);
+ }
+ to{
+ transform: rotate(360deg);
+ }
+}
+@keyframes rotate2 {
+ from{
+ transform: rotate(0deg);
+ }
+ to{
+ transform: rotate(-360deg);
+ }
+}
+@keyframes fire {
+ from{
+ transform: scale(1);
+ }
+ to{
+ transform: scale(1.2);
+ }
+}
+.cell{
+ width: 30px;
+ height: 30px;
+ border: 1px solid rgb(5, 5, 5);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ &:hover{
+ border: 1px solid orangered;
+ }
+}
+.blue{
+ background-color: #1560BD;
+}
+.fire_animate{
+ animation: fire 1s linear infinite;
+}
+.fire{
+ background-color: rgb(209, 38, 38);
+}
+.gun{
+ animation: rotate 6s linear infinite;
+}
+.gun2{
+ animation: rotate2 6s linear infinite;
+ }
\ No newline at end of file
diff --git a/src/Components/SeaBattle/CellComponent.tsx b/src/Components/SeaBattle/CellComponent.tsx
new file mode 100644
index 0000000..0787a89
--- /dev/null
+++ b/src/Components/SeaBattle/CellComponent.tsx
@@ -0,0 +1,36 @@
+import { useMemo } from "react";
+
+import fire from "../../assets/seaBattle/fire.png";
+import gun from "../../assets/seaBattle/gun.png";
+import mine from "../../assets/seaBattle/mine.png";
+
+import type { Cell } from "./Board";
+import styles from "./Cell.module.scss";
+
+interface IProps {
+ cell: Cell;
+ addMark: (x: number, y: number) => void;
+}
+
+export const CellComponent = ({ cell, addMark }: IProps) => {
+ const classes = [styles.cell];
+ const randomRotate = useMemo(() => Math.random() > 0.5, []);
+ classes.push(styles[cell.mark.color]);
+
+ return (
+ addMark(cell.x, cell.y)}>
+ {cell.mark.name === "miss" &&
}
+ {cell.mark.name === "damage" && (
+
+ )}
+ {cell.mark.name === "ship" && (
+
+ )}
+
+ );
+};
diff --git a/src/Components/SeaBattle/Field.module.scss b/src/Components/SeaBattle/Field.module.scss
new file mode 100644
index 0000000..d651a1f
--- /dev/null
+++ b/src/Components/SeaBattle/Field.module.scss
@@ -0,0 +1,58 @@
+.board{
+ font-family: 'Ceviche One', cursive;
+ display: flex;
+ width: 302px;
+ flex-wrap: wrap;
+ border: 1px solid rgb(0, 0, 0);
+ background-color: rgba(57, 141, 141, 0.575);
+ user-select: none;
+}
+.can_shoot{
+ box-shadow: 0 0 16px 4px rgba(12, 155, 17, 0.902);
+}
+.text{
+ color: wheat;
+ font-family: "Russo One", sans-serif;
+ font-weight: 100;
+ font-size: 1.6em;
+ max-width: 94vw;
+ text-align: center;
+}
+.letters{
+ font-family: 'Ceviche One', cursive;
+ margin-left: 31px;
+ display: flex;
+ width: 302px;
+ &_item{
+ width: 30px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+ user-select: none;
+}
+.horizontal{
+ display: flex;
+ user-select: none;
+}
+.numbers{
+ font-family: 'Ceviche One', cursive;
+ &_item{
+ width: 30px;
+ height: 30px;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
+ user-select: none;
+}
+
+@media screen and (max-width: 450px) {
+ .numbers {
+ display: none;
+ }
+ .letters {
+ display: none;
+ opacity: 0;
+ }
+}
\ No newline at end of file
diff --git a/src/Components/SeaBattle/FieldComp.tsx b/src/Components/SeaBattle/FieldComp.tsx
new file mode 100644
index 0000000..3236dee
--- /dev/null
+++ b/src/Components/SeaBattle/FieldComp.tsx
@@ -0,0 +1,88 @@
+import React, { useCallback } from "react";
+
+import type { Board } from "./Board";
+import { CellComponent } from "./CellComponent";
+import styles from "./Field.module.scss";
+
+interface IProps {
+ board: Board;
+ setBoard: React.Dispatch>;
+ shipsReady: boolean;
+ isEnemy: boolean;
+ canShoot: boolean;
+ shoot?: (x: number, y: number) => void;
+ setShip?: (x: number, y: number) => void;
+}
+const letters = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"];
+const numbers = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"];
+
+export const FieldComp = ({
+ board,
+ setBoard,
+ shipsReady,
+ isEnemy,
+ canShoot,
+ shoot,
+ setShip,
+}: IProps) => {
+ const classes = [styles.board];
+
+ const updateBoard = useCallback(() => {
+ const newBoard = board.getCopy();
+ setBoard(newBoard);
+ }, [board]);
+
+ const addMark = (x: number, y: number) => {
+ if (!shipsReady && !isEnemy) {
+ if (board.getCell(x, y).mark.name === "ship") {
+ board.empty(x, y);
+ } else {
+ board.createShip(x, y);
+ }
+
+ if (setShip) {
+ setShip(x, y);
+ }
+ } else if (canShoot && isEnemy) {
+ if (shoot) {
+ shoot(x, y);
+ }
+ }
+
+ updateBoard();
+ };
+
+ if (canShoot && isEnemy) {
+ classes.push(styles.can_shoot);
+ }
+
+ return (
+
+
+ {letters.map((letter) => (
+
+ {letter}
+
+ ))}
+
+
+
+ {numbers.map((number) => (
+
+ {number}
+
+ ))}
+
+
+ {board.cells.map((row, i) => (
+
+ {row.map((cell) => (
+
+ ))}
+
+ ))}
+
+
+
+ );
+};
diff --git a/src/Components/SeaBattle/InfoComp.tsx b/src/Components/SeaBattle/InfoComp.tsx
new file mode 100644
index 0000000..9a7817b
--- /dev/null
+++ b/src/Components/SeaBattle/InfoComp.tsx
@@ -0,0 +1,74 @@
+import type { Winner } from "../../Pages/SeaBattle/web-socket/websocketData";
+import useUserStore from "../../store";
+import languageStore from "../../store/language";
+import Button from "../common/Button";
+
+import styles from "./Field.module.scss";
+
+interface IProps {
+ shipsReady: boolean;
+ canShoot: boolean;
+ ready: () => void;
+ start: string;
+ winner?: Winner;
+ mainUser?: boolean;
+}
+
+export const InfoComp = ({
+ shipsReady = false,
+ canShoot = false,
+ ready,
+ start,
+ winner,
+ mainUser,
+}: IProps) => {
+ const { userName } = useUserStore();
+ const { isEn } = languageStore();
+
+ if (!shipsReady && !mainUser) {
+ return (
+ ready()} disabled={shipsReady}>
+ {isEn ? " Корабли готовы" : "Ships are ready"}
+
+ );
+ }
+
+ if (start === "") {
+ let message = mainUser ? (
+
+ {isEn ? "Ожидание 2 игрока" : "Waiting for the 2-nd player"}
+
+ ) : (
+
+ {isEn ? "Ожидание старта игры" : "Waiting for the start"}
+
+ );
+
+ if (winner) {
+ message =
+ winner.player.userName === userName ? (
+
+ {isEn ? "Вы победили! Ходов:" : "You win! Moves:"} {winner.moves}
+
+ ) : (
+
+ {isEn ? "Вы проиграли :(" : "You lose :("}
+
+ );
+ }
+
+ return message;
+ }
+
+ return (
+
+ {canShoot ? (
+
{isEn ? "Ваш выстрел" : "Your shoot"}
+ ) : (
+
+ {isEn ? "Выстрел соперника" : "Enemy shoot"}
+
+ )}
+
+ );
+};
diff --git a/src/Components/SeaBattle/Interfaces.ts b/src/Components/SeaBattle/Interfaces.ts
new file mode 100644
index 0000000..2aa09e4
--- /dev/null
+++ b/src/Components/SeaBattle/Interfaces.ts
@@ -0,0 +1,29 @@
+export interface IShip {
+ size: number;
+ cors: number[][];
+}
+
+export interface ISeaWarPlayer {
+ isLead: boolean;
+ isReady: boolean;
+ moves: number;
+ ships: IShip;
+ userName: string;
+}
+
+export interface IGameData {
+ gameId: string;
+ isStarted: boolean;
+ isMainUser: boolean;
+ player: ISeaWarPlayer;
+ enemyName: string | null;
+ isEnemyReady: boolean;
+ enemyField: number[][];
+ yourField: number[][];
+ winner: { username: string; moves: number } | null;
+}
+
+export interface IRequest {
+ type: string;
+ data: IGameData;
+}
diff --git a/src/Components/SeaBattle/Ship.ts b/src/Components/SeaBattle/Ship.ts
new file mode 100644
index 0000000..91228bc
--- /dev/null
+++ b/src/Components/SeaBattle/Ship.ts
@@ -0,0 +1,37 @@
+import type { Cell } from "./Board";
+
+// eslint disable max-classes-per-file
+export class Mark {
+ cell: Cell;
+
+ constructor(cell: Cell) {
+ this.cell = cell;
+ this.cell.mark.color = "";
+ this.cell.mark.id = Math.random() * 10;
+ this.cell.mark.name = "";
+ }
+}
+
+export class Ship extends Mark {
+ constructor(cell: Cell) {
+ super(cell);
+ this.cell.mark.color = "blue";
+ this.cell.mark.name = "ship";
+ }
+}
+
+export class Miss extends Mark {
+ constructor(cell: Cell) {
+ super(cell);
+ this.cell.mark.color = "mine";
+ this.cell.mark.name = "miss";
+ }
+}
+
+export class Damage extends Mark {
+ constructor(cell: Cell) {
+ super(cell);
+ this.cell.mark.color = "fire";
+ this.cell.mark.name = "damage";
+ }
+}
diff --git a/src/Components/Tetris/FigureItem/index.tsx b/src/Components/Tetris/FigureItem/index.tsx
new file mode 100644
index 0000000..644e590
--- /dev/null
+++ b/src/Components/Tetris/FigureItem/index.tsx
@@ -0,0 +1,22 @@
+import type { CSSProperties, FC } from "react";
+import { memo } from "react";
+
+import type { Coordinates } from "../../../helpers/tetris/movement";
+import "./style.scss";
+
+interface IFigureItemProps {
+ coordinates: Coordinates;
+ backgroundColor: string;
+}
+
+const FigureItem: FC = ({ coordinates, backgroundColor }) => {
+ const style: CSSProperties = {
+ top: coordinates[0],
+ left: coordinates[1],
+ backgroundColor,
+ };
+
+ return
;
+};
+
+export default memo(FigureItem);
diff --git a/src/Components/Tetris/FigureItem/style.scss b/src/Components/Tetris/FigureItem/style.scss
new file mode 100644
index 0000000..5211a41
--- /dev/null
+++ b/src/Components/Tetris/FigureItem/style.scss
@@ -0,0 +1,7 @@
+.figure-item {
+ width: 28px;
+ height: 28px;
+ position: absolute;
+ border: 1px solid #78909c;
+ user-select: none;
+}
\ No newline at end of file
diff --git a/src/Components/Tetris/FinishModal/index.tsx b/src/Components/Tetris/FinishModal/index.tsx
new file mode 100644
index 0000000..1ae96bf
--- /dev/null
+++ b/src/Components/Tetris/FinishModal/index.tsx
@@ -0,0 +1,44 @@
+import type { FC } from "react";
+import { memo } from "react";
+
+import "./style.scss";
+
+import languageStore from "../../../store/language";
+import Button from "../../common/Button";
+import Modal from "../../common/Modal";
+
+interface IFinishModalProps {
+ points: number;
+ isModalClosed: boolean;
+ setModalClosed: () => void;
+ reset: () => void;
+}
+
+const FinishModal: FC = ({
+ isModalClosed,
+ setModalClosed,
+ points,
+ reset,
+}) => {
+ const { isEn } = languageStore();
+
+ if (!isModalClosed) {
+ return (
+
+
+
+ {isEn ? "Cчет : " : "Score : "} {points}
+
+
{isEn ? "Заново" : "Reset"}
+
+
+ );
+ }
+
+ return null;
+};
+
+export default memo(FinishModal);
diff --git a/src/Components/Tetris/FinishModal/style.scss b/src/Components/Tetris/FinishModal/style.scss
new file mode 100644
index 0000000..7b2baa1
--- /dev/null
+++ b/src/Components/Tetris/FinishModal/style.scss
@@ -0,0 +1,12 @@
+.finish {
+ padding: 20px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+
+ &__title {
+ font-size: 32px;
+ margin-bottom: 30px;
+ }
+}
\ No newline at end of file
diff --git a/src/Components/Tetris/Item/index.tsx b/src/Components/Tetris/Item/index.tsx
new file mode 100644
index 0000000..57c4ac8
--- /dev/null
+++ b/src/Components/Tetris/Item/index.tsx
@@ -0,0 +1,26 @@
+import type { FC } from "react";
+import { memo } from "react";
+
+import type { Coordinates } from "../../../helpers/tetris/movement";
+import FigureItem from "../FigureItem";
+
+import "./style.scss";
+
+interface IItemProps {
+ coords: Coordinates[];
+ color: string;
+}
+
+const Item: FC = ({ coords, color }) => (
+
+ {coords.map((coordinates, index) => (
+
+ ))}
+
+);
+
+export default memo(Item);
diff --git a/src/Components/Tetris/Item/style.scss b/src/Components/Tetris/Item/style.scss
new file mode 100644
index 0000000..b636b14
--- /dev/null
+++ b/src/Components/Tetris/Item/style.scss
@@ -0,0 +1,5 @@
+.wrapper {
+ position: absolute;
+ top: 0;
+ left: 0;
+}
\ No newline at end of file
diff --git a/src/Components/common/Button/index.tsx b/src/Components/common/Button/index.tsx
new file mode 100644
index 0000000..1898afe
--- /dev/null
+++ b/src/Components/common/Button/index.tsx
@@ -0,0 +1,13 @@
+import clsx from "clsx";
+import type { FC, ButtonHTMLAttributes, DetailedHTMLProps } from "react";
+import "./style.scss";
+
+const Button: FC<
+ DetailedHTMLProps, HTMLButtonElement>
+> = ({ children, className, ...rest }) => (
+
+ {children}
+
+);
+
+export default Button;
diff --git a/src/Components/common/Button/style.scss b/src/Components/common/Button/style.scss
new file mode 100644
index 0000000..da0e37a
--- /dev/null
+++ b/src/Components/common/Button/style.scss
@@ -0,0 +1,22 @@
+.button {
+ font-size: 16px;
+ font-weight: 600;
+ color: #fff;
+ padding: 10px 40px;
+ background-image: linear-gradient(to right, #667eea, #764ba2);
+ border-radius: 20px;
+
+ &:hover {
+ background-position: 100% 0;
+ moz-transition: all .2s ease-in-out;
+ -o-transition: all .2s ease-in-out;
+ -webkit-transition: all .2s ease-in-out;
+ transition: all .2s ease-in-out;
+ box-shadow: 0 0 5px 0 #764ba2 inset, 0 0 5px 2px #667eea;
+ }
+ &:disabled {
+ cursor: default;
+ filter: saturate(40%) brightness(60%);
+ box-shadow: 0 0 0 0 transparent !important;
+ }
+}
\ No newline at end of file
diff --git a/src/Components/common/Input/PasswordControl/index.tsx b/src/Components/common/Input/PasswordControl/index.tsx
new file mode 100644
index 0000000..9e8caa4
--- /dev/null
+++ b/src/Components/common/Input/PasswordControl/index.tsx
@@ -0,0 +1,28 @@
+import { faEyeSlash } from "@fortawesome/free-regular-svg-icons";
+import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+import { useState } from "react";
+
+import "../style.scss";
+
+const PasswordControl = ({ ...inputProps }) => {
+ const [isValueVisible, setValueVisible] = useState(false);
+
+ const toggleValueVisibility = () => setValueVisible(!isValueVisible);
+
+ return (
+
+
+
+
+ );
+};
+
+export default PasswordControl;
diff --git a/src/Components/common/Input/UsernameControl/index.tsx b/src/Components/common/Input/UsernameControl/index.tsx
new file mode 100644
index 0000000..dacb044
--- /dev/null
+++ b/src/Components/common/Input/UsernameControl/index.tsx
@@ -0,0 +1,7 @@
+import "../style.scss";
+
+const UsernameControl = ({ ...inputProps }) => (
+
+);
+
+export default UsernameControl;
diff --git a/src/Components/common/Input/index.tsx b/src/Components/common/Input/index.tsx
new file mode 100644
index 0000000..52ac0d3
--- /dev/null
+++ b/src/Components/common/Input/index.tsx
@@ -0,0 +1,36 @@
+import type { DetailedHTMLProps, FC, InputHTMLAttributes } from "react";
+
+import PasswordControl from "./PasswordControl";
+import UsernameControl from "./UsernameControl";
+
+import "./style.scss";
+
+interface InputProps
+ extends DetailedHTMLProps<
+ InputHTMLAttributes,
+ HTMLInputElement
+ > {
+ label: string;
+ errorsMessage?: string;
+}
+
+const Input: FC = ({
+ type,
+ label,
+ errorsMessage,
+ ...inputProps
+}) => (
+
+
{label}
+ {type === "password" ? (
+
+ ) : (
+
+ )}
+
+ {errorsMessage &&
{errorsMessage}
}
+
+
+);
+
+export default Input;
diff --git a/src/Components/common/Input/style.scss b/src/Components/common/Input/style.scss
new file mode 100644
index 0000000..a49320f
--- /dev/null
+++ b/src/Components/common/Input/style.scss
@@ -0,0 +1,59 @@
+.input-wrapper {
+ margin-bottom: 12px;
+}
+
+.input {
+ width: 100%;
+ height: 40px;
+ padding: 10px 0 10px 15px;
+ border: 2px solid #7e6dd1;
+ border-radius: 5px;
+ outline: unset;
+
+ &::placeholder {
+ font-size: 16px;
+ line-height: 20px;
+ }
+
+ &__label {
+ color: #4f4c6b;
+ font-weight: 600;
+ }
+
+ &__error-message {
+ margin-top: 10px;
+ color: purple;
+ margin-left: 3px;
+ font-size: 14px;
+ line-height: 16px;
+ text-transform: capitalize;
+ }
+}
+
+.password-input-wrapper {
+ border: 2px solid #7e6dd1;
+ border-radius: 5px;
+ padding-right: 20px;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.password-input {
+ width: 100%;
+ height: 40px;
+ padding-left: 15px;
+ padding: 10px 0 10px 15px;
+ outline: unset;
+
+ &::placeholder {
+ font-size: 16px;
+ line-height: 20px;
+ }
+
+ border: none;
+}
+
+.visibility-icon {
+ cursor: pointer;
+}
\ No newline at end of file
diff --git a/src/Components/common/Modal/index.tsx b/src/Components/common/Modal/index.tsx
new file mode 100644
index 0000000..6aea9ea
--- /dev/null
+++ b/src/Components/common/Modal/index.tsx
@@ -0,0 +1,40 @@
+import { faXmark } from "@fortawesome/free-solid-svg-icons";
+import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+import type { FC, ReactNode } from "react";
+import ReactDOM from "react-dom";
+
+import themeStore from "../../../store/theme";
+
+import "./style.scss";
+
+interface ModalProps {
+ children: ReactNode;
+ title: string;
+ setModalClosed: () => void;
+}
+
+const Modal: FC = ({ children, title, setModalClosed }) => {
+ const theme = themeStore((state) => state.isDark);
+
+ return ReactDOM.createPortal(
+ ,
+ document.body
+ );
+};
+
+export default Modal;
diff --git a/src/Components/common/Modal/style.scss b/src/Components/common/Modal/style.scss
new file mode 100644
index 0000000..815f6a1
--- /dev/null
+++ b/src/Components/common/Modal/style.scss
@@ -0,0 +1,95 @@
+.modal-background {
+ position: fixed;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ right: 0;
+ z-index: 3;
+ background-color: rgb(0 0 0 / 38%);
+}
+
+.modal-wrapper {
+ height: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.modal__dark {
+ border-radius: 12px;
+ box-shadow: 0 0 5px 5px #667eea23;
+
+ .authentication__title {
+ color: #eeddffaf;
+ }
+
+ input {
+ background: #e0e0e0;
+ }
+
+ .input__label {
+ color: #eeddff91;
+ }
+
+ .password-input-wrapper {
+ background-color: #e0e0e0;
+ color: #764ba2;
+ }
+
+ .input__error-message {
+ color: #ea8066;
+ }
+}
+
+.modal {
+ min-width: 300px;
+ width: 420px;
+ max-width: 96vw;
+ z-index: 3;
+ position: fixed;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+
+ &__header {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ position: relative;
+ width: 100%;
+ padding: 16px;
+ border-radius: 10px 10px 0 0;
+ background: linear-gradient(to right, #667eea, #764ba2);
+ }
+
+ &__title {
+ text-align: center;
+ font-size: 32px;
+ line-height: 20px;
+ color: white;
+ font-family: 'Ceviche One', cursive;
+ }
+
+ &__close-icon {
+ position: absolute;
+ right: 20px;
+ color: white;
+ font-size: 24px;
+ cursor: pointer;
+
+ &:hover {
+ font-size: 28px;
+ }
+ }
+
+ &__content {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background-color: white;
+ border-radius: 0 0 10px 10px;
+ padding: 10px;
+ position: relative;
+ padding: 24px 20px;
+ }
+}
diff --git a/src/Pages/Games/GameComp/GameComp.tsx b/src/Pages/Games/GameComp/GameComp.tsx
new file mode 100644
index 0000000..e6a06b2
--- /dev/null
+++ b/src/Pages/Games/GameComp/GameComp.tsx
@@ -0,0 +1,38 @@
+import type { FC } from "react";
+import { useNavigate } from "react-router-dom";
+
+import languageStore from "../../../store/language";
+import type { GameItem } from "../games.data";
+import StarsView from "../StarsView/StarsView";
+
+import "./Style.scss";
+
+interface GameCompProps {
+ gameItem: GameItem;
+}
+
+const GameComp: FC = ({ gameItem }) => {
+ const navigate = useNavigate();
+ const { isEn } = languageStore();
+
+ return (
+ navigate(`/preview/${gameItem.name}`)}
+ >
+
+
+
{gameItem.fullName}
+ {isEn ? "Совсем скоро..." : "Coming soon..."}
+
+
+
+
+
+
+ );
+};
+
+export default GameComp;
diff --git a/src/Pages/Games/GameComp/Style.scss b/src/Pages/Games/GameComp/Style.scss
new file mode 100644
index 0000000..401c896
--- /dev/null
+++ b/src/Pages/Games/GameComp/Style.scss
@@ -0,0 +1,107 @@
+@import url('https://fonts.googleapis.com/css2?family=Black+Ops+One&display=swap');
+
+.game-item {
+ width: 420px;
+ height: 240px;
+ max-width: calc(100vw - 32px);
+ background-repeat: no-repeat;
+ background-size: cover;
+ background-position: center;
+ border-radius: 12px;
+ transition: all .2s;
+ cursor: pointer;
+
+ &:hover {
+ transform: scale(1.05);
+ }
+
+ // .game-item__name
+ &__name {
+ display: flex;
+ flex-direction: column;
+ width: calc(100% - 32px);
+ height: calc(100% - 32px);
+ position: absolute;
+ justify-content: center;
+ border-radius: 12px;
+
+ h3 {
+ margin: auto;
+ color: #ffffff;
+ font-family: 'Black Ops One', cursive;
+ font-size: 3.8em;
+ line-height: 90%;
+ text-shadow: 20px 0 20px #00000039,
+ 0 20px 20px #00000039,
+ -20px 0 20px #00000039,
+ 0 -20px 20px #00000039;
+ }
+ }
+
+ // .game-item__rating
+ &__rating {
+ margin-left: auto;
+ margin-top: auto;
+ }
+
+ // .game-item__wrapper
+ &__wrapper {
+ position: relative;
+ display: flex;
+ width: 100%;
+ height: 100%;
+ padding: 16px;
+ border-radius: 12px;
+ background: rgba(0,0,0,0.5);
+ background: linear-gradient(
+ 160deg,
+ rgba(255, 255, 255, 0.109) 0%,
+ rgba(255, 255, 255, 0.094) 73%,
+ rgba(255, 255, 255, 0.59) 100%);
+
+ h4 {
+ display: none;
+ }
+ }
+
+ &_coming-soon {
+ cursor: default;
+
+ &:hover {
+ transform: none;
+ }
+
+ .game-item__wrapper {
+ background: linear-gradient(
+ 160deg,
+ rgba(91, 91, 91, 0.826) 0%,
+ rgba(62, 62, 62, 0.781) 73%,
+ rgba(122, 122, 122, 0.817) 100%);
+
+ h3 {
+ opacity: .4;
+ }
+
+ h4 {
+ display: flex;
+ color: #ffffffa4;
+ font-family: 'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', sans-serif;
+ font-size: 1.2em;
+ }
+
+ .game-item__rating {
+ display: none;
+ }
+ }
+ }
+}
+
+@media screen and (max-width: 890px) {
+ .game-item {
+ min-width: 92vw;
+
+ &:hover {
+ transform: scale(1.02);
+ }
+ }
+}
diff --git a/src/Pages/Games/Games.tsx b/src/Pages/Games/Games.tsx
new file mode 100644
index 0000000..c45e49f
--- /dev/null
+++ b/src/Pages/Games/Games.tsx
@@ -0,0 +1,46 @@
+import { useEffect, useState } from "react";
+
+import { getAllGamesFromBackEnd } from "../../controller/GamesComments";
+import languageStore from "../../store/language";
+import useStatusStore from "../../store/load-status";
+
+import GameComp from "./GameComp/GameComp";
+import type { GameItem } from "./games.data";
+
+import "./Style.scss";
+
+const Games = () => {
+ const [gamesArr, setGamesArr] = useState>([]);
+ const { setStatus } = useStatusStore();
+ const { isLoading } = useStatusStore();
+ const { isEn } = languageStore();
+
+ useEffect(() => {
+ setStatus({ isLoading: true, message: "" });
+ getAllGamesFromBackEnd()
+ .then((games) => {
+ setGamesArr(games);
+ setStatus({ isLoading: false, message: "" });
+ })
+ .catch(({ message }) => {
+ setStatus({ isLoading: false, message });
+ });
+ }, []);
+
+ return (
+
+
{isEn ? "Игры" : "Games"}
+
+ {gamesArr.length > 0 &&
+ gamesArr.map((game) => )}
+
+ {!isLoading && gamesArr.length === 0 && (
+
+
{isEn ? "Игр пока нет!" : "There is no games!"}
+
+ )}
+
+ );
+};
+
+export default Games;
diff --git a/src/Pages/Games/StarsView/StarsView.tsx b/src/Pages/Games/StarsView/StarsView.tsx
new file mode 100644
index 0000000..0f3c3e0
--- /dev/null
+++ b/src/Pages/Games/StarsView/StarsView.tsx
@@ -0,0 +1,103 @@
+import type { FC } from "react";
+import { useEffect, useState } from "react";
+
+import "./style.scss";
+
+const NOT_SET_OPACITY = 0.6;
+
+interface SarsViewProps {
+ rating: number; // рейтинг который вычислился
+ canSet?: boolean; // может ли пользователь менять рейтинг
+ settedRating?: number; // значение заданное как-бы пользователем
+ setCallback?: (rating: number) => void; // вызывается когда пользователь задал рейтинг
+ starSize?: number; // Размер звездочки
+}
+
+const StarsView: FC = ({
+ rating,
+ canSet,
+ settedRating,
+ setCallback,
+ starSize = 30,
+}) => {
+ const [newRating, setRating] = useState(-1);
+ const [isSetted, userSetRating] = useState(false);
+
+ const setNewRating = (value: number) => {
+ if (canSet) {
+ setRating(value);
+ userSetRating(true);
+
+ if (setCallback) {
+ setCallback(value);
+ }
+ }
+ };
+
+ useEffect(() => {
+ if (settedRating) {
+ if (settedRating > 0 && settedRating <= 5) {
+ setRating(settedRating);
+ userSetRating(true);
+ }
+ }
+ }, [settedRating]);
+
+ const [starHovered, setStarHovered] = useState(0);
+
+ const getRate = () => (newRating >= 0 ? newRating : rating);
+
+ // Calculating Percent of filling for every star
+ const [ratingByStars, setRatingByStars] = useState([0, 0, 0, 0, 0]);
+
+ const renewrRatingByStars = () =>
+ setRatingByStars([
+ getRate() <= 0 ? 0 : getRate() >= 1 ? 100 : (getRate() - 0) * 100,
+ getRate() <= 1 ? 0 : getRate() >= 2 ? 100 : (getRate() - 1) * 100,
+ getRate() <= 2 ? 0 : getRate() >= 3 ? 100 : (getRate() - 2) * 100,
+ getRate() <= 3 ? 0 : getRate() >= 4 ? 100 : (getRate() - 3) * 100,
+ getRate() <= 4 ? 0 : getRate() >= 5 ? 100 : (getRate() - 4) * 100,
+ ]);
+
+ useEffect(() => renewrRatingByStars(), [newRating, rating]);
+
+ return (
+
+
setStarHovered(0)}>
+ {ratingByStars.map((percent, i) => (
+
{
+ if (canSet) setStarHovered(i + 1);
+ }}
+ onClick={() => setNewRating(i + 1)}
+ >
+
i ? 1 : NOT_SET_OPACITY,
+ }}
+ />
+
+ ))}
+
+
+ {ratingByStars.map((_, i) => (
+
+ ))}
+
+
+ );
+};
+
+export default StarsView;
diff --git a/src/Pages/Games/StarsView/style.scss b/src/Pages/Games/StarsView/style.scss
new file mode 100644
index 0000000..b922cbc
--- /dev/null
+++ b/src/Pages/Games/StarsView/style.scss
@@ -0,0 +1,44 @@
+.rating-view {
+ position: relative;
+ user-select: none;
+
+ // .rating-view__back
+ &__back {
+ display: flex;
+ gap: 6px;
+ z-index: 0;
+ }
+
+ // .rating-view__fill
+ &__fill {
+ position: absolute;
+ display: flex;
+ gap: 6px;
+ z-index: 1;
+ }
+
+ // .rating-view__star-wrapper
+ &__star-wrapper {
+ width: 30px;
+ height: 30px;
+ &input:focus {
+ background-color: transparent;
+ }
+ }
+
+ // .rating-view__star-no
+ &__star-no {
+ width: 100%;
+ height: 100%;
+ background: url(../../../assets/svg/star-empty.svg) no-repeat center;
+ background-size: cover;
+ }
+
+ // .rating-view__star-yes
+ &__star-yes {
+ width: 100%;
+ height: 100%;
+ background: url(../../../assets/svg/star-full.svg) no-repeat left;
+ background-size: cover;
+ }
+}
\ No newline at end of file
diff --git a/src/Pages/Games/Style.scss b/src/Pages/Games/Style.scss
new file mode 100644
index 0000000..cadc828
--- /dev/null
+++ b/src/Pages/Games/Style.scss
@@ -0,0 +1,39 @@
+.games {
+ display: flex;
+ min-height: calc(100vh - 80px - 80px);
+ ;
+ width: 100%;
+ flex-direction: column;
+ align-items: center;
+ padding: 16px;
+
+ // .games__title
+ &__title {
+ font-family: 'Russo One', sans-serif;
+ font-size: 3em;
+ font-weight: 900;
+ color: #7e6dd1;
+ margin-bottom: 40px;
+ }
+
+ // .games__list
+ &__list {
+ display: flex;
+ flex-wrap: wrap;
+ width: 100%;
+ gap: 16px;
+ }
+
+ // .games__no-games
+ &__no-games {
+ display: flex;
+ flex-direction: column;
+ margin: auto;
+ align-items: center;
+ justify-content: center;
+ font-size: 2em;
+ font-weight: 900;
+ color: #7e6dd1b5;
+ }
+
+}
\ No newline at end of file
diff --git a/src/Pages/Games/games.data.tsx b/src/Pages/Games/games.data.tsx
new file mode 100644
index 0000000..ede1491
--- /dev/null
+++ b/src/Pages/Games/games.data.tsx
@@ -0,0 +1,20 @@
+export interface GameItem {
+ name: string;
+ fullName: string;
+ image: string;
+ descriptionRu: string;
+ descriptionEn: string;
+ rulesRu: string;
+ rulesEn: string;
+ raiting: number;
+ comments: Array
;
+ isComingSoon: boolean;
+}
+
+export interface CommentItem {
+ userName: string;
+ gameName: string;
+ text: string;
+ raiting: number;
+ date: Date;
+}
diff --git a/src/Pages/Games/pointsData.ts b/src/Pages/Games/pointsData.ts
new file mode 100644
index 0000000..152de03
--- /dev/null
+++ b/src/Pages/Games/pointsData.ts
@@ -0,0 +1,4 @@
+export const pointsData = [
+ 100, 80, 70, 60, 55, 45, 40, 35, 30, 27, 24, 21, 18, 16, 14, 12, 10, 8, 6, 5,
+ 4, 3, 2, 1,
+];
diff --git a/src/Pages/MainPage/index.tsx b/src/Pages/MainPage/index.tsx
new file mode 100644
index 0000000..5e24e54
--- /dev/null
+++ b/src/Pages/MainPage/index.tsx
@@ -0,0 +1,56 @@
+import { useState } from "react";
+import { useNavigate } from "react-router-dom";
+
+import AuthenticationModal from "../../Components/Authentication";
+import Button from "../../Components/common/Button";
+import useUserStore from "../../store";
+import languageStore from "../../store/language";
+import themeStore from "../../store/theme";
+
+import "./style.scss";
+
+const MainPage = () => {
+ const [isModalClosed, setModalClosed] = useState(true);
+ const navigate = useNavigate();
+ const user = useUserStore((state) => state.userName);
+ const theme = themeStore((state) => state.isDark);
+ const isEn = languageStore((state) => state.isEn);
+
+ const handler = () => {
+ if (user === null) {
+ setModalClosed(false);
+ } else {
+ navigate("/games");
+ }
+ };
+
+ return (
+
+
+
+ {isEn
+ ? "Начни играть вместе с Gaming Zone"
+ : "Let`s play with Gaming Zone"}
+
+
+ {isEn
+ ? `Gaming Zone один из лучших сайтов онлайн игр, здесь вы гарантированно получите свою порцию веселья
+ играя с друзьями или в одиночку`
+ : `Gaming Zone has the best free online games selection and offers the most
+ fun experience to play alone or with friends.`}
+
+
+ {isEn ? "Начать" : "Get started"}
+
+ {!isModalClosed && (
+
setModalClosed(true)} />
+ )}
+
+ );
+};
+
+export default MainPage;
diff --git a/src/Pages/MainPage/style.scss b/src/Pages/MainPage/style.scss
new file mode 100644
index 0000000..84a47a4
--- /dev/null
+++ b/src/Pages/MainPage/style.scss
@@ -0,0 +1,57 @@
+.main-page {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+
+ &__photo {
+ width: 40%;
+ }
+
+ &__main-text {
+ margin-top: 20px;
+ max-width: 96vw;
+ font-size: 58px;
+ text-align: center;
+ line-height: 1;
+ font-family: 'Russo One', sans-serif;
+ font-weight: 600;
+ color: #4f4c6b;
+ }
+
+ &__secondary-text {
+ text-align: center;
+ margin-top: 60px;
+ max-width: 50%;
+ font-size: 20px;
+ font-weight: 400;
+ color: #4f4c6b;
+ opacity: 0.7;
+ }
+
+ &__button {
+ margin: 40px 0;
+ min-width: 200px;
+ }
+}
+
+.dark-theme{
+ .main-page__main-text{
+ color: #fffef0;
+ }
+ .main-page__secondary-text{
+ color: #fffef0;
+ }
+}
+
+@media screen and (max-width: 480px) {
+ .main-page {
+ &__main-text {
+ font-size: 2.5em;
+ max-width: 96vw;
+ }
+
+ &__secondary-text {
+ max-width: 90vw;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Pages/MemoryGame/MemoryGame.tsx b/src/Pages/MemoryGame/MemoryGame.tsx
new file mode 100644
index 0000000..312b5fa
--- /dev/null
+++ b/src/Pages/MemoryGame/MemoryGame.tsx
@@ -0,0 +1,209 @@
+import { useEffect, useRef, useState } from "react";
+import { useNavigate } from "react-router-dom";
+
+import Button from "../../Components/common/Button";
+import Modal from "../../Components/common/Modal";
+import CardComponent from "../../Components/MemoryGame/CardComponent";
+import { cardsArr } from "../../Components/MemoryGame/Data";
+import { type ICard } from "../../Components/MemoryGame/Interfaces";
+import { checkForBan } from "../../controller/banchecker";
+import { postWinner } from "../../controller/Winners";
+import useUserStore from "../../store";
+import languageStore from "../../store/language";
+import useStatusStore from "../../store/load-status";
+import { pointsData } from "../Games/pointsData";
+
+import styles from "./Memorygame.module.scss";
+
+const randomArr = [...cardsArr].sort(() => Math.random() - 0.5);
+
+const MemoryGame = () => {
+ const navigate = useNavigate();
+ const [cards, setCards] = useState(randomArr);
+ const [inGame, setInGame] = useState(false);
+ const [startGame, setStartGame] = useState(false);
+ const [countTry, setCountTry] = useState(0);
+ const [points, setPoints] = useState(0);
+ const [openCards, setOpenCards] = useState(0);
+ const [showModal, setShowModal] = useState(false);
+ const [width, setWidth] = useState(650);
+ const [level, setLevel] = useState(8);
+ const pairs = useRef([]);
+ const openPairs = useRef(0);
+ const { isEn } = languageStore();
+ const { setUser } = useUserStore();
+ const { setStatus } = useStatusStore();
+
+ const gameName = "Memorygame";
+ let misData = 0;
+
+ const onPress = (id: number) => {
+ setOpenCards(openCards + 1);
+ const obj = cardsArr.find((item) => item.id === id);
+
+ if (obj != null) {
+ pairs.current.push(obj);
+ }
+
+ if (pairs.current.length === 2) {
+ if (pairs.current[0].name === pairs.current[1].name) {
+ pairs.current[0].hasPair = true;
+ pairs.current[1].hasPair = true;
+
+ if (misData < pointsData.length && level === 18)
+ setPoints((prev) => prev + pointsData[misData]);
+ if (misData < pointsData.length - 2 && level === 12)
+ setPoints((prev) => prev + pointsData[misData + 2]);
+ if (misData < pointsData.length - 4 && level === 8)
+ setPoints((prev) => prev + pointsData[misData + 4]);
+ misData = 0;
+
+ const arr = [...cards];
+ arr.splice(cards.indexOf(pairs.current[0]), 1, pairs.current[0]);
+ arr.splice(cards.indexOf(pairs.current[1]), 1, pairs.current[1]);
+ setCards(arr);
+ openPairs.current += 1;
+ } else {
+ misData += 1;
+ }
+
+ pairs.current = [];
+ setCountTry((prev) => prev + 1);
+ }
+ };
+
+ const startGameFunc = () => {
+ setInGame(true);
+ setStartGame(true);
+ misData = 0;
+ setPoints(0);
+ setTimeout(() => {
+ setStartGame(false);
+ }, 3000);
+ };
+
+ const restartGame = () => {
+ setStartGame(true);
+ const arr = [...cardsArr.slice(0, level).sort(() => Math.random() - 0.5)];
+ arr.forEach((item) => {
+ item.hasPair = false;
+ });
+ setCards(arr);
+ setCountTry(0);
+ misData = 0;
+ setPoints(0);
+ pairs.current = [];
+ openPairs.current = 0;
+ setOpenCards(0);
+ setShowModal(false);
+ setTimeout(() => {
+ setStartGame(false);
+ }, 3000);
+ };
+
+ useEffect(() => {
+ if (openPairs.current === level / 2) {
+ setShowModal(true);
+ if (points !== 0) postWinner(gameName, points);
+ }
+ }, [openPairs.current]);
+
+ useEffect(() => {
+ const arr = cardsArr.slice(0, level);
+ setCards(arr.sort(() => Math.random() - 0.5));
+ restartGame();
+ setInGame(false);
+
+ switch (level) {
+ case 8:
+ setWidth(650);
+ break;
+ case 12:
+ setWidth(990);
+ break;
+ case 18:
+ setWidth(990);
+ break;
+
+ default:
+ setWidth(650);
+ break;
+ }
+ }, [level]);
+
+ useEffect(() => {
+ checkForBan(isEn, setUser, setStatus, navigate);
+ }, []);
+
+ return (
+
+
Memory Game
+
+
{isEn ? "Уровень : " : "Level : "}
+
{
+ setLevel(+e.target.value);
+ }}
+ >
+ {isEn ? "Легкий" : "Easy"}
+ {isEn ? "Средний" : "Medium"}
+ {isEn ? "Тяжелый" : "Hard"}
+
+
+
+ {isEn ? "Начать игру" : "Start game"}
+
+ {isEn ? "Рестарт" : "Restart"}
+
+
+
+
+ {isEn ? "Количество очков:" : "Points:"}
+ {points}
+
+
+ {cards.map((item) => (
+
+ ))}
+
+ {showModal && (
+
setShowModal(false)} title="Победа!">
+
+
Ваш результат {points}
+
{
+ navigate("/main");
+ setShowModal(false);
+ }}
+ >
+ {isEn ? " На главную" : "On main"}
+
+
{
+ restartGame();
+ setShowModal(false);
+ }}
+ >
+ {isEn ? "Начать заново" : "Play again"}
+
+
+
+ )}
+
+ );
+};
+
+export default MemoryGame;
diff --git a/src/Pages/MemoryGame/Memorygame.module.scss b/src/Pages/MemoryGame/Memorygame.module.scss
new file mode 100644
index 0000000..fb30ae9
--- /dev/null
+++ b/src/Pages/MemoryGame/Memorygame.module.scss
@@ -0,0 +1,73 @@
+.memory_main{
+ width: 100%;
+ margin: 0 auto;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ font-family: "Russo One", sans-serif;
+ font-size: 25px;
+ background: linear-gradient(
+ 180deg,
+ rgba(255, 255, 255, 0) 0%,
+ rgba(118, 75, 162, 0.565) 83%,
+ rgba(102, 126, 234, 0.86) 100%
+ );
+ padding: 10px 0 40px;
+ &__level{
+ display: flex;
+ gap: 20px;
+ align-items: center;
+ padding: 20px 0 0;
+ }
+ &__input{
+ padding: 5px 20px;
+ border-radius: 5px;
+ color: #fff;
+ background-image: linear-gradient(to right, #667eea, #764ba2);
+ option{
+ color: black;
+ }
+ }
+}
+.points{
+ margin-bottom: 10px;
+}
+.cards_conteiner{
+ display: flex;
+ flex-wrap: wrap;
+ gap: 15px;
+ justify-content: center;
+}
+.modal_window{
+ &__main{
+ padding: 20px;
+ width: 100%;
+ border-radius: 20px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 20px;
+ }
+ &__text{
+ font-weight: bold;
+ }
+}
+.btns_conteiner{
+ padding: 20px 0;
+ display: flex;
+ gap: 20px;
+}
+
+@media screen and (max-width: 485px) {
+ .btns_conteiner{
+ padding: 10px 0;
+ gap: 10px;
+ flex-direction: column;
+ button {
+ padding: 8px 20px !important;
+ }
+ }
+ .memory_main__level{
+ flex-direction: column;
+ }
+}
\ No newline at end of file
diff --git a/src/Pages/NotFound/NotFound.tsx b/src/Pages/NotFound/NotFound.tsx
new file mode 100644
index 0000000..dcd4d4c
--- /dev/null
+++ b/src/Pages/NotFound/NotFound.tsx
@@ -0,0 +1,32 @@
+import { useNavigate } from "react-router-dom";
+
+import "./style.css";
+import languageStore from "../../store/language";
+
+const NotFound = () => {
+ const navigate = useNavigate();
+ const { isEn } = languageStore();
+
+ return (
+
+
+
+
{isEn ? "упс!" : "oops!"}
+
+ {isEn
+ ? "Ошибка 404 : Страница не найдена"
+ : "Error 404 : Page Not Found"}
+
+
navigate(`/`)}>
+ {isEn ? "Вернутся" : "Go Back"}
+
+
+
+ );
+};
+
+export default NotFound;
diff --git a/src/Pages/NotFound/style.css b/src/Pages/NotFound/style.css
new file mode 100644
index 0000000..be2ade9
--- /dev/null
+++ b/src/Pages/NotFound/style.css
@@ -0,0 +1,143 @@
+/* vietnamese */
+@font-face {
+ font-family: 'Quicksand';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(/fonts.gstatic.com/s/quicksand/v30/6xK-dSZaM9iE8KbpRA_LJ3z8mH9BOJvgkBgv58m-wjwxUD2GF9Zc.woff2) format('woff2');
+ unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
+}
+/* latin-ext */
+@font-face {
+ font-family: 'Quicksand';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(/fonts.gstatic.com/s/quicksand/v30/6xK-dSZaM9iE8KbpRA_LJ3z8mH9BOJvgkBgv58i-wjwxUD2GF9Zc.woff2) format('woff2');
+ unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
+}
+/* latin */
+@font-face {
+ font-family: 'Quicksand';
+ font-style: normal;
+ font-weight: 700;
+ font-display: swap;
+ src: url(/fonts.gstatic.com/s/quicksand/v30/6xK-dSZaM9iE8KbpRA_LJ3z8mH9BOJvgkBgv58a-wjwxUD2GFw.woff2) format('woff2');
+ unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
+}
+
+* {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+#notfound {
+ height: calc(100vh - 80px - 80px);
+ background-color: #fafbfd;
+}
+
+#notfound .notfound {
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ -webkit-transform: translate(-50%, -50%);
+ -ms-transform: translate(-50%, -50%);
+ transform: translate(-50%, -50%);
+}
+
+.notfound {
+ max-width: 520px;
+ width: 100%;
+ text-align: center;
+}
+
+.notfound .notfound-bg {
+ position: absolute;
+ left: 0px;
+ right: 0px;
+ top: 50%;
+ -webkit-transform: translateY(-50%);
+ -ms-transform: translateY(-50%);
+ transform: translateY(-50%);
+ z-index: -1;
+}
+
+.notfound .notfound-bg > div {
+ width: 100%;
+ background: #fff;
+ border-radius: 90px;
+ height: 125px;
+}
+
+.notfound .notfound-bg > div:nth-child(1) {
+ -webkit-box-shadow: 5px 5px 0px 0px #f3f3f3;
+ box-shadow: 5px 5px 0px 0px #f3f3f3;
+}
+
+.notfound .notfound-bg > div:nth-child(2) {
+ -webkit-transform: scale(1.3);
+ -ms-transform: scale(1.3);
+ transform: scale(1.3);
+ -webkit-box-shadow: 5px 5px 0px 0px #f3f3f3;
+ box-shadow: 5px 5px 0px 0px #f3f3f3;
+ position: relative;
+ z-index: 10;
+}
+
+.notfound .notfound-bg > div:nth-child(3) {
+ -webkit-box-shadow: 5px 5px 0px 0px #f3f3f3;
+ box-shadow: 5px 5px 0px 0px #f3f3f3;
+ position: relative;
+ z-index: 90;
+}
+
+.notfound h1 {
+ font-family: 'Quicksand', sans-serif;
+ font-size: 86px;
+ text-transform: uppercase;
+ font-weight: 700;
+ margin-top: 0;
+ margin-bottom: 8px;
+ color: #151515;
+}
+
+.notfound h2 {
+ font-family: 'Quicksand', sans-serif;
+ font-size: 26px;
+ margin: 0;
+ font-weight: 700;
+ color: #151515;
+}
+
+.notfound button {
+ font-family: 'Quicksand', sans-serif;
+ font-size: 14px;
+ text-decoration: none;
+ text-transform: uppercase;
+ display: inline-block;
+ padding: 15px 30px;
+ color: #fff;
+ font-weight: 700;
+ margin-top: 40px;
+}
+
+@media only screen and (max-width: 767px) {
+ .notfound .notfound-bg {
+ width: 287px;
+ margin: auto;
+ }
+
+ .notfound .notfound-bg > div {
+ height: 85px;
+ }
+}
+
+@media only screen and (max-width: 480px) {
+ .notfound h1 {
+ font-size: 68px;
+ }
+
+ .notfound h2 {
+ font-size: 18px;
+ }
+}
\ No newline at end of file
diff --git a/src/Pages/PreviewPage/Components/CommentsList.tsx b/src/Pages/PreviewPage/Components/CommentsList.tsx
new file mode 100644
index 0000000..7028b07
--- /dev/null
+++ b/src/Pages/PreviewPage/Components/CommentsList.tsx
@@ -0,0 +1,70 @@
+import type { FC } from "react";
+import { useNavigate } from "react-router-dom";
+
+import Button from "../../../Components/common/Button";
+import { checkForBan } from "../../../controller/banchecker";
+import type { GameComment, GameData } from "../../../data/gamesData";
+import useUserStore from "../../../store";
+import languageStore from "../../../store/language";
+import useStatusStore from "../../../store/load-status";
+import StarsView from "../../Games/StarsView/StarsView";
+import styles from "../Preview.module.scss";
+
+interface CommentsListProps {
+ comments: Array;
+ gameData: GameData | null;
+ setShowModal: React.Dispatch>;
+}
+
+export const CommentsList: FC = ({
+ comments,
+ gameData,
+ setShowModal,
+}) => {
+ const { isEn } = languageStore();
+ const { setUser } = useUserStore();
+ const { setStatus } = useStatusStore();
+ const navigate = useNavigate();
+
+ return (
+
+
+
+ {isEn ? "Отзывы" : "Feedback"}
+
+ {comments.map((elem) => (
+
+
+
+
{elem.userName}
+
+
+
{elem.text}
+
+ {`${new Date(elem.date).toLocaleString()}`}
+
+
+ ))}
+
+
+ !gameData?.isComingSoon &&
+ !(await checkForBan(isEn, setUser, setStatus, navigate)) &&
+ setShowModal(true)
+ }
+ disabled={gameData?.isComingSoon}
+ >
+ {isEn ? " Оставить отзыв" : "Leave feedback"}
+
+
+ );
+};
diff --git a/src/Pages/PreviewPage/Components/PreviewMainSection.tsx b/src/Pages/PreviewPage/Components/PreviewMainSection.tsx
new file mode 100644
index 0000000..79ced9b
--- /dev/null
+++ b/src/Pages/PreviewPage/Components/PreviewMainSection.tsx
@@ -0,0 +1,73 @@
+import type { FC } from "react";
+import { useNavigate } from "react-router-dom";
+
+import Button from "../../../Components/common/Button";
+import { checkForBan } from "../../../controller/banchecker";
+import type { GameData } from "../../../data/gamesData";
+import useUserStore from "../../../store";
+import languageStore from "../../../store/language";
+import useStatusStore from "../../../store/load-status";
+import StarsView from "../../Games/StarsView/StarsView";
+import styles from "../Preview.module.scss";
+
+interface PreviewMainSectionProps {
+ gameData: GameData | null;
+ myRaiting: number;
+ setRaiting: React.Dispatch>;
+ setShowModal: React.Dispatch>;
+ gameName: string | undefined;
+}
+
+export const PreviewMainSection: FC = ({
+ gameData,
+ myRaiting,
+ setRaiting,
+ setShowModal,
+ gameName,
+}) => {
+ const navigate = useNavigate();
+ const { isEn } = languageStore();
+ const { setUser } = useUserStore();
+ const { setStatus } = useStatusStore();
+
+ const navigateHandler = () => {
+ if (gameData?.isComingSoon) return;
+
+ if (gameName !== "SeaBattle") {
+ navigate(`/${gameName}`);
+ } else {
+ navigate(`/room/${gameName}`);
+ }
+ };
+
+ return (
+
+
+
{gameData?.fullName}
+
+ {isEn ? gameData?.descriptionRu : gameData?.descriptionEn}
+
+
{
+ if (gameData?.isComingSoon) return;
+ setRaiting(rate);
+
+ if (!(await checkForBan(isEn, setUser, setStatus, navigate))) {
+ setShowModal(true);
+ }
+ }}
+ />
+
+ {isEn ? "Играть!" : "Play!"}
+
+
+
+ );
+};
diff --git a/src/Pages/PreviewPage/Components/ReviewComment.tsx b/src/Pages/PreviewPage/Components/ReviewComment.tsx
new file mode 100644
index 0000000..8ad7394
--- /dev/null
+++ b/src/Pages/PreviewPage/Components/ReviewComment.tsx
@@ -0,0 +1,58 @@
+import type { FC } from "react";
+import { useState } from "react";
+
+import Button from "../../../Components/common/Button";
+import { postComment } from "../../../controller/GamesComments";
+import type { GameData } from "../../../data/gamesData";
+import languageStore from "../../../store/language";
+import useStatusStore from "../../../store/load-status";
+import StarsView from "../../Games/StarsView/StarsView";
+import styles from "../Preview.module.scss";
+
+interface ReviewCommentProps {
+ gameData: GameData | null;
+ raiting: number;
+ setRaiting: React.Dispatch>;
+ hideModal: () => void;
+}
+
+export const ReviewComment: FC = ({
+ gameData,
+ raiting,
+ setRaiting,
+ hideModal,
+}) => {
+ const { setStatus } = useStatusStore();
+ const { isEn } = languageStore();
+ const [comment, setComment] = useState("");
+
+ const addComment = () => {
+ setStatus({ isLoading: true, message: "" });
+ postComment(gameData?.name || "", comment, raiting)
+ .then(() => {
+ hideModal();
+ setStatus({ isLoading: false, message: "" });
+ })
+ .catch((error) => {
+ setStatus({ isLoading: false, message: error.message });
+ });
+ };
+
+ return (
+
+ setRaiting(rate)}
+ />
+
+ );
+};
diff --git a/src/Pages/PreviewPage/Components/Rules.tsx b/src/Pages/PreviewPage/Components/Rules.tsx
new file mode 100644
index 0000000..e2ddd73
--- /dev/null
+++ b/src/Pages/PreviewPage/Components/Rules.tsx
@@ -0,0 +1,28 @@
+import type { FC } from "react";
+
+import type { GameData } from "../../../data/gamesData";
+import styles from "../Preview.module.scss";
+
+interface RulesProps {
+ gameData: GameData | null;
+ isEn: boolean;
+}
+
+export const Rules: FC = ({ gameData, isEn }) => (
+
+
+ {isEn ? "Правила Игры:" : "Game rules:"}
+
+
+ {isEn
+ ? gameData?.rulesRu
+ .split("")
+ .map((ch: string) => (ch === "\n" ? "\n\n" : ch))
+ .join("")
+ : gameData?.rulesEn
+ .split("")
+ .map((ch: string) => (ch === "\n" ? "\n\n" : ch))
+ .join("")}
+
+
+);
diff --git a/src/Pages/PreviewPage/Components/Winners.tsx b/src/Pages/PreviewPage/Components/Winners.tsx
new file mode 100644
index 0000000..074b13d
--- /dev/null
+++ b/src/Pages/PreviewPage/Components/Winners.tsx
@@ -0,0 +1,57 @@
+import type { FC } from "react";
+import React, { useEffect, useState } from "react";
+
+import { getGameWinsList } from "../../../controller/Winners";
+import type { WinnerRes } from "../../../data/winData";
+import styles from "../Preview.module.scss";
+
+interface WinnersProps {
+ gameName?: string;
+ isEn: boolean;
+}
+
+export const Winners: FC = ({ gameName, isEn }) => {
+ const [winners, setWinners] = useState>([]);
+
+ useEffect(() => {
+ getGameWinsList(gameName || "").then((data) => setWinners(data));
+ }, []);
+
+ return (
+
+
+ {isEn ? "ТОП победителей" : "Winners TOP"}
+
+
+ {winners.length > 0 ? (
+ winners.slice(0, 10).map((winner, i) => (
+
+ {i === 0 && (
+ <>
+
+
+ {isEn ? "Игрок" : "Player"}
+
+
+ {isEn ? "Очки" : "Points"}
+
+ >
+ )}
+ {i + 1}
+
+ {winner.userName}
+
+ {winner.points}
+
+ ))
+ ) : (
+
+ {isEn
+ ? "В игре пока нет победителей"
+ : "There are no winners in the game yet"}
+
+ )}
+
+
+ );
+};
diff --git a/src/Pages/PreviewPage/Preview.module.scss b/src/Pages/PreviewPage/Preview.module.scss
new file mode 100644
index 0000000..fc06acb
--- /dev/null
+++ b/src/Pages/PreviewPage/Preview.module.scss
@@ -0,0 +1,238 @@
+.preview{
+ width: 100%;
+ margin: auto;
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+
+ &_header {
+ color: #ffffffe3;
+ font-family: 'Black Ops One', cursive;
+ font-size: 3.8em;
+ line-height: 90%;
+ text-align: center;
+ text-shadow: 20px 0 20px #00000039,
+ 0 20px 20px #00000039,
+ -20px 0 20px #00000039,
+ 0 -20px 20px #00000039;
+ }
+ &__section {
+ display: flex;
+ width: 100%;
+ height: calc(100vh - 80px);
+ background-position: center;
+ background-repeat: no-repeat;
+ background-size: cover;
+ }
+ &__wrapper {
+ padding: 50px 0 20px;
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-around;
+ align-items: center;
+ height: 100%;
+ background: linear-gradient(
+ 180deg,
+ rgba(0, 0, 0, 0.626) 0%,
+ rgba(0, 0, 0, 0.326) 73%,
+ rgba(0, 0, 0, 0) 100%
+ );
+ }
+ &_description {
+ max-width: 80%;
+ font-size: 1.4em;
+ text-align: center;
+ color: #e1e1e1c6;
+ }
+
+ &_rules{
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ width: 100%;
+ padding: 80px 20px 60px;
+ }
+ &_rulesTitle {
+ margin-bottom: 70px;
+ font-family: Impact, Haettenschweiler, 'Arial Narrow Bold', sans-serif;
+ text-align: center;
+ font-size: 1.8em;
+ opacity: .9;
+ }
+ &_rulesText {
+ max-width: 1024px;
+ text-align: left;
+ opacity: .9;
+ white-space: pre-wrap;
+ font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif;
+ line-height: 1.3;
+ margin-bottom: 20px;
+ }
+ &_commentsWrapper {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ width: 100%;
+ padding: 20px 20px 40px;
+ background: linear-gradient(
+ 180deg,
+ rgba(255, 255, 255, 0) 0%,
+ rgba(118, 75, 162, 0.565) 83%,
+ rgba(102, 126, 234, 0.86) 100%
+ );
+ }
+ &_info {
+ padding: 4px 0;
+ display: flex;
+ flex-wrap: wrap;
+ gap: 20px;
+ align-items: center;
+ margin-bottom: 10px;
+ }
+
+ &_comments {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ width: 100%;
+ margin: 20px 0 60px;
+ gap: 10px;
+ }
+
+ &_image {
+ width: 40px;
+ height: 40px;
+ }
+
+ &_item {
+ width: 480px;
+ max-width: 92vw;
+ border: 1px solid rgb(173, 182, 189);
+ padding: 5px 20px;
+ border-radius: 16px;
+ background-color: rgb(240, 248, 255);
+ box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 3px 6px rgba(0, 0, 0, 0.23);
+
+ p {
+ color: #1c1c1c;
+ margin-bottom: 12px;
+ }
+ }
+
+ &_title {
+ font-weight: 600;
+ font-family: "Ceviche One", cursive;
+ }
+
+ &_username {
+ margin-right: auto;
+ color: #733892;
+ }
+
+ &_date {
+ margin-top: 4px;
+ text-align: right;
+ font-size: 12px;
+ color: #a39898;
+ }
+ &__reviewBtn {
+ border: solid #572886 2px;
+ background: linear-gradient(
+ to right, #7d85a82d, #8b73a422
+ );
+ &:hover {
+ box-shadow:
+ 0 0 5px 0
+ #764ba253 inset,
+ 0 0 5px 2px
+ #667eea41;
+ }
+ }
+
+ &_winnersWrapper {
+ width: 100vw;
+ background: linear-gradient(
+ rgb(154, 92, 220) 0%,
+ rgb(89, 24, 159) 50%,
+ rgb(47, 45, 150) 100%);
+ padding: 30px 20px 50px;
+ margin-bottom: 30px;
+ }
+ &_winners {
+ margin: 20px 0;
+ width: 96vw;
+ margin: 0 auto;
+ max-width: 480px;
+ display: grid;
+ grid-template-columns: 1fr 6fr 2fr;
+ gap: 12px;
+ align-items: baseline;
+ }
+ &_winnersTittle {
+ margin-bottom: 40px;
+ font-family: Impact, Haettenschweiler, "Arial Narrow Bold", sans-serif;
+ text-align: center;
+ font-size: 1.8em;
+ opacity: 0.9;
+ color: #fffffff2;
+ }
+ &_winnerPositionHead {
+ color: #fffffff2;
+ }
+ &_winnerPlayerHead {
+ font-family: Impact, Haettenschweiler, "Arial Narrow Bold", sans-serif;
+ font-size: 1.2em;
+ opacity: 0.9;
+ color: #130f5bc1;
+ }
+ &_winnerPointsHead {
+ font-family: Impact, Haettenschweiler, "Arial Narrow Bold", sans-serif;
+ font-size: 1.2em;
+ opacity: 0.9;
+ color: #130f5bc1;
+ }
+ &_winnerPosition {
+ font-family: "Ceviche One", cursive;
+ font-family: 'Russo One', sans-serif;
+ font-size: 1.7em;
+ color: rgb(136 89 203 / 87%);
+ }
+ &_winnerPlayer {
+ font-family: 'Russo One', sans-serif;
+ font-size: 1.4em;
+ color: #ffffffcb;
+ }
+ &_winnerPoints {
+ font-family: "Ceviche One", cursive;
+ font-family: 'Russo One', sans-serif;
+ font-size: 1.6em;
+ color: rgba(167, 159, 221, 0.95)
+ }
+ &_noWinners {
+ width: 100%;
+ margin: 50px auto 70px;
+ grid-column: 1 / 4;
+ text-align: center;
+ font-family: Impact, Haettenschweiler, "Arial Narrow Bold", sans-serif;
+ font-size: 1.2em;
+ opacity: 0.9;
+ color: #130f5b4a;
+ }
+}
+.modal{
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 20px;
+ width: 100%;
+ &_area{
+ width: 100%;
+ height: 200px;
+ padding: 10px;
+ font-family: 'Courier New', Courier, monospace;
+ font-weight: 700;
+ font-size: 1.2em;
+ resize: none;
+ }
+}
diff --git a/src/Pages/PreviewPage/PreviewPage.tsx b/src/Pages/PreviewPage/PreviewPage.tsx
new file mode 100644
index 0000000..a649be5
--- /dev/null
+++ b/src/Pages/PreviewPage/PreviewPage.tsx
@@ -0,0 +1,87 @@
+import { useEffect, useState } from "react";
+import { useParams } from "react-router-dom";
+
+import Modal from "../../Components/common/Modal";
+import { getGameData } from "../../controller/GamesComments";
+import type { GameComment, GameData } from "../../data/gamesData";
+import useUserStore from "../../store";
+import languageStore from "../../store/language";
+import useStatusStore from "../../store/load-status";
+
+import { CommentsList } from "./Components/CommentsList";
+import { PreviewMainSection } from "./Components/PreviewMainSection";
+import { ReviewComment } from "./Components/ReviewComment";
+import { Rules } from "./Components/Rules";
+import { Winners } from "./Components/Winners";
+import styles from "./Preview.module.scss";
+
+export default function PreviewPage() {
+ const params = useParams();
+ const gameName = params.game;
+ const { isEn } = languageStore();
+ const { isLoading, setStatus } = useStatusStore();
+ const { userName } = useUserStore();
+
+ const [comments, setComments] = useState([]);
+ const [gameData, setGameData] = useState(null);
+ const [showModal, setShowModal] = useState(false);
+ const [raiting, setRaiting] = useState(5);
+ const [myRaiting, setMyRaiting] = useState(-1);
+
+ const getRating = () => {
+ const myComment = comments.find((com) => com.userName === userName);
+ setMyRaiting(myComment ? myComment.raiting : -1);
+ };
+
+ const refillData = () => {
+ setStatus({ isLoading: true, message: "" });
+ getGameData(gameName || "")
+ .then((data) => {
+ setComments(data.comments);
+ setGameData(data);
+ })
+ .then(() => setStatus({ isLoading: false, message: "" }))
+ .catch((error) => {
+ setStatus({ isLoading: false, message: error.message });
+ });
+ };
+
+ useEffect(() => refillData(), [showModal]);
+ useEffect(() => getRating(), [comments]);
+
+ return (
+
+ {!isLoading && (
+ <>
+
+
+
+
+ >
+ )}
+ {showModal && (
+
setShowModal(false)}
+ title={isEn ? "Отзыв" : "Feedback"}
+ >
+ setShowModal(false)}
+ />
+
+ )}
+
+ );
+}
diff --git a/src/Pages/SeaBattle/CreateGame.tsx b/src/Pages/SeaBattle/CreateGame.tsx
new file mode 100644
index 0000000..7b32474
--- /dev/null
+++ b/src/Pages/SeaBattle/CreateGame.tsx
@@ -0,0 +1,93 @@
+import { useEffect } from "react";
+import * as reactRouterDom from "react-router-dom";
+
+import Button from "../../Components/common/Button";
+import { CreateGamesList } from "../../Components/MultiGames/CreateGamesList";
+import { checkForBan } from "../../controller/banchecker";
+import useUserStore from "../../store";
+import languageStore from "../../store/language";
+import useStatusStore from "../../store/load-status";
+
+import styles from "./SeaBattle.module.scss";
+import { webSocketController } from "./web-socket/WebSoket";
+
+export const CreateGame = () => {
+ const params = reactRouterDom.useParams();
+ const { gameName } = params;
+ const navigate = reactRouterDom.useNavigate();
+ const { userName: user, setUser } = useUserStore();
+ const { setStatus } = useStatusStore();
+ const location = reactRouterDom.useLocation();
+ const { isEn } = languageStore();
+
+ const startGame = () => {
+ if (webSocketController.getGameId() !== "") {
+ const gameId = webSocketController.getGameId();
+ navigate(`/SeaBattle/${gameId}`);
+ }
+ };
+
+ const createGame = async () => {
+ if (await checkForBan(isEn, setUser, setStatus, navigate)) {
+ return;
+ }
+
+ const request = {
+ type: "create",
+ data: null,
+ };
+ webSocketController.send(JSON.stringify(request));
+ setTimeout(startGame, 500);
+ };
+
+ const joinGame = async (id: string) => {
+ if (await checkForBan(isEn, setUser, setStatus, navigate)) {
+ return;
+ }
+
+ const request = {
+ type: "join",
+ data: { gameId: id },
+ };
+ webSocketController.send(JSON.stringify(request));
+
+ setTimeout(startGame, 500);
+ };
+
+ useEffect(() => {
+ if (user !== null) {
+ webSocketController.setUser(user);
+ webSocketController.connect();
+ } else {
+ navigate("/");
+ }
+
+ // подключаемся к игре, если есть квери параметры с id игры
+ const queryParams = new URLSearchParams(location.search);
+ const gameId = queryParams.get("gameId");
+
+ if (gameId) {
+ webSocketController.send(
+ JSON.stringify({ type: "join", data: { gameId } })
+ );
+ }
+
+ // убиваем все слушатели при выходе со страницы
+ return () => webSocketController.deleteAllCallbacks();
+ }, [user]);
+
+ return (
+
+
{gameName}
+
+ {isEn
+ ? "Создайте новую игру или присоединитесь к существующей"
+ : "Create a new game or join an existing one"}
+
+ createGame()}>
+ {isEn ? "Создать игру" : "Create game"}
+
+
+
+ );
+};
diff --git a/src/Pages/SeaBattle/SeaBattle.module.scss b/src/Pages/SeaBattle/SeaBattle.module.scss
new file mode 100644
index 0000000..7bcb2b3
--- /dev/null
+++ b/src/Pages/SeaBattle/SeaBattle.module.scss
@@ -0,0 +1,169 @@
+@import url('https://fonts.googleapis.com/css2?family=Black+Ops+One&display=swap');
+
+.main{
+ display: flex;
+ justify-content: center;
+ gap: 30px;
+ &_gameName {
+ margin-top: 10px;
+ font-family: "Black Ops One", cursive;
+ font-size: 2.3em;
+ }
+ &_score {
+ margin: -8px 8px 8px;
+ font-family: "Franklin Gothic Medium", "Arial Narrow", Arial, sans-serif;
+ }
+ &_create{
+ display: flex;
+ min-height: calc(100vh - 160px);
+ flex-direction: column;
+ justify-content: space-between;
+
+ align-items: center;
+ font-family: "Lucida Sans", "Lucida Sans Regular", "Lucida Grande", "Lucida Sans Unicode", Geneva, Verdana, sans-serif;
+ text-align: center;
+
+ margin: 0 auto;
+ width: 100%;
+ }
+ &_conteiner{
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 10px;
+ }
+ &_text{
+ padding: 10px;
+ max-width: 94vw;
+ }
+ &_radio{
+ display: flex;
+ gap: 30px;
+ }
+ &_label{
+ display: flex;
+ align-items: center;
+ cursor: pointer;
+ padding: 5px 10px;
+ border-radius: 15px;
+ &:hover {
+ background-image: linear-gradient(to right, #667eea, #764ba2);
+ }
+ }
+ &_myName {
+ font-size: 1.5em;
+ font-family: "Russo One", sans-serif;
+ }
+ &_enemyName {
+ font-size: 1.5em;
+ font-family: "Russo One", sans-serif;
+ }
+ button {
+ margin: 8px 0;
+ }
+}
+.global{
+ display: flex;
+ position: relative;
+ gap: 12px;
+ width: 100%;
+ min-height: calc(100vh - 160px);
+ margin: 0 auto;
+ align-items: center;
+ flex-direction: column;
+ font-family: 'Ceviche One', cursive;
+ padding-bottom: 20px;
+ z-index: 1;
+ &::before {
+ content: "";
+ background: url('../../assets/seaBattle/seaBattle.jpg') center no-repeat;
+ background-size: cover;
+ position: absolute;
+ top: 0px;
+ right: 0px;
+ bottom: 0px;
+ left: 0px;
+ opacity: 0.65;
+ z-index: -1;
+ }
+}
+
+@media screen and (max-width: 730px) {
+ .main {
+ position: relative;
+ max-width: 335px;
+ overflow: hidden;
+ transition: all .5s;
+ justify-content: center;
+ &_enemyName {
+ font-size: 1em;
+ }
+ p {
+ position: absolute;
+ }
+ & > div > div {
+ padding-top: 30px;
+ }
+ }
+
+ .main_forView {
+ padding: 0 0 0 375px;
+ .main_enemyName {
+ right: 0px;
+ font-size: 0.8em;
+ max-width: 100px;
+ max-height: 18px;
+ overflow: hidden;
+ &::before {
+ margin-right: 4px;
+ content: '<<';
+ }
+ }
+ .main_myName {
+ left: auto;
+ font-size: 1.2em;
+ &::after {
+ margin-right: 0;
+ content: '';
+ }
+ }
+ }
+
+ .main_forShoot {
+ padding: 0 375px 0 0;
+ .main_myName {
+ left: 30px;
+ font-size: 0.8em;
+ max-width: 100px;
+ max-height: 18px;
+ overflow: hidden;
+ &::after {
+ margin-left: 4px;
+ content: '>>';
+ }
+ }
+ .main_enemyName {
+ right: auto;
+ font-size: 1.2em;
+ &::before {
+ margin-right: 0;
+ content: '';
+ }
+ }
+ }
+}
+
+@media screen and (max-width: 450px) {
+ .main_forView {
+ padding: 0 0 0 335px;
+ .main_enemyName {
+ right: 16px;
+ }
+ }
+ .main_forShoot {
+ padding: 0 330px 0 0;
+ .main_myName {
+ left: 20px;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Pages/SeaBattle/SeaBattle.tsx b/src/Pages/SeaBattle/SeaBattle.tsx
new file mode 100644
index 0000000..75a42fa
--- /dev/null
+++ b/src/Pages/SeaBattle/SeaBattle.tsx
@@ -0,0 +1,264 @@
+import { useEffect, useState } from "react";
+import { useNavigate, useParams } from "react-router-dom";
+
+import Button from "../../Components/common/Button";
+import { Board } from "../../Components/SeaBattle/Board";
+import { FieldComp } from "../../Components/SeaBattle/FieldComp";
+import { InfoComp } from "../../Components/SeaBattle/InfoComp";
+import { checkUserToken } from "../../controller/Auth";
+import { MESSAGES_EN, MESSAGES_RU } from "../../data/restMsgs";
+import useUserStore from "../../store";
+import languageStore from "../../store/language";
+import useStatusStore from "../../store/load-status";
+
+import styles from "./SeaBattle.module.scss";
+import type { GameData } from "./web-socket/websocketData";
+import type { wsGameData } from "./web-socket/WebSoket";
+import { webSocketController } from "./web-socket/WebSoket";
+
+const SEABATTLE_MOBILE_MOVE_TIMEOUT = 1500;
+
+export const SeaBattle = () => {
+ const params = useParams();
+ const gameId = params.id;
+ const navigate = useNavigate();
+ const [myBoard, setMyBoard] = useState(new Board());
+ const [enemyBoard, setEnemyBoard] = useState(new Board());
+ const user = useUserStore((state) => state.userName);
+ const { setStatus } = useStatusStore();
+ const [enemyName, setEnemyName] = useState("");
+ const [shipsReady, setShipsReady] = useState(false);
+ const [canShoot, setCanShoot] = useState(false);
+ const [start, setStart] = useState("");
+ const [gameData, setGameData] = useState();
+ const [otherData, setOtherData] = useState();
+ const [serverError, setServerError] = useState("");
+ const [shootNow, setShootNow] = useState(false);
+ const { isEn } = languageStore();
+
+ const restart = () => {
+ const newBoard = new Board();
+ const newEnemyBoard = new Board();
+ newBoard.initCells();
+ newEnemyBoard.initCells();
+ setMyBoard(newBoard);
+ setEnemyBoard(newEnemyBoard);
+ };
+
+ const shoot = (x: number, y: number) => {
+ const request = {
+ type: "move",
+ data: { gameId, x, y },
+ };
+ webSocketController.send(JSON.stringify(request));
+ };
+
+ const setShip = (x: number, y: number) => {
+ const request = {
+ type: "set",
+ data: { gameId, x, y },
+ };
+ webSocketController.send(JSON.stringify(request));
+ };
+
+ const findCells = (
+ data: number[][],
+ board: Board,
+ setBoard: React.Dispatch>
+ ) => {
+ data.forEach((arr, x) => {
+ arr.forEach((number, y) => {
+ if (number === -1) {
+ board.miss(x, y);
+ }
+
+ if (number === -2) {
+ board.damage(x, y);
+ }
+
+ if (number === 2) {
+ board.createShip(x, y);
+ }
+
+ if (number === 1) {
+ board.empty(x, y);
+ }
+ });
+ });
+ const newBoard = board.getCopy();
+ setBoard(newBoard);
+ };
+
+ const ready = () => {
+ const request = {
+ type: "ready",
+ data: { gameId },
+ };
+ webSocketController.send(JSON.stringify(request));
+ };
+
+ const startGame = () => {
+ const request = {
+ type: "start",
+ data: { gameId },
+ };
+ webSocketController.send(JSON.stringify(request));
+ };
+
+ const joinGame = () => {
+ const request = {
+ type: "join",
+ data: { gameId },
+ };
+ webSocketController.send(JSON.stringify(request));
+ };
+
+ const exitGame = () => {
+ const request = {
+ type: "leave",
+ data: { gameId },
+ };
+ webSocketController.send(JSON.stringify(request));
+ navigate("/room/SeaBattle");
+ };
+
+ useEffect(() => {
+ if (gameData) {
+ const { type } = gameData;
+
+ switch (type) {
+ case "message":
+ if (gameData.message === "User is banned!") {
+ setStatus({
+ isLoading: false,
+ message: "You are banned!",
+ });
+ navigate("/");
+
+ return;
+ }
+
+ setServerError(gameData.message as string);
+ break;
+ case "game-data":
+ setOtherData(gameData.data as GameData);
+ findCells(
+ (gameData.data as GameData).enemyField,
+ enemyBoard,
+ setEnemyBoard
+ );
+ findCells((gameData.data as GameData).yourField, myBoard, setMyBoard);
+ setEnemyName((gameData.data as GameData).enemyName as string);
+ if (
+ (gameData.data as GameData).player &&
+ !(gameData.data as GameData).winner
+ )
+ setCanShoot(!!(gameData.data as GameData).player?.isLead);
+ setServerError("");
+ break;
+
+ default:
+ setServerError("");
+ }
+ }
+ }, [gameData]);
+
+ useEffect(() => {
+ setShipsReady(!!otherData?.player?.isReady);
+ setStart(otherData?.isStarted && !otherData.winner ? "start" : "");
+ setCanShoot(!!otherData?.player?.isLead && !otherData?.winner);
+
+ if (otherData?.winner) {
+ setStatus({
+ isLoading: false,
+ message:
+ otherData?.winner.player.userName === user ? "You win!" : "You lose",
+ });
+ }
+
+ setTimeout(() => {
+ setShootNow(!!otherData?.player?.isLead || !!otherData?.winner);
+ }, SEABATTLE_MOBILE_MOVE_TIMEOUT);
+ }, [otherData]);
+
+ useEffect(() => {
+ webSocketController.addMessageListener(setGameData);
+ checkUserToken().then((userData) => {
+ if (userData.userName) {
+ webSocketController.setUser(userData.userName);
+ webSocketController.setGameId(gameId || "");
+ webSocketController.connect().then(() => {
+ restart();
+ joinGame();
+ webSocketController.addMessageListener(setGameData);
+ });
+ } else {
+ navigate("/");
+ }
+ });
+
+ return () => webSocketController.deleteAllCallbacks();
+ }, []);
+
+ return (
+
+
SeaBattle
+
+ {isEn ? "Счет:" : " Score:"}{" "}
+ {otherData?.player?.points}
+
+
+
+
+
+ {enemyName || (isEn ? "Ожидание..." : "Waiting...")}
+
+
+
+
+
+ {serverError !== "" && (
+
{isEn ? MESSAGES_RU[serverError] : MESSAGES_EN[serverError]}
+ )}
+ {otherData && otherData.isMainUser && !otherData.winner && !start && (
+
{
+ if (otherData.isEnemyReady) startGame();
+ }}
+ disabled={!otherData.isEnemyReady}
+ >
+ {isEn ? "Старт" : " Start"}
+
+ )}
+
{isEn ? "Выйти" : "Quit the game"}
+
+ );
+};
diff --git a/src/Pages/SeaBattle/web-socket/WebSoket.ts b/src/Pages/SeaBattle/web-socket/WebSoket.ts
new file mode 100644
index 0000000..94631b9
--- /dev/null
+++ b/src/Pages/SeaBattle/web-socket/WebSoket.ts
@@ -0,0 +1,141 @@
+import { getUserToken } from "../../../controller/Auth";
+
+import type { GameData } from "./websocketData";
+
+const WS_SEABATTLE_URL =
+ import.meta.env.VITE_WS_SEABATTLE_URL || "wss://rsgames.online:8001/";
+
+export interface wsGameData {
+ type: string;
+ data: GameData | string | null;
+ message?: string;
+}
+
+export type wsCallback = (res: wsGameData) => void;
+
+class WebSocketController {
+ private webSocket?: WebSocket | null = null;
+
+ private gameId = "";
+
+ private callbacks: Array = [];
+
+ private token = "";
+
+ private user = "";
+
+ getGameId() {
+ return this.gameId;
+ }
+
+ setGameId(gameId: string) {
+ this.gameId = gameId;
+ }
+
+ async connect() {
+ if (!this.webSocket) {
+ this.webSocket = new WebSocket(WS_SEABATTLE_URL);
+
+ if (this.webSocket) {
+ this.webSocket.onopen = this.wsOpenHandler;
+ this.webSocket.onmessage = this.wsMessageHandler;
+ }
+ }
+
+ return this.webSocket;
+ }
+
+ wsMessageHandler = (resp: MessageEvent) => {
+ try {
+ const res: wsGameData = JSON.parse(resp.data);
+
+ if (this.callbacks) {
+ this.callbacks.forEach((callback) => {
+ callback(res);
+ });
+ }
+
+ const { type, data, message } = res;
+
+ switch (type) {
+ case "game-data":
+ // eslint-disable-next-line no-case-declarations
+ const { gameId } = data as GameData;
+ this.gameId = gameId;
+ break;
+
+ default:
+ if (message === "You are connected") {
+ if (this.gameId) {
+ this.joinToTheGame();
+ }
+ }
+ }
+ } catch (err) {
+ // eslint-disable-next-line no-console
+ console.error(err);
+ }
+ };
+
+ joinToTheGame() {
+ try {
+ const request = {
+ type: "join",
+ data: { gameId: this.gameId },
+ };
+
+ this.webSocket?.send(JSON.stringify(request));
+ } catch (err) {
+ // eslint-disable-next-line no-console
+ console.error(err);
+ }
+ }
+
+ private wsOpenHandler = () => {
+ this.token = getUserToken();
+
+ if (this.token && this.user) {
+ try {
+ const request = {
+ type: "ws-connect",
+ data: {
+ player: this.user,
+ token: this.token,
+ },
+ };
+
+ this.webSocket?.send(JSON.stringify(request));
+ } catch (err) {
+ // eslint-disable-next-line no-console
+ console.error(err);
+ }
+ }
+ };
+
+ addMessageListener(callback: wsCallback) {
+ if (this.webSocket) {
+ this.callbacks.push(callback);
+ }
+ }
+
+ deleteAllCallbacks() {
+ this.callbacks = [];
+ }
+
+ send(data: string) {
+ try {
+ if (this.webSocket) {
+ this.webSocket.send(data);
+ }
+ } catch (err) {
+ // eslint-disable-next-line no-console
+ console.error(err);
+ }
+ }
+
+ setUser(user: string) {
+ this.user = user;
+ }
+}
+
+export const webSocketController = new WebSocketController();
diff --git a/src/Pages/SeaBattle/web-socket/websocketData.ts b/src/Pages/SeaBattle/web-socket/websocketData.ts
new file mode 100644
index 0000000..dd6f42e
--- /dev/null
+++ b/src/Pages/SeaBattle/web-socket/websocketData.ts
@@ -0,0 +1,31 @@
+export interface Winner {
+ player: SeaWarPLayer;
+ moves: number;
+}
+
+export interface Ship {
+ size: number;
+ cors: Array>;
+}
+
+export interface SeaWarPLayer {
+ isLead: boolean;
+ isReady: boolean;
+ moves: number;
+ ships: Array;
+ userName: string;
+ points: number;
+ misMoves: number;
+}
+
+export interface GameData {
+ gameId: string;
+ isStarted?: boolean;
+ isMainUser?: boolean;
+ player?: SeaWarPLayer;
+ enemyName?: string | null;
+ isEnemyReady: boolean;
+ enemyField: Array>;
+ yourField: Array>;
+ winner: Winner;
+}
diff --git a/src/Pages/Tetris/fake-zone.tsx b/src/Pages/Tetris/fake-zone.tsx
new file mode 100644
index 0000000..1d5c67b
--- /dev/null
+++ b/src/Pages/Tetris/fake-zone.tsx
@@ -0,0 +1,51 @@
+import type { FC } from "react";
+import { useEffect, useState } from "react";
+
+import { Keys } from "../../helpers/tetris/movement";
+
+const HIDE_TIMEOUT = 2000;
+
+interface FakePlayZoneProps {
+ keyPresser: (key: string) => void;
+}
+
+export const FakePlayZone: FC = ({ keyPresser }) => {
+ const [hideControls, setHideControls] = useState(false);
+
+ useEffect(() => {
+ setTimeout(() => {
+ setHideControls(true);
+ }, HIDE_TIMEOUT);
+ }, []);
+
+ return (
+
+
keyPresser(Keys.ArrowUp)}
+ />
+
+
keyPresser(Keys.ArrowLeft)}
+ />
+
keyPresser(Keys.ArrowUp)}
+ />
+
keyPresser(Keys.ArrowRight)}
+ />
+
+
keyPresser(Keys.ArrowDown)}
+ />
+
+ );
+};
diff --git a/src/Pages/Tetris/index.tsx b/src/Pages/Tetris/index.tsx
new file mode 100644
index 0000000..00790e9
--- /dev/null
+++ b/src/Pages/Tetris/index.tsx
@@ -0,0 +1,112 @@
+import type { FC } from "react";
+import react from "react";
+import { useNavigate } from "react-router-dom";
+
+import "./style.scss";
+
+import Button from "../../Components/common/Button";
+import FinishModal from "../../Components/Tetris/FinishModal";
+import Item from "../../Components/Tetris/Item";
+import { checkForBan } from "../../controller/banchecker";
+import { postWinner } from "../../controller/Winners";
+import { useControls } from "../../helpers/tetris/hooks/useControls";
+import type { Movements } from "../../helpers/tetris/movement";
+import { rotations, Keys } from "../../helpers/tetris/movement";
+import useUserStore from "../../store";
+import languageStore from "../../store/language";
+import useStatusStore from "../../store/load-status";
+
+import { FakePlayZone } from "./fake-zone";
+
+const Tetris: FC = () => {
+ const gameName = "Tetris";
+ const {
+ figures,
+ moveRight,
+ moveLeft,
+ moveBottom,
+ rotateRight,
+ rotateLeft,
+ score,
+ isGameActive,
+ resetGame,
+ } = useControls();
+
+ const [isModalClosed, setModalClosed] = react.useState(true);
+ const { setStatus } = useStatusStore();
+ const { setUser } = useUserStore();
+ const { isEn } = languageStore();
+ const navigate = useNavigate();
+
+ const onResetClick = () => {
+ setModalClosed(true);
+ resetGame();
+ };
+
+ const onkeydownHandler = (key: string) => {
+ const movements: Movements = {
+ [Keys.ArrowRight]: moveRight,
+ [Keys.ArrowLeft]: moveLeft,
+ [Keys.ArrowDown]: moveBottom.current,
+ [Keys.ArrowUp]: rotateRight,
+ [Keys.R]: rotateLeft,
+ [Keys.r]: rotateRight,
+ };
+ rotations(key, movements)();
+ };
+
+ window.onkeydown = (ev: KeyboardEvent) => {
+ ev.preventDefault();
+ onkeydownHandler(ev.key);
+ };
+
+ react.useEffect(
+ () => () => {
+ window.onkeydown = null;
+ },
+ []
+ );
+
+ react.useEffect(() => {
+ checkForBan(isEn, setUser, setStatus, navigate);
+ }, []);
+
+ react.useEffect(() => {
+ if (!isGameActive) {
+ setModalClosed(false);
+ if (score > 0)
+ postWinner(gameName, score).catch(({ message }) =>
+ setStatus({ isLoading: false, message })
+ );
+ }
+ }, [isGameActive]);
+
+ return (
+
+
setModalClosed(true)}
+ points={score}
+ reset={onResetClick}
+ />
+
+
+ {isEn ? "Рестарт" : "Reset game"}
+
+
+ {isEn ? "Ваш счет : " : `Your score : `}
+ {score}
+
+
+
+
+
+ {figures.map((figure, id) => (
+
+ ))}
+
+
+ );
+};
+
+export default Tetris;
diff --git a/src/Pages/Tetris/style.scss b/src/Pages/Tetris/style.scss
new file mode 100644
index 0000000..9674a85
--- /dev/null
+++ b/src/Pages/Tetris/style.scss
@@ -0,0 +1,185 @@
+.tetris {
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ position: relative;
+ padding-top: 20px;
+ background-image: url("../../assets/tetris-mobile/tetrisBack.jpg");
+ background-size: cover;
+ &__reset {
+ max-width: 180px;
+ }
+
+ &__playzone {
+ overflow: hidden;
+ width: 450px;
+ height: 600px;
+ position: relative;
+ top: calc((100% - 400px) / 2);
+ left: calc((100% - 450px) / 2);
+ background-color: #f5f3ff;
+ border: 2px solid #764ba2;
+ }
+
+ &__fake-playzone {
+ overflow: hidden;
+ width: 450px;
+ height: 600px;
+ position: absolute;
+ z-index: 2;
+ top: calc((100% - 600px) / 2);
+ left: calc((100% - 450px) / 2);
+ background-color: transparent;
+ }
+
+ &__text {
+ margin-top: 8px;
+ color: #f5f3ff;
+ font-size: 1.8em;
+ }
+
+ &__points {
+ display: flex;
+ width: 100%;
+ max-width: 450px;
+ margin: 0 auto;
+ justify-content: space-between;
+ align-items: center;
+ text-align: left;
+ }
+}
+
+.tetris__fake-playzone {
+ transition: all .5s;
+ opacity: 0;
+ user-select: none;
+
+ @media screen and (max-width: 840px) {
+ opacity: .8;
+ }
+
+ .tetris__rot-up {
+ height: 25%;
+ background-color: #302ea042;
+ user-select: none;
+ }
+
+ .tetris__middle {
+ display: flex;
+ height: 60%;
+ width: 100%;
+ user-select: none;
+ }
+
+ .tetris__left {
+ height: 100%;
+ width: 40%;
+ background: url(../../assets/tetris-mobile/left.svg) no-repeat right;
+ background-size: 100px;
+ background-color: rgba(49, 169, 85, 0.4);
+ user-select: none;
+ }
+
+ .tetris__rot-middle {
+ height: 100%;
+ width: 50%;
+ background: url(../../assets/tetris-mobile/rotate.svg) no-repeat center;
+ background-size: 100px;
+ background-color: #302ea042;
+ user-select: none;
+ }
+
+ .tetris__right {
+ height: 100%;
+ width: 40%;
+ background: url(../../assets/tetris-mobile/right.svg) no-repeat center;
+ background-size: 100px;
+ background-color: rgba(210, 168, 41, 0.4);
+ user-select: none;
+ }
+
+ .tetris__down {
+ height: 20%;
+ width: 100%;
+ background: url(../../assets/tetris-mobile/down.svg) no-repeat top;
+ background-size: 100px;
+ background-color: rgba(145, 38, 136, 0.4);
+ user-select: none;
+ }
+
+ // .tetris__fake-playzone_hide
+ &_hide {
+ opacity: 0;
+ }
+}
+
+@media screen and (max-width: 500px), (max-height: 820px) {
+ .tetris__playzone {
+ top: 0;
+ -webkit-transform: scale(0.9);
+ -ms-transform: scale(0.9);
+ transform: scale(0.9);
+ }
+
+ .tetris__points {
+ max-width: 405px;
+ }
+}
+
+@media screen and (max-width: 460px), (max-height: 700px) {
+ .tetris__playzone {
+ top: -40px;
+ margin-bottom: -80px;
+ -webkit-transform: scale(0.8);
+ -ms-transform: scale(0.8);
+ transform: scale(0.8);
+ }
+
+ .tetris__points {
+ max-width: 360px;
+ }
+}
+
+@media screen and (max-width: 400px), (max-height: 640px) {
+ .tetris__playzone {
+ top: -80px;
+ margin-bottom: -150px;
+ -webkit-transform: scale(0.7);
+ -ms-transform: scale(0.7);
+ transform: scale(0.7);
+ }
+
+ .tetris__points {
+ max-width: 315px;
+ }
+ .tetris__reset {
+ max-width: 180px;
+ font-size: 0.9em;
+ }
+ .tetris__text {
+ margin-top: 8px;
+ font-size: 1.3em;
+ }
+}
+
+@media screen and (max-width: 360px), (max-height: 575px) {
+ .tetris__playzone {
+ top: -110px;
+ margin-bottom: -220px;
+ -webkit-transform: scale(0.57);
+ -ms-transform: scale(0.57);
+ transform: scale(0.57);
+ }
+
+ .tetris__points {
+ max-width: 256px;
+ }
+ .tetris__reset {
+ max-width: 190px;
+ font-size: 0.8em;
+ }
+ .tetris__text {
+ margin-top: 8px;
+ font-size: 1em;
+ }
+}
\ No newline at end of file
diff --git a/src/Pages/UserPage/Components/SearchUserComp.tsx b/src/Pages/UserPage/Components/SearchUserComp.tsx
new file mode 100644
index 0000000..31bee37
--- /dev/null
+++ b/src/Pages/UserPage/Components/SearchUserComp.tsx
@@ -0,0 +1,69 @@
+import type { FC } from "react";
+import { useState } from "react";
+import { useNavigate } from "react-router-dom";
+
+import { getUsers } from "../../../controller/UserControls";
+import type { UserData } from "../../../data/authData";
+// eslint-disable-next-line import/order
+import languageStore from "../../../store/language";
+
+import { DEFAULT_PICTURE } from "../UserPageData";
+
+import "../UserPage.scss";
+
+const BLUR_TIMEOUT = 200;
+
+export const SearchUserComp: FC = () => {
+ const { isEn } = languageStore();
+ const [usersArr, setUserArr] = useState
([]);
+ const navigate = useNavigate();
+ const [showList, setShowList] = useState(false);
+
+ const search = (userName: string) => {
+ if (userName === "") {
+ setUserArr([]);
+ } else {
+ getUsers(userName).then((users) => setUserArr(users.slice(0, 8)));
+ }
+ };
+
+ return (
+
+
search(e.target.value)}
+ onFocus={(e) => {
+ search(e.target.value);
+ setShowList(true);
+ }}
+ onBlur={() =>
+ setTimeout(() => {
+ setShowList(false);
+ }, BLUR_TIMEOUT)
+ }
+ />
+ {!!usersArr.length && showList && (
+
+ {usersArr.map((user) => (
+
navigate(`/user/${user.userName}`)}
+ >
+
+
{user.userName}
+
+ ))}
+
+ )}
+
+ );
+};
diff --git a/src/Pages/UserPage/Components/StatusLableComponent.tsx b/src/Pages/UserPage/Components/StatusLableComponent.tsx
new file mode 100644
index 0000000..3cd3329
--- /dev/null
+++ b/src/Pages/UserPage/Components/StatusLableComponent.tsx
@@ -0,0 +1,34 @@
+import type { FC } from "react";
+
+import type { UserData } from "../../../data/authData";
+import languageStore from "../../../store/language";
+import type { userStatus } from "../UserPageData";
+import { userStatusRu } from "../UserPageData";
+
+import "../UserPage.scss";
+import { changeUserStatus } from "./UserMainData.utils";
+
+interface StatusLableComponentProps {
+ user: UserData;
+ uStatus: userStatus;
+ refresh: () => void;
+}
+
+export const StatusLableComponent: FC = ({
+ user,
+ uStatus,
+ refresh,
+}) => {
+ const { isEn } = languageStore();
+
+ return (
+ changeUserStatus(user, uStatus).then(refresh)}
+ >
+ {isEn ? userStatusRu[uStatus] : uStatus}
+
+ );
+};
diff --git a/src/Pages/UserPage/Components/UserMainData.tsx b/src/Pages/UserPage/Components/UserMainData.tsx
new file mode 100644
index 0000000..acb5b7f
--- /dev/null
+++ b/src/Pages/UserPage/Components/UserMainData.tsx
@@ -0,0 +1,152 @@
+import { FC, useState } from "react";
+
+import ChangePass from "../../../Components/Authentication/ChangePass";
+import Button from "../../../Components/common/Button";
+import Modal from "../../../Components/common/Modal";
+import {
+ banUser,
+ deleteUser,
+ unbanUser,
+} from "../../../controller/UserControls";
+import type { UserData } from "../../../data/authData";
+import useUserStore from "../../../store";
+import languageStore from "../../../store/language";
+import { DEFAULT_PICTURE, userStatus } from "../UserPageData";
+
+import { AdminComp } from "./context/AdminComp";
+import { ModerComp } from "./context/ModerComp";
+import { StatusLableComponent } from "./StatusLableComponent";
+
+import "../UserPage.scss";
+
+interface UserMainCompProps {
+ user?: UserData;
+ refresh: () => void;
+}
+
+export const UserMainComp: FC = ({ user, refresh }) => {
+ const { isEn } = languageStore();
+ const { status, userName } = useUserStore();
+ const [changePass, setChangePass] = useState(false);
+ const [removeUser, setRemoveUser] = useState(false);
+
+ return (
+
+ {user?.userName ? (
+ <>
+
+
+
+
+
+
+
+
setRemoveUser(true)}
+ />
+
+
+
{user.userName}
+
+ {user.banned ? (
+
+ {isEn ? "забанен" : "banned"}
+
+ ) : (
+
+ {isEn ? "активен" : "active"}
+
+ )}
+
+ {!user.banned ? (
+ banUser(user.userName).then(() => refresh())}
+ >
+ {isEn ? "бан" : "ban"}
+
+ ) : (
+
+ unbanUser(user.userName).then(() => refresh())
+ }
+ >
+ {isEn ? "разбанить" : "unban"}
+
+ )}
+
+
+ setChangePass(true)}
+ className="user-profile__change-password"
+ >
+ {isEn ? "Изменить пароль" : "Change password"}
+
+
+
+
+ >
+ ) : (
+ User Not Found
+ )}
+ {changePass && (
+ setChangePass(false)}
+ title={isEn ? "Изменить пароль" : "Change password"}
+ >
+ setChangePass(false)} />
+
+ )}
+ {removeUser && (
+ setRemoveUser(false)}
+ title={isEn ? "Удалить пользователя?" : "Remove user?"}
+ >
+
+
+ {isEn
+ ? "Вы действительно хотите удалить данного пользователя? Изменения будут необратимы!"
+ : "Are you realy want to delete this user? The changes will be irreversible!"}
+
+
+ setRemoveUser(false)}>
+ {isEn ? "Нет" : "No"}
+
+ {
+ deleteUser(user?.userName ?? "").then(() =>
+ setRemoveUser(false)
+ );
+ }}
+ >
+ {isEn ? "Да" : "Yes"}
+
+
+
+
+ )}
+
+ );
+};
diff --git a/src/Pages/UserPage/Components/UserMainData.utils.ts b/src/Pages/UserPage/Components/UserMainData.utils.ts
new file mode 100644
index 0000000..1a5ed9f
--- /dev/null
+++ b/src/Pages/UserPage/Components/UserMainData.utils.ts
@@ -0,0 +1,15 @@
+import { setUserStatus } from "../../../controller/UserControls";
+import type { UserData } from "../../../data/authData";
+
+export const changeUserStatus = async (user: UserData, statusName: string) => {
+ let { status } = { ...user };
+ const { userName } = { ...user };
+
+ if (status.includes(statusName)) {
+ status = status.filter((stat) => stat !== statusName);
+ } else {
+ status.push(statusName);
+ }
+
+ return setUserStatus(userName, status);
+};
diff --git a/src/Pages/UserPage/Components/WinsListComp.tsx b/src/Pages/UserPage/Components/WinsListComp.tsx
new file mode 100644
index 0000000..cd09d9e
--- /dev/null
+++ b/src/Pages/UserPage/Components/WinsListComp.tsx
@@ -0,0 +1,38 @@
+import type { FC } from "react";
+import { useNavigate } from "react-router-dom";
+
+import type { WinnerRes } from "../../../data/winData";
+import languageStore from "../../../store/language";
+
+import "../UserPage.scss";
+
+interface WinsListCompProps {
+ winArr: WinnerRes[];
+}
+
+export const WinsListComp: FC
= ({ winArr }) => {
+ const navigate = useNavigate();
+ const { isEn } = languageStore();
+
+ return (
+
+ {winArr.map((item, i) => (
+
navigate(`/preview/${item.gameName}`)}
+ >
+
{item.gameName}
+
+ {isEn ? "Рекорд: " : "Max points: "}
+ {item.points}
+
+
+ {isEn ? "Позиция в топе: " : "Number in top:"}
+ {item.position}
+
+
+ ))}
+
+ );
+};
diff --git a/src/Pages/UserPage/Components/context/AdminComp.tsx b/src/Pages/UserPage/Components/context/AdminComp.tsx
new file mode 100644
index 0000000..8b3ceba
--- /dev/null
+++ b/src/Pages/UserPage/Components/context/AdminComp.tsx
@@ -0,0 +1,11 @@
+import type { FC, ReactNode } from "react";
+
+interface AdminCompProps {
+ children: ReactNode;
+ isAdmin: boolean;
+}
+
+export const AdminComp: FC = ({ children, isAdmin }) => (
+ // eslint-disable-next-line react/jsx-no-useless-fragment
+ <>{isAdmin && children}>
+);
diff --git a/src/Pages/UserPage/Components/context/ModerComp.tsx b/src/Pages/UserPage/Components/context/ModerComp.tsx
new file mode 100644
index 0000000..93966e8
--- /dev/null
+++ b/src/Pages/UserPage/Components/context/ModerComp.tsx
@@ -0,0 +1,11 @@
+import type { FC, ReactNode } from "react";
+
+interface ModerCompProps {
+ children: ReactNode;
+ isModer: boolean;
+}
+
+export const ModerComp: FC = ({ children, isModer }) => (
+ // eslint-disable-next-line react/jsx-no-useless-fragment
+ <>{isModer && children}>
+);
diff --git a/src/Pages/UserPage/UserPage.scss b/src/Pages/UserPage/UserPage.scss
new file mode 100644
index 0000000..2ea9e69
--- /dev/null
+++ b/src/Pages/UserPage/UserPage.scss
@@ -0,0 +1,404 @@
+.main{
+ width: 100%;
+ min-height: calc(100vh - 160px);
+ padding: 30px 30px 85px;
+ display: flex;
+ flex-direction: column;
+ gap: 20px;
+ align-items: center;
+ background: linear-gradient(
+ 180deg,
+ rgba(255, 255, 255, 0) 0%,
+ rgba(118, 75, 162, 0.565) 83%,
+ rgba(102, 126, 234, 0.86) 100%
+ );
+
+ &__game-list{
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+ width: calc(100% - 20px);
+ }
+ &__to-games-btn {
+ margin-top: auto;
+ }
+ &__game-item{
+ padding: 8px 20px;
+ border-radius: 12px;
+ display: flex;
+ justify-content: space-between;
+ gap: 4px;
+ border: 1px solid #764ba2;
+ background: linear-gradient(
+ 180.2deg,
+ rgba(255, 255, 255, 0) 0%,
+ rgba(167, 124, 209, 0.201) 90%,
+ rgba(22, 35, 93, 0.86) 100%
+ );
+ p{
+ font-weight: bold;
+ }
+ &:hover{
+ cursor: pointer;
+ background: linear-gradient(
+ 180.2deg,
+ rgba(216, 74, 22, 0.359) 0%,
+ rgba(238, 70, 9, 0.149) 90%,
+ rgba(207, 78, 9, 0.6) 100%,
+ );
+ }
+ }
+ &__points {
+ text-align: left;
+ width: 100%;
+ }
+ &__position {
+ text-align: right;
+ min-width: 200px;
+ }
+ &__title {
+ font-family: "Russo One", sans-serif;
+ font-size: 2em;
+ font-weight: 900;
+ color: #7e6dd1;
+ margin-bottom: 10px;
+ display: none;
+ }
+
+ &__name {
+ text-align: left;
+ font-family: Black Ops One,cursive;
+ font-size: 1.3em;
+ min-width: 200px;
+ }
+ &__user {
+ display: flex;
+ gap: 10px;
+ align-items: center;
+ justify-content: space-between;
+ p{
+ width: 140px;
+ font-weight: bold;
+ }
+ }
+ &__list {
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ gap: 5px;
+ }
+ &__admin {
+ width: 100%;
+ }
+}
+
+.user-profile {
+ display: flex;
+ height: 200px;
+ // .user-profile__picture
+ &__picture {
+ width: 200px;
+ height: 200px;
+ border-radius: 50%;
+ background-position: center;
+ background-size: contain;
+ background-repeat: no-repeat;
+ }
+
+ // .user-profile__wrapper
+ &__wrapper {
+ height: 100%;
+ margin-left: 10px;
+ display: flex;
+ flex-direction: column;
+ width: calc(100vw - 280px);
+ }
+
+ // .user-profile__status
+ &__status {
+ display: flex;
+ gap: 2px;
+ margin-bottom: 28px;
+ margin-left: auto;
+ div {
+ max-width: fit-content;
+ padding: 2px 8px;
+ border-radius: 5px;
+ text-transform: uppercase;
+ font-size: 0.9em;
+ cursor: pointer;
+ color: #ecf2ff;
+ }
+ }
+
+ // .user-profile__status_admin
+ &__status_admin {
+ background: #b33d2e;
+ border: 1px solid #721d11;
+ transition: all 0.2s;
+ &:hover {
+ background: #e54732;
+ border: 1px solid #b0210e;
+ }
+ }
+
+ // .user-profile__status_moderator
+ &__status_moderator {
+ background: #b3842e;
+ border: 1px solid #79530c;
+ transition: all 0.2s;
+ &:hover {
+ background: #e6b04d;
+ border: 1px solid #ba7b05;
+ }
+ }
+
+ // .user-profile__status_user
+ &__status_user {
+ background: #2e6ab3;
+ border: 1px solid #083367;
+ transition: all 0.2s;
+ &:hover {
+ background: #1974e2;
+ border: 1px solid #2c82ec;
+ }
+ }
+
+ // .user-profile__status_disabled
+ &__status_disabled {
+ background: #939ba4;
+ border: 1px solid #313b45;
+ transition: all 0.2s;
+ &:hover {
+ background: #525861;
+ border: 1px solid #595959;
+ }
+ }
+
+ // .user-profile__name
+ &__name {
+ font-family: "Russo One", sans-serif;
+ font-size: 2.5em;
+ font-weight: 600;
+ color: #4f4c6b;
+ }
+
+ // .user-profile__ban-status
+ &__ban-status {
+ display: flex;
+ flex-direction: column;
+ }
+
+ // .user-profile__is-baned
+ &__is-baned {
+ max-width: min-content;
+ margin-bottom: 4px;
+ padding: 2px 4px;
+ border-radius: 20px;
+ font-size: 1.1em;
+ font-weight: 900;
+ color: #e8270e;
+ }
+
+ // .user-profile__is-active
+ &__is-active {
+ max-width: min-content;
+ margin-bottom: 4px;
+ padding: 2px 4px;
+ border-radius: 20px;
+ font-size: 1.1em;
+ font-weight: 900;
+ color: #60cd00;
+ }
+
+ // .user-profile__ban-btn
+ &__ban-btn {
+ padding: 2px 10px;
+ text-transform: uppercase;
+ max-width: max-content;
+ }
+
+ // .user-profile__unban-btn
+ &__unban-btn {
+ padding: 2px 10px;
+ text-transform: uppercase;
+ max-width: max-content;
+ }
+
+ // .user-profile__not-found
+ &__not-found {
+ top: 0;
+ position: absolute;
+ margin: auto;
+ margin-top: 45vh;
+ display: flex;
+ font-size: 1.4em;
+ font-weight: 900;
+ }
+ &__change-password {
+ margin-top: 20px;
+ max-width: max-content;
+ }
+ // .user-profile__delete
+ &__delete {
+ padding: 0;
+ margin-left: 10px;
+ width: 44px;
+ height: 24px;
+ background: url(../../assets/svg/delete.svg) center no-repeat;
+ background-size: cover;
+ transition: all 0.3s;
+ cursor: pointer;
+ transform: scale(1.3);
+ &:hover {
+ transform: scale(1.5);
+ }
+ }
+}
+
+@media screen and (max-width: 680px) {
+ .user-profile{
+ &__picture {
+ width: 100px;
+ height: 200px;
+ }
+ &__wrapper {
+ width: calc(100vw - 220px);
+ }
+ }
+ .main{
+ &__name {
+ min-width: 180px;
+ }
+ &__position {
+ min-width: 135px;
+ }
+ }
+}
+
+@media screen and (max-width: 580px) {
+ .user-profile{
+ height: auto;
+ flex-direction: column;
+ align-items: center;
+
+ &__picture {
+ width: 160px;
+ height: 160px;
+ }
+ &__wrapper {
+ width: calc(100vw - 10px);
+ align-items: center;
+ }
+ &__status {
+ margin: 10px auto 18px;
+ div {
+ font-size: 1em;
+ }
+ }
+ &__ban-btn {
+ padding: 4px 12px;
+ text-transform: uppercase;
+ background-image: linear-gradient(to right, #667eea, #764ba2) !important;
+ color: #fff !important;
+ font-size: 1.4em !important;
+ }
+ &__unban-btn {
+ padding: 4px 12px;
+ text-transform: uppercase;
+ background-image: linear-gradient(to right, #667eea, #764ba2) !important;
+ color: #fff !important;
+ font-size: 1.4em !important;
+ }
+ &__ban-status {
+ align-items: center;
+ }
+ }
+ .main{
+ &__game-list {
+ gap: 8px;
+ align-items: center;
+ }
+ &__game-item {
+ flex-direction: column;
+ gap: 12px;
+ padding: 16px 20px;
+ width: 100%;
+ }
+ &__position {
+ text-align: left;
+ }
+ }
+}
+
+.search-user {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+ position: relative;
+ width: 300px;
+ input {
+ width: 300px;
+ padding: 8px 14px;
+ border: 2px solid #083367;
+ border-radius: 12px;
+ font-family: "Russo One", sans-serif;
+ font-size: 1.2em;
+ background-color: #b3cff2e0;
+ color: #083367;
+ }
+ &__list {
+ top: 44px;
+ position: absolute;
+ background-color: #b3cff2e0;
+ border-radius: 12px;
+ border: 2px solid #083367;
+ padding: 0 0;
+ overflow: hidden;
+ z-index: 2;
+ width: 300px;
+ }
+ &__item {
+ margin-bottom: -2px;
+ padding: 4px 10px;
+ display: flex;
+ gap: 10px;
+ align-items: center;
+ border-bottom: 2px solid #083367;
+ &:hover {
+ background-color: #7531a9b7;
+ }
+ }
+ &__item-picture {
+ width: 35px;
+ height: 35px;
+ border-radius: 50%;
+ background-image: url("https://rsgames.online/images/user.png");
+ background-position: center;
+ background-repeat: no-repeat;
+ background-size: contain;
+ }
+ &__item-username {
+ font-family: "Russo One", sans-serif;
+ font-size: 1.2em;
+ font-weight: 600;
+ color: #382f78;
+ }
+}
+
+.popup-dialog {
+ &__text {
+ font-size: 1.3em;
+ margin-bottom: 34px;
+ text-align: center;
+ }
+ &__buttons {
+ display: flex;
+ justify-content: center;
+ gap: 20px;
+
+ button {
+ min-width: 120px;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/Pages/UserPage/UserPage.tsx b/src/Pages/UserPage/UserPage.tsx
new file mode 100644
index 0000000..de7cfd1
--- /dev/null
+++ b/src/Pages/UserPage/UserPage.tsx
@@ -0,0 +1,69 @@
+import { useEffect, useState } from "react";
+import { useNavigate, useParams } from "react-router-dom";
+
+import Button from "../../Components/common/Button";
+import { getUser } from "../../controller/UserControls";
+import { getUserWinsList } from "../../controller/Winners";
+import type { UserData } from "../../data/authData";
+import type { WinnerRes } from "../../data/winData";
+import useUserStore from "../../store";
+import languageStore from "../../store/language";
+import useStatusStore from "../../store/load-status";
+
+import { ModerComp } from "./Components/context/ModerComp";
+import { SearchUserComp } from "./Components/SearchUserComp";
+import { UserMainComp } from "./Components/UserMainData";
+import { WinsListComp } from "./Components/WinsListComp";
+import "./UserPage.scss";
+import { userStatus } from "./UserPageData";
+
+const UserPage = () => {
+ const navigate = useNavigate();
+ const params = useParams();
+ const userNameParam = params.name;
+ const { isEn } = languageStore();
+ const { userName, status } = useUserStore();
+ const [winArr, setWinArr] = useState([]);
+ const { setStatus } = useStatusStore();
+ const [user, setUser] = useState(null);
+
+ const loadUser = () => {
+ setStatus({ isLoading: true, message: "" });
+ const name = userNameParam === userName ? "" : userNameParam ?? "";
+
+ getUser(name)
+ .then((resUser) => setUser(resUser))
+ .then(() => getUserWinsList(userNameParam ?? userName ?? ""))
+ .then((wins) => setWinArr(wins))
+ .then(() => setStatus({ isLoading: false, message: "" }))
+ .catch(({ message }) => setStatus({ isLoading: false, message }));
+ };
+
+ useEffect(() => {
+ loadUser();
+ }, [userNameParam]);
+
+ return (
+
+
+ {isEn ? "Страница пользователя" : "User page"}
+
+
+
+
+
+
+
+ navigate("/main")} className="main__to-games-btn">
+ {isEn ? "К списку игр" : "On games page"}
+
+
+ );
+};
+
+export default UserPage;
diff --git a/src/Pages/UserPage/UserPageData.ts b/src/Pages/UserPage/UserPageData.ts
new file mode 100644
index 0000000..a408a62
--- /dev/null
+++ b/src/Pages/UserPage/UserPageData.ts
@@ -0,0 +1,13 @@
+export const DEFAULT_PICTURE = "https://rsgames.online/images/user.png";
+
+export enum userStatus {
+ user = "user",
+ moderator = "moderator",
+ admin = "admin",
+}
+
+export enum userStatusRu {
+ user = "игрок",
+ moderator = "модератор",
+ admin = "админ",
+}
diff --git a/src/assets/cars/audi.jfif b/src/assets/cars/audi.jfif
new file mode 100644
index 0000000..5a37a16
Binary files /dev/null and b/src/assets/cars/audi.jfif differ
diff --git a/src/assets/cars/bmw.jfif b/src/assets/cars/bmw.jfif
new file mode 100644
index 0000000..908a9ea
Binary files /dev/null and b/src/assets/cars/bmw.jfif differ
diff --git a/src/assets/cars/dodje.jfif b/src/assets/cars/dodje.jfif
new file mode 100644
index 0000000..39564e0
Binary files /dev/null and b/src/assets/cars/dodje.jfif differ
diff --git a/src/assets/cars/ferrari.jfif b/src/assets/cars/ferrari.jfif
new file mode 100644
index 0000000..258136b
Binary files /dev/null and b/src/assets/cars/ferrari.jfif differ
diff --git a/src/assets/cars/lambo.jfif b/src/assets/cars/lambo.jfif
new file mode 100644
index 0000000..4f1ca92
Binary files /dev/null and b/src/assets/cars/lambo.jfif differ
diff --git a/src/assets/cars/maserati.jfif b/src/assets/cars/maserati.jfif
new file mode 100644
index 0000000..a9d55e5
Binary files /dev/null and b/src/assets/cars/maserati.jfif differ
diff --git a/src/assets/cars/mers.jfif b/src/assets/cars/mers.jfif
new file mode 100644
index 0000000..84508a2
Binary files /dev/null and b/src/assets/cars/mers.jfif differ
diff --git a/src/assets/cars/porshe.jfif b/src/assets/cars/porshe.jfif
new file mode 100644
index 0000000..af1a50e
Binary files /dev/null and b/src/assets/cars/porshe.jfif differ
diff --git a/src/assets/cars/shirt.jfif b/src/assets/cars/shirt.jfif
new file mode 100644
index 0000000..18713f6
Binary files /dev/null and b/src/assets/cars/shirt.jfif differ
diff --git a/src/assets/cars/zhiga.jfif b/src/assets/cars/zhiga.jfif
new file mode 100644
index 0000000..28db9e9
Binary files /dev/null and b/src/assets/cars/zhiga.jfif differ
diff --git a/src/assets/langIcons/english.png b/src/assets/langIcons/english.png
new file mode 100644
index 0000000..49c7104
Binary files /dev/null and b/src/assets/langIcons/english.png differ
diff --git a/src/assets/langIcons/russian.png b/src/assets/langIcons/russian.png
new file mode 100644
index 0000000..9d4f48a
Binary files /dev/null and b/src/assets/langIcons/russian.png differ
diff --git a/src/assets/seaBattle/fire.png b/src/assets/seaBattle/fire.png
new file mode 100644
index 0000000..d7e6c3a
Binary files /dev/null and b/src/assets/seaBattle/fire.png differ
diff --git a/src/assets/seaBattle/gun.png b/src/assets/seaBattle/gun.png
new file mode 100644
index 0000000..0e1f5e6
Binary files /dev/null and b/src/assets/seaBattle/gun.png differ
diff --git a/src/assets/seaBattle/mine.png b/src/assets/seaBattle/mine.png
new file mode 100644
index 0000000..860ba9c
Binary files /dev/null and b/src/assets/seaBattle/mine.png differ
diff --git a/src/assets/seaBattle/seaBattle.jpg b/src/assets/seaBattle/seaBattle.jpg
new file mode 100644
index 0000000..851c4f5
Binary files /dev/null and b/src/assets/seaBattle/seaBattle.jpg differ
diff --git a/src/assets/svg/delete.svg b/src/assets/svg/delete.svg
new file mode 100644
index 0000000..951e176
--- /dev/null
+++ b/src/assets/svg/delete.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/svg/star-empty.svg b/src/assets/svg/star-empty.svg
new file mode 100644
index 0000000..33a2885
--- /dev/null
+++ b/src/assets/svg/star-empty.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/src/assets/svg/star-full.svg b/src/assets/svg/star-full.svg
new file mode 100644
index 0000000..0d01fbd
--- /dev/null
+++ b/src/assets/svg/star-full.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/src/assets/svg/users.svg b/src/assets/svg/users.svg
new file mode 100644
index 0000000..f1b8494
--- /dev/null
+++ b/src/assets/svg/users.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/src/assets/tetris-mobile/down.svg b/src/assets/tetris-mobile/down.svg
new file mode 100644
index 0000000..64e5cd3
--- /dev/null
+++ b/src/assets/tetris-mobile/down.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/src/assets/tetris-mobile/left.svg b/src/assets/tetris-mobile/left.svg
new file mode 100644
index 0000000..fb4a487
--- /dev/null
+++ b/src/assets/tetris-mobile/left.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/tetris-mobile/right.svg b/src/assets/tetris-mobile/right.svg
new file mode 100644
index 0000000..1c864f5
--- /dev/null
+++ b/src/assets/tetris-mobile/right.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/tetris-mobile/rotate.svg b/src/assets/tetris-mobile/rotate.svg
new file mode 100644
index 0000000..8d6a50b
--- /dev/null
+++ b/src/assets/tetris-mobile/rotate.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/tetris-mobile/tetrisBack.jpg b/src/assets/tetris-mobile/tetrisBack.jpg
new file mode 100644
index 0000000..07c068c
Binary files /dev/null and b/src/assets/tetris-mobile/tetrisBack.jpg differ
diff --git a/src/controller/Auth.ts b/src/controller/Auth.ts
new file mode 100644
index 0000000..f85123c
--- /dev/null
+++ b/src/controller/Auth.ts
@@ -0,0 +1,196 @@
+import type {
+ TokenData,
+ UserData,
+ Values,
+ NewUserData,
+ ForgotUserData,
+ MessageData,
+ NewPassData,
+ ChangePassData,
+} from "../data/authData";
+import {
+ FETCH_CORRECT_ERROR,
+ BACKEND_URL,
+ BACKEND_MYUSER_PATH,
+ BACKEND_LOGIN_PATH,
+ BACKEND_REG_PATH,
+ BACKEND_FORGOT_PATH,
+ COOKIE_TOKEN_VAL,
+ BACKEND_SETPASS_PATH,
+ FETCH_ERROR,
+} from "../data/authData";
+
+export const getUserToken = (): string => {
+ const token = document.cookie
+ .split(";")
+ .find((val) => val.split("=")[0].trim() === COOKIE_TOKEN_VAL);
+
+ return token?.split("=")[1] ?? "";
+};
+
+export const logoutUser = () => {
+ document.cookie = `userToken=; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/;`;
+};
+
+const getUserDataByToken = async (): Promise =>
+ new Promise((resolve, reject) => {
+ fetch(`${BACKEND_URL}${BACKEND_MYUSER_PATH}`, {
+ method: "GET",
+ headers: {
+ "Content-Type": "application/json",
+ Authorization: `Bearer ${getUserToken()}`,
+ },
+ }).then((response) => {
+ if (response.ok) {
+ response.json().then((data) => {
+ data.fetched = true;
+ resolve(data);
+ });
+ } else {
+ response
+ .json()
+ .then((errorMessage) => reject(errorMessage))
+ .catch((err) => reject(err.message));
+ }
+ });
+ });
+
+export const checkUserToken = async () =>
+ new Promise((resolve, reject) => {
+ getUserDataByToken()
+ .then((userData: UserData) => {
+ resolve(userData);
+ })
+ .catch((err) => {
+ reject(err);
+ });
+ });
+
+export const authLogin = async (data: Values) =>
+ new Promise((resolve, reject) => {
+ fetch(`${BACKEND_URL}${BACKEND_LOGIN_PATH}`, {
+ method: "POST",
+ credentials: "same-origin",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify(data),
+ }).then((response) => {
+ if (response.ok) {
+ response.json().then((tokenData: TokenData) => {
+ document.cookie = `userToken=${tokenData.token}`;
+ resolve(tokenData);
+ });
+ } else {
+ response
+ .json()
+ .then((errorMessage) => reject(errorMessage))
+ .catch((err) => reject(err.message));
+ }
+ });
+ });
+
+export const createUser = async (data: NewUserData) =>
+ new Promise((resolve, reject) => {
+ fetch(`${BACKEND_URL}${BACKEND_REG_PATH}`, {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify(data),
+ }).then((response) => {
+ if (response.ok) {
+ resolve(response.json());
+ } else {
+ response
+ .json()
+ .then((errorMessage) => reject(errorMessage))
+ .catch((err) => reject(err.message));
+ }
+ });
+ });
+
+export const forgotPassword = async (data: ForgotUserData) =>
+ new Promise((resolve, reject) => {
+ fetch(`${BACKEND_URL}${BACKEND_FORGOT_PATH}`, {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify(data),
+ })
+ .then((response) => {
+ if (response.ok) {
+ resolve(response.json());
+ } else {
+ response
+ .json()
+ .then((errorMessage) => reject(errorMessage))
+ .catch((err) => reject(err.message));
+ }
+ })
+ .catch((err) => {
+ if (err.message === FETCH_ERROR) {
+ err.message = FETCH_CORRECT_ERROR;
+ }
+
+ reject(err);
+ });
+ });
+
+export const getUserNameByResetToken = async (resetToken: string) =>
+ new Promise((resolve, reject) => {
+ fetch(
+ `${BACKEND_URL}${BACKEND_SETPASS_PATH}?resetToken=${resetToken}`
+ ).then((response) => {
+ if (response.ok) {
+ resolve(response.json());
+ } else {
+ response
+ .json()
+ .then((errorMessage) => reject(errorMessage))
+ .catch((err) => reject(err.message));
+ }
+ });
+ });
+
+export const setNewPassword = async (data: NewPassData) =>
+ new Promise((resolve, reject) => {
+ fetch(`${BACKEND_URL}${BACKEND_SETPASS_PATH}`, {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify(data),
+ }).then((response) => {
+ if (response.ok) {
+ resolve(response.json());
+ } else {
+ response
+ .json()
+ .then((errorMessage) => reject(errorMessage))
+ .catch((err) => reject(err.message));
+ }
+ });
+ });
+
+export const changePassword = async (data: ChangePassData) =>
+ new Promise((resolve, reject) => {
+ fetch(`${BACKEND_URL}${BACKEND_SETPASS_PATH}`, {
+ method: "PUT",
+ headers: {
+ "Content-Type": "application/json",
+ Authorization: `Bearer ${getUserToken()}`,
+ },
+ body: JSON.stringify(data),
+ }).then((response) => {
+ if (response.ok) {
+ resolve(response.json());
+ } else {
+ response
+ .json()
+ .then((errorMessage) => reject(errorMessage))
+ .catch((err) => reject(err.message));
+ }
+ });
+ });
diff --git a/src/controller/GamesComments.ts b/src/controller/GamesComments.ts
new file mode 100644
index 0000000..ca51d73
--- /dev/null
+++ b/src/controller/GamesComments.ts
@@ -0,0 +1,68 @@
+import { BACKEND_URL } from "../data/authData";
+import type { GameComment, GameData } from "../data/gamesData";
+import { BACKEND_GAMES_PATH } from "../data/gamesData";
+import type { GameItem } from "../Pages/Games/games.data";
+
+import { getUserToken } from "./Auth";
+
+export const getAllGamesFromBackEnd = async () =>
+ new Promise>((resolve, reject) => {
+ fetch(`${BACKEND_URL}${BACKEND_GAMES_PATH}`, {
+ method: "GET",
+ headers: {
+ "Content-Type": "application/json",
+ Authorization: `Bearer ${getUserToken()}`,
+ },
+ })
+ .then((response) => {
+ if (response.ok) {
+ response.json().then((data) => resolve(data));
+ } else {
+ response
+ .json()
+ .then((err) => reject(err))
+ .catch((err) => reject(err));
+ }
+ })
+ .catch((err) => reject(err));
+ });
+
+export const getGameData = (gameName: string) =>
+ new Promise((resolve, reject) => {
+ fetch(
+ `https://rsgames.online:8888/games/data?name=${gameName
+ ?.split("")
+ .filter((char) => char !== " ")
+ .join("")}`
+ ).then((response) => {
+ if (response.ok) {
+ resolve(response.json());
+ } else {
+ response
+ .json()
+ .then((errorMessage) => reject(errorMessage))
+ .catch((err) => reject(err.message));
+ }
+ });
+ });
+
+export const postComment = (gameName: string, text: string, raiting: number) =>
+ new Promise((resolve, reject) => {
+ fetch(`https://rsgames.online:8888/games/comments?gameName=${gameName}`, {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json; charset=utf-8",
+ Authorization: `Bearer ${getUserToken()}`,
+ },
+ body: JSON.stringify({ text, raiting }),
+ }).then((response) => {
+ if (response.ok) {
+ resolve(response.json());
+ } else {
+ response
+ .json()
+ .then((errorMessage) => reject(errorMessage))
+ .catch((err) => reject(err.message));
+ }
+ });
+ });
diff --git a/src/controller/UserControls.tsx b/src/controller/UserControls.tsx
new file mode 100644
index 0000000..cab2e0d
--- /dev/null
+++ b/src/controller/UserControls.tsx
@@ -0,0 +1,68 @@
+import type { UserData } from "../data/authData";
+import {
+ MY_USER_PATH,
+ BACKEND_URL,
+ USERS_LIST,
+ USER_PATH,
+} from "../data/authData";
+
+import { getUserToken } from "./Auth";
+
+export const getUsers = async (search?: string) =>
+ fetch(`${BACKEND_URL}${USERS_LIST}${search ? `?search=${search}` : ""}`, {
+ method: "GET",
+ headers: {
+ "Content-Type": "application/json",
+ Authorization: `Bearer ${getUserToken()}`,
+ },
+ }).then((response) => response.json());
+
+export const getUser = (name: string) => {
+ const path = name ? `${USER_PATH}?userName=${name}` : MY_USER_PATH;
+
+ return fetch(`${BACKEND_URL}${path}`, {
+ method: "GET",
+ headers: {
+ "Content-Type": "application/json",
+ Authorization: `Bearer ${getUserToken()}`,
+ },
+ }).then((response) => response.json());
+};
+
+export const setUserStatus = async (userName: string, status: string[]) =>
+ fetch(`${BACKEND_URL}${USER_PATH}`, {
+ method: "PUT",
+ headers: {
+ "Content-Type": "application/json",
+ Authorization: `Bearer ${getUserToken()}`,
+ },
+ body: JSON.stringify({ userName, status }),
+ });
+
+export const banUser = async (userName: string) =>
+ fetch(`${BACKEND_URL}${USER_PATH}/ban?userName=${userName}`, {
+ method: "GET",
+ headers: {
+ "Content-Type": "application/json",
+ Authorization: `Bearer ${getUserToken()}`,
+ },
+ });
+
+export const unbanUser = async (userName: string) =>
+ fetch(`${BACKEND_URL}${USER_PATH}/unban?userName=${userName}`, {
+ method: "GET",
+ headers: {
+ "Content-Type": "application/json",
+ Authorization: `Bearer ${getUserToken()}`,
+ },
+ });
+
+export const deleteUser = async (name: string) =>
+ fetch(`${BACKEND_URL}${USER_PATH}`, {
+ method: "DELETE",
+ headers: {
+ "Content-Type": "application/json",
+ Authorization: `Bearer ${getUserToken()}`,
+ },
+ body: JSON.stringify({ userName: name }),
+ }).then((response) => response.json());
diff --git a/src/controller/Winners.ts b/src/controller/Winners.ts
new file mode 100644
index 0000000..1e1492a
--- /dev/null
+++ b/src/controller/Winners.ts
@@ -0,0 +1,66 @@
+import { BACKEND_URL, WIN_DATA } from "../data/authData";
+import type { WinnerRes } from "../data/winData";
+
+import { getUserToken } from "./Auth";
+
+export const postWinner = (gameName: string, points: number) =>
+ new Promise((resolve, reject) => {
+ fetch(`${BACKEND_URL}${WIN_DATA}`, {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json; charset=utf-8",
+ Authorization: `Bearer ${getUserToken()}`,
+ },
+ body: JSON.stringify({ game: gameName, points }),
+ }).then((response) => {
+ if (response.ok) {
+ resolve(response.json());
+ } else {
+ response
+ .json()
+ .then((errorMessage) => reject(errorMessage))
+ .catch((err) => reject(err.message));
+ }
+ });
+ });
+
+export const getGameWinsList = (gameName: string) =>
+ new Promise>((resolve, reject) => {
+ fetch(`${BACKEND_URL}${WIN_DATA}?game=${gameName}`, {
+ method: "GET",
+ headers: {
+ "Content-Type": "application/json; charset=utf-8",
+ Authorization: `Bearer ${getUserToken()}`,
+ },
+ }).then((response) => {
+ if (response.ok) {
+ resolve(response.json());
+ } else {
+ response
+ .json()
+ .then((errorMessage) => reject(errorMessage))
+ .catch((err) => reject(err.message));
+ }
+ });
+ });
+
+export const getUserWinsList = (userName?: string) =>
+ new Promise>((resolve, reject) => {
+ const userParam = userName ? `?userName=${userName}` : "";
+ fetch(`${BACKEND_URL}${WIN_DATA}${userParam}`, {
+ method: "GET",
+ headers: {
+ "Content-Type": "application/json; charset=utf-8",
+ Authorization: `Bearer ${getUserToken()}`,
+ },
+ }).then((response) => {
+ if (response.ok) {
+ resolve(response.json());
+ } else {
+ response
+ .json()
+ .then((errorMessage) => reject(errorMessage))
+ .catch((err) => reject(err.message));
+ }
+ });
+ });
diff --git a/src/controller/banchecker.ts b/src/controller/banchecker.ts
new file mode 100644
index 0000000..7807a75
--- /dev/null
+++ b/src/controller/banchecker.ts
@@ -0,0 +1,50 @@
+import type { NavigateFunction } from "react-router-dom";
+
+import { nullUser } from "../store";
+
+import { checkUserToken } from "./Auth";
+
+type UserSetter = (user: {
+ userName: string | null;
+ image?: string | undefined;
+ status: string[];
+ banned: boolean;
+ email: string | null;
+}) => void;
+
+type StatusSetter = (user: { isLoading: boolean; message: string }) => void;
+
+export const checkForBan = async (
+ isEn: boolean,
+ setUser: UserSetter,
+ setStatus: StatusSetter,
+ navigate: NavigateFunction
+) =>
+ checkUserToken()
+ .then((userData) => {
+ setUser({
+ userName: userData.userName,
+ image: userData.image,
+ status: userData.status,
+ banned: userData.banned,
+ email: userData.email,
+ });
+
+ return userData;
+ })
+ .then((userData) => {
+ if (userData.banned) {
+ setStatus({
+ isLoading: false,
+ message: isEn ? "Вы забанены!" : "You are banned!",
+ });
+ navigate("/");
+
+ return true;
+ }
+
+ return false;
+ })
+ .catch(() => {
+ setUser(nullUser);
+ });
diff --git a/src/data/authData.ts b/src/data/authData.ts
new file mode 100644
index 0000000..eede517
--- /dev/null
+++ b/src/data/authData.ts
@@ -0,0 +1,70 @@
+export const BACKEND_URL =
+ import.meta.env.VITE_BACK_SOURCE || "https://rsgames.online:8888";
+
+export const BACKEND_LOGIN_PATH = "/auth/login/";
+
+export const BACKEND_MYUSER_PATH = "/auth/myuser/";
+
+export const BACKEND_REG_PATH = "/auth/registr/";
+
+export const BACKEND_FORGOT_PATH = "/auth/forgotpass/";
+
+export const BACKEND_SETPASS_PATH = "/auth/setpass/";
+
+export const COOKIE_TOKEN_VAL = "userToken";
+
+export const FETCH_ERROR = "Failed to fetch";
+
+export const FETCH_CORRECT_ERROR = "Too frequent requests";
+
+export const WIN_DATA = "/win/data";
+
+export const USERS_LIST = "/auth/users";
+
+export const USER_PATH = "/auth/user";
+
+export const MY_USER_PATH = "/auth/myuser";
+
+export interface Values {
+ userName: string;
+ password: string;
+}
+
+export interface UserData {
+ _id: string;
+ userName: string;
+ image?: string;
+ email: string;
+ status: Array;
+ banned: boolean;
+ date: Date;
+}
+
+export interface TokenData {
+ token: string;
+}
+
+export interface NewUserData {
+ userName: string;
+ email: string;
+ password: string;
+}
+
+export interface ForgotUserData {
+ userName?: string;
+ email?: string;
+}
+
+export interface MessageData {
+ message: string;
+}
+
+export interface NewPassData {
+ resetToken: string;
+ password: string;
+}
+
+export interface ChangePassData {
+ password: string;
+ newPassword: string;
+}
diff --git a/src/data/gamesData.ts b/src/data/gamesData.ts
new file mode 100644
index 0000000..3c2d0ce
--- /dev/null
+++ b/src/data/gamesData.ts
@@ -0,0 +1,23 @@
+export const BACKEND_GAMES_PATH = "/games/all/";
+
+export interface GameComment {
+ userName: string;
+ gameName: string;
+ text: string;
+ raiting: number;
+ date: Date;
+}
+
+export interface GameData {
+ _id: string;
+ name: string;
+ fullName: string;
+ image: string;
+ descriptionRu: string;
+ descriptionEn: string;
+ rulesRu: string;
+ rulesEn: string;
+ raiting: number;
+ comments: [GameComment];
+ isComingSoon: boolean;
+}
diff --git a/src/data/restMsgs.ts b/src/data/restMsgs.ts
new file mode 100644
index 0000000..340b41c
--- /dev/null
+++ b/src/data/restMsgs.ts
@@ -0,0 +1,190 @@
+interface IRoutesMap {
+ [index: string]: string;
+}
+
+const ALL_MESSAGES: IRoutesMap = {
+ "Wrong Input Data": "Wrong Input Data",
+ "User not found": "User not found",
+ "Password has been changed!": "Password has been changed!",
+ "Password Reset Error": "Password Reset Error",
+ "Incorrect password": "Incorrect password",
+ "Password Changing Error": "Password Changing Error",
+ "Error: Cannot get userName": "Error: Cannot get userName",
+ "Validation error": "Validation error",
+ "User is allredy registred": "User is allredy registred",
+ "User with current email is allredy registred":
+ "User with current email is allredy registred",
+ "New User has been successfully created!":
+ "New User has been successfully created!",
+ "Registration Error": "Registration Error",
+ "Login Error": "Login Error",
+ "Failed to get users": "Failed to get users",
+ "Failed to get user": "Failed to get user",
+ "You can not changed this admin status!":
+ "You can not changed this admin status!",
+ "Status changed": "Status changed",
+ "Failed to set new status": "Failed to set new status",
+ "You can not delete this user!": "You can not delete this user!",
+ "User has been deleted": "User has been deleted",
+ "Failed to delete user": "Failed to delete user",
+ "User has been banned": "User has been banned",
+ "User has been unbanned": "User has been unbanned",
+ "Failed to ban user": "Failed to ban user",
+
+ "Games not found!": "Games not found!",
+ "Failed to get games list": "Failed to get games list",
+ "Failed to get game": "Failed to get game",
+ "Failed to add game": "Failed to add game",
+ "Failed to edit game": "Failed to edit game",
+ "Faild to get commets": "Faild to get commets",
+ "Wrong User Name": "Wrong User Name",
+ "Wrong Game Name": "Wrong Game Name",
+ "Faild to save commet": "Faild to save commet",
+ "Comment not found": "Comment not found",
+ "Faild to delete commet": "Faild to delete commet",
+
+ "User is not authorized": "User is not authorized",
+ "User is banned": "User is banned",
+ "Game not found": "Game not found",
+ "Failed to add winner": "Failed to add winner",
+ "Failed to get winner": "Failed to get winner",
+
+ "User not authorized": "User not authorized",
+ "You do not have permission": "You do not have permission",
+ "You are banned!": "You are banned!",
+ "Вы забанены!": "You are banned!",
+
+ "You have successfully registered!": "You have successfully registered!",
+ "You are logged in": "You are logged in",
+
+ "This user is not connected to the game":
+ "This user is not connected to the game",
+ "Not enough players for start": "Not enough players for start",
+ "You don't have permission to start the game":
+ "You don't have permission to start the game",
+ "Not all players are ready to start the game":
+ "Not all players are ready to start the game",
+ "Game not found!": "Game not found!",
+ "Server error!": "Server error!",
+ "Wrong or expired token": "Wrong or expired token",
+ "Maximum number of players in the game":
+ "Maximum number of players in the game",
+ "The game is already started, you can not change the position of the ships":
+ "The game is already started, you can not change the position of the ships",
+ "User has joined the game": "User has joined the game",
+ "The user has disconnected from the game":
+ "The user has disconnected from the game",
+ "User is ready to play": "User is ready to play",
+ "User is not ready to play": "User is not ready to play",
+ "Game is started!": "Game is started!",
+ "Game is ended!": "Game is ended!",
+ "You are connected": "You are connected",
+ "Game has been created!": "Game has been created!",
+ "Wrong ships count": "Wrong ships count",
+ "Wrong ships position": "Wrong ships position",
+
+ "You win!": "You win!",
+ "You lose": "You lose",
+};
+
+const ALL_MESSAGES_RU: IRoutesMap = {
+ "Wrong Input Data": "Не верный ввод",
+ "User not found": "Пользователь не найден",
+ "Password has been changed!": "Password has been changed!",
+ "Password Reset Error": "При сбросе пароля возникла ошибка",
+ "Incorrect password": "Не верный пароль",
+ "Password Changing Error": "Ошибка изменения пароля",
+ "Error: Cannot get userName": "Ошибка: Не возможно получить Имя Пользователя",
+ "Validation error": "Ошибка валидации",
+ "User is allredy registred": "Такой пользователь уже зарегистрирован",
+ "User with current email is allredy registred":
+ "Пользователь с таким email'ом уже зарегистрирован",
+ "New User has been successfully created!":
+ "Новый пользователь успешно создан!",
+ "Registration Error": "Ошибка регистрации",
+ "Login Error": "Ошибка входа",
+ "Failed to get users": "Не удалось получить пользователей",
+ "Failed to get user": "Не удалось получить пользователя",
+ "You can not changed this admin status!":
+ 'Вы не можете изменять статус "admin" у данного пользователя!',
+ "Status changed": "Статус изменен",
+ "Failed to set new status": "Не удалось задать новый статус",
+ "You can not delete this user!": "Вы не можете удалить данного пользователя!",
+ "User has been deleted": "Пользователь успешно удален",
+ "Failed to delete user": "Не удалось удалить пользователя",
+ "User has been banned": "Пользователь забанен",
+ "User has been unbanned": "Пользователь разбанен",
+ "Failed to ban user": "Не удалось забанить пользователя",
+
+ "Games not found!": "Игра не найдена!",
+ "Failed to get games list": "Не удалось загрузить список игр",
+ "Failed to get game": "Не удалось загрузить игру",
+ "Failed to add game": "Не удалось добавить игру",
+ "Failed to edit game": "Не удалось изменить игру",
+ "Faild to get commets": "Не удалось загрузить комментарии",
+ "Wrong User Name": "Не верное Имя Пользователя",
+ "Wrong Game Name": "Не верное название игры",
+ "Faild to save commet": "Не удалось сохранить комментарий",
+ "Comment not found": "Комментарий не найден",
+ "Faild to delete commet": "Не удалось удалить комментарий",
+
+ "User is not authorized": "Пользователь не авторизирован",
+ "User is banned": "Пользователь забанен",
+ "Game not found": "Игра не найдена",
+ "Failed to add winner": "Не удалось добавить победителя",
+ "Failed to get winner": "Не удалось загрузить победителя",
+
+ "User not authorized": "Пользователь не авторизован",
+ "You do not have permission": "У вас нет прав для выполнения операции",
+ "You are banned!": "Вы забанены!",
+ "Вы забанены!": "Вы забанены!",
+
+ "You have successfully registered!": "Вы успешно зарегистрированны!",
+ "You are logged in": "Вы вошли в систему",
+
+ "This user is not connected to the game": "Пользователь не подключен к игре",
+ "Not enough players for start": "Не хватает игрока для старта",
+ "You don't have permission to start the game": "У вас нет прав начать игру",
+ "Not all players are ready to start the game":
+ "Другой пользователь не подтвердил готовность к игре",
+ "Game not found!": "Игра не найдена!",
+ "Server error!": "Ошибка сервера!",
+ "Wrong or expired token": "Не верный или истегший токен",
+ "Maximum number of players in the game":
+ "Максимальное количество плееров в игре",
+ "The game is already started, you can not change the position of the ships":
+ "Игра уже началась, вы не можете изменять позицию своих кораблей",
+ "User has joined the game": "Пользователь присоеденился к игре",
+ "The user has disconnected from the game": "Пользователь покинул игру",
+ "User is ready to play": "Игрок готов начать игру",
+ "User is not ready to play": "Пользователь не готов к игре",
+ "Game is started!": "Игра началась!",
+ "Game is ended!": "Игра окончена!",
+ "You are connected": "Вы присоеденились",
+ "Game has been created!": "Игра создана!",
+ "Wrong ships count": "Не верное количество кораблей",
+ "Wrong ships position": "Не верное положение кораблей",
+
+ "You win!": "Вы победили!",
+ "You lose": "Вы проиграли",
+};
+
+export const MESSAGES_EN = new Proxy(ALL_MESSAGES, {
+ get(target, prop: string) {
+ if (prop.substring(0, 16) === "E-mail sended to") {
+ return prop;
+ }
+
+ return target[prop] ?? "Connection Error!";
+ },
+});
+
+export const MESSAGES_RU = new Proxy(ALL_MESSAGES_RU, {
+ get(target, prop: string) {
+ if (prop.substring(0, 16) === "E-mail sended to") {
+ return prop.replace("E-mail sended to", "Письмо отправелнно на почту:");
+ }
+
+ return target[prop] ?? "Ошибка соединения!";
+ },
+});
diff --git a/src/data/winData.ts b/src/data/winData.ts
new file mode 100644
index 0000000..ecad38b
--- /dev/null
+++ b/src/data/winData.ts
@@ -0,0 +1,19 @@
+export interface WinnerReq {
+ game: string;
+ points: number;
+}
+
+export interface WinnerRes {
+ _id: string;
+ userName: string;
+ gameName: string;
+ points: number;
+ date: string;
+ position?: number;
+}
+
+export enum WinErrorMessages {
+ notAuthorized = "User not authorized",
+ gameNotFound = "Game not found",
+ failed = "Failed to add winner",
+}
diff --git a/src/helpers/tetris/constants/index.ts b/src/helpers/tetris/constants/index.ts
new file mode 100644
index 0000000..5cace72
--- /dev/null
+++ b/src/helpers/tetris/constants/index.ts
@@ -0,0 +1,7 @@
+export const ITEM_SIZE = 30;
+
+export const WIDTH_CENTER = 210;
+
+export const PLAY_ZONE_WIDTH = 450;
+
+export const PLAY_ZONE_HEIGHT = 600;
diff --git a/src/helpers/tetris/figures/constants.ts b/src/helpers/tetris/figures/constants.ts
new file mode 100644
index 0000000..39b274e
--- /dev/null
+++ b/src/helpers/tetris/figures/constants.ts
@@ -0,0 +1,62 @@
+import { ITEM_SIZE } from "../constants";
+import type { Coordinates } from "../movement";
+
+import type { FigureType } from ".";
+
+export const INITIAL_COORDINATES_BY_FIGURE_TYPE: Record<
+ FigureType,
+ Coordinates[]
+> = {
+ I: [
+ [0, -ITEM_SIZE * 2],
+ [0, -ITEM_SIZE],
+ [0, 0],
+ [0, ITEM_SIZE],
+ ],
+ L: [
+ [0, -ITEM_SIZE],
+ [0, 0],
+ [0, ITEM_SIZE],
+ [ITEM_SIZE, ITEM_SIZE],
+ ],
+ RevertL: [
+ [0, -ITEM_SIZE],
+ [0, 0],
+ [0, ITEM_SIZE],
+ [-ITEM_SIZE, ITEM_SIZE],
+ ],
+ RevertZ: [
+ [ITEM_SIZE, -ITEM_SIZE],
+ [ITEM_SIZE, 0],
+ [0, 0],
+ [0, ITEM_SIZE],
+ ],
+ Square: [
+ [0, -ITEM_SIZE],
+ [0, 0],
+ [ITEM_SIZE, -ITEM_SIZE],
+ [ITEM_SIZE, 0],
+ ],
+ T: [
+ [0, -ITEM_SIZE],
+ [0, 0],
+ [ITEM_SIZE, 0],
+ [0, ITEM_SIZE],
+ ],
+ Z: [
+ [0, -ITEM_SIZE],
+ [0, 0],
+ [ITEM_SIZE, 0],
+ [ITEM_SIZE, ITEM_SIZE],
+ ],
+};
+
+export const COLOR_BY_FIGURE_TYPE: Record = {
+ I: "#ff5f52",
+ L: "#85bb5c",
+ RevertL: "#6d6d6d",
+ RevertZ: "#7b5e57",
+ Square: "#5f5fc4",
+ T: "#ffd95a",
+ Z: "#ff9d3f",
+};
diff --git a/src/helpers/tetris/figures/helpers.ts b/src/helpers/tetris/figures/helpers.ts
new file mode 100644
index 0000000..9654d4c
--- /dev/null
+++ b/src/helpers/tetris/figures/helpers.ts
@@ -0,0 +1,15 @@
+import type { FigureType } from ".";
+import { createFigure } from ".";
+
+const figures: FigureType[] = [
+ "I",
+ "L",
+ "T",
+ "Z",
+ "RevertL",
+ "RevertZ",
+ "Square",
+];
+
+export const getRandomFigure = (options: Parameters[1]) =>
+ createFigure(figures[Math.floor(Math.random() * figures.length)], options);
diff --git a/src/helpers/tetris/figures/index.ts b/src/helpers/tetris/figures/index.ts
new file mode 100644
index 0000000..61ffb86
--- /dev/null
+++ b/src/helpers/tetris/figures/index.ts
@@ -0,0 +1,131 @@
+import { ITEM_SIZE } from "../constants";
+import type { Coordinates } from "../movement";
+
+import {
+ COLOR_BY_FIGURE_TYPE,
+ INITIAL_COORDINATES_BY_FIGURE_TYPE,
+} from "./constants";
+
+export type Figure = {
+ coordinates: Coordinates[];
+ color: string;
+ coordinatesInNullishPoint: Coordinates[];
+ type: FigureType;
+};
+
+export type FigureType =
+ | "I"
+ | "L"
+ | "Z"
+ | "RevertL"
+ | "RevertZ"
+ | "Square"
+ | "T";
+
+export const createFigure = (
+ type: FigureType,
+ {
+ offsetX,
+ offsetY,
+ initialCoordinate,
+ }: { offsetX?: number; offsetY?: number; initialCoordinate?: Coordinates[] }
+): Figure => ({
+ color: COLOR_BY_FIGURE_TYPE[type],
+ coordinates:
+ initialCoordinate ??
+ INITIAL_COORDINATES_BY_FIGURE_TYPE[type].map(([x, y]) => [
+ (offsetX || 0) + x,
+ (offsetY || 0) + y,
+ ]),
+ coordinatesInNullishPoint:
+ initialCoordinate ?? INITIAL_COORDINATES_BY_FIGURE_TYPE[type],
+ type,
+});
+
+export const removeLineFromFigure = (line: number, figure: Figure) => {
+ const initialLength = figure.coordinates.length;
+
+ const newCoordinates = figure.coordinates
+ .filter(([x]) => x !== line)
+ .map(([x, y]) => (x <= line ? [x + ITEM_SIZE, y] : [x, y]));
+
+ return {
+ newFigure: {
+ ...figure,
+ coordinates: newCoordinates,
+ },
+ score: initialLength - newCoordinates.length,
+ };
+};
+
+export const updateCoordinatesInNullishPoint = (
+ newCoordinatesInNullishPoint: Coordinates[],
+ figure: Figure
+): Figure => ({
+ ...figure,
+ coordinatesInNullishPoint: newCoordinatesInNullishPoint,
+});
+
+export const removeFilledLines = (staticFigures: Figure[]) => {
+ const filledLines = staticFigures
+ .map((figure) => figure.coordinates)
+ .flat()
+ .sort((a, b) => a[0] - b[0])
+ .reduce(
+ (acc, curr) => ({ ...acc, [curr[0]]: (acc[curr[0]] || 0) + 1 }),
+ {} as Record
+ );
+
+ const linesToRemove = Object.entries(filledLines)
+ .filter(([, value]) => value === 15)
+ .map(([x]) => Number.parseInt(x, 10));
+
+ const result = linesToRemove.reduce<{
+ newStaticFigures: Figure[];
+ totalScore: number;
+ }>(
+ (acc, line) => {
+ const newStaticFigures = acc.newStaticFigures.reduce<{
+ figures: Figure[];
+ score: number;
+ }>(
+ (figuresAcc, curr) => {
+ const figureWithoutLine = removeLineFromFigure(line, curr);
+
+ return {
+ figures: [...figuresAcc.figures, figureWithoutLine.newFigure],
+ score: figuresAcc.score + figureWithoutLine.score,
+ };
+ },
+ {
+ figures: [],
+ score: 0,
+ }
+ );
+
+ return {
+ newStaticFigures: [...newStaticFigures.figures],
+ totalScore: acc.totalScore + newStaticFigures.score,
+ };
+ },
+ {
+ newStaticFigures: [...staticFigures],
+ totalScore: 0,
+ }
+ );
+
+ return result;
+};
+
+export const isFiguresCollided = (
+ staticFigures: Figure[],
+ currentFigure: Figure
+) =>
+ staticFigures.some((figure) =>
+ figure.coordinates.some((coords) =>
+ currentFigure.coordinates.some(
+ (selfCoords) =>
+ coords[0] === selfCoords[0] && coords[1] === selfCoords[1]
+ )
+ )
+ );
diff --git a/src/helpers/tetris/hooks/useControls.ts b/src/helpers/tetris/hooks/useControls.ts
new file mode 100644
index 0000000..065674c
--- /dev/null
+++ b/src/helpers/tetris/hooks/useControls.ts
@@ -0,0 +1,145 @@
+import { useState, useEffect, useRef, useCallback } from "react";
+import type { MutableRefObject } from "react";
+
+import { WIDTH_CENTER } from "../constants";
+import type { Figure } from "../figures";
+import { isFiguresCollided, removeFilledLines } from "../figures";
+import { getRandomFigure } from "../figures/helpers";
+import { move, Moves, rotate } from "../movement";
+
+interface IUseControls {
+ figures: Figure[];
+ rotateRight: () => void;
+ rotateLeft: () => void;
+ moveRight: () => void;
+ moveLeft: () => void;
+ moveBottom: MutableRefObject<() => void>;
+ resetGame: () => void;
+ score: number;
+ isGameActive: boolean;
+}
+
+const getNewFigure = () =>
+ getRandomFigure({
+ offsetY: WIDTH_CENTER,
+ });
+
+export const useControls = (): IUseControls => {
+ const [score, setScore] = useState(0);
+ const [staticFigures, setStaticFigures] = useState([]);
+ const [isGameActive, setGameActive] = useState(true);
+ const [activeFigure, setActiveFigure] = useState(getNewFigure);
+ const intervalRef = useRef>();
+
+ const resetGame = useCallback(() => {
+ const newFigure = getNewFigure();
+
+ setScore(0);
+ setStaticFigures([]);
+
+ setGameActive(true);
+
+ setActiveFigure(newFigure);
+ }, []);
+
+ const moveBottomRef = useRef<() => void>(() => {});
+
+ const setMoveInterval = () => {
+ intervalRef.current = setInterval(() => {
+ moveBottomRef.current();
+ }, 1000);
+ };
+
+ const stopFigure = () => {
+ const newFigure = getNewFigure();
+
+ if (isFiguresCollided(staticFigures, newFigure)) {
+ setGameActive(false);
+
+ return;
+ }
+
+ clearInterval(intervalRef.current);
+ setTimeout(() => {
+ setActiveFigure(newFigure);
+ setStaticFigures((oldFigures) => {
+ const newFigures = oldFigures.concat(activeFigure);
+
+ const { newStaticFigures, totalScore } = removeFilledLines(newFigures);
+
+ setScore((state) => state + totalScore);
+
+ return newStaticFigures;
+ });
+ setMoveInterval();
+ }, 0);
+ };
+
+ const rotateRight = () => {
+ if (!isGameActive) {
+ return;
+ }
+
+ setActiveFigure(rotate(activeFigure, staticFigures, true));
+ };
+
+ const rotateLeft = () => {
+ if (!isGameActive) {
+ return;
+ }
+
+ setActiveFigure(rotate(activeFigure, staticFigures));
+ };
+
+ const moveRight = () => {
+ if (!isGameActive) {
+ return;
+ }
+
+ setActiveFigure(move(activeFigure, staticFigures, Moves.right));
+ };
+
+ const moveLeft = () => {
+ if (!isGameActive) {
+ return;
+ }
+
+ setActiveFigure(move(activeFigure, staticFigures, Moves.left));
+ };
+
+ moveBottomRef.current = () => {
+ if (!isGameActive) {
+ return;
+ }
+
+ setActiveFigure(
+ move(activeFigure, staticFigures, Moves.bottom, stopFigure)
+ );
+ };
+
+ const movements = {
+ rotateRight,
+ rotateLeft,
+ moveRight,
+ moveLeft,
+ };
+
+ useEffect(() => {
+ setMoveInterval();
+
+ return () => {
+ clearInterval(intervalRef.current);
+ };
+ }, []);
+
+ const fullFigures = staticFigures.concat(activeFigure);
+
+ return {
+ figures: fullFigures,
+ score,
+ resetGame,
+ isGameActive,
+ moveBottom: moveBottomRef,
+ ...movements,
+ };
+};
diff --git a/src/helpers/tetris/movement/index.ts b/src/helpers/tetris/movement/index.ts
new file mode 100644
index 0000000..36eed7a
--- /dev/null
+++ b/src/helpers/tetris/movement/index.ts
@@ -0,0 +1,167 @@
+// eslint-disable-next-line import/no-extraneous-dependencies
+import { Matrix } from "ml-matrix";
+
+import { PLAY_ZONE_WIDTH, PLAY_ZONE_HEIGHT, ITEM_SIZE } from "../constants";
+import type { Figure } from "../figures";
+import {
+ createFigure,
+ isFiguresCollided,
+ updateCoordinatesInNullishPoint,
+} from "../figures";
+
+export const rotationRightMatrix = new Matrix([
+ [0, -1],
+ [1, 0],
+]);
+
+export const rotationLeftMatrix = new Matrix([
+ [0, 1],
+ [-1, 0],
+]);
+
+export enum Moves {
+ right,
+ left,
+ bottom,
+}
+
+export enum Keys {
+ ArrowRight = "ArrowRight",
+ ArrowLeft = "ArrowLeft",
+ ArrowDown = "ArrowDown",
+ ArrowUp = "ArrowUp",
+ r = "r",
+ R = "R",
+}
+
+export type Coordinates = number[];
+
+export type Movements = Record void>;
+
+export type Rotations = (key: string, movements: Movements) => () => void;
+
+const checkBorder = (matrix: Matrix, moveTo: Moves, isWeak?: boolean) => {
+ switch (moveTo) {
+ case Moves.right:
+ return isWeak
+ ? matrix.maxColumn(1) + ITEM_SIZE > PLAY_ZONE_WIDTH
+ : matrix.maxColumn(1) + ITEM_SIZE >= PLAY_ZONE_WIDTH;
+
+ case Moves.left:
+ return isWeak ? matrix.minColumn(1) < 0 : matrix.minColumn(1) <= 0;
+
+ case Moves.bottom:
+ return isWeak
+ ? matrix.maxColumn(0) + ITEM_SIZE > PLAY_ZONE_HEIGHT
+ : matrix.maxColumn(0) + ITEM_SIZE >= PLAY_ZONE_HEIGHT;
+
+ default:
+ return isWeak;
+ }
+};
+
+export const rotate = (
+ figure: Figure,
+ staticFigures: Figure[],
+ isClockwise?: boolean
+): Figure => {
+ const diff = new Matrix(figure.coordinates).add(
+ new Matrix(figure.coordinatesInNullishPoint).neg()
+ );
+ const oldOffset = new Matrix(figure.coordinates).add(diff.clone().neg());
+ const rotation = isClockwise ? rotationRightMatrix : rotationLeftMatrix;
+
+ const newCoords = new Matrix(oldOffset).mmul(rotation).add(diff);
+
+ const newCoordinatesInNullishPoint = new Matrix(
+ figure.coordinatesInNullishPoint
+ )
+ .mmul(rotation)
+ .to2DArray();
+
+ const figureWithNewCoordinatesInNullishPoint =
+ updateCoordinatesInNullishPoint(newCoordinatesInNullishPoint, figure);
+
+ const newFigure = {
+ ...figureWithNewCoordinatesInNullishPoint,
+ coordinates: newCoords.to2DArray(),
+ };
+
+ const isCollided =
+ checkBorder(newCoords.clone(), Moves.bottom, true) ||
+ checkBorder(newCoords.clone(), Moves.left, true) ||
+ checkBorder(newCoords.clone(), Moves.right, true) ||
+ isFiguresCollided(staticFigures, newFigure);
+
+ if (isCollided) {
+ return figure;
+ }
+
+ return newFigure;
+};
+
+const coordinatesMapperByMoveType: Record<
+ Moves,
+ (figure: Coordinates) => Coordinates
+> = {
+ [Moves.bottom]: ([first, last]) => [first + ITEM_SIZE, last],
+ [Moves.right]: ([first, last]) => [first, last + ITEM_SIZE],
+ [Moves.left]: ([first, last]) => [first, last - ITEM_SIZE],
+};
+
+export const move = (
+ figure: Figure,
+ staticFigures: Figure[],
+ moveTo: Moves,
+ isEndCallback?: () => void
+): Figure => {
+ const coords = figure.coordinates;
+ const matrix = new Matrix(coords);
+ const isBorderCollided = checkBorder(matrix, moveTo);
+
+ if (isBorderCollided) {
+ if (isEndCallback) {
+ isEndCallback();
+ }
+
+ return figure;
+ }
+
+ const newCoords = coords.map(coordinatesMapperByMoveType[moveTo]);
+
+ if (
+ isFiguresCollided(
+ staticFigures,
+ createFigure(figure.type, {
+ initialCoordinate: newCoords,
+ })
+ )
+ ) {
+ if (isEndCallback) {
+ isEndCallback();
+ }
+
+ return figure;
+ }
+
+ return {
+ ...figure,
+ coordinates: newCoords,
+ };
+};
+
+export const isValidKey = (key: string): key is Keys => {
+ if (key in Keys) {
+ return true;
+ }
+
+ return false;
+};
+
+export const rotations: Rotations = (key, movements) => {
+ if (!isValidKey(key)) {
+ return () => {};
+ }
+
+ return movements[key];
+};
diff --git a/src/index.scss b/src/index.scss
new file mode 100644
index 0000000..68b3993
--- /dev/null
+++ b/src/index.scss
@@ -0,0 +1,84 @@
+:root {
+ font-family: Inter, Avenir, Helvetica, Arial, sans-serif;
+ font-size: 16px;
+ line-height: 1.2;
+ font-weight: 400;
+
+ color-scheme: light dark;
+ color: rgba(255, 255, 255, 0.87);
+ background-color: #242424;
+
+ font-synthesis: none;
+ text-rendering: optimizeLegibility;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-text-size-adjust: 100%;
+}
+
+a {
+ color: #7e6dd1;
+ text-decoration: inherit;
+}
+
+a:hover {
+ color: #535bf2;
+}
+
+body {
+ margin: 0;
+ min-width: 300px;
+ min-height: 100vh;
+ overflow-x: hidden;
+ background-color: #fbfbfb;
+ color: #1a1a1a;
+}
+
+input {
+ background-color: #fbfbfb;
+ color: #1a1a1a;
+}
+
+h1 {
+ font-size: 3.2em;
+ line-height: 1.1;
+}
+
+button {
+ border-radius: 8px;
+ border: 1px solid transparent;
+ padding: 0.6em 1.2em;
+ font-size: 1em;
+ font-weight: 500;
+ font-family: inherit;
+ background-color: #1a1a1a;
+ cursor: pointer;
+ transition: all .1s;
+}
+
+button:hover {
+ border-color: #7e6dd1;
+}
+
+button:disabled {
+ border-color: transparent;
+}
+
+button:focus,
+button:focus-visible {
+ outline: 4px auto -webkit-focus-ring-color;
+}
+
+@media (prefers-color-scheme: light) {
+ :root {
+ color: #213547;
+ background-color: #ffffff;
+ }
+
+ a:hover {
+ color: #747bff;
+ }
+
+ button {
+ background-color: #f9f9f9;
+ }
+}
\ No newline at end of file
diff --git a/src/main.tsx b/src/main.tsx
new file mode 100644
index 0000000..f64f5cc
--- /dev/null
+++ b/src/main.tsx
@@ -0,0 +1,21 @@
+import ReactDOM from "react-dom/client";
+import { HashRouter as Router } from "react-router-dom";
+
+import App from "./App";
+import { CheckForLogin } from "./Components/Authentication/utils";
+import Footer from "./Components/Footer";
+import Header from "./Components/Header";
+import Loading from "./Components/Loading/Lodaing";
+import PopupMessage from "./Components/Message/PopMessage";
+import "./index.scss";
+
+ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
+
+
+
+
+
+
+
+
+);
diff --git a/src/store/index.tsx b/src/store/index.tsx
new file mode 100644
index 0000000..bbc531c
--- /dev/null
+++ b/src/store/index.tsx
@@ -0,0 +1,37 @@
+import { create } from "zustand";
+
+export type userSetter = (user: {
+ userName: string | null;
+ image?: string;
+ status: Array;
+ banned: boolean;
+ email: string | null;
+}) => void;
+
+interface UsersState {
+ userName: string | null;
+ image?: string;
+ status: Array;
+ banned: boolean;
+ setUser: userSetter;
+ fetched: boolean;
+}
+
+const useUserStore = create((set) => ({
+ userName: null,
+ status: [],
+ banned: false,
+ email: null,
+ fetched: false,
+ setUser: (newUser) => set(() => newUser),
+}));
+
+export const nullUser = {
+ userName: null,
+ status: [],
+ banned: false,
+ email: null,
+ fetched: true,
+};
+
+export default useUserStore;
diff --git a/src/store/language.ts b/src/store/language.ts
new file mode 100644
index 0000000..77776ca
--- /dev/null
+++ b/src/store/language.ts
@@ -0,0 +1,16 @@
+import { create } from "zustand";
+
+// eslint-disable-next-line import/no-cycle
+import { LS_LANG } from "../Components/Header/Lang/LangComp";
+
+interface ILangState {
+ isEn: boolean;
+ setLang: (newTheme: boolean) => void;
+}
+
+const languageStore = create((set) => ({
+ isEn: localStorage.getItem(LS_LANG) === "true",
+ setLang: (newLang) => set({ isEn: newLang }),
+}));
+
+export default languageStore;
diff --git a/src/store/load-status.tsx b/src/store/load-status.tsx
new file mode 100644
index 0000000..856a260
--- /dev/null
+++ b/src/store/load-status.tsx
@@ -0,0 +1,20 @@
+import { create } from "zustand";
+
+export type StatusSetter = (user: {
+ isLoading: boolean;
+ message: string;
+}) => void;
+
+interface StatusState {
+ isLoading: boolean;
+ message: string;
+ setStatus: StatusSetter;
+}
+
+const useStatusStore = create((set) => ({
+ isLoading: false,
+ message: "",
+ setStatus: (newStatus) => set(() => newStatus),
+}));
+
+export default useStatusStore;
diff --git a/src/store/theme.ts b/src/store/theme.ts
new file mode 100644
index 0000000..2274a59
--- /dev/null
+++ b/src/store/theme.ts
@@ -0,0 +1,15 @@
+import { create } from "zustand";
+
+export const LS_THEME = "rs-games-online__theme";
+
+interface IThemeState {
+ isDark: boolean;
+ setTheme: (newTheme: boolean) => void;
+}
+
+const themeStore = create((set) => ({
+ isDark: localStorage.getItem(LS_THEME) === "true",
+ setTheme: (newTheme) => set({ isDark: newTheme }),
+}));
+
+export default themeStore;
diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts
new file mode 100644
index 0000000..11f02fe
--- /dev/null
+++ b/src/vite-env.d.ts
@@ -0,0 +1 @@
+///
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..0e3f091
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,21 @@
+{
+ "compilerOptions": {
+ "target": "ESNext",
+ "useDefineForClassFields": true,
+ "lib": ["DOM", "DOM.Iterable", "ESNext"],
+ "allowJs": false,
+ "skipLibCheck": true,
+ "esModuleInterop": false,
+ "allowSyntheticDefaultImports": true,
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "module": "ESNext",
+ "moduleResolution": "Node",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "noEmit": true,
+ "jsx": "react-jsx"
+ },
+ "include": ["src",".eslintrc.json"],
+ "references": [{ "path": "./tsconfig.node.json" }]
+}
diff --git a/tsconfig.node.json b/tsconfig.node.json
new file mode 100644
index 0000000..9d31e2a
--- /dev/null
+++ b/tsconfig.node.json
@@ -0,0 +1,9 @@
+{
+ "compilerOptions": {
+ "composite": true,
+ "module": "ESNext",
+ "moduleResolution": "Node",
+ "allowSyntheticDefaultImports": true
+ },
+ "include": ["vite.config.ts"]
+}
diff --git a/vite.config.ts b/vite.config.ts
new file mode 100644
index 0000000..9c89347
--- /dev/null
+++ b/vite.config.ts
@@ -0,0 +1,8 @@
+import react from "@vitejs/plugin-react";
+import { defineConfig } from "vite";
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [react()],
+ base: "/RsClone",
+});
diff --git a/vite.config.ts.prod b/vite.config.ts.prod
new file mode 100644
index 0000000..7e403dc
--- /dev/null
+++ b/vite.config.ts.prod
@@ -0,0 +1,8 @@
+import { defineConfig } from 'vite'
+import react from '@vitejs/plugin-react'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [react()],
+ base: '/'
+})