diff --git a/.env.template b/.env.template
deleted file mode 100644
index 232b90483e02b29d1af95058c1b5990cf8c98710..0000000000000000000000000000000000000000
--- a/.env.template
+++ /dev/null
@@ -1,29 +0,0 @@
-NODE_TLS_REJECT_UNAUTHORIZED = '0'
-HTTPS=true
-SSL_CRT_FILE=cert.pem
-SSL_KEY_FILE=key.pem
-
-# Common settings
-HOSTNAME=localhost
-ANIMATOR_ROLE=ANIMATORS
-ADMIN_ROLE=ADMINS
-DEBUG_MODE=
-MOCK_OAUTH2=
-HTTPS_PORT=
-IMAGE_FOLDER=
-
-# Needed to user OAuth2 authentication :
-REDIRECT_URL=
-CLIENT_ID=
-CLIENT_SECRET=
-AUTH_URL=
-TOKEN_URL=
-USERINFO_URL=
-LOGOUT_URL=
-
-# Access to the database
-DATABASE_USER=
-DATABASE_PASSWORD=
-DATABASE_NAME=
-
-SGE_API_TOKEN=
diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 0000000000000000000000000000000000000000..82a9a730d1eb49a60b39ab7be3194025c4891533
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1 @@
+.eslintrc.js
\ No newline at end of file
diff --git a/.eslintrc.js b/.eslintrc.js
index f899dd418de6f58d241b17dcc55db8e890b43c88..ab0d29b2f7419e2c65533b285fcc5468d30a9186 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -1,24 +1,48 @@
 module.exports = {
-  parser: '@typescript-eslint/parser', // Specifies the ESLint parser
   extends: [
-    'plugin:react/recommended', // Uses the recommended rules from @eslint-plugin-react
-    'plugin:@typescript-eslint/eslint-recommended', // Uses the recommended rules from @typescript-eslint/eslint-plugin
+    'eslint:recommended',
     'prettier', // Uses eslint-config-prettier to disable ESLint rules from @typescript-eslint/eslint-plugin that would conflict with prettier
+    'plugin:react/recommended', // Uses the recommended rules from @eslint-plugin-react
     'plugin:prettier/recommended', // Enables eslint-plugin-prettier and displays prettier errors as ESLint errors. Make sure this is always the last configuration in the extends array.
     'plugin:react-hooks/recommended',
   ],
+  parser: '@typescript-eslint/parser', // Specifies the ESLint parser
+  plugins: ['@typescript-eslint', 'react', 'react-hooks'],
   parserOptions: {
     ecmaVersion: 2020, // Allows for the parsing of modern ECMAScript features
     sourceType: 'module', // Allows for the use of imports
     ecmaFeatures: {
       jsx: true, // Allows for the parsing of JSX
     },
+    tsconfigRootDir: __dirname,
+    project: './tsconfig.json',
   },
+  root: true,
+  overrides: [
+    {
+      files: ['**/*.{ts,tsx}'],
+      extends: [
+        'plugin:@typescript-eslint/recommended',
+        'plugin:@typescript-eslint/stylistic-type-checked',
+      ],
+      rules: {
+        '@typescript-eslint/explicit-function-return-type': 'off',
+        '@typescript-eslint/no-unused-vars': 'warn',
+        '@typescript-eslint/no-explicit-any': 'warn',
+        '@typescript-eslint/prefer-optional-chain': 'warn',
+        '@typescript-eslint/prefer-as-const': 'error',
+        '@typescript-eslint/await-thenable': 'error',
+        '@typescript-eslint/no-var-requires': 'off',
+
+        '@typescript-eslint/no-empty-function': 'off', // fixes a build error
+      },
+    },
+  ],
   rules: {
     // Place to specify ESLint rules. Can be used to overwrite rules specified from the extended configs
-    '@typescript-eslint/explicit-function-return-type': 'off',
     'react/react-in-jsx-scope': 'off',
     'react/prop-types': 'warn',
+    'react/self-closing-comp': 'warn',
   },
   settings: {
     react: {
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index cb77e80a1c8ab19ec9eba7e298ab75cfc2daa2ee..fdeef40438419333de94b0e5ebd3e7fa48448021 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -16,7 +16,7 @@ stages:
 
 build-test:
   stage: build
-  image: node:14.20-alpine
+  image: node:18.17-alpine
   before_script:
     - apk add git
     - apk add bash
@@ -67,10 +67,14 @@ sonarqube:
 
 deploy_rec:
   stage: deploy
+  environment:
+    name: Recette - Ecolyo Agent
+    url: https://ecolyo-agent-rec.apps.grandlyon.com/
   before_script:
     - NAMESPACE=ns-ecolyo-bo-r01-syn
     - sed -i "s/{{IMAGE_TAG}}/dev/" ./k8s/deployments/ecolyo-agent-client-deployment.yml
     - export KUBECONFIG=$KUBE_CONFIG_REC
+
   script:
     - find k8s/ -name '*.yml' -exec sed -i "s/{{NS}}/$NAMESPACE/g" {} \;
     - sed -i "s/{{HOSTNAME}}/ecolyo-agent-rec.apps.grandlyon.com/g" ./k8s/routes/ecolyo-agent-client-route.yml
@@ -83,6 +87,8 @@ deploy_rec:
     - oc apply -f k8s/deployments
     - oc apply -f k8s/services
     - oc apply -f k8s/routes
+
+    - oc delete pod -l app=ecolyo-agent-client
   tags:
     - ns-ecolyo-bo-r01-syn
   only:
@@ -90,6 +96,9 @@ deploy_rec:
 
 deploy_prod:
   stage: deploy
+  environment:
+    name: Prod - Ecolyo Agent
+    url: https://ecolyo-agent.apps.grandlyon.com/
   before_script:
     - NAMESPACE=ns-ecolyo-bo-p01-syn
     - sed -i "s/{{IMAGE_TAG}}/master/" ./k8s/deployments/ecolyo-agent-client-deployment.yml
diff --git a/.node-version b/.node-version
new file mode 100644
index 0000000000000000000000000000000000000000..bcaa3377df163b7441cbee802ac339c7c33d44ef
--- /dev/null
+++ b/.node-version
@@ -0,0 +1 @@
+18.17
\ No newline at end of file
diff --git a/.prettierrc b/.prettierrc
index a8926a50ca780291a6a3f86604260a66c3dcd8d8..c97c46da0aaac0fe1e1a6b384e0780a518b6b2b4 100644
--- a/.prettierrc
+++ b/.prettierrc
@@ -3,5 +3,6 @@
   "semi": false,
   "singleQuote": true,
   "tabWidth": 2,
-  "trailingComma": "es5"
+  "trailingComma": "es5",
+  "arrowParens": "avoid"
 }
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 8df3d7acaede87adf6ff8ce5dad8818c3020d357..e0fa5ad32fc3955b850d146f232fab10b47b4868 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -33,11 +33,15 @@
   },
   "editor.defaultFormatter": "esbenp.prettier-vscode",
   "peacock.color": "#2aa63d",
+  "gitlens.remotes": [
+    { "type": "GitLab", "domain": "forge.grandlyon.com", "name": "Forge" }
+  ],
   "sonarlint.connectedMode.project": {
     "connectionId": "sonarqube-forge-grandlyon",
     "projectKey": "web-et-numerique-llle-project-backoffice-client"
   },
   "cSpell.words": [
+    "backoffice",
     "draftjs",
     "ecogesture",
     "ecolyo",
diff --git a/Dockerfile b/Dockerfile
index 7ca9b79246fe52e42d34723a33e6d348d3a20a3e..86cfda80a3f2dc9cf4c8130bdbbac22804774d7f 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,5 +1,5 @@
 # Stage 0, "build-stage", based on Node.js, to build and compile the frontend
-FROM node:14-alpine AS build-stage
+FROM node:18-alpine AS build-stage
 
 WORKDIR /app
 COPY package.json /app/
@@ -9,7 +9,7 @@ COPY ./ /app/
 RUN yarn build
 
 # Stage 1, based on Nginx, to have only the compiled app, ready for production with Nginx
-FROM nginxinc/nginx-unprivileged:1.23
+FROM nginxinc/nginx-unprivileged:1.25
 COPY --from=build-stage /app/build/ /usr/share/nginx/html
 COPY ./nginx/nginx.conf /etc/nginx/nginx.conf
 COPY ./nginx/site.prod.conf /etc/nginx/conf.d/default.conf
diff --git a/dbinit/dbinit.sql b/dbinit/dbinit.sql
deleted file mode 100644
index 1070e073e94c76ab0f737dbb8caeac22222b9718..0000000000000000000000000000000000000000
--- a/dbinit/dbinit.sql
+++ /dev/null
@@ -1,4 +0,0 @@
-LOAD DATA LOCAL INFILE '/dbinit/fluidprices.CSV' INTO TABLE prices 
-FIELDS TERMINATED BY ',' 
-LINES TERMINATED BY '\n'
-IGNORE 1 ROWS;
\ No newline at end of file
diff --git a/dbinit/fluidprices.CSV b/dbinit/fluidprices.CSV
deleted file mode 100644
index 21670990623e0507be87e11a64779b23757ce9ef..0000000000000000000000000000000000000000
--- a/dbinit/fluidprices.CSV
+++ /dev/null
@@ -1,84 +0,0 @@
-fluid_type,price,start_date,end_date,id,created_at,updated_at
-0,0.1256,2012-07-23T00:00:00Z,2013-07-31T23:59:59Z,1,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-0,0.1329,2013-08-01T00:00:00Z,2014-10-31T23:59:59Z,2,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-0,0.1401,2014-01-11T00:00:00Z,2015-07-31T23:59:59Z,3,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-0,0.1437,2015-08-01T00:00:00Z,2016-07-31T23:59:59Z,4,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-0,0.1503,2016-08-01T00:00:00Z,2017-07-31T23:59:59Z,5,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-0,0.1546,2017-08-01T00:00:00Z,2018-01-31T23:59:59Z,6,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-0,0.1555,2018-02-01T00:00:00Z,2018-07-31T23:59:59Z,7,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-0,0.145,2018-08-01T00:00:00Z,2019-05-31T23:59:59Z,8,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-0,0.1531,2019-06-01T00:00:00Z,2019-07-31T23:59:59Z,9,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-0,0.1524,2019-08-01T00:00:00Z,2020-01-31T23:59:59Z,10,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-0,0.1546,2020-02-01T00:00:00Z,2020-07-31T23:59:59Z,11,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-0,0.1557,2020-08-01T00:00:00Z,2021-01-31T23:59:59Z,12,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-0,0.1582,2021-02-01T00:00:00Z,2021-07-31T23:59:59Z,13,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-0,0.1558,2021-08-01T00:00:00Z,2022-01-31T23:59:59Z,14,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-0,0.174,2022-02-01T00:00:00Z,,15,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-1,0.0030735,2012-01-01T00:00:00Z,2012-12-31T23:59:59Z,16,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-1,0.0031483,2013-01-01T00:00:00Z,2013-12-31T23:59:59Z,17,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-1,0.0031381,2014-01-01T00:00:00Z,2014-12-31T23:59:59Z,18,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-1,0.00307,2015-01-01T00:00:00Z,2015-12-31T23:59:59Z,19,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-1,0.0031,2016-01-01T00:00:00Z,2016-12-31T23:59:59Z,20,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-1,0.00311,2017-01-01T00:00:00Z,2017-12-31T23:59:59Z,21,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-1,0.00313,2018-01-01T00:00:00Z,2018-12-31T23:59:59Z,22,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-1,0.00313,2019-01-01T00:00:00Z,2019-12-31T23:59:59Z,23,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-1,0.00315,2020-01-01T00:00:00Z,2020-12-31T23:59:59Z,24,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-1,0.00319,2021-01-01T00:00:00Z,,25,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0919,2017-01-01T00:00:00Z,2017-01-31T23:59:59Z,26,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0915,2017-02-01T00:00:00Z,2017-02-28T23:59:59Z,27,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0932,2017-03-01T00:00:00Z,2017-03-31T23:59:59Z,28,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0927,2017-04-01T00:00:00Z,2017-04-30T23:59:59Z,29,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0906,2017-05-01T00:00:00Z,2017-05-31T23:59:59Z,30,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0906,2017-06-01T00:00:00Z,2017-06-30T23:59:59Z,31,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0788,2017-07-01T00:00:00Z,2017-07-31T23:59:59Z,32,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0783,2017-08-01T00:00:00Z,2017-08-31T23:59:59Z,33,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0783,2017-09-01T00:00:00Z,2017-09-30T23:59:59Z,34,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0791,2017-10-01T00:00:00Z,2017-10-31T23:59:59Z,35,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0806,2017-11-01T00:00:00Z,2017-11-30T23:59:59Z,36,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0812,2017-12-01T00:00:00Z,2017-12-31T23:59:59Z,37,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0857,2018-01-01T00:00:00Z,2018-01-31T23:59:59Z,38,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0866,2018-02-01T00:00:00Z,2018-02-28T23:59:59Z,39,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0847,2018-03-01T00:00:00Z,2018-03-31T23:59:59Z,40,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0839,2018-04-01T00:00:00Z,2018-04-30T23:59:59Z,41,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0842,2018-05-01T00:00:00Z,2018-05-31T23:59:59Z,42,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0855,2018-06-01T00:00:00Z,2018-06-30T23:59:59Z,43,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0959,2018-07-01T00:00:00Z,2018-07-31T23:59:59Z,44,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0961,2018-08-01T00:00:00Z,2018-08-31T23:59:59Z,45,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0967,2018-09-01T00:00:00Z,2018-09-30T23:59:59Z,46,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0989,2018-10-01T00:00:00Z,2018-10-31T23:59:59Z,47,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.1031,2018-11-01T00:00:00Z,2018-11-30T23:59:59Z,48,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.1013,2018-12-01T00:00:00Z,2018-12-31T23:59:59Z,49,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0999,2019-01-01T00:00:00Z,2019-01-31T23:59:59Z,50,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0993,2019-02-01T00:00:00Z,2019-02-28T23:59:59Z,51,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0993,2019-03-01T00:00:00Z,2019-03-31T23:59:59Z,52,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0977,2019-04-01T00:00:00Z,2019-04-30T23:59:59Z,53,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0973,2019-05-01T00:00:00Z,2019-05-31T23:59:59Z,54,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0969,2019-06-01T00:00:00Z,2019-06-30T23:59:59Z,55,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0795,2019-07-01T00:00:00Z,2019-07-31T23:59:59Z,56,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0791,2019-08-01T00:00:00Z,2019-08-31T23:59:59Z,57,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0785,2019-09-01T00:00:00Z,2019-09-30T23:59:59Z,58,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.077,2019-10-01T00:00:00Z,2019-10-31T23:59:59Z,59,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0789,2019-11-01T00:00:00Z,2019-11-30T23:59:59Z,60,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0793,2019-12-01T00:00:00Z,2019-12-31T23:59:59Z,61,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0787,2020-01-01T00:00:00Z,2020-01-31T23:59:59Z,62,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0765,2020-02-01T00:00:00Z,2020-02-29T23:59:59Z,70,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0736,2020-03-01T00:00:00Z,2020-03-31T23:59:59Z,71,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.071,2020-04-01T00:00:00Z,2020-04-30T23:59:59Z,72,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0703,2020-05-01T00:00:00Z,2020-05-31T23:59:59Z,73,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0687,2020-06-01T00:00:00Z,2020-06-30T23:59:59Z,74,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0698,2020-07-01T00:00:00Z,2020-07-31T23:59:59Z,75,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0705,2020-08-01T00:00:00Z,2020-08-31T23:59:59Z,76,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0709,2020-09-01T00:00:00Z,2020-09-30T23:59:59Z,77,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0735,2020-10-01T00:00:00Z,2020-10-31T23:59:59Z,78,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0745,2020-11-01T00:00:00Z,2020-11-30T23:59:59Z,79,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0759,2020-12-01T00:00:00Z,2020-12-31T23:59:59Z,80,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.076,2021-01-01T00:00:00Z,2021-01-31T23:59:59Z,81,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0782,2021-02-01T00:00:00Z,2021-02-28T23:59:59Z,82,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0818,2021-03-01T00:00:00Z,2021-03-31T23:59:59Z,83,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.079,2021-04-01T00:00:00Z,2021-04-30T23:59:59Z,84,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0797,2021-05-01T00:00:00Z,2021-05-31T23:59:59Z,85,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0826,2021-06-01T00:00:00Z,2021-06-30T23:59:59Z,86,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0895,2021-07-01T00:00:00Z,2021-07-31T23:59:59Z,87,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.0934,2021-08-01T00:00:00Z,2021-08-31T23:59:59Z,88,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.1002,2021-09-01T00:00:00Z,2021-09-30T23:59:59Z,89,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
-2,0.1121,2021-10-01T00:00:00Z,,90,2000-01-01T00:00:00Z,2000-01-01T00:00:00Z
\ No newline at end of file
diff --git a/dbinit/init.md b/dbinit/init.md
deleted file mode 100644
index 21120af53c0319ce892155eb5c04ac5279b4c606..0000000000000000000000000000000000000000
--- a/dbinit/init.md
+++ /dev/null
@@ -1,25 +0,0 @@
-# Init first prices data
-
-## Local
-
-If the script is not working (problem with secure_file_priv variable), use the import in phpMyAdmin:
-
-- Ignore the request for the first line
-- Select format "CVS using LOAD DATA"
-- Choose the right column separator ","
-- Then launch the execution
-
-## Rec/Prod
-
-- Connect to mysql docker container
-
-```
-docker exec -it <container-id> bash
-```
-
-- Open mysql shell
-
-```
-mysql --local-infile=1 -uroot -p backoffice < /dbinit/dbinit.sql
-
-```
diff --git a/docker-compose.local.yml b/docker-compose.local.yml
index 2bef82fe26ceb9c216e01b0c94be4daa80a50471..20b98d3d648d0ae7515040595f7c497e72eefca3 100644
--- a/docker-compose.local.yml
+++ b/docker-compose.local.yml
@@ -1,72 +1,14 @@
 version: '3.7'
 services:
   nginx:
-    image: nginxinc/nginx-unprivileged:1.23
+    image: nginxinc/nginx-unprivileged:1.25
     volumes:
       - ./nginx/nginx.conf:/etc/nginx/nginx.conf
-      - ./nginx/site.conf:/etc/nginx/conf.d/default.conf
+      - ./nginx/site.local.conf:/etc/nginx/conf.d/default.conf
       - ./cert.pem:/etc/nginx/cert.pem
       - ./key.pem:/etc/nginx/key.pem
     ports:
       - 443:443
-    depends_on:
-      - backend
     # For linux users
     extra_hosts:
       - 'host.docker.internal:host-gateway'
-
-  database-agent:
-    image: mysql:5
-    volumes:
-      - ./db_data:/var/lib/mysql
-    ports:
-      - 3306:3306
-    environment:
-      MYSQL_ROOT_PASSWORD: ${DATABASE_PASSWORD}
-      MYSQL_DATABASE: ${DATABASE_NAME}
-    healthcheck:
-      test: mysqladmin ping -h 127.0.0.1 -u root --password=$$MYSQL_ROOT_PASSWORD
-      interval: 5s
-      timeout: 10s
-      retries: 60
-
-  phpmyadmin:
-    image: phpmyadmin/phpmyadmin:latest
-    depends_on:
-      - database-agent
-    ports:
-      - 8008:80
-    environment:
-      PMA_HOST: database-agent
-
-  backend:
-    # --When using yarn local-up build backoffice service image with: docker build . -t backoffice-server
-    image: backoffice-server
-    depends_on:
-      database-agent:
-        condition: service_healthy
-    restart: unless-stopped
-    volumes:
-      - ./mnt:/app/mnt
-    ports:
-      - ${HTTPS_PORT}:${HTTPS_PORT}
-      - 8090:8090
-    environment:
-      - HOSTNAME=${HOSTNAME}
-      - HTTPS_PORT=${HTTPS_PORT}
-      - ANIMATOR_ROLE=${ANIMATOR_ROLE}
-      - ADMIN_ROLE=${ADMIN_ROLE}
-      - REDIRECT_URL=${REDIRECT_URL}
-      - CLIENT_ID=${CLIENT_ID}
-      - CLIENT_SECRET=${CLIENT_SECRET}
-      - AUTH_URL=${AUTH_URL}
-      - TOKEN_URL=${TOKEN_URL}
-      - USERINFO_URL=${USERINFO_URL}
-      - DEBUG_MODE=${DEBUG_MODE}
-      - DATABASE_USER=${DATABASE_USER}
-      - DATABASE_NAME=${DATABASE_NAME}
-      - DATABASE_PASSWORD=${DATABASE_PASSWORD}
-      - DATABASE_HOST=database-agent
-      - MOCK_OAUTH2=${MOCK_OAUTH2}
-      - IMAGE_FOLDER=${IMAGE_FOLDER}
-      - SGE_API_TOKEN=${SGE_API_TOKEN}
diff --git a/docker-compose.yml b/docker-compose.yml
deleted file mode 100644
index b0754887ab409ffaeaa8cb2da996f9d2d2380ffc..0000000000000000000000000000000000000000
--- a/docker-compose.yml
+++ /dev/null
@@ -1,72 +0,0 @@
-version: '3.7'
-services:
-  nginx:
-    image: registry.forge.grandlyon.com/web-et-numerique/factory/llle_project/backoffice-client:dev
-    restart: unless-stopped
-    ports:
-      - 8088:8080
-    depends_on:
-      - backend
-    networks:
-      backoffice:
-    volumes:
-      - ./site.conf:/etc/nginx/conf.d/default.conf
-      - ./image-lib:/usr/share/nginx/html/lib
-      - ./dacc-preview:/usr/share/nginx/html/static-site
-
-  database-agent:
-    image: mysql:5
-    ports:
-      - 3306:3306
-    networks:
-      backoffice:
-    restart: unless-stopped
-    environment:
-      MYSQL_ROOT_PASSWORD: ${DATABASE_PASSWORD}
-      MYSQL_DATABASE: ${DATABASE_NAME}
-    healthcheck:
-      test: mysqladmin ping -h 127.0.0.1 -u root --password=$$MYSQL_ROOT_PASSWORD
-      interval: 5s
-      timeout: 10s
-      retries: 60
-    volumes:
-      - ./dbinit:/dbinit
-
-  backend:
-    image: registry.forge.grandlyon.com/web-et-numerique/factory/llle_project/backoffice-server:dev
-    networks:
-      backoffice:
-    depends_on:
-      database-agent:
-        condition: service_healthy
-    restart: unless-stopped
-    volumes:
-      - /etc/localtime:/etc/localtime:ro
-      - ./configs:/app/configs
-      - ./letsencrypt_cache:/app/letsencrypt_cache
-      - ./data:/app/data
-      - ./${IMAGE_FOLDER}:/app/${IMAGE_FOLDER}
-    ports:
-      - ${HTTPS_PORT}:${HTTPS_PORT}
-      - 8190:8090
-    environment:
-      - HOSTNAME=${HOSTNAME}
-      - HTTPS_PORT=${HTTPS_PORT}
-      - ANIMATOR_ROLE=${ANIMATOR_ROLE}
-      - ADMIN_ROLE=${ADMIN_ROLE}
-      - REDIRECT_URL=${REDIRECT_URL}
-      - CLIENT_ID=${CLIENT_ID}
-      - CLIENT_SECRET=${CLIENT_SECRET}
-      - AUTH_URL=${AUTH_URL}
-      - IMAGE_FOLDER=${IMAGE_FOLDER}
-      - MOCK_OAUTH2=${MOCK_OAUTH2}
-      - TOKEN_URL=${TOKEN_URL}
-      - USERINFO_URL=${USERINFO_URL}
-      - DEBUG_MODE=${DEBUG_MODE}
-      - DATABASE_USER=${DATABASE_USER}
-      - DATABASE_NAME=${DATABASE_NAME}
-      - DATABASE_PASSWORD=${DATABASE_PASSWORD}
-      - DATABASE_HOST=database-agent
-
-networks:
-  backoffice:
diff --git a/mnt/configs/tokenskey.json b/mnt/configs/tokenskey.json
deleted file mode 100644
index 4ac2c4c1e5c67b27a5447ccba384355364f9cca2..0000000000000000000000000000000000000000
--- a/mnt/configs/tokenskey.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "Key": "F+gSLqJL7zZynkJYp/fd2jI6t3TolYGRt9bjO7mMgQc="
-}
diff --git a/nginx/site.conf b/nginx/site.local.conf
similarity index 56%
rename from nginx/site.conf
rename to nginx/site.local.conf
index 127a83107dca5dd2fcb8afa776d737c6975dd649..10882b16c8f05181a8bd5c0f4d6329d65d757752 100644
--- a/nginx/site.conf
+++ b/nginx/site.local.conf
@@ -10,24 +10,24 @@ server {
             proxy_pass https://host.docker.internal:3000;
         }
         location /api {  
-            proxy_pass https://backend:1443/api;
+            proxy_pass https://host.docker.internal:1443/api;
         }
         location /OAuth2Login {
-            proxy_pass https://backend:1443/OAuth2Login;
+            proxy_pass https://host.docker.internal:1443/OAuth2Login;
         }
         location /OAuth2Callback {
-            proxy_pass https://backend:1443/OAuth2Callback;
+            proxy_pass https://host.docker.internal:1443/OAuth2Callback;
         }
         location /Logout {
-            proxy_pass https://backend:1443/Logout;
+            proxy_pass https://host.docker.internal:1443/Logout;
         }
         location /doc {
-            proxy_pass https://backend:1443/doc;
+            proxy_pass https://host.docker.internal:1443/doc;
         }
         location /imageNames {
-            proxy_pass https://backend:1443/api/animator/imageNames;
+            proxy_pass https://host.docker.internal:1443/api/animator/imageNames;
         }
         location /assets {
-            proxy_pass https://backend:1443/assets;
+            proxy_pass https://host.docker.internal:1443/assets;
         }
 }
\ No newline at end of file
diff --git a/package.json b/package.json
index 809302991e0ccc35d57207632a44767dff9a0777..b26c94210c9e1338c29ef2ea804d667856df9469 100644
--- a/package.json
+++ b/package.json
@@ -3,14 +3,14 @@
   "version": "1.0.0",
   "private": true,
   "scripts": {
-    "start": "react-scripts start",
-    "build": "react-scripts build",
+    "start": "HTTPS=true react-scripts start",
+    "build": "CI=false && react-scripts build",
     "local-up": "docker-compose -f docker-compose.local.yml up -d && yarn start",
     "local-down": "docker-compose -f docker-compose.local.yml down",
     "docker": "docker run -it --rm -p 3000:3000 front-backoffice",
-    "lint": "eslint .",
+    "lint": "eslint src -c .eslintrc.js --fix",
     "lint:fix": "eslint --fix .",
-    "format": "prettier --write \"**/*.{js,jsx,json,md}\"",
+    "format": "prettier --write \"./src/**/*.{js,jsx,ts,tsx,json,md}\"",
     "test": "react-scripts test",
     "eject": "react-scripts eject"
   },
@@ -26,39 +26,20 @@
       "last 1 safari version"
     ]
   },
-  "devDependencies": {
-    "@types/jest": "^26.0.15",
-    "@types/node": "^12.0.0",
-    "@types/react": "^17.0.0",
-    "@types/react-dom": "^17.0.0",
-    "@types/react-router-dom": "^5.1.8",
-    "@typescript-eslint/eslint-plugin": "^5.3.1",
-    "@typescript-eslint/parser": "^5.3.1",
-    "eslint": "^8.21.0",
-    "eslint-config-prettier": "^8.5.0",
-    "eslint-config-react-app": "^6.0.0",
-    "eslint-plugin-import": "^2.23.4",
-    "eslint-plugin-jest": "^24.4.0",
-    "eslint-plugin-prettier": "^4.2.1",
-    "eslint-plugin-react": "7.30.1",
-    "eslint-plugin-react-hooks": "^4.2.0",
-    "prettier": "^2.7.1",
-    "prettier-eslint": "^15.0.1"
-  },
   "dependencies": {
-    "@material-ui/core": "^4.12.3",
-    "@material-ui/lab": "^4.0.0-alpha.60",
-    "@testing-library/jest-dom": "^5.11.4",
-    "@testing-library/react": "^11.1.0",
-    "@testing-library/user-event": "^12.1.10",
+    "@emotion/react": "^11.11.1",
+    "@emotion/styled": "^11.11.0",
+    "@mui/lab": "^5.0.0-alpha.144",
+    "@mui/material": "^5.14.9",
+    "@mui/styles": "^5.14.9",
     "@types/draft-js": "^0.11.4",
     "@types/draftjs-to-html": "^0.8.1",
     "@types/html-to-draftjs": "^1.4.0",
     "@types/luxon": "^3.0.0",
     "@types/react-draft-wysiwyg": "^1.13.4",
-    "ag-grid-community": "^27.1.0",
-    "ag-grid-react": "^27.1.0",
-    "axios": "^0.21.1",
+    "ag-grid-community": "^30.0.0",
+    "ag-grid-react": "^30.0.0",
+    "axios": "^1.0.0",
     "dayjs": "^1.10.7",
     "draft-js": "^0.11.7",
     "draft-js-export-html": "^1.4.1",
@@ -68,11 +49,26 @@
     "react": "^17.0.2",
     "react-dom": "^17.0.2",
     "react-draft-wysiwyg": "^1.15.0",
-    "react-router-dom": "^5.2.0",
+    "react-query": "^3.39.3",
+    "react-router-dom": "^6.0.0",
     "react-scripts": "^5.0.1",
-    "react-toastify": "^7.0.4",
+    "react-toastify": "^9.0.0",
     "sass": "^1.35.2",
     "typescript": "^4.1.2",
-    "web-vitals": "^1.0.1"
+    "web-vitals": "^3.0.0"
+  },
+  "devDependencies": {
+    "@types/node": "^18.0.0",
+    "@types/react": "^17.0.0",
+    "@types/react-dom": "^17.0.0",
+    "@typescript-eslint/eslint-plugin": "^6.1.0",
+    "@typescript-eslint/parser": "^6.1.0",
+    "eslint": "^8.49.0",
+    "eslint-config-prettier": "^9.0.0",
+    "eslint-plugin-prettier": "^5.0.0",
+    "eslint-plugin-react": "7.30.1",
+    "eslint-plugin-react-hooks": "^4.2.0",
+    "prettier": "^3.0.0",
+    "prettier-eslint": "^15.0.1"
   }
 }
diff --git a/public/index.html b/public/index.html
index dc5567c4dede5d36eec705d550c2359a286d9539..b0236df8b5a6bb6c89deaaece4dd0fefac84fd35 100644
--- a/public/index.html
+++ b/public/index.html
@@ -12,6 +12,12 @@
       user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
     -->
     <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
+    <link
+  rel="stylesheet"
+  href="https://cdn.jsdelivr.net/npm/ag-grid-community@30.1.0/styles/ag-grid.css" />
+    <link
+  rel="stylesheet"
+  href="https://cdn.jsdelivr.net/npm/ag-grid-community@30.1.0/styles/ag-theme-alpine.css" />
     <!--
       Notice the use of %PUBLIC_URL% in the tags above.
       It will be replaced with the URL of the `public` folder during the build.
diff --git a/scripts/import-convert-assets.sh b/scripts/import-convert-assets.sh
deleted file mode 100755
index 73615174a91ed9745ace41a50ab05c3a66ea2d68..0000000000000000000000000000000000000000
--- a/scripts/import-convert-assets.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/bin/bash
-
-# Get env variables
-. ../.env
-
-REGISTRY_ID=409
-EMAIL_ASSETS_PATH="src/assets/icons/email"
-ECOGESTURE_ASSETS_PATH="src/assets/icons/visu/ecogesture"
-pwd=$(pwd)
-
-# Fetch and convert email assets
-curl "https://forge.grandlyon.com/api/v4/projects/${REGISTRY_ID}/repository/archive?path=${EMAIL_ASSETS_PATH}" --output email.tar.gz
-tar -xf email.tar.gz
-cd *-email/$EMAIL_ASSETS_PATH && for file in *.svg; do inkscape -h 200 --export-type="png" $file; done && rm *.svg
-
-cd $pwd
-# Fetch and convert ecogesture assets
-curl "https://forge.grandlyon.com/api/v4/projects/${REGISTRY_ID}/repository/archive?path=${ECOGESTURE_ASSETS_PATH}" --output ecogesture.tar.gz
-tar -xf ecogesture.tar.gz
-cd *-ecogesture/$ECOGESTURE_ASSETS_PATH && for file in *.svg; do inkscape -h 200 --export-type="png" $file; done && rm *.svg
-
-# Cleanup
-cd $pwd
-rm -rf ../${IMAGE_FOLDER}/*
-
-# Copy assets in IMAGE_FOLDER
-mv *-email/$EMAIL_ASSETS_PATH/* ../${IMAGE_FOLDER}
-mv *-ecogesture/$ECOGESTURE_ASSETS_PATH ../${IMAGE_FOLDER}/ecogesture
-rm -rf email.tar.gz ecogesture.tar.gz *-email *-ecogesture
diff --git a/src/API.ts b/src/API.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e8e2df1f30029fe1cea997483e6ef2cce44ba3c4
--- /dev/null
+++ b/src/API.ts
@@ -0,0 +1,26 @@
+import axios from 'axios'
+import { useQuery } from 'react-query'
+import { toast } from 'react-toastify'
+import { User } from './models/user.model'
+
+const fetchWhoAmI = async () => {
+  const { data } = await axios.get<User | null>('/api/common/WhoAmI')
+  return data
+}
+
+export const useWhoAmI = () => {
+  return useQuery({
+    queryKey: ['WhoAmI'],
+    queryFn: fetchWhoAmI,
+    retry: false,
+    onError: error => {
+      console.error('error whoami', error)
+      toast.error('Accès refusé, veuillez vous connecter')
+    },
+    refetchOnMount: false,
+  })
+}
+
+export const fetchLogout = async () => {
+  return await axios.get('/Logout')
+}
diff --git a/src/App.tsx b/src/App.tsx
index 75c23b356dc176087fb1e1406470926606725bd8..a4e01a839c5f2c7e49420a3ad1a788fcee41d9ef 100644
--- a/src/App.tsx
+++ b/src/App.tsx
@@ -1,25 +1,22 @@
+import { ThemeProvider } from '@mui/material'
+import { QueryClient, QueryClientProvider } from 'react-query'
 import { BrowserRouter } from 'react-router-dom'
 import { ToastContainer } from 'react-toastify'
 import 'react-toastify/dist/ReactToastify.css'
-import Layout from './components/Layout/Layout'
 import Router from './components/Routes/Router'
-import useFindUser from './hooks/useFindUser'
-import { UserContext } from './hooks/userContext'
+import { theme } from './components/UI/theme'
 
-function App() {
-  const { user, setUser, isLoading } = useFindUser()
+const queryClient = new QueryClient()
 
+function App() {
   return (
     <BrowserRouter>
-      <UserContext.Provider value={{ user, setUser, isLoading }}>
-        <Layout>
+      <ThemeProvider theme={theme}>
+        <QueryClientProvider client={queryClient}>
           <Router />
-        </Layout>
-      </UserContext.Provider>
-      <ToastContainer
-        progressClassName="toastProgress"
-        bodyClassName="toastBody"
-      />
+          <ToastContainer theme="colored" />
+        </QueryClientProvider>
+      </ThemeProvider>
     </BrowserRouter>
   )
 }
diff --git a/src/components/Consents/Consents.tsx b/src/components/Consents/Consents.tsx
index 2267a99c51979a2bb7e727c7a7571da558fd8325..8b7a74491e18b96d95c977d075fdb9b9f067cd7c 100644
--- a/src/components/Consents/Consents.tsx
+++ b/src/components/Consents/Consents.tsx
@@ -1,30 +1,22 @@
-import TablePagination from '@material-ui/core/TablePagination'
+import { Button, TablePagination, TextField } from '@mui/material'
 import {
   ColDef,
   ColGroupDef,
   CsvExportParams,
   GridApi,
   GridReadyEvent,
-  RowNode,
+  IRowNode,
   RowSelectedEvent,
   ValueFormatterParams,
 } from 'ag-grid-community'
-import 'ag-grid-community/dist/styles/ag-grid.css'
-import 'ag-grid-community/dist/styles/ag-theme-alpine-dark.css'
 import { AgGridReact } from 'ag-grid-react'
 import { DateTime } from 'luxon'
-import React, {
-  useCallback,
-  useContext,
-  useEffect,
-  useMemo,
-  useState,
-} from 'react'
+import React, { useCallback, useEffect, useMemo, useState } from 'react'
+import { useWhoAmI } from '../../API'
 import { getAxiosXSRFHeader } from '../../axios.config'
-import { UserContext, UserContextProps } from '../../hooks/userContext'
 import { IConsent } from '../../models/consent.model'
 import { ConsentService } from '../../services/consent.service'
-import DowloadModal from './DowloadModal'
+import DownloadModal from './DownloadModal'
 import './agGridOverrides.scss'
 import styles from './consents.module.scss'
 import './muiPaginationOverrides.scss'
@@ -32,20 +24,20 @@ import './muiPaginationOverrides.scss'
 const Consents: React.FC = () => {
   const [gridApi, setGridApi] = useState<GridApi | null>(null)
   const [search, setSearch] = useState<string>('')
-  const [selectedNodes, setSelectedNodes] = useState<RowNode[]>([])
+  const [selectedNodes, setSelectedNodes] = useState<IRowNode[]>([])
   const [isShowingSelection, setIsShowingSelection] = useState<boolean>(false)
-  const [openDowloadModal, setOpenDowloadModal] = useState<boolean>(false)
+  const [openDownloadModal, setOpenDownloadModal] = useState<boolean>(false)
   const [consents, setConsents] = useState<IConsent[]>([])
   const [page, setPage] = useState<number>(0)
   const [rowsPerPage, setRowsPerPage] = useState<number>(50)
   const [totalRows, setTotalRows] = useState<number>(50)
-  const { user }: Partial<UserContextProps> = useContext(UserContext)
+  const { data: user } = useWhoAmI()
   const consentService = useMemo(() => {
     return new ConsentService()
   }, [])
 
   const toggleOpenModal = useCallback(() => {
-    setOpenDowloadModal((prev) => !prev)
+    setOpenDownloadModal(prev => !prev)
   }, [])
 
   const defaultColDef = useMemo(
@@ -134,7 +126,7 @@ const Consents: React.FC = () => {
     },
     []
   )
-  const handleChangeRowsPerPage = useCallback((event: any) => {
+  const handleChangeRowsPerPage = useCallback(event => {
     setRowsPerPage(event.target.value)
     setPage(0)
   }, [])
@@ -143,12 +135,11 @@ const Consents: React.FC = () => {
     if (gridApi) {
       const newNodes = gridApi.getRenderedNodes()
       const idsToCheck: string[] = selectedNodes
-        .filter((node: RowNode) => node.isSelected)
-        .map((node: RowNode) => node.data.ID)
+        .filter(node => node.isSelected)
+        .map(node => node.data.ID)
 
-      newNodes.forEach((node: RowNode) => {
-        if (idsToCheck.includes(node.data.ID))
-          node.setSelected(true, false, true)
+      newNodes.forEach(node => {
+        if (idsToCheck.includes(node.data.ID)) node.setSelected(true, false)
       })
     }
   }, [gridApi, selectedNodes])
@@ -187,14 +178,14 @@ const Consents: React.FC = () => {
     (event: RowSelectedEvent) => {
       if (event.node.isSelected()) {
         const index = selectedNodes.findIndex(
-          (node) => node.data.ID === event.node.data.ID
+          node => node.data.ID === event.node.data.ID
         )
         if (index === -1) {
-          setSelectedNodes((prev) => [...prev, event.node])
+          setSelectedNodes(prev => [...prev, event.node])
         }
       } else {
-        setSelectedNodes((prev) =>
-          prev.filter((node) => {
+        setSelectedNodes(prev =>
+          prev.filter(node => {
             return node.data.ID != event.node.data.ID
           })
         )
@@ -210,10 +201,10 @@ const Consents: React.FC = () => {
       const newNodes = gridApi.getRenderedNodes()
       // We have to select nodes that have already been selected since we cannot pass a Node array to init AgGrid
       const idsToCheck: string[] = selectedNodes
-        .filter((node: RowNode) => node.isSelected)
-        .map((node: RowNode) => node.data.ID)
+        .filter(node => node.isSelected)
+        .map(node => node.data.ID)
 
-      newNodes.forEach((node: RowNode) => {
+      newNodes.forEach(node => {
         if (idsToCheck.includes(node.data.ID)) node.setSelected(true)
       })
     }
@@ -221,7 +212,7 @@ const Consents: React.FC = () => {
 
   const showCurrentSelection = useCallback(() => {
     setIsShowingSelection(true)
-    const dataFromNode = selectedNodes.map((item: RowNode) => item.data)
+    const dataFromNode = selectedNodes.map(item => item.data)
     selectedNodes && gridApi?.setRowData(dataFromNode)
     gridApi?.selectAll()
   }, [gridApi, selectedNodes])
@@ -232,7 +223,7 @@ const Consents: React.FC = () => {
       columnSeparator: ',',
     }
     gridApi?.exportDataAsCsv(params)
-    setOpenDowloadModal(false)
+    setOpenDownloadModal(false)
     resetSelection()
   }, [gridApi, resetSelection])
 
@@ -263,25 +254,19 @@ const Consents: React.FC = () => {
   return (
     <>
       <div className="header">
-        <p className="title pageTitle">Gestion des consentements Enedis</p>
+        <h1>Gestion des consentements Enedis</h1>
       </div>
       <div className={styles.content}>
-        <div className={styles.searchField}>
-          <div className={styles.inputGroup}>
-            <label htmlFor="search">Recherche</label>
-            <input
-              value={search}
-              name="search"
-              type="number"
-              placeholder="N°PDL (14 chiffres)"
-              onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
-                handleSearchChange(e.target.value)
-              }
-              disabled={isShowingSelection}
-              autoComplete="off"
-            ></input>
-          </div>
-        </div>
+        <TextField
+          placeholder="N°PDL (14 chiffres)"
+          label="Recherche"
+          value={search}
+          onChange={(e: React.ChangeEvent<HTMLInputElement>) =>
+            handleSearchChange(e.target.value)
+          }
+          disabled={isShowingSelection}
+          autoComplete="off"
+        />
         <div
           className="ag-theme-alpine-dark"
           style={{ width: '100%', height: '75vh' }}
@@ -301,9 +286,9 @@ const Consents: React.FC = () => {
             pagination={false}
             suppressCellFocus={true}
             rowClassRules={{
-              expired: (params) => params.data.endDate < DateTime.now(),
+              expired: params => params.data.endDate < DateTime.now(),
             }}
-          ></AgGridReact>
+          />
           {!isShowingSelection && (
             <TablePagination
               labelRowsPerPage="Consentements par page"
@@ -317,16 +302,15 @@ const Consents: React.FC = () => {
             />
           )}
         </div>
-        {openDowloadModal && (
-          <DowloadModal
-            toggleOpenModal={toggleOpenModal}
-            exportData={exportData}
-          />
-        )}
+        <DownloadModal
+          open={openDownloadModal}
+          toggleOpenModal={toggleOpenModal}
+          exportData={exportData}
+        />
       </div>
       <div className={styles.footerButtons}>
-        <button
-          className="btnDelete"
+        <Button
+          variant="outlined"
           onClick={isShowingSelection ? continueSelection : resetSelection}
           disabled={
             !isShowingSelection && selectedNodes && selectedNodes.length === 0
@@ -335,15 +319,15 @@ const Consents: React.FC = () => {
           {isShowingSelection
             ? 'Continuer ma sélection'
             : 'Tout désélectionner'}
-        </button>
-        <button
-          className={styles.btnSelection + ' btnValid'}
+        </Button>
+        <Button
           onClick={!isShowingSelection ? showCurrentSelection : toggleOpenModal}
           disabled={selectedNodes && selectedNodes.length <= 0}
+          classes={{ contained: styles.btnText }}
         >
           {!isShowingSelection ? 'Voir mes sélections' : 'Télécharger'}
-          <span>{selectedNodes?.length}</span>
-        </button>
+          <div>{selectedNodes?.length}</div>
+        </Button>
       </div>
     </>
   )
diff --git a/src/components/Consents/DownloadModal.module.scss b/src/components/Consents/DownloadModal.module.scss
index f207b0a861db492e471315eb770464532f882866..803a9e7a0e37def046c2fcf280294e32f25c8d7b 100644
--- a/src/components/Consents/DownloadModal.module.scss
+++ b/src/components/Consents/DownloadModal.module.scss
@@ -18,16 +18,4 @@
   .text2 {
     color: $text-dark;
   }
-
-  .buttons {
-    margin-top: 1rem;
-    display: flex;
-    justify-content: center;
-    align-items: center;
-    gap: 2rem;
-
-    button {
-      margin: 0;
-    }
-  }
 }
diff --git a/src/components/Consents/DowloadModal.tsx b/src/components/Consents/DownloadModal.tsx
similarity index 60%
rename from src/components/Consents/DowloadModal.tsx
rename to src/components/Consents/DownloadModal.tsx
index e5774f8d852fe868ded8f60b2459d7ec009ddc33..b5e6132910d970621d396130deb008a4fe2adc88 100644
--- a/src/components/Consents/DowloadModal.tsx
+++ b/src/components/Consents/DownloadModal.tsx
@@ -1,23 +1,25 @@
+import { Button, Dialog } from '@mui/material'
 import React from 'react'
-import dowloadIcon from '../../assets/icons/ico-download.svg'
-import Modal from '../Newsletter/Modal/Modal'
+import downloadIcon from '../../assets/icons/ico-download.svg'
 import styles from './DownloadModal.module.scss'
 
-interface DowloadModalProps {
+interface DownloadModalProps {
+  open: boolean
   toggleOpenModal: () => void
   exportData: () => void
 }
-const DowloadModal: React.FC<DowloadModalProps> = ({
+const DownloadModal: React.FC<DownloadModalProps> = ({
+  open,
   toggleOpenModal,
   exportData,
-}: DowloadModalProps) => {
+}) => {
   return (
-    <Modal>
+    <Dialog open={open} onClose={toggleOpenModal}>
       <div className={styles.modalContent}>
         <img
-          src={dowloadIcon}
+          src={downloadIcon}
           className={styles.modalIcon}
-          alt="dowload-icon"
+          alt="download-icon"
         />
         <div className={styles.modalTitle}>
           Voulez-vous télécharger les consentements sélectionnés ?
@@ -30,16 +32,14 @@ const DowloadModal: React.FC<DowloadModalProps> = ({
           l&apos;utiliser qu&apos;en cas de contrôle de la part d&apos;Enedis et
           à supprimer ce fichier ensuite de tout ordinateur.
         </div>
-        <div className={styles.buttons}>
-          <button className="btnCancel2" onClick={toggleOpenModal}>
+        <div className="buttons">
+          <Button variant="outlined" onClick={toggleOpenModal}>
             Annuler
-          </button>
-          <button className="btnValid" onClick={exportData}>
-            Télécharger
-          </button>
+          </Button>
+          <Button onClick={exportData}>Télécharger</Button>
         </div>
       </div>
-    </Modal>
+    </Dialog>
   )
 }
-export default DowloadModal
+export default DownloadModal
diff --git a/src/components/Consents/consents.module.scss b/src/components/Consents/consents.module.scss
index 3d40ea62df56e6c19bad85801f4eac5bbe35be8f..188960e5307e9f2a86ea466bf3ef69cfb4e85e98 100644
--- a/src/components/Consents/consents.module.scss
+++ b/src/components/Consents/consents.module.scss
@@ -1,5 +1,4 @@
 @import '../../styles/config/colors';
-@import '../../styles/config/layout';
 @import '../../styles/config/breakpoints';
 @import '../../styles/config/typography';
 
@@ -7,37 +6,6 @@
   padding: 1rem;
 }
 
-.searchField {
-  max-width: 750px;
-  width: 100%;
-  display: flex;
-  align-items: flex-end;
-  .inputGroup {
-    color: $text-grey;
-    font-size: 1rem;
-    margin-right: 2rem;
-    label {
-      font-weight: 700;
-      display: block;
-      margin-bottom: 0.5rem;
-    }
-    input {
-      box-sizing: border-box;
-      background: transparent;
-      border: 1px solid $text-dark;
-      border-radius: 4px;
-      height: 40px;
-      padding: 0 0.5rem;
-      width: 500px;
-      &:disabled {
-        opacity: 0.8;
-        cursor: not-allowed;
-      }
-    }
-  }
-}
-@include customCheckBox(1.45rem);
-
 .footerButtons {
   padding: 1rem 0;
   display: flex;
@@ -47,12 +15,8 @@
   left: 50%;
   transform: translate(-25%);
 
-  button {
-    margin: 0;
-  }
-  .btnSelection {
-    position: relative;
-    span {
+  .btnText {
+    div {
       position: absolute;
       font-size: 1rem;
       padding-top: 4px;
@@ -64,6 +28,7 @@
       display: block;
       background: $grey-dark;
       border: 1px solid $text-dark;
+      line-height: 100%;
     }
   }
 }
diff --git a/src/components/Layout/Layout.tsx b/src/components/Layout/Layout.tsx
deleted file mode 100644
index e33fe680b515fc2e33d7ab7526328effb1c99b67..0000000000000000000000000000000000000000
--- a/src/components/Layout/Layout.tsx
+++ /dev/null
@@ -1,43 +0,0 @@
-import React, { useEffect, useState } from 'react'
-import BottomBar from '../Navigation/BottomBar'
-import SideBar from '../Navigation/SideBar'
-import styles from './layout.module.scss'
-
-const Layout: React.FC = ({ children }) => {
-  const [isMobile, setIsMobile] = useState<boolean>(false)
-  useEffect(() => {
-    function handleResize() {
-      const test: boolean =
-        /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
-          navigator.userAgent
-        ) || window.innerWidth < 768
-          ? true
-          : false
-      setIsMobile(test)
-    }
-    handleResize()
-
-    window.addEventListener('resize', handleResize)
-    return () => {
-      window.removeEventListener('resize', handleResize)
-    }
-  }, [])
-  return (
-    <div className={styles.root}>
-      {!isMobile ? (
-        <div className={styles.menuWrapper}>
-          <SideBar />
-        </div>
-      ) : (
-        <div className={styles.mobileNavWrapper}>
-          <BottomBar />
-        </div>
-      )}
-      <div className={styles.wrapper}>
-        <main>{children}</main>
-      </div>
-    </div>
-  )
-}
-
-export default Layout
diff --git a/src/components/Layout/layout.module.scss b/src/components/Layout/layout.module.scss
deleted file mode 100644
index c62142238a2faf974cdd9d32f7d9fcaad7784c95..0000000000000000000000000000000000000000
--- a/src/components/Layout/layout.module.scss
+++ /dev/null
@@ -1,45 +0,0 @@
-@import '../../styles/config/layout';
-@import '../../styles/config/colors';
-@import '../../styles/config/breakpoints';
-.root {
-  display: flex;
-  min-height: 100vh;
-  box-sizing: border-box;
-}
-.menuWrapper {
-  position: fixed;
-  top: 0;
-  left: 0;
-  width: $menu-width;
-  height: 100vh;
-  z-index: 1501;
-
-  @media screen and (max-width: $width-tablet) {
-    width: 0;
-    display: none;
-  }
-}
-.mobileNavWrapper {
-  position: fixed;
-  bottom: 0;
-  left: 0;
-  height: $navbar-height;
-  width: 100%;
-  z-index: 1500;
-}
-.wrapper {
-  flex: 1;
-  display: flex;
-  flex-direction: row;
-  margin-left: $menu-width;
-  box-shadow: 0px 5px 5px rgb(0 0 0 / 20%), 0px 3px 14px rgb(0 0 0 / 12%),
-    0px 8px 10px rgb(0 0 0 / 14%);
-  background: $dark-bg;
-  @media screen and (max-width: $width-tablet) {
-    margin-left: 0;
-    padding-bottom: $navbar-height;
-  }
-  main {
-    width: 100%;
-  }
-}
diff --git a/src/components/Loader/loader.scss b/src/components/Loader/loader.scss
index 872512dcdcfeff6f48209b63a669d4bf1b90ad45..982003b1a436190ef287470f083a99e197e895cb 100644
--- a/src/components/Loader/loader.scss
+++ b/src/components/Loader/loader.scss
@@ -1,9 +1,9 @@
 @import '../../styles/config/colors.scss';
 
 .loader-container {
-  width: 100%;
-  height: 80vh;
   display: flex;
+  height: 100%;
+  flex: 1;
   overflow: hidden;
 }
 .loader {
@@ -23,7 +23,6 @@
   background: -o-linear-gradient(left, $gold 10%, rgba(255, 255, 255, 0) 42%);
   background: -ms-linear-gradient(left, $gold 10%, rgba(255, 255, 255, 0) 42%);
   background: linear-gradient(to right, $gold 10%, rgba(255, 255, 255, 0) 42%);
-  position: relative;
   -webkit-animation: load3 1.4s infinite linear;
   animation: load3 1.4s infinite linear;
   -webkit-transform: translateZ(0);
diff --git a/src/components/Login/Login.tsx b/src/components/Login/Login.tsx
index 1f20b820b0daabb90e23d18cdd77f0a46a5bfbf6..b8a1f2e6e0b99661f8c2f22daeb014e9ce30713b 100644
--- a/src/components/Login/Login.tsx
+++ b/src/components/Login/Login.tsx
@@ -1,17 +1,17 @@
+import { Button } from '@mui/material'
 import React from 'react'
-import { useAuth } from '../../hooks/useAuth'
 import './login.scss'
 
 const Login: React.FC = () => {
-  const { loginUser } = useAuth()
+  const loginUser = () => {
+    window.location.href = '/OAuth2Login'
+  }
 
   return (
     <div className="login">
       <div className="container">
         <h1>Bienvenue sur le Backoffice d&apos;Ecolyo !</h1>
-        <button className="btnValid" onClick={loginUser}>
-          Login
-        </button>
+        <Button onClick={loginUser}>Login</Button>
       </div>
     </div>
   )
diff --git a/src/components/Login/login.scss b/src/components/Login/login.scss
index ee3b921580016004c02261c867ea1a3b9fc51900..14327f4c3b5f451838d0c9f650fc42dd892476c7 100644
--- a/src/components/Login/login.scss
+++ b/src/components/Login/login.scss
@@ -3,6 +3,9 @@
   width: 100%;
   height: inherit;
   min-height: 95vh;
+  h1 {
+    margin-bottom: 0.5rem;
+  }
   .container {
     margin: auto;
     padding: 2rem;
diff --git a/src/components/Navigation/BottomBar.tsx b/src/components/Navigation/BottomBar.tsx
deleted file mode 100644
index 0129a6363413b96f77688ef1183969f4b233bd69..0000000000000000000000000000000000000000
--- a/src/components/Navigation/BottomBar.tsx
+++ /dev/null
@@ -1,43 +0,0 @@
-import React, { useContext } from 'react'
-import { NavLink } from 'react-router-dom'
-import { useAuth } from '../../hooks/useAuth'
-import { UserContext } from '../../hooks/userContext'
-import { routes } from '../Routes/Router'
-import './bottombar.scss'
-
-const BottomBar: React.FC = () => {
-  const { user } = useContext(UserContext)
-  const { logoutUser } = useAuth()
-
-  return (
-    <div className="navbar">
-      <div className="menu-list">
-        {user &&
-          routes.map(
-            (route) =>
-              (!route.adminOnly || user?.isAdmin) && (
-                <NavLink
-                  key={route.label}
-                  to={route.path}
-                  activeClassName="active"
-                >
-                  {route.label}
-                </NavLink>
-              )
-          )}
-        {process.env.NODE_ENV === 'development' && (
-          <a href="/doc/" target="_blank">
-            Swagger doc
-          </a>
-        )}
-      </div>
-      {user && (
-        <button className="btnValid logButton" onClick={logoutUser}>
-          Logout
-        </button>
-      )}
-    </div>
-  )
-}
-
-export default BottomBar
diff --git a/src/components/Navigation/bottombar.scss b/src/components/Navigation/bottombar.scss
deleted file mode 100644
index 78f8bc8988fac89c94c76cbae9026bed80928374..0000000000000000000000000000000000000000
--- a/src/components/Navigation/bottombar.scss
+++ /dev/null
@@ -1,44 +0,0 @@
-@import '../../styles/config/colors';
-.navbar {
-  height: inherit;
-  background: radial-gradient(
-    74.83% 76.97% at 50% 13.64%,
-    #343641 0%,
-    #1b1c22 100%
-  );
-  display: flex;
-  align-items: center;
-  justify-content: center;
-  padding: 0 1rem;
-  z-index: 1500;
-  .menu-list {
-    display: flex;
-    align-items: center;
-    justify-content: center;
-  }
-  a {
-    text-decoration: none;
-    display: flex;
-    align-items: center;
-    flex-direction: column;
-    font-size: 0.9rem;
-    &:not(:first-of-type) {
-      margin-left: 2rem;
-    }
-    img {
-      margin-bottom: 0.3rem;
-    }
-  }
-  .active {
-    color: $gold;
-  }
-  .navbar-icon {
-    width: 1.3rem;
-  }
-  .logButton {
-    width: 100px;
-    min-width: 0;
-    margin-left: auto;
-    margin-top: 0;
-  }
-}
diff --git a/src/components/Navigation/sidebar.scss b/src/components/Navigation/sidebar.scss
deleted file mode 100644
index e6917fe46f2dcd36c62247699aea73b2f5f75742..0000000000000000000000000000000000000000
--- a/src/components/Navigation/sidebar.scss
+++ /dev/null
@@ -1,42 +0,0 @@
-@import '../../styles/config/colors';
-@import '../../styles/config/layout';
-
-.menu {
-  display: flex;
-  flex-direction: column;
-  height: inherit;
-  padding: 1.875rem;
-  box-shadow: 0px 5px 5px rgb(0 0 0 / 20%), 0px 3px 14px rgb(0 0 0 / 12%),
-    0px 8px 10px rgb(0 0 0 / 14%);
-  background-color: $grey-light;
-
-  .logo-container {
-    display: flex;
-  }
-  .logo {
-    margin: auto;
-    max-width: 4rem;
-  }
-  a {
-    display: block;
-    padding: 0.5rem 0;
-    text-decoration: none;
-    color: $text-grey;
-    font-size: 1rem;
-
-    &.active {
-      color: $gold;
-      font-weight: 700;
-    }
-
-    &:hover {
-      color: $gold;
-    }
-  }
-  .menu-list {
-    margin-top: 1.5rem;
-  }
-  .administration {
-    margin-top: auto;
-  }
-}
diff --git a/src/components/Newsletter/CustomEditor.tsx b/src/components/Newsletter/CustomEditor.tsx
index b9867c75e8d282218ff4cd7c00d8513b568f58b1..9131bf356a62e382c970c5435995f8f911f072e3 100644
--- a/src/components/Newsletter/CustomEditor.tsx
+++ b/src/components/Newsletter/CustomEditor.tsx
@@ -60,7 +60,7 @@ const CustomEditor: React.FC<CustomEditorProps> = ({
   return (
     <Editor
       editorState={editorState}
-      onEditorStateChange={(state) => handleStateChange(state)}
+      onEditorStateChange={state => handleStateChange(state)}
       handlePastedText={() => false}
       wrapperClassName="wrapper-class"
       editorClassName="editor-class"
diff --git a/src/components/Newsletter/CustomLink.tsx b/src/components/Newsletter/CustomLink.tsx
index fc69ff89ad50d4db54725648f41b44f29277cc60..847c8da19ff14daa7658d5ae61c9373650b2632e 100644
--- a/src/components/Newsletter/CustomLink.tsx
+++ b/src/components/Newsletter/CustomLink.tsx
@@ -77,7 +77,7 @@ const CustomLink: React.FC<EcolyoLinkProps> = ({ onChange, editorState }) => {
                 : 'rdw-dropdown-optionwrapper placeholder-ul'
             }
           >
-            {links.map((item: LinkState) => {
+            {links.map(item => {
               return (
                 <li
                   className="rdw-dropdownoption-default placeholder-li"
diff --git a/src/components/Newsletter/DateSelector/DateSelector.tsx b/src/components/Newsletter/DateSelector/DateSelector.tsx
index e811fc653e4fefafed32443dda9a22f85da4fcfe..2049f71adb045e6ca8b193486912585eb0d63dce 100644
--- a/src/components/Newsletter/DateSelector/DateSelector.tsx
+++ b/src/components/Newsletter/DateSelector/DateSelector.tsx
@@ -1,7 +1,7 @@
+import { Button, Dialog, IconButton } from '@mui/material'
 import React, { useState } from 'react'
 import leftChevron from '../../../assets/icons/left-chevron.svg'
 import rightChevron from '../../../assets/icons/right-chevron.svg'
-import Modal from '../Modal/Modal'
 import './dateSelector.scss'
 
 interface DateSelectorProps {
@@ -17,7 +17,7 @@ const DateSelector: React.FC<DateSelectorProps> = ({
 }) => {
   const [openModal, setOpenModal] = useState<boolean>(false)
   const [isPrev, setIsPrev] = useState<boolean>(false)
-  const toggleOpenModal = () => setOpenModal((prev) => !prev)
+  const toggleOpenModal = () => setOpenModal(prev => !prev)
 
   const handleNextMonth = () => {
     setIsPrev(false)
@@ -44,40 +44,29 @@ const DateSelector: React.FC<DateSelectorProps> = ({
   }
   return (
     <div className="date-selector">
-      <img
-        src={leftChevron}
-        alt="Previous Month"
-        onClick={handlePrevMonth}
-        className="arrow"
-      />
+      <IconButton onClick={handlePrevMonth}>
+        <img src={leftChevron} alt="Previous Month" className="arrow" />
+      </IconButton>
       <div className="text">
         {date.toLocaleString('default', { month: 'long', year: 'numeric' })}
       </div>
-      <img
-        src={rightChevron}
-        alt="Next Month"
-        onClick={handleNextMonth}
-        className="arrow"
-      />
-      {openModal && (
-        <Modal>
-          <>
-            <div className="modal-text">
-              Attention, vous n&apos;avez pas enregistré vos modifications.
-              Celles-ci seront annulées en changeant de mois. Voulez-vous
-              continuer ?
-            </div>
-            <div className="buttons">
-              <button className="btnCancel" onClick={() => setOpenModal(false)}>
-                Annuler
-              </button>
-              <button className="btnValid" onClick={handleConfirmAlert}>
-                Continuer
-              </button>
-            </div>
-          </>
-        </Modal>
-      )}
+      <IconButton onClick={handleNextMonth}>
+        <img src={rightChevron} alt="Next Month" className="arrow" />
+      </IconButton>
+
+      <Dialog open={openModal}>
+        <div className="modal-text">
+          Attention, vous n&apos;avez pas enregistré vos modifications.
+          Celles-ci seront annulées en changeant de mois. Voulez-vous continuer
+          ?
+        </div>
+        <div className="buttons">
+          <Button variant="outlined" onClick={() => setOpenModal(false)}>
+            Annuler
+          </Button>
+          <Button onClick={handleConfirmAlert}>Continuer</Button>
+        </div>
+      </Dialog>
     </div>
   )
 }
diff --git a/src/components/Newsletter/DateSelector/dateSelector.scss b/src/components/Newsletter/DateSelector/dateSelector.scss
index cb2a92c023ff94fb33b4dad892a1cb2d26f7ae5a..729caa02b424da686c0c4a05138be531d5828a5c 100644
--- a/src/components/Newsletter/DateSelector/dateSelector.scss
+++ b/src/components/Newsletter/DateSelector/dateSelector.scss
@@ -26,14 +26,11 @@
     padding: 0.5rem;
     border-radius: 50%;
     background: #343641;
-    margin: 0 0.5rem;
-    box-shadow: 0px 5px 5px rgb(0 0 0 / 20%), 0px 3px 14px rgb(0 0 0 / 12%),
+    box-shadow:
+      0px 5px 5px rgb(0 0 0 / 20%),
+      0px 3px 14px rgb(0 0 0 / 12%),
       0px 8px 10px rgb(0 0 0 / 14%);
     transition: all 300ms ease;
-    &:hover {
-      background: $text-grey;
-      opacity: 0.9;
-    }
   }
 }
 .modal-text {
diff --git a/src/components/Newsletter/ImagePicker/ImagePicker.tsx b/src/components/Newsletter/ImagePicker/ImagePicker.tsx
index 33a85e80a7e9c39444ef466216cb13fa7e9d1f19..98e236e37af1ae7dbc68875f9d254193d762e985 100644
--- a/src/components/Newsletter/ImagePicker/ImagePicker.tsx
+++ b/src/components/Newsletter/ImagePicker/ImagePicker.tsx
@@ -1,10 +1,9 @@
-import Pagination from '@material-ui/lab/Pagination'
-import React, { useContext, useEffect, useState } from 'react'
+import { Button, Dialog, Pagination } from '@mui/material'
+import React, { useEffect, useState } from 'react'
+import { useWhoAmI } from '../../../API'
 import { getAxiosXSRFHeader } from '../../../axios.config'
-import { UserContext, UserContextProps } from '../../../hooks/userContext'
 import { NewsletterService } from '../../../services/newsletter.service'
 import { EditorType } from '../CustomEditor'
-import Modal from '../Modal/Modal'
 import SingleImage from './SingleImage'
 
 interface ImagePickerProps {
@@ -16,19 +15,19 @@ const ImagePicker: React.FC<ImagePickerProps> = ({
   imageURL,
   handleChange,
 }) => {
-  const [imageNames, setImageNames] = useState<Array<string[]>>([])
+  const { data: user } = useWhoAmI()
+  const [imageNames, setImageNames] = useState<string[][]>([])
   const [selectedImageURL, setSelectedImageURL] = useState<string>(
     imageURL && imageURL !== null ? imageURL : ''
   )
   const [openModal, setOpenModal] = useState<boolean>(false)
-  const { user }: Partial<UserContextProps> = useContext(UserContext)
   const [currentPage, setCurrentPage] = useState(1)
   const [pageCount, setPageCount] = useState<number>(1)
   const [preSelectImage, setPreSelectImage] = useState<string>('')
   const imagePerPage = 10
 
   const toggleModal = () => {
-    setOpenModal((prev) => !prev)
+    setOpenModal(prev => !prev)
   }
   const handleChangePage = (page: number) => {
     setCurrentPage(page)
@@ -69,9 +68,8 @@ const ImagePicker: React.FC<ImagePickerProps> = ({
       {selectedImageURL === '' || !selectedImageURL ? (
         <>
           <p>Pas d&apos;image sélectionnée</p>
-          <button className="btnValid" onClick={toggleModal}>
-            Choisir une image
-          </button>
+          <br />
+          <Button onClick={toggleModal}>Choisir une image</Button>
         </>
       ) : (
         <>
@@ -82,49 +80,41 @@ const ImagePicker: React.FC<ImagePickerProps> = ({
             className="ecogesture-image"
             alt="selected"
           />
-          <button className="btnDelete" onClick={toggleModal}>
-            Modifier l&apos;image
-          </button>
+          <Button onClick={toggleModal}>Modifier l&apos;image</Button>
         </>
       )}
 
-      {openModal && (
-        <Modal classes={'modal-large'}>
-          <>
-            <div className="image-picker">
-              {imageNames &&
-                imageNames.length !== 0 &&
-                imageNames[currentPage - 1].length !== 0 &&
-                imageNames[currentPage - 1].map((imageName) => (
-                  <SingleImage
-                    imageURL={imageName}
-                    key={imageName}
-                    selectedImage={preSelectImage}
-                    setSelectedImageURL={setPreSelectImage}
-                  />
-                ))}
-            </div>
-            <div className="footer">
-              <Pagination
-                count={pageCount}
-                siblingCount={0}
-                onChange={(_e, page) => handleChangePage(page)}
+      <Dialog open={openModal} className="modal-large">
+        <div className="image-picker">
+          {imageNames &&
+            imageNames.length !== 0 &&
+            imageNames[currentPage - 1].length !== 0 &&
+            imageNames[currentPage - 1].map(imageName => (
+              <SingleImage
+                imageURL={imageName}
+                key={imageName}
+                selectedImage={preSelectImage}
+                setSelectedImageURL={setPreSelectImage}
               />
-              <div className="buttons">
-                <button
-                  className="btnCancel"
-                  onClick={() => setOpenModal(false)}
-                >
-                  Annuler
-                </button>
-                <button className="btnValid" onClick={handleValidateImage}>
-                  Valider
-                </button>
-              </div>
-            </div>
-          </>
-        </Modal>
-      )}
+            ))}
+        </div>
+        <Pagination
+          count={pageCount}
+          siblingCount={0}
+          onChange={(_e, page) => handleChangePage(page)}
+          style={{
+            display: 'flex',
+            justifyContent: 'center',
+            marginTop: '1rem',
+          }}
+        />
+        <div className="buttons">
+          <Button variant="outlined" onClick={() => setOpenModal(false)}>
+            Annuler
+          </Button>
+          <Button onClick={handleValidateImage}>Valider</Button>
+        </div>
+      </Dialog>
     </>
   )
 }
diff --git a/src/components/Newsletter/ImagePicker/imagePicker.scss b/src/components/Newsletter/ImagePicker/imagePicker.scss
index d831ef10abcede991f3b82fb6104ee87d8e43a91..60c9acff8409e4889f0c08e7a31baddbdb26142a 100644
--- a/src/components/Newsletter/ImagePicker/imagePicker.scss
+++ b/src/components/Newsletter/ImagePicker/imagePicker.scss
@@ -13,6 +13,7 @@
   }
 }
 .ecogesture-image {
+  cursor: pointer;
   display: block;
   box-sizing: border-box;
   border: solid 1px transparent;
diff --git a/src/components/Newsletter/MailSubject/mailSubject.scss b/src/components/Newsletter/MailSubject/mailSubject.scss
deleted file mode 100644
index de327758893e42b30477e68dba7af7e83629ab7a..0000000000000000000000000000000000000000
--- a/src/components/Newsletter/MailSubject/mailSubject.scss
+++ /dev/null
@@ -1,9 +0,0 @@
-.mailSubject {
-  .title {
-    margin: 1rem 0;
-  }
-  input {
-    min-width: 300px;
-    margin-left: 0;
-  }
-}
diff --git a/src/components/Newsletter/MailSubject/mailSubject.tsx b/src/components/Newsletter/MailSubject/mailSubject.tsx
index bf6443b9d4ce0ddb6e8e9157ae4d5cddfd80ec62..47baa378497ea3c262bb6573e98d02debd024dfb 100644
--- a/src/components/Newsletter/MailSubject/mailSubject.tsx
+++ b/src/components/Newsletter/MailSubject/mailSubject.tsx
@@ -1,7 +1,7 @@
+import { Button, TextField } from '@mui/material'
 import React, { ChangeEvent } from 'react'
 import { EditorType } from '../CustomEditor'
 import { ContentItems } from '../Newsletter'
-import './mailSubject.scss'
 
 interface MailSubjectProps {
   onSave: () => Promise<void>
@@ -23,25 +23,26 @@ const MailSubject: React.FC<MailSubjectProps> = ({
   return (
     <div className="mailSubject">
       <h2>Objet de la newsletter (Optionnel)</h2>
-      <p className="title">Objet</p>
-      <input
+      <h3>Objet</h3>
+      <TextField
         type="text"
-        className="input-dark"
         placeholder="Par défaut : [Ecolyo] Votre bilan..."
         value={subject}
         onChange={handleChangeSubject}
       />
       <div>
         <div className="buttons">
-          <button className="btnCancel" onClick={onCancel}>
+          <Button variant="outlined" onClick={onCancel}>
             Annuler
-          </button>
-          <button className="btnValid" onClick={onSave}>
-            Sauvegarder
-          </button>
-          <button className="btnDelete" onClick={() => onDelete('subject')}>
+          </Button>
+          <Button onClick={onSave}>Sauvegarder</Button>
+          <Button
+            style={{ marginLeft: 'auto' }}
+            variant="text"
+            onClick={() => onDelete('subject')}
+          >
             Supprimer
-          </button>
+          </Button>
         </div>
       </div>
     </div>
diff --git a/src/components/Newsletter/Modal/Modal.tsx b/src/components/Newsletter/Modal/Modal.tsx
deleted file mode 100644
index da3c6c9e021e5756a23cdd5bd4f42dded0f7ba36..0000000000000000000000000000000000000000
--- a/src/components/Newsletter/Modal/Modal.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import React, { ReactChild } from 'react'
-import { createPortal } from 'react-dom'
-import './modal.scss'
-interface ModalProps {
-  children: ReactChild
-  classes?: string
-}
-
-const Modal: React.FC<ModalProps> = ({ children, classes }) => {
-  return createPortal(
-    <div className="modal-bg">
-      <div className="modal-container">
-        <div className={`modal-content ${classes}`}>{children}</div>
-      </div>
-    </div>,
-    document.body
-  )
-}
-
-export default Modal
diff --git a/src/components/Newsletter/Modal/modal.scss b/src/components/Newsletter/Modal/modal.scss
deleted file mode 100644
index ae25cc96eb55815b1d094116dc26bd758602b687..0000000000000000000000000000000000000000
--- a/src/components/Newsletter/Modal/modal.scss
+++ /dev/null
@@ -1,39 +0,0 @@
-@import '../../../styles/config/colors';
-
-.modal-bg {
-  background-color: rgba(27, 28, 34, 0.85);
-  display: flex;
-  height: 100vh;
-  left: 0;
-  position: fixed;
-  top: 0;
-  width: 100%;
-  z-index: 9999;
-
-  .modal-container {
-    align-items: center;
-    display: flex;
-    justify-content: center;
-    overflow-y: auto;
-    width: 100%;
-  }
-  .modal-content {
-    background: linear-gradient(180deg, #323339 0%, #25262b 100%);
-    box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55);
-    border-radius: 4px;
-    padding: 1rem;
-    position: relative;
-    max-width: 350px;
-    width: 100%;
-  }
-  .modal-large {
-    max-width: 700px;
-    min-height: 380px;
-    display: flex;
-    flex-direction: column;
-  }
-  .buttons {
-    display: flex;
-    justify-content: center;
-  }
-}
diff --git a/src/components/Newsletter/MonthlyInfo/MonthlyInfo.tsx b/src/components/Newsletter/MonthlyInfo/MonthlyInfo.tsx
index d7d8a2773505a8ac7a5eaccccb2949d162ee65d9..7b45e657f588ed13fb4cba92a766586433c4d484 100644
--- a/src/components/Newsletter/MonthlyInfo/MonthlyInfo.tsx
+++ b/src/components/Newsletter/MonthlyInfo/MonthlyInfo.tsx
@@ -1,49 +1,51 @@
+import { Button } from '@mui/material'
 import React from 'react'
 import 'react-draft-wysiwyg/dist/react-draft-wysiwyg.css'
 import { convertStringToEditorState } from '../../../utils/editorStateManagement'
 import CustomEditor, { EditorType } from '../CustomEditor'
 import ImagePicker from '../ImagePicker/ImagePicker'
 import { ContentItems } from '../Newsletter'
-import './monthlyInfo.scss'
 
 interface MonthlyInfoProps {
-  onSave: () => Promise<void>
-  onCancel: () => void
-  info: string
   handleChange: (value: string, type: EditorType) => void
-  onDelete: (target: ContentItems) => void
   imageURL: string
+  info: string
+  onCancel: () => void
+  onDelete: (target: ContentItems) => void
+  onSave: () => Promise<void>
 }
 const MonthlyInfo: React.FC<MonthlyInfoProps> = ({
-  onSave,
-  onCancel,
-  info,
   handleChange,
-  onDelete,
   imageURL,
+  info,
+  onCancel,
+  onDelete,
+  onSave,
 }) => {
   return (
     <div className="monthlyInfo">
       <h2>Informations du mois (Optionnel)</h2>
       <div>
-        <p className="title">Image</p>
+        <h3>Image</h3>
         <ImagePicker imageURL={imageURL} handleChange={handleChange} />
-        <p className="title">Info</p>
+        <h3>Info</h3>
         <CustomEditor
           baseState={convertStringToEditorState(info)}
           handleChange={handleChange}
           type="info"
         />
         <div className="buttons">
-          <button className="btnCancel" onClick={onCancel}>
+          <Button variant="outlined" onClick={onCancel}>
             Annuler
-          </button>
-          <button className="btnValid" onClick={onSave}>
-            Sauvegarder
-          </button>
-          <button className="btnDelete" onClick={() => onDelete('monthlyInfo')}>
+          </Button>
+          <Button onClick={onSave}>Sauvegarder</Button>
+          <Button
+            style={{ marginLeft: 'auto' }}
+            variant="text"
+            onClick={() => onDelete('monthlyInfo')}
+          >
             Supprimer
-          </button>
+          </Button>
         </div>
       </div>
     </div>
diff --git a/src/components/Newsletter/MonthlyInfo/monthlyInfo.scss b/src/components/Newsletter/MonthlyInfo/monthlyInfo.scss
deleted file mode 100644
index 90aaf6171d7ed970e45b136bb5447742e115e4c3..0000000000000000000000000000000000000000
--- a/src/components/Newsletter/MonthlyInfo/monthlyInfo.scss
+++ /dev/null
@@ -1,9 +0,0 @@
-.monthlyInfo {
-  margin: 2rem 0;
-  .title {
-    margin: 1rem 0;
-  }
-  h2 {
-    margin-bottom: 1rem;
-  }
-}
diff --git a/src/components/Newsletter/MonthlyNews/MonthlyNews.tsx b/src/components/Newsletter/MonthlyNews/MonthlyNews.tsx
index 90557d310fe8f7d438f7a16052f687d0e1a6e659..19c05bad01ef7125a59609161f5dc2f5961d5cf8 100644
--- a/src/components/Newsletter/MonthlyNews/MonthlyNews.tsx
+++ b/src/components/Newsletter/MonthlyNews/MonthlyNews.tsx
@@ -1,9 +1,9 @@
+import { Button, TextField } from '@mui/material'
 import React, { ChangeEvent } from 'react'
 import 'react-draft-wysiwyg/dist/react-draft-wysiwyg.css'
 import { convertStringToEditorState } from '../../../utils/editorStateManagement'
 import CustomEditor, { EditorType } from '../CustomEditor'
 import { ContentItems } from '../Newsletter'
-import './monthlyNews.scss'
 
 interface MonthlyNewsProps {
   onSave: () => Promise<void>
@@ -27,16 +27,15 @@ const MonthlyNews: React.FC<MonthlyNewsProps> = ({
   return (
     <div className="monthlyNews">
       <h2>Nouveautés du mois (Optionnel)</h2>
-      <p className="title">Titre</p>
-      <input
+      <h3>Titre</h3>
+      <TextField
         type="text"
-        className="input-dark"
         placeholder="Par défaut : Les nouveautés du service"
         value={title}
         onChange={handleChangeTitle}
       />
       <div>
-        <p className="title">Contenu</p>
+        <h3>Contenu</h3>
         <div>
           <CustomEditor
             baseState={convertStringToEditorState(content)}
@@ -46,15 +45,17 @@ const MonthlyNews: React.FC<MonthlyNewsProps> = ({
         </div>
 
         <div className="buttons">
-          <button className="btnCancel" onClick={onCancel}>
+          <Button variant="outlined" onClick={onCancel}>
             Annuler
-          </button>
-          <button className="btnValid" onClick={onSave}>
-            Sauvegarder
-          </button>
-          <button className="btnDelete" onClick={() => onDelete('monthlyNews')}>
+          </Button>
+          <Button onClick={onSave}>Sauvegarder</Button>
+          <Button
+            style={{ marginLeft: 'auto' }}
+            variant="text"
+            onClick={() => onDelete('monthlyNews')}
+          >
             Supprimer
-          </button>
+          </Button>
         </div>
       </div>
     </div>
diff --git a/src/components/Newsletter/MonthlyNews/monthlyNews.scss b/src/components/Newsletter/MonthlyNews/monthlyNews.scss
deleted file mode 100644
index e71c10d084410f5f74604f8436233efa8683c48a..0000000000000000000000000000000000000000
--- a/src/components/Newsletter/MonthlyNews/monthlyNews.scss
+++ /dev/null
@@ -1,10 +0,0 @@
-.monthlyNews {
-  margin: 2rem 0;
-  .title {
-    margin: 1rem 0;
-  }
-  input {
-    min-width: 300px;
-    margin-left: 0;
-  }
-}
diff --git a/src/components/Newsletter/Newsletter.tsx b/src/components/Newsletter/Newsletter.tsx
index 410ca99964aadb383e29812f98b7d46347093b76..9ecedf91638a7aaf76b679c84d4322dabfbe87ad 100644
--- a/src/components/Newsletter/Newsletter.tsx
+++ b/src/components/Newsletter/Newsletter.tsx
@@ -1,12 +1,7 @@
-import React, {
-  useCallback,
-  useContext,
-  useEffect,
-  useMemo,
-  useState,
-} from 'react'
+import { Button, Dialog } from '@mui/material'
+import React, { useCallback, useEffect, useMemo, useState } from 'react'
+import { useWhoAmI } from '../../API'
 import { getAxiosXSRFHeader } from '../../axios.config'
-import { UserContext, UserContextProps } from '../../hooks/userContext'
 import { IMailSubject } from '../../models/mailSubject.model'
 import { IMonthlyInfo } from '../../models/monthlyInfo.model'
 import { IMonthlyNews } from '../../models/monthlyNews.model'
@@ -16,7 +11,6 @@ import Loader from '../Loader/Loader'
 import { EditorType } from './CustomEditor'
 import DateSelector from './DateSelector/DateSelector'
 import MailSubject from './MailSubject/mailSubject'
-import Modal from './Modal/Modal'
 import MonthlyInfo from './MonthlyInfo/MonthlyInfo'
 import MonthlyNews from './MonthlyNews/MonthlyNews'
 import Poll from './Poll/Poll'
@@ -30,9 +24,9 @@ export type ContentItems =
   | ''
 
 const Newsletter: React.FC = () => {
-  /**
-   * Display previous month until the newsletter is sent on the 3rd day of the month
-   */
+  const { data: user } = useWhoAmI()
+
+  /** Display previous month until the newsletter is sent on the 3rd day of the month */
   const getCurrentNewsletterDate = (): Date => {
     const today = new Date()
     const currentDay = today.getDate()
@@ -57,7 +51,6 @@ const Newsletter: React.FC = () => {
   const [isLoading, setIsLoading] = useState<boolean>(false)
   const [warningModal, setWarningModal] = useState<boolean>(false)
   const [toDelete, setToDelete] = useState<ContentItems>('')
-  const { user }: Partial<UserContextProps> = useContext(UserContext)
   const newsletterService = useMemo(() => {
     return new NewsletterService()
   }, [])
@@ -286,7 +279,7 @@ const Newsletter: React.FC = () => {
   return (
     <>
       <div className="header">
-        <p className="title pageTitle">Édition de la newsletter</p>
+        <h1 className="title pageTitle">Édition de la newsletter</h1>
         <DateSelector date={date} setDate={setDate} isEmpty={isEmpty} />
       </div>
       {isLoading && <Loader />}
@@ -298,7 +291,7 @@ const Newsletter: React.FC = () => {
             subject={subject}
             handleChange={handleEditorChange}
             onDelete={handleOpenDeleteModal}
-          ></MailSubject>
+          />
           <hr />
           <MonthlyInfo
             info={info}
@@ -328,27 +321,19 @@ const Newsletter: React.FC = () => {
           />
         </div>
       )}
-      {warningModal && (
-        <Modal>
-          <>
-            <div className="modal-text">
-              Êtes-vous sûr de vouloir supprimer{' '}
-              {getContentItemString(toDelete)}&nbsp;?
-            </div>
-            <div className="buttons">
-              <button
-                className="btnCancel"
-                onClick={() => setWarningModal(false)}
-              >
-                Annuler
-              </button>
-              <button className="btnValid" onClick={handleConfirmAlert}>
-                Continuer
-              </button>
-            </div>
-          </>
-        </Modal>
-      )}
+
+      <Dialog open={warningModal}>
+        <div className="modal-text">
+          Êtes-vous sûr de vouloir supprimer {getContentItemString(toDelete)}
+          &nbsp;?
+        </div>
+        <div className="buttons">
+          <Button variant="outlined" onClick={() => setWarningModal(false)}>
+            Annuler
+          </Button>
+          <Button onClick={handleConfirmAlert}>Continuer</Button>
+        </div>
+      </Dialog>
     </>
   )
 }
diff --git a/src/components/Newsletter/Poll/Poll.tsx b/src/components/Newsletter/Poll/Poll.tsx
index c82196168da4164fe179a41a46d8d3691531ffd8..614a16038778f70431d12bf27009235188371cd8 100644
--- a/src/components/Newsletter/Poll/Poll.tsx
+++ b/src/components/Newsletter/Poll/Poll.tsx
@@ -1,9 +1,9 @@
+import { Button, TextField } from '@mui/material'
 import React, { ChangeEvent } from 'react'
 import 'react-draft-wysiwyg/dist/react-draft-wysiwyg.css'
 import { convertStringToEditorState } from '../../../utils/editorStateManagement'
 import CustomEditor, { EditorType } from '../CustomEditor'
 import { ContentItems } from '../Newsletter'
-import './poll.scss'
 
 interface PollProps {
   question: string
@@ -29,15 +29,10 @@ const Poll: React.FC<PollProps> = ({
   return (
     <div className="poll">
       <h2>Ajouter un sondage (Optionnel)</h2>
-      <p className="title">Lien</p>
-      <input
-        type="text"
-        className="input-dark"
-        value={link}
-        onChange={handleChangeLink}
-      />
+      <h3>Lien</h3>
+      <TextField type="text" value={link} onChange={handleChangeLink} />
       <div>
-        <p className="title">Question</p>
+        <h3>Question</h3>
         <div>
           <CustomEditor
             baseState={convertStringToEditorState(question)}
@@ -47,15 +42,17 @@ const Poll: React.FC<PollProps> = ({
         </div>
 
         <div className="buttons">
-          <button className="btnCancel" onClick={onCancel}>
+          <Button variant="outlined" onClick={onCancel}>
             Annuler
-          </button>
-          <button className="btnValid" onClick={onSave}>
-            Sauvegarder
-          </button>
-          <button className="btnDelete" onClick={() => onDelete('poll')}>
+          </Button>
+          <Button onClick={onSave}>Sauvegarder</Button>
+          <Button
+            style={{ marginLeft: 'auto' }}
+            variant="text"
+            onClick={() => onDelete('poll')}
+          >
             Supprimer
-          </button>
+          </Button>
         </div>
       </div>
     </div>
diff --git a/src/components/Newsletter/Poll/poll.scss b/src/components/Newsletter/Poll/poll.scss
deleted file mode 100644
index 8c606f9ce7b29b0330dbb05e8e4ae1ab99063a2c..0000000000000000000000000000000000000000
--- a/src/components/Newsletter/Poll/poll.scss
+++ /dev/null
@@ -1,10 +0,0 @@
-.poll {
-  margin: 2rem 0;
-  .title {
-    margin: 1rem 0;
-  }
-  input {
-    min-width: 300px;
-    margin-left: 0;
-  }
-}
diff --git a/src/components/Newsletter/newsletter.scss b/src/components/Newsletter/newsletter.scss
index e2c8832d1fb4a5cd2225123ea730f4d5fc3b96fa..2c43170fcac7ace2fc11fff5045149333d9b3d38 100644
--- a/src/components/Newsletter/newsletter.scss
+++ b/src/components/Newsletter/newsletter.scss
@@ -1,5 +1,4 @@
 @import '../../styles/config/typography.scss';
-@import '../../styles/config/layout.scss';
 @import '../../styles/config/breakpoints';
 
 .header {
@@ -10,24 +9,14 @@
     #343641 0%,
     #1b1c22 100%
   );
-  box-shadow: 0px 5px 5px rgb(0 0 0 / 0%), 0px 3px 14px rgb(0 0 0 / 0%),
+  box-shadow:
+    0px 5px 5px rgb(0 0 0 / 0%),
+    0px 3px 14px rgb(0 0 0 / 0%),
     0px 8px 10px rgb(0 0 0 / 15%);
 }
 .content {
   padding: 1rem;
 }
-.subtitle {
-  margin: 1rem 0;
-}
 hr {
-  margin: 2rem 1rem;
-}
-.buttons {
-  display: flex;
-  @media screen and (max-width: $width-tablet) {
-    flex-direction: column;
-    button {
-      width: 100%;
-    }
-  }
+  margin: 2rem 0rem;
 }
diff --git a/src/components/Popups/Popups.tsx b/src/components/Popups/Popups.tsx
index c921d3fc60f598c372b9e855de42d53ea8c4d9d8..d85f8870e9079b5efd3a3f637e40d979a3320cc4 100644
--- a/src/components/Popups/Popups.tsx
+++ b/src/components/Popups/Popups.tsx
@@ -1,9 +1,18 @@
+import {
+  Button,
+  FormControl,
+  FormControlLabel,
+  FormGroup,
+  NativeSelect,
+  Switch,
+  TextField,
+} from '@mui/material'
 import { DateTime } from 'luxon'
-import React, { useCallback, useContext, useEffect, useState } from 'react'
+import React, { useCallback, useEffect, useState } from 'react'
 import 'react-draft-wysiwyg/dist/react-draft-wysiwyg.css'
+import { useWhoAmI } from '../../API'
 import { getAxiosXSRFHeader } from '../../axios.config'
 import { CheckboxType } from '../../enum/checkboxType.enum'
-import { UserContext, UserContextProps } from '../../hooks/userContext'
 import { ICustomPopup, PopupDuration } from '../../models/customPopup.model'
 import {
   Option,
@@ -18,7 +27,7 @@ import Loader from '../Loader/Loader'
 import CustomEditor from '../Newsletter/CustomEditor'
 import './popups.scss'
 
-const OPTIONS: Array<Option> = [
+const OPTIONS: Option[] = [
   {
     value: durationEnum.hours,
     label: 'Heures',
@@ -34,6 +43,8 @@ const OPTIONS: Array<Option> = [
 ]
 
 const Popups: React.FC = () => {
+  const { data: user } = useWhoAmI()
+
   const [refreshData, setRefreshData] = useState(false)
   const [isLoading, setIsLoading] = useState(false)
   const [partnersInfo, setPartnersInfo] = useState<IPartnersInfo>({
@@ -54,41 +65,37 @@ const Popups: React.FC = () => {
     duration: 0,
   })
 
-  const { user }: Partial<UserContextProps> = useContext(UserContext)
-
   const isPartnerNotificationOn = () =>
     partnersInfo.enedis_failure ||
     partnersInfo.egl_failure ||
     partnersInfo.grdf_failure
 
-  /**
-   * Only one type of popup can be enabled
-   */
+  /** Only one type of popup can be enabled */
   const isPageValid = () =>
     !(isPartnerNotificationOn() && customPopup.popupEnabled)
 
   const handleCheckboxChange = (value: boolean, type: CheckboxType): void => {
     switch (type) {
       case CheckboxType.GRDF:
-        setPartnersInfo((prevPartnersInfo) => ({
+        setPartnersInfo(prevPartnersInfo => ({
           ...prevPartnersInfo,
           grdf_failure: value,
         }))
         break
       case CheckboxType.ENEDIS:
-        setPartnersInfo((prevPartnersInfo) => ({
+        setPartnersInfo(prevPartnersInfo => ({
           ...prevPartnersInfo,
           enedis_failure: value,
         }))
         break
       case CheckboxType.EGL:
-        setPartnersInfo((prevPartnersInfo) => ({
+        setPartnersInfo(prevPartnersInfo => ({
           ...prevPartnersInfo,
           egl_failure: value,
         }))
         break
       case CheckboxType.CUSTOM:
-        setCustomPopup((prev) => ({
+        setCustomPopup(prev => ({
           ...prev,
           popupEnabled: value,
         }))
@@ -99,12 +106,13 @@ const Popups: React.FC = () => {
   }
 
   const handlePopupChange = (field: 'title' | 'description', value: string) => {
-    setCustomPopup((prev) => ({
+    setCustomPopup(prev => ({
       ...prev,
       [field]: value,
     }))
   }
 
+  // clean this
   const handleCancel = useCallback(() => {
     setRefreshData(true)
   }, [setRefreshData])
@@ -176,7 +184,7 @@ const Popups: React.FC = () => {
   }
 
   const handleSelectChange = (event: React.ChangeEvent<HTMLSelectElement>) => {
-    setPopupDuration((prev) => ({
+    setPopupDuration(prev => ({
       ...prev,
       type: event.target.value as durationType,
     }))
@@ -197,7 +205,7 @@ const Popups: React.FC = () => {
         years: 1,
       })
     }
-    setCustomPopup((prev) => ({
+    setCustomPopup(prev => ({
       ...prev,
       endDate: newDate.toISO(),
     }))
@@ -227,130 +235,132 @@ const Popups: React.FC = () => {
   return (
     <>
       <div className="header">
-        <p className="title pageTitle">Paramètres de l&apos;appli</p>
+        <h1>Création de Pop-up</h1>
       </div>
 
       <div className="content popups">
         {isLoading && <Loader />}
         {!isLoading && (
           <>
-            <h1>Création de Pop-up</h1>
             <div className="partnersInfo">
-              <h2 className="title">Affichage des pop-up de panne</h2>
-              <div className={customPopup.popupEnabled ? 'disabled' : ''}>
+              <h3>Affichage des pop-up de panne</h3>
+              <div>
                 <p>Services concernés</p>
-                <div className="switch_div">
-                  <span>Panne Enedis</span>
-                  <input
-                    type="checkbox"
-                    id="switch_enedis"
-                    disabled={customPopup.popupEnabled}
-                    checked={partnersInfo.enedis_failure}
-                    onChange={(event) => {
-                      handleCheckboxChange(
-                        event.currentTarget.checked,
-                        CheckboxType.ENEDIS
-                      )
-                    }}
+                <FormGroup style={{ flexDirection: 'row' }}>
+                  <FormControlLabel
+                    label="Panne Enedis"
+                    labelPlacement="top"
+                    control={
+                      <Switch
+                        disabled={customPopup.popupEnabled}
+                        checked={partnersInfo.enedis_failure}
+                        onChange={event => {
+                          handleCheckboxChange(
+                            event.target.checked,
+                            CheckboxType.ENEDIS
+                          )
+                        }}
+                      />
+                    }
                   />
-                  <label htmlFor="switch_enedis"></label>
-                </div>
-                <div className="switch_div">
-                  <span>Panne EGL</span>
-                  <input
-                    type="checkbox"
-                    id="switch_egl"
-                    disabled={customPopup.popupEnabled}
-                    checked={partnersInfo.egl_failure}
-                    onChange={(event) => {
-                      handleCheckboxChange(
-                        event.currentTarget.checked,
-                        CheckboxType.EGL
-                      )
-                    }}
+                  <FormControlLabel
+                    label="Panne EGL"
+                    labelPlacement="top"
+                    control={
+                      <Switch
+                        disabled={customPopup.popupEnabled}
+                        checked={partnersInfo.egl_failure}
+                        onChange={event => {
+                          handleCheckboxChange(
+                            event.target.checked,
+                            CheckboxType.EGL
+                          )
+                        }}
+                      />
+                    }
                   />
-                  <label htmlFor="switch_egl"></label>
-                </div>
-                <div className="switch_div">
-                  <span>Panne GRDF</span>
-                  <input
-                    type="checkbox"
-                    id="switch_grdf"
-                    disabled={customPopup.popupEnabled}
-                    checked={partnersInfo.grdf_failure}
-                    onChange={(event) => {
-                      handleCheckboxChange(
-                        event.currentTarget.checked,
-                        CheckboxType.GRDF
-                      )
-                    }}
+                  <FormControlLabel
+                    label="Panne GRDF"
+                    labelPlacement="top"
+                    control={
+                      <Switch
+                        disabled={customPopup.popupEnabled}
+                        checked={partnersInfo.grdf_failure}
+                        onChange={event => {
+                          handleCheckboxChange(
+                            event.target.checked,
+                            CheckboxType.GRDF
+                          )
+                        }}
+                      />
+                    }
                   />
-                  <label htmlFor="switch_grdf"></label>
-                </div>
+                </FormGroup>
               </div>
             </div>
 
             <div className="customPopup">
-              <h2 className="title">Affichage de pop-up personnalisée</h2>
-              <div className={isPartnerNotificationOn() ? 'disabled' : ''}>
-                <div className="currentPopup">
-                  <div className="switch_div">
-                    <span>Pop-up active</span>
-                    <input
-                      type="checkbox"
-                      id="switch_popup"
+              <h3>Affichage de pop-up personnalisée</h3>
+              <FormGroup style={{ flexDirection: 'row' }}>
+                <FormControlLabel
+                  label="Pop-up active"
+                  labelPlacement="top"
+                  control={
+                    <Switch
                       disabled={isPartnerNotificationOn()}
                       checked={customPopup.popupEnabled}
-                      onChange={(event) => {
+                      onChange={event => {
                         handleCheckboxChange(
-                          event.currentTarget.checked,
+                          event.target.checked,
                           CheckboxType.CUSTOM
                         )
                       }}
                     />
-                    <label htmlFor="switch_popup"></label>
-                  </div>
+                  }
+                />
+                {customPopup.popupEnabled &&
+                  previousEndDate &&
+                  getRemainingDuration(previousEndDate)}
+              </FormGroup>
 
-                  {customPopup.popupEnabled &&
-                    previousEndDate &&
-                    getRemainingDuration(previousEndDate)}
-                </div>
-
-                <div className="popupTitle">
-                  <label htmlFor="title">Titre</label>
-                  <input
-                    type="text"
-                    name="title"
-                    id="title"
-                    min={1}
-                    placeholder="Titre"
-                    value={customPopup.title}
-                    onChange={(event) =>
-                      handlePopupChange('title', event.target.value)
-                    }
-                  />
-                </div>
+              <div className="popupTitle">
+                <TextField
+                  type="text"
+                  placeholder="Titre de la popup"
+                  fullWidth
+                  label="Titre"
+                  value={customPopup.title}
+                  onChange={event =>
+                    handlePopupChange('title', event.target.value)
+                  }
+                />
+              </div>
 
-                <div className="popupDescription">
-                  <CustomEditor
-                    baseState={convertStringToEditorState(
-                      customPopup.description
-                    )}
-                    handleChange={(value) =>
-                      handlePopupChange('description', value)
-                    }
-                    type="custom_popup"
-                  />
-                </div>
+              <div className="popupDescription">
+                <CustomEditor
+                  baseState={convertStringToEditorState(
+                    customPopup.description
+                  )}
+                  handleChange={value =>
+                    handlePopupChange('description', value)
+                  }
+                  type="custom_popup"
+                />
+              </div>
 
-                <div className="popupEndDate">
-                  <label htmlFor="title">Nouvelle Durée</label>
-                  <div className="durationInput">
-                    <select
-                      value={popupDuration.type}
-                      onChange={(event) => handleSelectChange(event)}
+              <div className="popupEndDate">
+                <label htmlFor="title">Nouvelle Durée</label>
+                <div>
+                  <FormControl style={{ flexDirection: 'row', gap: '1rem' }}>
+                    <NativeSelect
+                      defaultValue={30}
+                      inputProps={{
+                        name: 'age',
+                        id: 'uncontrolled-native',
+                      }}
+                      onChange={event => handleSelectChange(event)}
                     >
-                      {OPTIONS.map((option) => (
+                      {OPTIONS.map(option => (
                         <option
                           key={option.value}
                           value={option.value}
@@ -359,37 +369,40 @@ const Popups: React.FC = () => {
                           {option.label}
                         </option>
                       ))}
-                    </select>
+                    </NativeSelect>
+
                     {popupDuration.type !== 'infinite' && (
-                      <input
+                      <TextField
+                        inputProps={{
+                          inputMode: 'numeric',
+                          pattern: '[0-9]*',
+                        }}
+                        id="outlined-number"
                         type="number"
-                        min="0"
+                        InputLabelProps={{
+                          shrink: true,
+                        }}
                         value={popupDuration.duration}
-                        onChange={(e) =>
-                          setPopupDuration((prev) => ({
+                        onChange={e =>
+                          setPopupDuration(prev => ({
                             ...prev,
                             duration: Number(e.target.value),
                           }))
                         }
                       />
                     )}
-                  </div>
+                  </FormControl>
                 </div>
               </div>
             </div>
 
             <div className="buttons">
-              <button className="btnCancel" onClick={handleCancel}>
+              <Button variant="outlined" onClick={handleCancel}>
                 Annuler
-              </button>
-              <button
-                className="btnValid"
-                onClick={handleSave}
-                disabled={!isPageValid()}
-                title="Un seul type de popup peut être activé"
-              >
+              </Button>
+              <Button disabled={!isPageValid()} onClick={handleSave}>
                 Sauvegarder
-              </button>
+              </Button>
             </div>
           </>
         )}
diff --git a/src/components/Popups/popups.scss b/src/components/Popups/popups.scss
index 7f93c69038d13c943d4658f6c0c478f956d5480c..0071eb96daa5cfba37bc16abb470e22a596c33d0 100644
--- a/src/components/Popups/popups.scss
+++ b/src/components/Popups/popups.scss
@@ -1,48 +1,15 @@
 @import '../../styles/config/colors';
 
 .popups {
-  .disabled {
-    opacity: 0.5;
-  }
-
-  .partnersInfo,
-  .customPopup {
-    h2.title {
-      margin: 1rem 0;
-    }
-  }
-
   .partnersInfo {
-    margin: 2rem 0;
-    h1 {
-      margin-bottom: 1rem;
-    }
-
-    p {
-      color: $text-grey;
-    }
-  }
-
-  .customPopup {
-    .currentPopup {
-      display: flex;
-      margin-bottom: 1rem;
-      .switch_div {
-        padding-top: 0;
-      }
-
-      p.endDate {
-        color: $gold-dark;
-        font-weight: bold;
-      }
-    }
+    margin-bottom: 2rem;
   }
 
-  .popupTitle {
-    margin-bottom: 1.5rem;
+  p.endDate {
+    color: $gold-dark;
+    font-weight: bold;
   }
 
-  .popupTitle,
   .popupDescription,
   .popupEndDate {
     display: flex;
@@ -54,17 +21,6 @@
       font-weight: 700;
     }
 
-    input,
-    textarea {
-      background: inherit;
-      border-radius: 4px;
-      border: 1px solid $text-chart;
-      max-width: 600px;
-      padding: 1rem;
-      color: $text-grey;
-      font-size: 1rem;
-    }
-
     .count {
       color: $text-dark;
       max-width: 600px;
@@ -76,94 +32,9 @@
     }
   }
 
-  .popupEndDate {
-    margin-top: 1rem;
-    .durationInput {
-      display: flex;
-      gap: 1.5rem;
-      max-height: 36px;
-
-      input,
-      select {
-        background: #383941;
-        border: 1px solid $text-chart;
-        border-radius: 2px;
-      }
-
-      input {
-        max-width: 100px;
-      }
-
-      select {
-        max-width: 180px;
-        padding: 0.5rem 1rem;
-        option {
-          background-color: $grey-light;
-        }
-      }
-    }
-  }
-
-  .buttons {
+  .customPopup {
     display: flex;
-    justify-content: center;
+    flex-direction: column;
     gap: 1rem;
-    button {
-      margin: 0;
-    }
-  }
-
-  .switch_div {
-    display: inline-block;
-    padding: 1rem 1rem;
-    min-width: 135px;
-
-    span {
-      color: $text-dark;
-    }
-
-    input[type='checkbox'] {
-      width: 0;
-      height: 0;
-      visibility: hidden;
-      margin-bottom: 15px;
-    }
-
-    label {
-      display: block;
-      width: 50px;
-      height: 20px;
-      background-color: grey;
-      border-radius: 15px;
-      position: relative;
-      cursor: pointer;
-      transition: 0.5s;
-      box-shadow: 0 0 20px #80808050;
-    }
-
-    label::after {
-      content: '';
-      width: 17px;
-      height: 17px;
-      background-color: #e8f5f7;
-      position: absolute;
-      border-radius: 13px;
-      top: 2px;
-      left: 2px;
-      transition: 0.5s;
-    }
-
-    input:checked + label:after {
-      left: calc(100% - 3px);
-      transform: translateX(-100%);
-    }
-
-    input:checked + label {
-      background-color: #e3b82a;
-    }
-
-    label:active:after {
-      width: 34px;
-    }
   }
 }
diff --git a/src/components/Prices/PriceRow.tsx b/src/components/Prices/PriceRow.tsx
index b2df90bfad18548b187c3e82d78b7762523e9254..09b28b353fbed0e41e3274534170bbc6701ddfec 100644
--- a/src/components/Prices/PriceRow.tsx
+++ b/src/components/Prices/PriceRow.tsx
@@ -21,7 +21,7 @@ const PriceRow: React.FC<PriceSectionProps> = ({
   index,
   isNextPrice,
 }) => {
-  const editableLimit: number = 3
+  const editableLimit = 3
 
   return (
     <>
@@ -47,7 +47,7 @@ const PriceRow: React.FC<PriceSectionProps> = ({
           />
         )}
       </li>
-      <hr></hr>
+      <hr />
     </>
   )
 }
diff --git a/src/components/Prices/PriceSection.tsx b/src/components/Prices/PriceSection.tsx
index 317d938ae8cfb51561656bd3da9948eb71257cdd..84b364ca50a911d66678db601feebbffd27f8553 100644
--- a/src/components/Prices/PriceSection.tsx
+++ b/src/components/Prices/PriceSection.tsx
@@ -1,13 +1,14 @@
+import { Button, TextField } from '@mui/material'
 import dayjs from 'dayjs'
 import timezone from 'dayjs/plugin/timezone'
 import utc from 'dayjs/plugin/utc'
-import React, { useCallback, useContext, useEffect, useState } from 'react'
+import React, { useCallback, useEffect, useState } from 'react'
 import 'react-draft-wysiwyg/dist/react-draft-wysiwyg.css'
+import { useWhoAmI } from '../../API'
 import arrowDown from '../../assets/icons/down-arrow.png'
 import { getAxiosXSRFHeader } from '../../axios.config'
 import { FluidType } from '../../enum/fluidTypes'
 import { FrequencyInMonth } from '../../enum/frequency.enum'
-import { UserContext, UserContextProps } from '../../hooks/userContext'
 import { IPrice } from '../../models/price.model'
 import { PricesService } from '../../services/prices.service'
 import Loader from '../Loader/Loader'
@@ -23,6 +24,7 @@ interface PriceSectionProps {
 }
 
 const PriceSection: React.FC<PriceSectionProps> = ({ fluid, frequency }) => {
+  const { data: user } = useWhoAmI()
   const [prices, setPrices] = useState<IPrice[]>([])
   const [nextPrice, setNextPrice] = useState<IPrice>()
   const [isLoading, setIsLoading] = useState<boolean>(false)
@@ -35,14 +37,13 @@ const PriceSection: React.FC<PriceSectionProps> = ({ fluid, frequency }) => {
     startDate: '',
     endDate: null,
   })
-  const { user }: Partial<UserContextProps> = useContext(UserContext)
-  const maxPerList: number = 8
+  const maxPerList = 8
 
   const handlePriceSelection = useCallback((val: string) => {
     if (val === '') val = '0'
     val = val.replace(/,/g, '.')
     val = val.replace(/([^0-9.]+)/, '')
-    setPriceToSave((prev) => {
+    setPriceToSave(prev => {
       return { ...prev, price: val }
     })
   }, [])
@@ -68,7 +69,7 @@ const PriceSection: React.FC<PriceSectionProps> = ({ fluid, frequency }) => {
   }, [priceToSave, user])
 
   const toggleHistory = useCallback(() => {
-    setShowHistory((prev) => !prev)
+    setShowHistory(prev => !prev)
   }, [])
 
   const getDate = useCallback((isoString: string): string => {
@@ -79,7 +80,7 @@ const PriceSection: React.FC<PriceSectionProps> = ({ fluid, frequency }) => {
   }, [])
 
   const toggleFullList = useCallback(() => {
-    setShowFullList((prev) => !prev)
+    setShowFullList(prev => !prev)
   }, [])
 
   useEffect(() => {
@@ -120,7 +121,7 @@ const PriceSection: React.FC<PriceSectionProps> = ({ fluid, frequency }) => {
     }
   }, [refreshData, frequency, fluid])
 
-  if (isLoading) return <Loader></Loader>
+  if (isLoading) return <Loader />
   if (!prices.length) return <section> Aucun prix trouvé</section>
   return (
     <section>
@@ -132,38 +133,41 @@ const PriceSection: React.FC<PriceSectionProps> = ({ fluid, frequency }) => {
       <hr className="price-separator" />
       <div className="flex-bloc">
         <p>Nouveau prix : </p>
-        <input
-          className="input-dark price-select"
+        <TextField
           type="text"
           value={priceToSave.price.toString()}
-          onChange={(e) => handlePriceSelection(e.target.value)}
+          onChange={e => handlePriceSelection(e.target.value)}
           placeholder={priceToSave.price === '' ? 'Saisir le nouveau prix' : ''}
+          fullWidth={false}
         />
         <span className="euro">€</span>
 
         <div className="flex-bloc startDate">
           <p>A partir de : </p>
-          <p className="date">
-            <span className="capital">{getDate(priceToSave.startDate)}</span>
-          </p>
+          <p className="date">{getDate(priceToSave.startDate)}</p>
         </div>
       </div>
-      <button
-        className="btnValid"
-        onClick={savePrice}
-        disabled={priceToSave.price === '0' || priceToSave.price === ''}
-      >
-        Sauvegarder
-      </button>
+      <div>
+        <Button
+          onClick={savePrice}
+          disabled={priceToSave.price === '0' || priceToSave.price === ''}
+        >
+          Sauvegarder
+        </Button>
+      </div>
       <div className="history">
-        <button onClick={toggleHistory} className={showHistory ? 'active' : ''}>
-          <span>Voir l&apos;historique</span>
+        <Button
+          variant="outlined"
+          onClick={toggleHistory}
+          className={showHistory ? 'active' : ''}
+        >
+          Voir l&apos;historique
           <img
             src={arrowDown}
             className={showHistory ? 'icon-active' : ''}
             alt="arrow-icon"
           />
-        </button>
+        </Button>
         {showHistory && (
           <ul className={showHistory ? 'active' : ''}>
             {nextPrice && (
@@ -194,17 +198,17 @@ const PriceSection: React.FC<PriceSectionProps> = ({ fluid, frequency }) => {
                     index={i}
                   />
                   {i === maxPerList && !showFullList && (
-                    <button onClick={toggleFullList} className="showButton">
+                    <Button variant="outlined" onClick={toggleFullList}>
                       En voir plus
-                    </button>
+                    </Button>
                   )}
                 </div>
               )
             })}
             {showFullList && (
-              <button onClick={toggleFullList} className="showButton">
+              <Button variant="outlined" onClick={toggleFullList}>
                 En voir moins
-              </button>
+              </Button>
             )}
           </ul>
         )}
diff --git a/src/components/Prices/Prices.tsx b/src/components/Prices/Prices.tsx
index 75cadeb53eeea30a23e7d37bdcd682022e0dd857..d18a85b9c90bac3ede5f8c88e2633074d86d61df 100644
--- a/src/components/Prices/Prices.tsx
+++ b/src/components/Prices/Prices.tsx
@@ -9,7 +9,7 @@ const Prices: React.FC = () => {
   return (
     <>
       <div className="header">
-        <p className="title pageTitle">Prix des fluides</p>
+        <h1>Prix des fluides</h1>
       </div>
       <div className="prices">
         <PriceSection
diff --git a/src/components/Prices/prices.scss b/src/components/Prices/prices.scss
index 0f0d367b909bda1b5261d7f54ddf888a5923411a..eabf44ca432c77e451490c17341bc01347b4eb01 100644
--- a/src/components/Prices/prices.scss
+++ b/src/components/Prices/prices.scss
@@ -1,39 +1,30 @@
 @import '../../styles/config/typography.scss';
-@import '../../styles/config/layout.scss';
 @import '../../styles/config/breakpoints';
 @import '../../styles/config/colors';
 
 .prices {
-  margin-top: $navigator-height;
   padding: 1rem;
   .title {
     margin: 1rem 0;
   }
-  .capital {
-    text-transform: capitalize;
-  }
   h2 {
-    margin-bottom: 1rem;
     color: $gold;
   }
   .price-separator {
-    margin: 1rem 0;
+    margin: 0;
     background: white;
   }
   .flex-bloc {
     display: flex;
     align-items: center;
-    .price-select {
-      position: relative;
-    }
+    gap: 0.5rem;
+
     .euro {
-      display: block;
-      margin-left: 0.5rem;
       font-weight: bold;
     }
     .startDate {
-      margin-left: 1rem;
       .date {
+        text-transform: capitalize;
         margin-left: 0.5rem;
         color: $gold;
         font-weight: bold;
@@ -41,28 +32,20 @@
     }
   }
   section {
+    display: flex;
+    flex-direction: column;
+    gap: 1rem;
     margin-top: 1rem;
     margin-bottom: 2rem;
     .history {
       button {
-        @include baseButton();
-        background: $grey-dark;
-        border: solid 1px $gold;
-        display: flex;
-        align-items: center;
-        &:hover {
-          background: $dark-background;
-          opacity: 0.8;
-        }
-        &.active {
-          border-radius: 5px 5px 0 0;
-        }
         img {
           width: 20px;
           margin-left: 0.5rem;
-        }
-        span {
-          color: $gold;
+          transition: all 0.3s ease-out;
+          &.icon-active {
+            transform: rotate(180deg);
+          }
         }
       }
       ul {
@@ -106,13 +89,6 @@
           margin: 0;
           background: white;
         }
-        .showButton {
-          text-align: center;
-          color: $gold;
-        }
-      }
-      .icon-active {
-        transform: rotate(180deg);
       }
     }
   }
diff --git a/src/components/Routes/Router.tsx b/src/components/Routes/Router.tsx
index a1fe6c0d2b971d07b8950128c2260ae408afa6f0..64c8f6cbfaea33ba15f2932a25f06e4ace6bd55f 100644
--- a/src/components/Routes/Router.tsx
+++ b/src/components/Routes/Router.tsx
@@ -1,15 +1,17 @@
-import React, { useContext } from 'react'
-import { Redirect, Route, Switch } from 'react-router-dom'
-import { UserContext } from '../../hooks/userContext'
+import { Navigate, Route, Routes } from 'react-router-dom'
+import { useWhoAmI } from '../../API'
 import Consents from '../Consents/Consents'
+import Loader from '../Loader/Loader'
 import Login from '../Login/Login'
 import Newsletter from '../Newsletter/Newsletter'
 import Popups from '../Popups/Popups'
 import Prices from '../Prices/Prices'
+import SideBar from '../SideBar/SideBar'
 
-export const links: {
-  [key: string]: { label: string; path: string; adminOnly?: boolean }
-} = {
+export const links: Record<
+  string,
+  { label: string; path: string; adminOnly?: boolean }
+> = {
   newsletter: {
     label: 'Newsletter',
     path: '/newsletter',
@@ -29,35 +31,41 @@ export const links: {
   },
 }
 
-export const routes = Object.keys(links).map((key) => ({
+export const routes = Object.keys(links).map(key => ({
   label: links[key].label,
   path: links[key].path,
   adminOnly: links[key].adminOnly,
 }))
 
-const Router: React.FC = () => {
-  const { user } = useContext(UserContext)
+const Router = () => {
+  const { data: user, isLoading } = useWhoAmI()
 
-  return (
-    <Switch>
-      {user ? (
-        <>
-          <Route exact path={links.newsletter.path} component={Newsletter} />
-          <Route exact path={links.prices.path} component={Prices} />
-          <Route exact path={links.popups.path} component={Popups} />
-          {user.isAdmin && (
-            <Route exact path={links.consents.path} component={Consents} />
-          )}
-          <Redirect path="*" to={links.newsletter.path} />
-        </>
-      ) : (
-        <>
-          <Route path="/login" component={Login} />
-          <Redirect path="*" to="/login" />
-        </>
-      )}
-    </Switch>
-  )
+  if (isLoading) return <Loader />
+
+  if (user) {
+    return (
+      <>
+        <SideBar />
+        <main className="wrapper">
+          <Routes>
+            <Route path={links.newsletter.path} element={<Newsletter />} />
+            <Route path={links.prices.path} element={<Prices />} />
+            <Route path="/popups" element={<Popups />} />
+            {user.isAdmin && (
+              <Route path={links.consents.path} element={<Consents />} />
+            )}
+            <Route path="/login" element={<Login />} />
+            <Route
+              path="*"
+              element={<Navigate replace to={links.newsletter.path} />}
+            />
+          </Routes>
+        </main>
+      </>
+    )
+  }
+
+  return <Login />
 }
 
 export default Router
diff --git a/src/components/Navigation/SideBar.tsx b/src/components/SideBar/SideBar.tsx
similarity index 51%
rename from src/components/Navigation/SideBar.tsx
rename to src/components/SideBar/SideBar.tsx
index 301ac19b2ef555924f449633fda66eec864bb065..dbaabae3f6662e92b892fbdd3fd15ffe6a091870 100644
--- a/src/components/Navigation/SideBar.tsx
+++ b/src/components/SideBar/SideBar.tsx
@@ -1,29 +1,41 @@
-import React, { useContext } from 'react'
-import { NavLink } from 'react-router-dom'
+import { Button } from '@mui/material'
+import React from 'react'
+import { useMutation, useQueryClient } from 'react-query'
+import { NavLink, useNavigate } from 'react-router-dom'
+import { fetchLogout, useWhoAmI } from '../../API'
 import logo from '../../assets/icons/ecolyo-logo.svg'
-import { useAuth } from '../../hooks/useAuth'
-import { UserContext } from '../../hooks/userContext'
 import { routes } from '../Routes/Router'
 import './sidebar.scss'
 
 const SideBar: React.FC = () => {
-  const { user } = useContext(UserContext)
-  const { logoutUser } = useAuth()
+  const queryClient = useQueryClient()
+  const navigate = useNavigate()
+  const { data: user } = useWhoAmI()
+
+  const { mutate: logout } = useMutation({
+    mutationFn: fetchLogout,
+    onSuccess: () => {
+      queryClient.clear()
+      navigate('/login')
+    },
+  })
+
+  if (!user) return <div />
 
   return (
-    <nav className={'menu'}>
+    <nav className="menu">
       <div className="logo-container">
         <img src={logo} alt="Ecolyo logo" className="logo" />
       </div>
       <div className="menu-list">
         {user &&
           routes.map(
-            (route) =>
+            route =>
               (!route.adminOnly || user.isAdmin) && (
                 <NavLink
                   key={route.label}
                   to={route.path}
-                  activeClassName="active"
+                  className={({ isActive }) => (isActive ? 'active' : '')}
                 >
                   {route.label}
                 </NavLink>
@@ -35,13 +47,13 @@ const SideBar: React.FC = () => {
           </a>
         )}
       </div>
-      <div className="administration">
+      <div className="bottom">
         {user ? (
-          <button className="btnValid" onClick={logoutUser}>
+          <Button variant="outlined" onClick={() => logout()}>
             Logout
-          </button>
+          </Button>
         ) : (
-          <NavLink to="/login" activeClassName="active">
+          <NavLink to="/login" className="active">
             Login
           </NavLink>
         )}
diff --git a/src/components/SideBar/sidebar.scss b/src/components/SideBar/sidebar.scss
new file mode 100644
index 0000000000000000000000000000000000000000..1b2189ed7cc9407f80bb4f597ec5c33660d2532d
--- /dev/null
+++ b/src/components/SideBar/sidebar.scss
@@ -0,0 +1,65 @@
+@import '../../styles/config/colors';
+@import '../../styles/config/breakpoints';
+
+.menu {
+  z-index: 1500;
+  display: flex;
+  flex-direction: column;
+  padding: 1.5rem;
+  gap: 1.5rem;
+  box-shadow:
+    0px 5px 5px rgb(0 0 0 / 20%),
+    0px 3px 14px rgb(0 0 0 / 12%),
+    0px 8px 10px rgb(0 0 0 / 14%);
+  background-color: $grey-light;
+
+  @media screen and (max-width: $width-tablet) {
+    position: fixed;
+    top: unset;
+    bottom: 0;
+    height: auto;
+    width: 100%;
+  }
+
+  @media screen and (max-width: $width-tablet) {
+    flex-direction: row;
+    align-items: center;
+    justify-content: space-between;
+  }
+
+  .logo-container {
+    display: flex;
+    .logo {
+      margin: auto;
+      max-width: 4rem;
+    }
+
+    @media screen and (max-width: $width-tablet) {
+      display: none;
+    }
+  }
+
+  .menu-list {
+    display: flex;
+    flex-direction: column;
+    gap: 1rem;
+    @media screen and (max-width: $width-tablet) {
+      flex-direction: row;
+    }
+    a {
+      text-decoration: none;
+
+      &.active {
+        color: $gold;
+        font-weight: 700;
+      }
+      &:hover {
+        color: $gold;
+      }
+    }
+  }
+
+  .bottom {
+    margin-top: auto;
+  }
+}
diff --git a/src/components/UI/theme.ts b/src/components/UI/theme.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f605e03675953e20de8f1b939b0f6d94ff7a3357
--- /dev/null
+++ b/src/components/UI/theme.ts
@@ -0,0 +1,54 @@
+import { createTheme } from '@mui/material'
+
+export const theme = createTheme({
+  palette: {
+    mode: 'dark',
+    primary: {
+      main: '#F1C017',
+      contrastText: '#000',
+    },
+  },
+  components: {
+    MuiButton: {
+      defaultProps: {
+        variant: 'contained',
+      },
+      styleOverrides: {
+        root: {
+          fontWeight: 700,
+          minWidth: 130,
+        },
+      },
+    },
+    MuiTextField: {
+      defaultProps: {
+        size: 'small',
+        fullWidth: true,
+      },
+      styleOverrides: {
+        root: {
+          maxWidth: '600px',
+        },
+      },
+    },
+    MuiSwitch: {
+      styleOverrides: {
+        track: {
+          backgroundColor: '#7B7B7B',
+          '.Mui-checked.Mui-checked + &': {
+            backgroundColor: '#DCBA4A',
+            opacity: 1,
+          },
+        },
+      },
+    },
+    MuiDialog: {
+      styleOverrides: {
+        paper: {
+          padding: '1rem',
+          maxWidth: '700px',
+        },
+      },
+    },
+  },
+})
diff --git a/src/custom.d.ts b/src/custom.d.ts
index dc10f53aef6889af8c781134aa86ab2ff513795e..526d0dd14bc29ab80d0cfafc5ae56bae2d5662dc 100644
--- a/src/custom.d.ts
+++ b/src/custom.d.ts
@@ -4,11 +4,11 @@ declare module '*.svg' {
 }
 
 declare module '*.scss' {
-  const styles: { [className: string]: string }
+  const styles: Record<string, string>
   export default styles
 }
 
-declare module "react-datepicker" {
+declare module 'react-datepicker' {
   const datepicker: any
   export default datepicker
-} 
\ No newline at end of file
+}
diff --git a/src/hooks/useAuth.ts b/src/hooks/useAuth.ts
deleted file mode 100644
index 6f57d463e9384d19c25871045d2b5165d73a7878..0000000000000000000000000000000000000000
--- a/src/hooks/useAuth.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-import axios from 'axios'
-import { useContext, useState } from 'react'
-import { useHistory } from 'react-router-dom'
-import { links } from '../components/Routes/Router'
-import { UserContext } from './userContext'
-
-export interface Auth {
-  loginUser: () => Promise<void>
-  error: null
-  logoutUser: () => void
-}
-export const useAuth = (): Auth => {
-  const [error, setError] = useState<any>(null)
-  const { setUser } = useContext(UserContext)
-  const history = useHistory()
-
-  //login user
-  const loginUser = async (): Promise<void> => {
-    try {
-      window.location.href = '/OAuth2Login'
-      await setUserContext()
-    } catch (e) {
-      setError(e)
-    }
-  }
-
-  const logoutUser = async (): Promise<void> => {
-    try {
-      if (setUser) setUser(null)
-      window.location.href = '/Logout'
-    } catch (e) {
-      setError(e)
-    }
-  }
-
-  //set user in context and push them home
-  const setUserContext = async (): Promise<void> => {
-    try {
-      const { data } = await axios.get(`/api/common/WhoAmI`)
-      if (data && setUser) {
-        setUser(data)
-        history.push(links.newsletter.path)
-      }
-    } catch (e) {
-      setError(e)
-    }
-  }
-
-  return { loginUser, error, logoutUser }
-}
diff --git a/src/hooks/useFindUser.ts b/src/hooks/useFindUser.ts
deleted file mode 100644
index 201bd31a45e281591bc5f6b69d20051cbe45f8de..0000000000000000000000000000000000000000
--- a/src/hooks/useFindUser.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import axios from 'axios'
-import { useEffect, useState } from 'react'
-import { toast } from 'react-toastify'
-import { User } from '../models/user.model'
-
-const useFindUser = () => {
-  const [user, setUser] = useState<User | null>(null)
-  const [isLoading, setLoading] = useState<boolean>(true)
-
-  useEffect(() => {
-    async function findUser() {
-      try {
-        const { data } = await axios.get(`/api/common/WhoAmI`)
-        if (data) {
-          setUser(data)
-          setLoading(false)
-        }
-      } catch (error) {
-        toast.error('Accès refusé, veuillez vous connecter')
-      }
-    }
-    findUser()
-  }, [])
-  return {
-    user,
-    setUser,
-    isLoading,
-  }
-}
-
-export default useFindUser
diff --git a/src/hooks/userContext.ts b/src/hooks/userContext.ts
deleted file mode 100644
index e2f6936764e83d2e058302e7fb4a835aa859ff82..0000000000000000000000000000000000000000
--- a/src/hooks/userContext.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import { createContext, Dispatch, SetStateAction } from 'react'
-import { User } from '../models/user.model'
-
-export interface UserContextProps {
-  user: User | null
-  setUser: Dispatch<SetStateAction<User | null>>
-  isLoading: boolean
-}
-export const UserContext = createContext<Partial<UserContextProps>>({})
diff --git a/src/services/consent.service.ts b/src/services/consent.service.ts
index 8f41655a3ea11f4286cbebeaca0da807561bed15..185b123064e38d2ce903f0fc177a80a9bd5cad1b 100644
--- a/src/services/consent.service.ts
+++ b/src/services/consent.service.ts
@@ -1,11 +1,12 @@
 import axios, { AxiosRequestConfig } from 'axios'
 import { DateTime } from 'luxon'
 import { toast } from 'react-toastify'
-import { ConsentEntity, IConsent } from '../models/consent.model'
 import {
+  ConsentEntity,
   ConsentPaginationEntity,
+  IConsent,
   IConsentPagination,
-} from './../models/consent.model'
+} from '../models/consent.model'
 
 export class ConsentService {
   /**
@@ -28,7 +29,7 @@ export class ConsentService {
       )
       const consentPagination = data as ConsentPaginationEntity
       return this.parseConsentPagination(consentPagination)
-    } catch (e: any) {
+    } catch (e) {
       if (e.response.status === 403) {
         toast.error("Accès refusé : vous n'avez pas les droits nécessaires")
       } else {
@@ -72,7 +73,7 @@ export class ConsentService {
   public parseConsentPagination = (
     consentPaginationEntity: ConsentPaginationEntity
   ): IConsentPagination => {
-    const rows = consentPaginationEntity.rows.map((consent) =>
+    const rows = consentPaginationEntity.rows.map(consent =>
       this.parseConsent(consent)
     )
 
diff --git a/src/services/newsletter.service.ts b/src/services/newsletter.service.ts
index 2a2791eca2a8886ac03c3ca45797af5d72cd7bf4..525ca8762ce9e4f758c78520d2774d9b92aa581c 100644
--- a/src/services/newsletter.service.ts
+++ b/src/services/newsletter.service.ts
@@ -27,7 +27,7 @@ export class NewsletterService {
         axiosHeaders
       )
       toast.success('Objet de la newsletter enregistré !')
-    } catch (e: any) {
+    } catch (e) {
       if (e.response.status === 403) {
         toast.error("Accès refusé : vous n'avez pas les droits nécessaires")
       } else {
@@ -56,7 +56,7 @@ export class NewsletterService {
         axiosHeaders
       )
       return data as IMailSubject
-    } catch (e: any) {
+    } catch (e) {
       console.error('error', e)
       return null
     }
@@ -79,7 +79,7 @@ export class NewsletterService {
         axiosHeaders
       )
       toast.success('Objet de la newsletter supprimé !')
-    } catch (e: any) {
+    } catch (e) {
       if (e.response.status === 403) {
         toast.error("Accès refusé : vous n'avez pas les droits nécessaires")
       } else {
@@ -112,7 +112,7 @@ export class NewsletterService {
         axiosHeaders
       )
       toast.success('Information du mois enregistrée !')
-    } catch (e: any) {
+    } catch (e) {
       if (e.response.status === 403) {
         toast.error("Accès refusé : vous n'avez pas les droits nécessaires")
       } else {
@@ -139,7 +139,7 @@ export class NewsletterService {
         axiosHeaders
       )
       return data as IMonthlyInfo
-    } catch (e: any) {
+    } catch (e) {
       console.error('error', e)
       return null
     }
@@ -162,7 +162,7 @@ export class NewsletterService {
         axiosHeaders
       )
       toast.success('Informations du mois supprimées !')
-    } catch (e: any) {
+    } catch (e) {
       if (e.response.status === 403) {
         toast.error("Accès refusé : vous n'avez pas les droits nécessaires")
       } else {
@@ -196,7 +196,7 @@ export class NewsletterService {
         axiosHeaders
       )
       toast.success('Nouveautés du mois enregistrés !')
-    } catch (e: any) {
+    } catch (e) {
       if (e.response.status === 403) {
         toast.error("Accès refusé : vous n'avez pas les droits nécessaires")
       } else {
@@ -246,7 +246,7 @@ export class NewsletterService {
         axiosHeaders
       )
       toast.success('Nouveautés du mois supprimées !')
-    } catch (e: any) {
+    } catch (e) {
       if (e.response.status === 403) {
         toast.error("Accès refusé : vous n'avez pas les droits nécessaires")
       } else {
@@ -280,7 +280,7 @@ export class NewsletterService {
         axiosHeaders
       )
       toast.success('Sondage enregistré !')
-    } catch (e: any) {
+    } catch (e) {
       if (e.response.status === 403) {
         toast.error("Accès refusé : vous n'avez pas les droits nécessaires")
       } else {
@@ -326,7 +326,7 @@ export class NewsletterService {
         axiosHeaders
       )
       toast.success('Sondage supprimé !')
-    } catch (e: any) {
+    } catch (e) {
       if (e.response.status === 403) {
         toast.error("Accès refusé : vous n'avez pas les droits nécessaires")
       } else {
diff --git a/src/setupTests.ts b/src/setupTests.ts
deleted file mode 100644
index 8f2609b7b3e0e3897ab3bcaad13caf6876e48699..0000000000000000000000000000000000000000
--- a/src/setupTests.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-// jest-dom adds custom jest matchers for asserting on DOM nodes.
-// allows you to do things like:
-// expect(element).toHaveTextContent(/react/i)
-// learn more: https://github.com/testing-library/jest-dom
-import '@testing-library/jest-dom';
diff --git a/src/styles/_toast.scss b/src/styles/_toast.scss
deleted file mode 100644
index 9654eb81c1c93cc26ff6a5ffcab83c7a0f1e0d00..0000000000000000000000000000000000000000
--- a/src/styles/_toast.scss
+++ /dev/null
@@ -1,25 +0,0 @@
-@import 'config/colors';
-
-.Toastify__toast {
-  background: #fafafa !important;
-}
-.Toastify__toast--success {
-  .toastBody {
-    color: #73a839;
-  }
-  .toastProgress {
-    background: #73a839 !important;
-  }
-}
-
-.Toastify__toast--error {
-  .toastBody {
-    color: #c71c22;
-  }
-  .toastProgress {
-    background: #c71c22 !important;
-  }
-}
-.toastBody {
-  font-size: 1rem !important;
-}
diff --git a/src/styles/config/_layout.scss b/src/styles/config/_layout.scss
deleted file mode 100644
index ea910ee76cb86683e19120a8d0770332157625ed..0000000000000000000000000000000000000000
--- a/src/styles/config/_layout.scss
+++ /dev/null
@@ -1,4 +0,0 @@
-$menu-width: 11.25rem;
-$navbar-height: 3.5rem;
-$navigator-height: 8rem;
-$small-nav-height: 5.5rem;
diff --git a/src/styles/config/_typography.scss b/src/styles/config/_typography.scss
index b37644cf618bfd9645ff710b02f4634c548e698a..ab39ae631ff26b2d1b0aa7fe03ebbca082f4a0a8 100644
--- a/src/styles/config/_typography.scss
+++ b/src/styles/config/_typography.scss
@@ -87,55 +87,3 @@ $main-spacing: 4px;
   border-radius: 5px;
   padding: 0.3rem;
 }
-@mixin customCheckBox($size) {
-  .checkbox {
-    cursor: pointer;
-    margin: 0.5rem 0;
-    display: flex;
-    align-items: center;
-    width: fit-content;
-    font-size: 0.9rem;
-    color: $text-grey;
-    input {
-      margin: 0.5rem 1rem 0.5rem 0.5rem;
-      appearance: none;
-      -moz-appearance: none;
-      -webkit-appearance: none;
-      width: $size;
-      height: $size;
-      min-width: $size;
-      min-height: $size;
-      position: relative;
-      border: solid 2px $gold;
-      background: black;
-      border-radius: 2px;
-      cursor: pointer;
-    }
-  }
-  .answerChecked {
-    input {
-      &:before,
-      &:after {
-        content: '';
-        position: absolute;
-        display: inline-block;
-        background: $gold;
-        border-radius: 0.5rem;
-      }
-      &:before {
-        width: 3px;
-        height: 12px;
-        left: 10px;
-        top: 4px;
-        transform: rotate(41deg);
-      }
-      &:after {
-        width: 3px;
-        height: 6px;
-        left: 5px;
-        top: 8px;
-        transform: rotate(133deg);
-      }
-    }
-  }
-}
diff --git a/src/styles/index.scss b/src/styles/index.scss
index 722b9ca974212378cf9ae5ed2bf7eb3bdb79f0ad..e634f95d9ecc2700c846a945c4bade28b3220ee8 100644
--- a/src/styles/index.scss
+++ b/src/styles/index.scss
@@ -1,8 +1,6 @@
 @import 'config/breakpoints';
 @import 'config/colors';
 @import 'config/typography';
-@import 'config/layout';
-@import 'toast';
 
 * {
   margin: 0;
@@ -10,21 +8,44 @@
   box-sizing: border-box;
   color: $text-grey;
 }
-.title {
-  color: $gold;
-  font-weight: 600;
-  font-size: 1.3rem;
-  @include text-large();
+
+#root {
+  display: flex;
+  background: $dark-bg;
+  height: 100vh;
+}
+
+.wrapper {
+  flex: 1;
+  box-shadow:
+    0px 5px 5px rgb(0 0 0 / 20%),
+    0px 3px 14px rgb(0 0 0 / 12%),
+    0px 8px 10px rgb(0 0 0 / 14%);
+  overflow-y: scroll;
+
+  @media screen and (max-width: $width-tablet) {
+    padding-bottom: 5rem;
+  }
 }
-.pageTitle {
+
+h1 {
   color: #fafafa;
+  @include text-large();
+}
+
+h3 {
+  margin: 1rem 0;
+  color: $gold;
 }
-.MuiPagination-ul {
+
+li.MuiMenuItem-root {
+  color: white !important;
+}
+
+.buttons {
+  margin-top: 1rem;
+  display: flex;
   justify-content: center;
-  li button {
-    color: white;
-    &.Mui-selected {
-      color: $gold;
-    }
-  }
+  gap: 1rem;
+  flex-wrap: wrap;
 }
diff --git a/tsconfig.json b/tsconfig.json
index a273b0cfc0e965c35524e3cd0d3574cbe1ad2d0d..fb1d76a6ef018480ce98e8b370813d294f09edaf 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,11 +1,7 @@
 {
   "compilerOptions": {
     "target": "es5",
-    "lib": [
-      "dom",
-      "dom.iterable",
-      "esnext"
-    ],
+    "lib": ["dom", "dom.iterable", "esnext"],
     "allowJs": true,
     "skipLibCheck": true,
     "esModuleInterop": true,
@@ -18,9 +14,8 @@
     "resolveJsonModule": true,
     "isolatedModules": true,
     "noEmit": true,
-    "jsx": "react-jsx"
+    "jsx": "react-jsx",
+    "useUnknownInCatchVariables": false
   },
-  "include": [
-    "src"
-  ]
+  "include": ["**/*.ts", "**/*.tsx"]
 }
diff --git a/yarn.lock b/yarn.lock
index ef8cbce08a3a93a27bb9cbceecbe30908d1b9d5c..0f3ac92884ea2aa36a87da50657d2012bb161177 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,6 +2,11 @@
 # yarn lockfile v1
 
 
+"@aashutoshrathi/word-wrap@^1.2.3":
+  version "1.2.6"
+  resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf"
+  integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==
+
 "@ampproject/remapping@^2.1.0":
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d"
@@ -213,6 +218,13 @@
   dependencies:
     "@babel/types" "^7.18.6"
 
+"@babel/helper-module-imports@^7.16.7":
+  version "7.22.15"
+  resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0"
+  integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==
+  dependencies:
+    "@babel/types" "^7.22.15"
+
 "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.18.9":
   version "7.18.9"
   resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz#5a1079c005135ed627442df31a42887e80fcb712"
@@ -286,11 +298,21 @@
   resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56"
   integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==
 
+"@babel/helper-string-parser@^7.22.5":
+  version "7.22.5"
+  resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f"
+  integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==
+
 "@babel/helper-validator-identifier@^7.18.6":
   version "7.18.6"
   resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076"
   integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==
 
+"@babel/helper-validator-identifier@^7.22.19":
+  version "7.22.19"
+  resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.19.tgz#2f34ab1e445f5b95e2e6edfe50ea2449e610583a"
+  integrity sha512-Tinq7ybnEPFFXhlYOYFiSjespWQk0dq2dRNAiMdRTOYQzEGqnnNyrTxPYHP5r6wGjlF1rFgABdDV0g8EwD6Qbg==
+
 "@babel/helper-validator-option@^7.18.6":
   version "7.18.6"
   resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8"
@@ -1177,13 +1199,20 @@
     core-js-pure "^3.20.2"
     regenerator-runtime "^0.13.4"
 
-"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
+"@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7":
   version "7.18.9"
   resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.9.tgz#b4fcfce55db3d2e5e080d2490f608a3b9f407f4a"
   integrity sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==
   dependencies:
     regenerator-runtime "^0.13.4"
 
+"@babel/runtime@^7.18.3", "@babel/runtime@^7.22.15", "@babel/runtime@^7.22.6", "@babel/runtime@^7.6.2", "@babel/runtime@^7.7.2":
+  version "7.22.15"
+  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.15.tgz#38f46494ccf6cf020bd4eed7124b425e83e523b8"
+  integrity sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==
+  dependencies:
+    regenerator-runtime "^0.14.0"
+
 "@babel/template@^7.18.10":
   version "7.18.10"
   resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71"
@@ -1251,6 +1280,15 @@
     "@babel/helper-validator-identifier" "^7.18.6"
     to-fast-properties "^2.0.0"
 
+"@babel/types@^7.22.15":
+  version "7.22.19"
+  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.19.tgz#7425343253556916e440e662bb221a93ddb75684"
+  integrity sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==
+  dependencies:
+    "@babel/helper-string-parser" "^7.22.5"
+    "@babel/helper-validator-identifier" "^7.22.19"
+    to-fast-properties "^2.0.0"
+
 "@bcoe/v8-coverage@^0.2.3":
   version "0.2.3"
   resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
@@ -1353,10 +1391,124 @@
   resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz#1bfafe4b7ed0f3e4105837e056e0a89b108ebe36"
   integrity sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==
 
-"@emotion/hash@^0.8.0":
-  version "0.8.0"
-  resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413"
-  integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==
+"@emotion/babel-plugin@^11.11.0":
+  version "11.11.0"
+  resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz#c2d872b6a7767a9d176d007f5b31f7d504bb5d6c"
+  integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==
+  dependencies:
+    "@babel/helper-module-imports" "^7.16.7"
+    "@babel/runtime" "^7.18.3"
+    "@emotion/hash" "^0.9.1"
+    "@emotion/memoize" "^0.8.1"
+    "@emotion/serialize" "^1.1.2"
+    babel-plugin-macros "^3.1.0"
+    convert-source-map "^1.5.0"
+    escape-string-regexp "^4.0.0"
+    find-root "^1.1.0"
+    source-map "^0.5.7"
+    stylis "4.2.0"
+
+"@emotion/cache@^11.11.0":
+  version "11.11.0"
+  resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.11.0.tgz#809b33ee6b1cb1a625fef7a45bc568ccd9b8f3ff"
+  integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==
+  dependencies:
+    "@emotion/memoize" "^0.8.1"
+    "@emotion/sheet" "^1.2.2"
+    "@emotion/utils" "^1.2.1"
+    "@emotion/weak-memoize" "^0.3.1"
+    stylis "4.2.0"
+
+"@emotion/hash@^0.9.1":
+  version "0.9.1"
+  resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.1.tgz#4ffb0055f7ef676ebc3a5a91fb621393294e2f43"
+  integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==
+
+"@emotion/is-prop-valid@^1.2.1":
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc"
+  integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==
+  dependencies:
+    "@emotion/memoize" "^0.8.1"
+
+"@emotion/memoize@^0.8.1":
+  version "0.8.1"
+  resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.1.tgz#c1ddb040429c6d21d38cc945fe75c818cfb68e17"
+  integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==
+
+"@emotion/react@^11.11.1":
+  version "11.11.1"
+  resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.11.1.tgz#b2c36afac95b184f73b08da8c214fdf861fa4157"
+  integrity sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==
+  dependencies:
+    "@babel/runtime" "^7.18.3"
+    "@emotion/babel-plugin" "^11.11.0"
+    "@emotion/cache" "^11.11.0"
+    "@emotion/serialize" "^1.1.2"
+    "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1"
+    "@emotion/utils" "^1.2.1"
+    "@emotion/weak-memoize" "^0.3.1"
+    hoist-non-react-statics "^3.3.1"
+
+"@emotion/serialize@^1.1.2":
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.2.tgz#017a6e4c9b8a803bd576ff3d52a0ea6fa5a62b51"
+  integrity sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==
+  dependencies:
+    "@emotion/hash" "^0.9.1"
+    "@emotion/memoize" "^0.8.1"
+    "@emotion/unitless" "^0.8.1"
+    "@emotion/utils" "^1.2.1"
+    csstype "^3.0.2"
+
+"@emotion/sheet@^1.2.2":
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.2.tgz#d58e788ee27267a14342303e1abb3d508b6d0fec"
+  integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==
+
+"@emotion/styled@^11.11.0":
+  version "11.11.0"
+  resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.11.0.tgz#26b75e1b5a1b7a629d7c0a8b708fbf5a9cdce346"
+  integrity sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==
+  dependencies:
+    "@babel/runtime" "^7.18.3"
+    "@emotion/babel-plugin" "^11.11.0"
+    "@emotion/is-prop-valid" "^1.2.1"
+    "@emotion/serialize" "^1.1.2"
+    "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1"
+    "@emotion/utils" "^1.2.1"
+
+"@emotion/unitless@^0.8.1":
+  version "0.8.1"
+  resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.1.tgz#182b5a4704ef8ad91bde93f7a860a88fd92c79a3"
+  integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==
+
+"@emotion/use-insertion-effect-with-fallbacks@^1.0.1":
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz#08de79f54eb3406f9daaf77c76e35313da963963"
+  integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==
+
+"@emotion/utils@^1.2.1":
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.1.tgz#bbab58465738d31ae4cb3dbb6fc00a5991f755e4"
+  integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==
+
+"@emotion/weak-memoize@^0.3.1":
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz#d0fce5d07b0620caa282b5131c297bb60f9d87e6"
+  integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==
+
+"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
+  version "4.4.0"
+  resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59"
+  integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==
+  dependencies:
+    eslint-visitor-keys "^3.3.0"
+
+"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1":
+  version "4.8.0"
+  resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.0.tgz#11195513186f68d42fbf449f9a7136b2c0c92005"
+  integrity sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==
 
 "@eslint/eslintrc@^1.3.0":
   version "1.3.0"
@@ -1373,6 +1525,53 @@
     minimatch "^3.1.2"
     strip-json-comments "^3.1.1"
 
+"@eslint/eslintrc@^2.1.2":
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396"
+  integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==
+  dependencies:
+    ajv "^6.12.4"
+    debug "^4.3.2"
+    espree "^9.6.0"
+    globals "^13.19.0"
+    ignore "^5.2.0"
+    import-fresh "^3.2.1"
+    js-yaml "^4.1.0"
+    minimatch "^3.1.2"
+    strip-json-comments "^3.1.1"
+
+"@eslint/js@8.49.0":
+  version "8.49.0"
+  resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.49.0.tgz#86f79756004a97fa4df866835093f1df3d03c333"
+  integrity sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==
+
+"@floating-ui/core@^1.4.2":
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.5.0.tgz#5c05c60d5ae2d05101c3021c1a2a350ddc027f8c"
+  integrity sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==
+  dependencies:
+    "@floating-ui/utils" "^0.1.3"
+
+"@floating-ui/dom@^1.5.1":
+  version "1.5.3"
+  resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.5.3.tgz#54e50efcb432c06c23cd33de2b575102005436fa"
+  integrity sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==
+  dependencies:
+    "@floating-ui/core" "^1.4.2"
+    "@floating-ui/utils" "^0.1.3"
+
+"@floating-ui/react-dom@^2.0.2":
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-2.0.2.tgz#fab244d64db08e6bed7be4b5fcce65315ef44d20"
+  integrity sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==
+  dependencies:
+    "@floating-ui/dom" "^1.5.1"
+
+"@floating-ui/utils@^0.1.3":
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.1.3.tgz#6ee493102b45d796d69f1f472d4bf64e5244500a"
+  integrity sha512-uvnFKtPgzLnpzzTRfhDlvXX0kLYi9lDRQbcDmT8iXl71Rx+uwSuaUIQl3DNC7w5OweAQ7XQMDObML+KaYDQfng==
+
 "@humanwhocodes/config-array@^0.10.4":
   version "0.10.4"
   resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.4.tgz#01e7366e57d2ad104feea63e72248f22015c520c"
@@ -1382,11 +1581,25 @@
     debug "^4.1.1"
     minimatch "^3.0.4"
 
+"@humanwhocodes/config-array@^0.11.11":
+  version "0.11.11"
+  resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz#88a04c570dbbc7dd943e4712429c3df09bc32844"
+  integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==
+  dependencies:
+    "@humanwhocodes/object-schema" "^1.2.1"
+    debug "^4.1.1"
+    minimatch "^3.0.5"
+
 "@humanwhocodes/gitignore-to-minimatch@^1.0.2":
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz#316b0a63b91c10e53f242efb4ace5c3b34e8728d"
   integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==
 
+"@humanwhocodes/module-importer@^1.0.1":
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
+  integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
+
 "@humanwhocodes/object-schema@^1.2.1":
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
@@ -1595,17 +1808,6 @@
     source-map "^0.6.1"
     write-file-atomic "^3.0.0"
 
-"@jest/types@^26.6.2":
-  version "26.6.2"
-  resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e"
-  integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==
-  dependencies:
-    "@types/istanbul-lib-coverage" "^2.0.0"
-    "@types/istanbul-reports" "^3.0.0"
-    "@types/node" "*"
-    "@types/yargs" "^15.0.0"
-    chalk "^4.0.0"
-
 "@jest/types@^27.5.1":
   version "27.5.1"
   resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80"
@@ -1682,80 +1884,138 @@
   resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b"
   integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==
 
-"@material-ui/core@^4.12.3":
-  version "4.12.4"
-  resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.12.4.tgz#4ac17488e8fcaf55eb6a7f5efb2a131e10138a73"
-  integrity sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ==
-  dependencies:
-    "@babel/runtime" "^7.4.4"
-    "@material-ui/styles" "^4.11.5"
-    "@material-ui/system" "^4.12.2"
-    "@material-ui/types" "5.1.0"
-    "@material-ui/utils" "^4.11.3"
-    "@types/react-transition-group" "^4.2.0"
-    clsx "^1.0.4"
-    hoist-non-react-statics "^3.3.2"
-    popper.js "1.16.1-lts"
-    prop-types "^15.7.2"
-    react-is "^16.8.0 || ^17.0.0"
-    react-transition-group "^4.4.0"
+"@mui/base@5.0.0-beta.15":
+  version "5.0.0-beta.15"
+  resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-beta.15.tgz#76bebd377cc3b7fdc80924759a4100e5319ed0f9"
+  integrity sha512-Xtom3YSdi0iwYPtyVRFUEGoRwi6IHWixPwifDKaK+4PkEPtUWMU5YOIJfTsmC59ri+dFvA3oBNSiTPUGGrklZw==
+  dependencies:
+    "@babel/runtime" "^7.22.15"
+    "@floating-ui/react-dom" "^2.0.2"
+    "@mui/types" "^7.2.4"
+    "@mui/utils" "^5.14.9"
+    "@popperjs/core" "^2.11.8"
+    clsx "^2.0.0"
+    prop-types "^15.8.1"
+
+"@mui/core-downloads-tracker@^5.14.9":
+  version "5.14.9"
+  resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.9.tgz#97a4e2decce1583983b4a0cded8bcb2be1b1cb31"
+  integrity sha512-JAU/R5hM3l2zP1Q4KnioDRhq5V3vZ4mmjEZ+TwARDb2xFhg3p59McacQuzkSu0sUHJnH9aJos36+hU5sPQBcFQ==
+
+"@mui/lab@^5.0.0-alpha.144":
+  version "5.0.0-alpha.144"
+  resolved "https://registry.yarnpkg.com/@mui/lab/-/lab-5.0.0-alpha.144.tgz#88a04adfe6301acd6d38e6870511b7ea19372444"
+  integrity sha512-CS/mBxfX9eSsrvatYBNphYCSCM4tIAIb4jZ3LiX1vSZ32DjRlNi+2U56+ObnBaVTjMMYdegMsT38uxYHSVXszA==
+  dependencies:
+    "@babel/runtime" "^7.22.15"
+    "@mui/base" "5.0.0-beta.15"
+    "@mui/system" "^5.14.9"
+    "@mui/types" "^7.2.4"
+    "@mui/utils" "^5.14.9"
+    "@mui/x-tree-view" "6.0.0-alpha.1"
+    clsx "^2.0.0"
+    prop-types "^15.8.1"
+
+"@mui/material@^5.14.9":
+  version "5.14.9"
+  resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.14.9.tgz#d536505a3728441cfe8003443f143ae87457767b"
+  integrity sha512-pbBy5kc5iUGXPxgbb+t+yEPvLK5nE3bPUb8WbAafJ8iZ40ZGui0xC4xiiIyzbVexzsLmyN7MaSo4LkxLmPKqUQ==
+  dependencies:
+    "@babel/runtime" "^7.22.15"
+    "@mui/base" "5.0.0-beta.15"
+    "@mui/core-downloads-tracker" "^5.14.9"
+    "@mui/system" "^5.14.9"
+    "@mui/types" "^7.2.4"
+    "@mui/utils" "^5.14.9"
+    "@types/react-transition-group" "^4.4.6"
+    clsx "^2.0.0"
+    csstype "^3.1.2"
+    prop-types "^15.8.1"
+    react-is "^18.2.0"
+    react-transition-group "^4.4.5"
 
-"@material-ui/lab@^4.0.0-alpha.60":
-  version "4.0.0-alpha.61"
-  resolved "https://registry.yarnpkg.com/@material-ui/lab/-/lab-4.0.0-alpha.61.tgz#9bf8eb389c0c26c15e40933cc114d4ad85e3d978"
-  integrity sha512-rSzm+XKiNUjKegj8bzt5+pygZeckNLOr+IjykH8sYdVk7dE9y2ZuUSofiMV2bJk3qU+JHwexmw+q0RyNZB9ugg==
+"@mui/private-theming@^5.14.9":
+  version "5.14.9"
+  resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.14.9.tgz#085041c44cc28c25f3431a293339922ec3d9b5f8"
+  integrity sha512-0PzoUFqFXTXiNchhR7K4b7kZunasPOjx6Qf7AagCmfZDNASHedA0x6evHVhnST918x/AHY9xykYNKfB0Z4xMBg==
   dependencies:
-    "@babel/runtime" "^7.4.4"
-    "@material-ui/utils" "^4.11.3"
-    clsx "^1.0.4"
-    prop-types "^15.7.2"
-    react-is "^16.8.0 || ^17.0.0"
-
-"@material-ui/styles@^4.11.5":
-  version "4.11.5"
-  resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.11.5.tgz#19f84457df3aafd956ac863dbe156b1d88e2bbfb"
-  integrity sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==
-  dependencies:
-    "@babel/runtime" "^7.4.4"
-    "@emotion/hash" "^0.8.0"
-    "@material-ui/types" "5.1.0"
-    "@material-ui/utils" "^4.11.3"
-    clsx "^1.0.4"
-    csstype "^2.5.2"
-    hoist-non-react-statics "^3.3.2"
-    jss "^10.5.1"
-    jss-plugin-camel-case "^10.5.1"
-    jss-plugin-default-unit "^10.5.1"
-    jss-plugin-global "^10.5.1"
-    jss-plugin-nested "^10.5.1"
-    jss-plugin-props-sort "^10.5.1"
-    jss-plugin-rule-value-function "^10.5.1"
-    jss-plugin-vendor-prefixer "^10.5.1"
-    prop-types "^15.7.2"
+    "@babel/runtime" "^7.22.15"
+    "@mui/utils" "^5.14.9"
+    prop-types "^15.8.1"
 
-"@material-ui/system@^4.12.2":
-  version "4.12.2"
-  resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-4.12.2.tgz#f5c389adf3fce4146edd489bf4082d461d86aa8b"
-  integrity sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==
+"@mui/styled-engine@^5.14.9":
+  version "5.14.9"
+  resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-5.14.9.tgz#bc2121db1399bb84ea5390b40beac742b6be7023"
+  integrity sha512-LEQxLrW9oWvea33pge08+oyNeTz704jb6Nhe26xEJKojXWd34Rr327Zzx3dmo70AcS4h0b99vQjEpUzm6ASqUw==
   dependencies:
-    "@babel/runtime" "^7.4.4"
-    "@material-ui/utils" "^4.11.3"
-    csstype "^2.5.2"
-    prop-types "^15.7.2"
+    "@babel/runtime" "^7.22.15"
+    "@emotion/cache" "^11.11.0"
+    csstype "^3.1.2"
+    prop-types "^15.8.1"
+    react "^18.2.0"
+
+"@mui/styles@^5.14.9":
+  version "5.14.9"
+  resolved "https://registry.yarnpkg.com/@mui/styles/-/styles-5.14.9.tgz#f02a435f349582dbca73847502ba0a44895aa3ab"
+  integrity sha512-pd308euoTj6t5bMnIS/FKNoPTzbZMk238FHnWfDIl0KLGw95Xrc6JPNCmrwfP1jCm++xXqcbSL11JGPf2OeQXA==
+  dependencies:
+    "@babel/runtime" "^7.22.15"
+    "@emotion/hash" "^0.9.1"
+    "@mui/private-theming" "^5.14.9"
+    "@mui/types" "^7.2.4"
+    "@mui/utils" "^5.14.9"
+    clsx "^2.0.0"
+    csstype "^3.1.2"
+    hoist-non-react-statics "^3.3.2"
+    jss "^10.10.0"
+    jss-plugin-camel-case "^10.10.0"
+    jss-plugin-default-unit "^10.10.0"
+    jss-plugin-global "^10.10.0"
+    jss-plugin-nested "^10.10.0"
+    jss-plugin-props-sort "^10.10.0"
+    jss-plugin-rule-value-function "^10.10.0"
+    jss-plugin-vendor-prefixer "^10.10.0"
+    prop-types "^15.8.1"
 
-"@material-ui/types@5.1.0":
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/@material-ui/types/-/types-5.1.0.tgz#efa1c7a0b0eaa4c7c87ac0390445f0f88b0d88f2"
-  integrity sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==
+"@mui/system@^5.14.9":
+  version "5.14.9"
+  resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.14.9.tgz#90a20473a85622ddabf5a2409de1980fad98f38d"
+  integrity sha512-Z00Wj590QXk5+SIxmxayBo7SWrao+y433LKGChneJxO4QcT/caSCeEWtyeoLs1Q8ys0zOzl2kkKee6n8TaKzhQ==
+  dependencies:
+    "@babel/runtime" "^7.22.15"
+    "@mui/private-theming" "^5.14.9"
+    "@mui/styled-engine" "^5.14.9"
+    "@mui/types" "^7.2.4"
+    "@mui/utils" "^5.14.9"
+    clsx "^2.0.0"
+    csstype "^3.1.2"
+    prop-types "^15.8.1"
 
-"@material-ui/utils@^4.11.3":
-  version "4.11.3"
-  resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-4.11.3.tgz#232bd86c4ea81dab714f21edad70b7fdf0253942"
-  integrity sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==
+"@mui/types@^7.2.4":
+  version "7.2.4"
+  resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.4.tgz#b6fade19323b754c5c6de679a38f068fd50b9328"
+  integrity sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==
+
+"@mui/utils@^5.14.3", "@mui/utils@^5.14.9":
+  version "5.14.9"
+  resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.14.9.tgz#eeefef88dbee687ac90e8972c63f0d41f19348a3"
+  integrity sha512-9ysB5e+RwS7ofn0n3nwAg1/3c81vBTmSvauD3EuK9LmqMzhmF//BFDaC44U4yITvB/0m1kWyDqg924Ll3VHCcg==
   dependencies:
-    "@babel/runtime" "^7.4.4"
-    prop-types "^15.7.2"
-    react-is "^16.8.0 || ^17.0.0"
+    "@babel/runtime" "^7.22.15"
+    prop-types "^15.8.1"
+    react-is "^18.2.0"
+
+"@mui/x-tree-view@6.0.0-alpha.1":
+  version "6.0.0-alpha.1"
+  resolved "https://registry.yarnpkg.com/@mui/x-tree-view/-/x-tree-view-6.0.0-alpha.1.tgz#fe499f8c43c01d28aca95cfb17491746ffcc3080"
+  integrity sha512-JUG3HmBrmGEALbCFg1b+i7h726e1dWYZs4db3syO1j+Q++E3nbvE4Lehp5yGTFm+8esH0Tny50tuJaa4WX6VSA==
+  dependencies:
+    "@babel/runtime" "^7.22.6"
+    "@mui/utils" "^5.14.3"
+    "@types/react-transition-group" "^4.4.6"
+    clsx "^2.0.0"
+    prop-types "^15.8.1"
+    react-transition-group "^4.4.5"
 
 "@nodelib/fs.scandir@2.1.5":
   version "2.1.5"
@@ -1770,7 +2030,7 @@
   resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
   integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
 
-"@nodelib/fs.walk@^1.2.3":
+"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8":
   version "1.2.8"
   resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
   integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
@@ -1778,6 +2038,18 @@
     "@nodelib/fs.scandir" "2.1.5"
     fastq "^1.6.0"
 
+"@pkgr/utils@^2.3.1":
+  version "2.4.2"
+  resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.4.2.tgz#9e638bbe9a6a6f165580dc943f138fd3309a2cbc"
+  integrity sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==
+  dependencies:
+    cross-spawn "^7.0.3"
+    fast-glob "^3.3.0"
+    is-glob "^4.0.3"
+    open "^9.1.0"
+    picocolors "^1.0.0"
+    tslib "^2.6.0"
+
 "@pmmmwh/react-refresh-webpack-plugin@^0.5.3":
   version "0.5.7"
   resolved "https://registry.yarnpkg.com/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.7.tgz#58f8217ba70069cc6a73f5d7e05e85b458c150e2"
@@ -1793,6 +2065,16 @@
     schema-utils "^3.0.0"
     source-map "^0.7.3"
 
+"@popperjs/core@^2.11.8":
+  version "2.11.8"
+  resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f"
+  integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==
+
+"@remix-run/router@1.8.0":
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.8.0.tgz#e848d2f669f601544df15ce2a313955e4bf0bafc"
+  integrity sha512-mrfKqIHnSZRyIzBcanNJmVQELTnX+qagEDlcKO90RgRBVOZGSGvZKeDihTRfWcqoDn5N/NkUcwWTccnpN18Tfg==
+
 "@rollup/plugin-babel@^5.2.0":
   version "5.3.1"
   resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz#04bc0608f4aa4b2e4b1aebf284344d0f68fda283"
@@ -1967,50 +2249,6 @@
     "@svgr/plugin-svgo" "^5.5.0"
     loader-utils "^2.0.0"
 
-"@testing-library/dom@^7.28.1":
-  version "7.31.2"
-  resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.31.2.tgz#df361db38f5212b88555068ab8119f5d841a8c4a"
-  integrity sha512-3UqjCpey6HiTZT92vODYLPxTBWlM8ZOOjr3LX5F37/VRipW2M1kX6I/Cm4VXzteZqfGfagg8yXywpcOgQBlNsQ==
-  dependencies:
-    "@babel/code-frame" "^7.10.4"
-    "@babel/runtime" "^7.12.5"
-    "@types/aria-query" "^4.2.0"
-    aria-query "^4.2.2"
-    chalk "^4.1.0"
-    dom-accessibility-api "^0.5.6"
-    lz-string "^1.4.4"
-    pretty-format "^26.6.2"
-
-"@testing-library/jest-dom@^5.11.4":
-  version "5.16.4"
-  resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.16.4.tgz#938302d7b8b483963a3ae821f1c0808f872245cd"
-  integrity sha512-Gy+IoFutbMQcky0k+bqqumXZ1cTGswLsFqmNLzNdSKkU9KGV2u9oXhukCbbJ9/LRPKiqwxEE8VpV/+YZlfkPUA==
-  dependencies:
-    "@babel/runtime" "^7.9.2"
-    "@types/testing-library__jest-dom" "^5.9.1"
-    aria-query "^5.0.0"
-    chalk "^3.0.0"
-    css "^3.0.0"
-    css.escape "^1.5.1"
-    dom-accessibility-api "^0.5.6"
-    lodash "^4.17.15"
-    redent "^3.0.0"
-
-"@testing-library/react@^11.1.0":
-  version "11.2.7"
-  resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-11.2.7.tgz#b29e2e95c6765c815786c0bc1d5aed9cb2bf7818"
-  integrity sha512-tzRNp7pzd5QmbtXNG/mhdcl7Awfu/Iz1RaVHY75zTdOkmHCuzMhRL83gWHSgOAcjS3CCbyfwUHMZgRJb4kAfpA==
-  dependencies:
-    "@babel/runtime" "^7.12.5"
-    "@testing-library/dom" "^7.28.1"
-
-"@testing-library/user-event@^12.1.10":
-  version "12.8.3"
-  resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-12.8.3.tgz#1aa3ed4b9f79340a1e1836bc7f57c501e838704a"
-  integrity sha512-IR0iWbFkgd56Bu5ZI/ej8yQwrkCv8Qydx6RzwbKz9faXazR/+5tvYKsZQgyXJiwgpcva127YO6JcWy7YlCfofQ==
-  dependencies:
-    "@babel/runtime" "^7.12.5"
-
 "@tootallnate/once@1":
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
@@ -2021,11 +2259,6 @@
   resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad"
   integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==
 
-"@types/aria-query@^4.2.0":
-  version "4.2.2"
-  resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc"
-  integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==
-
 "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14":
   version "7.1.19"
   resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.19.tgz#7b497495b7d1b4812bdb9d02804d0576f43ee460"
@@ -2161,11 +2394,6 @@
   dependencies:
     "@types/node" "*"
 
-"@types/history@^4.7.11":
-  version "4.7.11"
-  resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.11.tgz#56588b17ae8f50c53983a524fc3cc47437969d64"
-  integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==
-
 "@types/html-minifier-terser@^6.0.0":
   version "6.1.0"
   resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35"
@@ -2204,27 +2432,16 @@
   dependencies:
     "@types/istanbul-lib-report" "*"
 
-"@types/jest@*":
-  version "28.1.6"
-  resolved "https://registry.yarnpkg.com/@types/jest/-/jest-28.1.6.tgz#d6a9cdd38967d2d746861fb5be6b120e38284dd4"
-  integrity sha512-0RbGAFMfcBJKOmqRazM8L98uokwuwD5F8rHrv/ZMbrZBwVOWZUyPG6VFNscjYr/vjM3Vu4fRrCPbOs42AfemaQ==
-  dependencies:
-    jest-matcher-utils "^28.0.0"
-    pretty-format "^28.0.0"
-
-"@types/jest@^26.0.15":
-  version "26.0.24"
-  resolved "https://registry.yarnpkg.com/@types/jest/-/jest-26.0.24.tgz#943d11976b16739185913a1936e0de0c4a7d595a"
-  integrity sha512-E/X5Vib8BWqZNRlDxj9vYXhsDwPYbPINqKF9BsnSoon4RQ0D9moEuLD8txgyypFLH7J4+Lho9Nr/c8H0Fi+17w==
-  dependencies:
-    jest-diff "^26.0.0"
-    pretty-format "^26.0.0"
-
-"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
+"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
   version "7.0.11"
   resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
   integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
 
+"@types/json-schema@^7.0.12":
+  version "7.0.12"
+  resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb"
+  integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==
+
 "@types/json5@^0.0.29":
   version "0.0.29"
   resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
@@ -2245,10 +2462,10 @@
   resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.6.tgz#0ba49ac517ad69abe7a1508bc9b3a5483df9d5d7"
   integrity sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw==
 
-"@types/node@^12.0.0":
-  version "12.20.55"
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240"
-  integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==
+"@types/node@^18.0.0":
+  version "18.17.15"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-18.17.15.tgz#31301a273b9ca7d568fe6d1c35ae52e0fb3f8d6a"
+  integrity sha512-2yrWpBk32tvV/JAd3HNHWuZn/VDN1P+72hWirHnvsvTGSqbANi+kSeuQR9yAHnbvaBvHDsoTdXV0Fe+iRtHLKA==
 
 "@types/parse-json@^4.0.0":
   version "4.0.0"
@@ -2295,27 +2512,10 @@
     "@types/draft-js" "*"
     "@types/react" "*"
 
-"@types/react-router-dom@^5.1.8":
-  version "5.3.3"
-  resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.3.3.tgz#e9d6b4a66fcdbd651a5f106c2656a30088cc1e83"
-  integrity sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==
-  dependencies:
-    "@types/history" "^4.7.11"
-    "@types/react" "*"
-    "@types/react-router" "*"
-
-"@types/react-router@*":
-  version "5.1.18"
-  resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.18.tgz#c8851884b60bc23733500d86c1266e1cfbbd9ef3"
-  integrity sha512-YYknwy0D0iOwKQgz9v8nOzt2J6l4gouBmDnWqUUznltOTaon+r8US8ky8HvN0tXvc38U9m6z/t2RsVsnd1zM0g==
-  dependencies:
-    "@types/history" "^4.7.11"
-    "@types/react" "*"
-
-"@types/react-transition-group@^4.2.0":
-  version "4.4.5"
-  resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.5.tgz#aae20dcf773c5aa275d5b9f7cdbca638abc5e416"
-  integrity sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==
+"@types/react-transition-group@^4.4.6":
+  version "4.4.6"
+  resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.6.tgz#18187bcda5281f8e10dfc48f0943e2fdf4f75e2e"
+  integrity sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==
   dependencies:
     "@types/react" "*"
 
@@ -2354,6 +2554,11 @@
   resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39"
   integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==
 
+"@types/semver@^7.5.0":
+  version "7.5.1"
+  resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.1.tgz#0480eeb7221eb9bc398ad7432c9d7e14b1a5a367"
+  integrity sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==
+
 "@types/serve-index@^1.9.1":
   version "1.9.1"
   resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278"
@@ -2381,13 +2586,6 @@
   resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c"
   integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==
 
-"@types/testing-library__jest-dom@^5.9.1":
-  version "5.14.5"
-  resolved "https://registry.yarnpkg.com/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.5.tgz#d113709c90b3c75fdb127ec338dad7d5f86c974f"
-  integrity sha512-SBwbxYoyPIvxHbeHxTZX2Pe/74F/tX2/D3mMvzabdeJ25bBojfW0TyB8BHrbq/9zaaKICJZjLP+8r6AeZMFCuQ==
-  dependencies:
-    "@types/jest" "*"
-
 "@types/trusted-types@^2.0.2":
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.2.tgz#fc25ad9943bcac11cceb8168db4f275e0e72e756"
@@ -2405,13 +2603,6 @@
   resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b"
   integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==
 
-"@types/yargs@^15.0.0":
-  version "15.0.14"
-  resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.14.tgz#26d821ddb89e70492160b66d10a0eb6df8f6fb06"
-  integrity sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ==
-  dependencies:
-    "@types/yargs-parser" "*"
-
 "@types/yargs@^16.0.0":
   version "16.0.4"
   resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977"
@@ -2426,7 +2617,7 @@
   dependencies:
     "@types/yargs-parser" "*"
 
-"@typescript-eslint/eslint-plugin@^5.3.1", "@typescript-eslint/eslint-plugin@^5.5.0":
+"@typescript-eslint/eslint-plugin@^5.5.0":
   version "5.32.0"
   resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.32.0.tgz#e27e38cffa4a61226327c874a7be965e9a861624"
   integrity sha512-CHLuz5Uz7bHP2WgVlvoZGhf0BvFakBJKAD/43Ty0emn4wXWv5k01ND0C0fHcl/Im8Td2y/7h44E9pca9qAu2ew==
@@ -2441,17 +2632,22 @@
     semver "^7.3.7"
     tsutils "^3.21.0"
 
-"@typescript-eslint/experimental-utils@^4.0.1":
-  version "4.33.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd"
-  integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==
+"@typescript-eslint/eslint-plugin@^6.1.0":
+  version "6.6.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.6.0.tgz#19ba09aa34fd504696445100262e5a9e1b1d7024"
+  integrity sha512-CW9YDGTQnNYMIo5lMeuiIG08p4E0cXrXTbcZ2saT/ETE7dWUrNxlijsQeU04qAAKkILiLzdQz+cGFxCJjaZUmA==
   dependencies:
-    "@types/json-schema" "^7.0.7"
-    "@typescript-eslint/scope-manager" "4.33.0"
-    "@typescript-eslint/types" "4.33.0"
-    "@typescript-eslint/typescript-estree" "4.33.0"
-    eslint-scope "^5.1.1"
-    eslint-utils "^3.0.0"
+    "@eslint-community/regexpp" "^4.5.1"
+    "@typescript-eslint/scope-manager" "6.6.0"
+    "@typescript-eslint/type-utils" "6.6.0"
+    "@typescript-eslint/utils" "6.6.0"
+    "@typescript-eslint/visitor-keys" "6.6.0"
+    debug "^4.3.4"
+    graphemer "^1.4.0"
+    ignore "^5.2.4"
+    natural-compare "^1.4.0"
+    semver "^7.5.4"
+    ts-api-utils "^1.0.1"
 
 "@typescript-eslint/experimental-utils@^5.0.0":
   version "5.32.0"
@@ -2470,7 +2666,7 @@
     "@typescript-eslint/typescript-estree" "5.33.0"
     debug "^4.3.4"
 
-"@typescript-eslint/parser@^5.3.1", "@typescript-eslint/parser@^5.5.0":
+"@typescript-eslint/parser@^5.5.0":
   version "5.32.0"
   resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.32.0.tgz#1de243443bc6186fb153b9e395b842e46877ca5d"
   integrity sha512-IxRtsehdGV9GFQ35IGm5oKKR2OGcazUoiNBxhRV160iF9FoyuXxjY+rIqs1gfnd+4eL98OjeGnMpE7RF/NBb3A==
@@ -2480,13 +2676,16 @@
     "@typescript-eslint/typescript-estree" "5.32.0"
     debug "^4.3.4"
 
-"@typescript-eslint/scope-manager@4.33.0":
-  version "4.33.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3"
-  integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==
+"@typescript-eslint/parser@^6.1.0":
+  version "6.6.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.6.0.tgz#fe323a7b4eafb6d5ea82b96216561810394a739e"
+  integrity sha512-setq5aJgUwtzGrhW177/i+DMLqBaJbdwGj2CPIVFFLE0NCliy5ujIdLHd2D1ysmlmsjdL2GWW+hR85neEfc12w==
   dependencies:
-    "@typescript-eslint/types" "4.33.0"
-    "@typescript-eslint/visitor-keys" "4.33.0"
+    "@typescript-eslint/scope-manager" "6.6.0"
+    "@typescript-eslint/types" "6.6.0"
+    "@typescript-eslint/typescript-estree" "6.6.0"
+    "@typescript-eslint/visitor-keys" "6.6.0"
+    debug "^4.3.4"
 
 "@typescript-eslint/scope-manager@5.32.0":
   version "5.32.0"
@@ -2504,6 +2703,14 @@
     "@typescript-eslint/types" "5.33.0"
     "@typescript-eslint/visitor-keys" "5.33.0"
 
+"@typescript-eslint/scope-manager@6.6.0":
+  version "6.6.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.6.0.tgz#57105d4419d6de971f7d2c30a2ff4ac40003f61a"
+  integrity sha512-pT08u5W/GT4KjPUmEtc2kSYvrH8x89cVzkA0Sy2aaOUIw6YxOIjA8ilwLr/1fLjOedX1QAuBpG9XggWqIIfERw==
+  dependencies:
+    "@typescript-eslint/types" "6.6.0"
+    "@typescript-eslint/visitor-keys" "6.6.0"
+
 "@typescript-eslint/type-utils@5.32.0":
   version "5.32.0"
   resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.32.0.tgz#45a14506fe3fb908600b4cef2f70778f7b5cdc79"
@@ -2513,10 +2720,15 @@
     debug "^4.3.4"
     tsutils "^3.21.0"
 
-"@typescript-eslint/types@4.33.0":
-  version "4.33.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72"
-  integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==
+"@typescript-eslint/type-utils@6.6.0":
+  version "6.6.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.6.0.tgz#14f651d13b884915c4fca0d27adeb652a4499e86"
+  integrity sha512-8m16fwAcEnQc69IpeDyokNO+D5spo0w1jepWWY2Q6y5ZKNuj5EhVQXjtVAeDDqvW6Yg7dhclbsz6rTtOvcwpHg==
+  dependencies:
+    "@typescript-eslint/typescript-estree" "6.6.0"
+    "@typescript-eslint/utils" "6.6.0"
+    debug "^4.3.4"
+    ts-api-utils "^1.0.1"
 
 "@typescript-eslint/types@5.32.0":
   version "5.32.0"
@@ -2528,18 +2740,10 @@
   resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.33.0.tgz#d41c584831805554b063791338b0220b613a275b"
   integrity sha512-nIMt96JngB4MYFYXpZ/3ZNU4GWPNdBbcB5w2rDOCpXOVUkhtNlG2mmm8uXhubhidRZdwMaMBap7Uk8SZMU/ppw==
 
-"@typescript-eslint/typescript-estree@4.33.0":
-  version "4.33.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609"
-  integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==
-  dependencies:
-    "@typescript-eslint/types" "4.33.0"
-    "@typescript-eslint/visitor-keys" "4.33.0"
-    debug "^4.3.1"
-    globby "^11.0.3"
-    is-glob "^4.0.1"
-    semver "^7.3.5"
-    tsutils "^3.21.0"
+"@typescript-eslint/types@6.6.0":
+  version "6.6.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.6.0.tgz#95e7ea650a2b28bc5af5ea8907114a48f54618c2"
+  integrity sha512-CB6QpJQ6BAHlJXdwUmiaXDBmTqIE2bzGTDLADgvqtHWuhfNP3rAOK7kAgRMAET5rDRr9Utt+qAzRBdu3AhR3sg==
 
 "@typescript-eslint/typescript-estree@5.32.0":
   version "5.32.0"
@@ -2567,6 +2771,19 @@
     semver "^7.3.7"
     tsutils "^3.21.0"
 
+"@typescript-eslint/typescript-estree@6.6.0":
+  version "6.6.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.6.0.tgz#373c420d2e12c28220f4a83352280a04823a91b7"
+  integrity sha512-hMcTQ6Al8MP2E6JKBAaSxSVw5bDhdmbCEhGW/V8QXkb9oNsFkA4SBuOMYVPxD3jbtQ4R/vSODBsr76R6fP3tbA==
+  dependencies:
+    "@typescript-eslint/types" "6.6.0"
+    "@typescript-eslint/visitor-keys" "6.6.0"
+    debug "^4.3.4"
+    globby "^11.1.0"
+    is-glob "^4.0.3"
+    semver "^7.5.4"
+    ts-api-utils "^1.0.1"
+
 "@typescript-eslint/utils@5.32.0", "@typescript-eslint/utils@^5.13.0":
   version "5.32.0"
   resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.32.0.tgz#eccb6b672b94516f1afc6508d05173c45924840c"
@@ -2579,13 +2796,18 @@
     eslint-scope "^5.1.1"
     eslint-utils "^3.0.0"
 
-"@typescript-eslint/visitor-keys@4.33.0":
-  version "4.33.0"
-  resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd"
-  integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==
+"@typescript-eslint/utils@6.6.0":
+  version "6.6.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.6.0.tgz#2d686c0f0786da6362d909e27a9de1c13ba2e7dc"
+  integrity sha512-mPHFoNa2bPIWWglWYdR0QfY9GN0CfvvXX1Sv6DlSTive3jlMTUy+an67//Gysc+0Me9pjitrq0LJp0nGtLgftw==
   dependencies:
-    "@typescript-eslint/types" "4.33.0"
-    eslint-visitor-keys "^2.0.0"
+    "@eslint-community/eslint-utils" "^4.4.0"
+    "@types/json-schema" "^7.0.12"
+    "@types/semver" "^7.5.0"
+    "@typescript-eslint/scope-manager" "6.6.0"
+    "@typescript-eslint/types" "6.6.0"
+    "@typescript-eslint/typescript-estree" "6.6.0"
+    semver "^7.5.4"
 
 "@typescript-eslint/visitor-keys@5.32.0":
   version "5.32.0"
@@ -2603,6 +2825,14 @@
     "@typescript-eslint/types" "5.33.0"
     eslint-visitor-keys "^3.3.0"
 
+"@typescript-eslint/visitor-keys@6.6.0":
+  version "6.6.0"
+  resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.6.0.tgz#1109088b4346c8b2446f3845db526374d9a3bafc"
+  integrity sha512-L61uJT26cMOfFQ+lMZKoJNbAEckLe539VhTxiGHrWl5XSKQgA0RTBZJW2HFPy5T0ZvPVSD93QsrTKDkfNwJGyQ==
+  dependencies:
+    "@typescript-eslint/types" "6.6.0"
+    eslint-visitor-keys "^3.4.1"
+
 "@webassemblyjs/ast@1.11.1":
   version "1.11.1"
   resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7"
@@ -2794,6 +3024,11 @@ acorn@^8.7.1, acorn@^8.8.0:
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8"
   integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==
 
+acorn@^8.9.0:
+  version "8.10.0"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5"
+  integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==
+
 address@^1.0.1, address@^1.1.2:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/address/-/address-1.2.0.tgz#d352a62c92fee90f89a693eccd2a8b2139ab02d9"
@@ -2807,15 +3042,15 @@ adjust-sourcemap-loader@^4.0.0:
     loader-utils "^2.0.0"
     regex-parser "^2.2.11"
 
-ag-grid-community@^27.1.0:
-  version "27.3.0"
-  resolved "https://registry.yarnpkg.com/ag-grid-community/-/ag-grid-community-27.3.0.tgz#b1e94a58026aaf2f0cd7920e35833325b5e762c7"
-  integrity sha512-R5oZMXEHXnOLrmhn91J8lR0bv6IAnRcU6maO+wKLMJxffRWaAYFAuw1jt7bdmcKCv8c65F6LEBx4ykSOALa9vA==
+ag-grid-community@^30.0.0:
+  version "30.1.0"
+  resolved "https://registry.yarnpkg.com/ag-grid-community/-/ag-grid-community-30.1.0.tgz#50c532df2e6cc22596300b801651eca76459a189"
+  integrity sha512-D69e63CUALxfgLZSu1rXC8Xiyhu6+17zxzTV8cWsyvt5GeSDv2frQ3BKOqGZbUfVoOCLv2SQoHVTTqw8OjxavA==
 
-ag-grid-react@^27.1.0:
-  version "27.3.0"
-  resolved "https://registry.yarnpkg.com/ag-grid-react/-/ag-grid-react-27.3.0.tgz#fe06647653f8b0b349b8e613aab8ea2e07915562"
-  integrity sha512-2bs9YfJ/shvBZQLLjny4NFvht+ic6VtpTPO0r3bHHOhlL3Fjx2rGvS6AHSwfvu+kJacHCta30PjaEbX8T3UDyw==
+ag-grid-react@^30.0.0:
+  version "30.1.0"
+  resolved "https://registry.yarnpkg.com/ag-grid-react/-/ag-grid-react-30.1.0.tgz#9b45b6d9115a0d8a278c112ab1fd2a9d378f26a2"
+  integrity sha512-qnJAWe2yN4fjnFYiyzQu6S3EX0rZVvrZbkTEXVEy55pufTkcmimvCtKSV1aVxGg+TeZFJBw0gkXfXW4aMwTh4Q==
   dependencies:
     prop-types "^15.8.1"
 
@@ -2887,7 +3122,7 @@ ansi-regex@^3.0.0:
   resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1"
   integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==
 
-ansi-regex@^5.0.0, ansi-regex@^5.0.1:
+ansi-regex@^5.0.1:
   version "5.0.1"
   resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
   integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
@@ -2954,11 +3189,6 @@ aria-query@^4.2.2:
     "@babel/runtime" "^7.10.2"
     "@babel/runtime-corejs3" "^7.10.2"
 
-aria-query@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.0.0.tgz#210c21aaf469613ee8c9a62c7f86525e058db52c"
-  integrity sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==
-
 array-flatten@1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
@@ -3041,11 +3271,6 @@ at-least-node@^1.0.0:
   resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
   integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
 
-atob@^2.1.2:
-  version "2.1.2"
-  resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
-  integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
-
 autoprefixer@^10.4.7:
   version "10.4.8"
   resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.8.tgz#92c7a0199e1cfb2ad5d9427bd585a3d75895b9e5"
@@ -3063,12 +3288,14 @@ axe-core@^4.4.3:
   resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.3.tgz#11c74d23d5013c0fa5d183796729bc3482bd2f6f"
   integrity sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==
 
-axios@^0.21.1:
-  version "0.21.4"
-  resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575"
-  integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==
+axios@^1.0.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/axios/-/axios-1.5.0.tgz#f02e4af823e2e46a9768cfc74691fdd0517ea267"
+  integrity sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==
   dependencies:
-    follow-redirects "^1.14.0"
+    follow-redirects "^1.15.0"
+    form-data "^4.0.0"
+    proxy-from-env "^1.1.0"
 
 axobject-query@^2.2.0:
   version "2.2.0"
@@ -3262,6 +3489,11 @@ bfj@^7.0.2:
     hoopy "^0.1.4"
     tryer "^1.0.1"
 
+big-integer@^1.6.16, big-integer@^1.6.44:
+  version "1.6.51"
+  resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686"
+  integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==
+
 big.js@^5.2.2:
   version "5.2.2"
   resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
@@ -3310,6 +3542,13 @@ boolbase@^1.0.0, boolbase@~1.0.0:
   resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
   integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==
 
+bplist-parser@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e"
+  integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==
+  dependencies:
+    big-integer "^1.6.44"
+
 brace-expansion@^1.1.7:
   version "1.1.11"
   resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
@@ -3332,6 +3571,20 @@ braces@^3.0.2, braces@~3.0.2:
   dependencies:
     fill-range "^7.0.1"
 
+broadcast-channel@^3.4.1:
+  version "3.7.0"
+  resolved "https://registry.yarnpkg.com/broadcast-channel/-/broadcast-channel-3.7.0.tgz#2dfa5c7b4289547ac3f6705f9c00af8723889937"
+  integrity sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==
+  dependencies:
+    "@babel/runtime" "^7.7.2"
+    detect-node "^2.1.0"
+    js-sha3 "0.8.0"
+    microseconds "0.2.0"
+    nano-time "1.0.0"
+    oblivious-set "1.0.0"
+    rimraf "3.0.2"
+    unload "2.2.0"
+
 browser-process-hrtime@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626"
@@ -3374,6 +3627,13 @@ builtin-modules@^3.1.0:
   resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6"
   integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==
 
+bundle-name@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-3.0.0.tgz#ba59bcc9ac785fb67ccdbf104a2bf60c099f0e1a"
+  integrity sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==
+  dependencies:
+    run-applescript "^5.0.0"
+
 bytes@3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
@@ -3430,15 +3690,10 @@ caniuse-api@^3.0.0:
     lodash.memoize "^4.1.2"
     lodash.uniq "^4.5.0"
 
-caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001366:
-  version "1.0.30001367"
-  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001367.tgz#2b97fe472e8fa29c78c5970615d7cd2ee414108a"
-  integrity sha512-XDgbeOHfifWV3GEES2B8rtsrADx4Jf+juKX2SICJcaUhjYBO3bR96kvEIHa15VU6ohtOhBZuPGGYGbXMRn0NCw==
-
-caniuse-lite@^1.0.30001370, caniuse-lite@^1.0.30001373:
-  version "1.0.30001374"
-  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001374.tgz#3dab138e3f5485ba2e74bd13eca7fe1037ce6f57"
-  integrity sha512-mWvzatRx3w+j5wx/mpFN5v5twlPrabG8NqX2c6e45LCpymdoGqNvRkRutFUqpRTXKFQFNQJasvK0YT7suW6/Hw==
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001366, caniuse-lite@^1.0.30001370, caniuse-lite@^1.0.30001373:
+  version "1.0.30001532"
+  resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001532.tgz"
+  integrity sha512-FbDFnNat3nMnrROzqrsg314zhqN5LGQ1kyyMk2opcrwGbVGpHRhgCWtAgD5YJUqNAiQ+dklreil/c3Qf1dfCTw==
 
 case-sensitive-paths-webpack-plugin@^2.4.0:
   version "2.4.0"
@@ -3465,14 +3720,6 @@ chalk@^2.0.0, chalk@^2.4.1:
     escape-string-regexp "^1.0.5"
     supports-color "^5.3.0"
 
-chalk@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
-  integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
-  dependencies:
-    ansi-styles "^4.1.0"
-    supports-color "^7.1.0"
-
 chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2:
   version "4.1.2"
   resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
@@ -3547,11 +3794,16 @@ cliui@^7.0.2:
     strip-ansi "^6.0.0"
     wrap-ansi "^7.0.0"
 
-clsx@^1.0.4, clsx@^1.1.1:
+clsx@^1.1.1:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12"
   integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==
 
+clsx@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.0.0.tgz#12658f3fd98fafe62075595a5c30e43d18f3d00b"
+  integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==
+
 co@^4.6.0:
   version "4.6.0"
   resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
@@ -3667,7 +3919,7 @@ concat-map@0.0.1:
   resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
   integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
 
-confusing-browser-globals@^1.0.10, confusing-browser-globals@^1.0.11:
+confusing-browser-globals@^1.0.11:
   version "1.0.11"
   resolved "https://registry.yarnpkg.com/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz#ae40e9b57cdd3915408a2805ebd3a5585608dc81"
   integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==
@@ -3696,6 +3948,11 @@ convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0:
   dependencies:
     safe-buffer "~5.1.1"
 
+convert-source-map@^1.5.0:
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f"
+  integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
+
 cookie-signature@1.0.6:
   version "1.0.6"
   resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
@@ -3892,20 +4149,6 @@ css-what@^6.0.1:
   resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4"
   integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==
 
-css.escape@^1.5.1:
-  version "1.5.1"
-  resolved "https://registry.yarnpkg.com/css.escape/-/css.escape-1.5.1.tgz#42e27d4fa04ae32f931a4b4d4191fa9cddee97cb"
-  integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==
-
-css@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/css/-/css-3.0.0.tgz#4447a4d58fdd03367c516ca9f64ae365cee4aa5d"
-  integrity sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==
-  dependencies:
-    inherits "^2.0.4"
-    source-map "^0.6.1"
-    source-map-resolve "^0.6.0"
-
 cssdb@^6.6.3:
   version "6.6.3"
   resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-6.6.3.tgz#1f331a2fab30c18d9f087301e6122a878bb1e505"
@@ -3989,16 +4232,16 @@ cssstyle@^2.3.0:
   dependencies:
     cssom "~0.3.6"
 
-csstype@^2.5.2:
-  version "2.6.20"
-  resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.20.tgz#9229c65ea0b260cf4d3d997cb06288e36a8d6dda"
-  integrity sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==
-
 csstype@^3.0.2:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.0.tgz#4ddcac3718d787cf9df0d1b7d15033925c8f29f2"
   integrity sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==
 
+csstype@^3.1.2:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b"
+  integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==
+
 damerau-levenshtein@^1.0.8:
   version "1.0.8"
   resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7"
@@ -4025,7 +4268,7 @@ debug@2.6.9, debug@^2.6.0, debug@^2.6.9:
   dependencies:
     ms "2.0.0"
 
-debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4:
+debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4:
   version "4.3.4"
   resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
   integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
@@ -4044,11 +4287,6 @@ decimal.js@^10.2.1:
   resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783"
   integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==
 
-decode-uri-component@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
-  integrity sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==
-
 dedent@^0.7.0:
   version "0.7.0"
   resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
@@ -4064,6 +4302,24 @@ deepmerge@^4.2.2:
   resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
   integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==
 
+default-browser-id@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-3.0.0.tgz#bee7bbbef1f4e75d31f98f4d3f1556a14cea790c"
+  integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==
+  dependencies:
+    bplist-parser "^0.2.0"
+    untildify "^4.0.0"
+
+default-browser@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-4.0.0.tgz#53c9894f8810bf86696de117a6ce9085a3cbc7da"
+  integrity sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==
+  dependencies:
+    bundle-name "^3.0.0"
+    default-browser-id "^3.0.0"
+    execa "^7.1.1"
+    titleize "^3.0.0"
+
 default-gateway@^6.0.3:
   version "6.0.3"
   resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71"
@@ -4076,6 +4332,11 @@ define-lazy-prop@^2.0.0:
   resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f"
   integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==
 
+define-lazy-prop@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f"
+  integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==
+
 define-properties@^1.1.3, define-properties@^1.1.4:
   version "1.1.4"
   resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1"
@@ -4114,7 +4375,7 @@ detect-newline@^3.0.0:
   resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651"
   integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==
 
-detect-node@^2.0.4:
+detect-node@^2.0.4, detect-node@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1"
   integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==
@@ -4141,21 +4402,11 @@ didyoumean@^1.2.2:
   resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037"
   integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==
 
-diff-sequences@^26.6.2:
-  version "26.6.2"
-  resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1"
-  integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==
-
 diff-sequences@^27.5.1:
   version "27.5.1"
   resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327"
   integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==
 
-diff-sequences@^28.1.1:
-  version "28.1.1"
-  resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6"
-  integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==
-
 dir-glob@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
@@ -4194,11 +4445,6 @@ doctrine@^3.0.0:
   dependencies:
     esutils "^2.0.2"
 
-dom-accessibility-api@^0.5.6:
-  version "0.5.14"
-  resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.14.tgz#56082f71b1dc7aac69d83c4285eef39c15d93f56"
-  integrity sha512-NMt+m9zFMPZe0JcY9gN224Qvk6qLIdqex29clBvc/y75ZBX9YA9wNK3frsYvu2DI1xcCIwxwnX+TlsJ2DSOADg==
-
 dom-converter@^0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768"
@@ -4497,17 +4743,10 @@ escodegen@^2.0.0:
   optionalDependencies:
     source-map "~0.6.1"
 
-eslint-config-prettier@^8.5.0:
-  version "8.5.0"
-  resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1"
-  integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==
-
-eslint-config-react-app@^6.0.0:
-  version "6.0.0"
-  resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-6.0.0.tgz#ccff9fc8e36b322902844cbd79197982be355a0e"
-  integrity sha512-bpoAAC+YRfzq0dsTk+6v9aHm/uqnDwayNAXleMypGl6CpxI9oXXscVHo4fk3eJPIn+rsbtNetB4r/ZIidFIE8A==
-  dependencies:
-    confusing-browser-globals "^1.0.10"
+eslint-config-prettier@^9.0.0:
+  version "9.0.0"
+  resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz#eb25485946dd0c66cd216a46232dc05451518d1f"
+  integrity sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==
 
 eslint-config-react-app@^7.0.1:
   version "7.0.1"
@@ -4553,7 +4792,7 @@ eslint-plugin-flowtype@^8.0.3:
     lodash "^4.17.21"
     string-natural-compare "^3.0.1"
 
-eslint-plugin-import@^2.23.4, eslint-plugin-import@^2.25.3:
+eslint-plugin-import@^2.25.3:
   version "2.26.0"
   resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b"
   integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==
@@ -4572,13 +4811,6 @@ eslint-plugin-import@^2.23.4, eslint-plugin-import@^2.25.3:
     resolve "^1.22.0"
     tsconfig-paths "^3.14.1"
 
-eslint-plugin-jest@^24.4.0:
-  version "24.7.0"
-  resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-24.7.0.tgz#206ac0833841e59e375170b15f8d0955219c4889"
-  integrity sha512-wUxdF2bAZiYSKBclsUMrYHH6WxiBreNjyDxbRv345TIvPeoCEgPNEn3Sa+ZrSqsf1Dl9SqqSREXMHExlMMu1DA==
-  dependencies:
-    "@typescript-eslint/experimental-utils" "^4.0.1"
-
 eslint-plugin-jest@^25.3.0:
   version "25.7.0"
   resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz#ff4ac97520b53a96187bad9c9814e7d00de09a6a"
@@ -4605,12 +4837,13 @@ eslint-plugin-jsx-a11y@^6.5.1:
     minimatch "^3.1.2"
     semver "^6.3.0"
 
-eslint-plugin-prettier@^4.2.1:
-  version "4.2.1"
-  resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b"
-  integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==
+eslint-plugin-prettier@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz#6887780ed95f7708340ec79acfdf60c35b9be57a"
+  integrity sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==
   dependencies:
     prettier-linter-helpers "^1.0.0"
+    synckit "^0.8.5"
 
 eslint-plugin-react-hooks@^4.2.0, eslint-plugin-react-hooks@^4.3.0:
   version "4.6.0"
@@ -4660,6 +4893,14 @@ eslint-scope@^7.0.0, eslint-scope@^7.1.1:
     esrecurse "^4.3.0"
     estraverse "^5.2.0"
 
+eslint-scope@^7.2.2:
+  version "7.2.2"
+  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f"
+  integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==
+  dependencies:
+    esrecurse "^4.3.0"
+    estraverse "^5.2.0"
+
 eslint-utils@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672"
@@ -4677,6 +4918,11 @@ eslint-visitor-keys@^3.1.0, eslint-visitor-keys@^3.3.0:
   resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
   integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
 
+eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
+  version "3.4.3"
+  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
+  integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
+
 eslint-webpack-plugin@^3.1.1:
   version "3.2.0"
   resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz#1978cdb9edc461e4b0195a20da950cf57988347c"
@@ -4688,7 +4934,7 @@ eslint-webpack-plugin@^3.1.1:
     normalize-path "^3.0.0"
     schema-utils "^4.0.0"
 
-eslint@^8.21.0, eslint@^8.3.0, eslint@^8.7.0:
+eslint@^8.3.0, eslint@^8.7.0:
   version "8.21.0"
   resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.21.0.tgz#1940a68d7e0573cef6f50037addee295ff9be9ef"
   integrity sha512-/XJ1+Qurf1T9G2M5IHrsjp+xrGT73RZf23xA1z5wB1ZzzEAWSZKvRwhWxTFp1rvkvCfwcvAUNAP31bhKTTGfDA==
@@ -4733,6 +4979,49 @@ eslint@^8.21.0, eslint@^8.3.0, eslint@^8.7.0:
     text-table "^0.2.0"
     v8-compile-cache "^2.0.3"
 
+eslint@^8.49.0:
+  version "8.49.0"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.49.0.tgz#09d80a89bdb4edee2efcf6964623af1054bf6d42"
+  integrity sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==
+  dependencies:
+    "@eslint-community/eslint-utils" "^4.2.0"
+    "@eslint-community/regexpp" "^4.6.1"
+    "@eslint/eslintrc" "^2.1.2"
+    "@eslint/js" "8.49.0"
+    "@humanwhocodes/config-array" "^0.11.11"
+    "@humanwhocodes/module-importer" "^1.0.1"
+    "@nodelib/fs.walk" "^1.2.8"
+    ajv "^6.12.4"
+    chalk "^4.0.0"
+    cross-spawn "^7.0.2"
+    debug "^4.3.2"
+    doctrine "^3.0.0"
+    escape-string-regexp "^4.0.0"
+    eslint-scope "^7.2.2"
+    eslint-visitor-keys "^3.4.3"
+    espree "^9.6.1"
+    esquery "^1.4.2"
+    esutils "^2.0.2"
+    fast-deep-equal "^3.1.3"
+    file-entry-cache "^6.0.1"
+    find-up "^5.0.0"
+    glob-parent "^6.0.2"
+    globals "^13.19.0"
+    graphemer "^1.4.0"
+    ignore "^5.2.0"
+    imurmurhash "^0.1.4"
+    is-glob "^4.0.0"
+    is-path-inside "^3.0.3"
+    js-yaml "^4.1.0"
+    json-stable-stringify-without-jsonify "^1.0.1"
+    levn "^0.4.1"
+    lodash.merge "^4.6.2"
+    minimatch "^3.1.2"
+    natural-compare "^1.4.0"
+    optionator "^0.9.3"
+    strip-ansi "^6.0.1"
+    text-table "^0.2.0"
+
 espree@^9.0.0, espree@^9.3.2, espree@^9.3.3:
   version "9.3.3"
   resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.3.tgz#2dd37c4162bb05f433ad3c1a52ddf8a49dc08e9d"
@@ -4742,6 +5031,15 @@ espree@^9.0.0, espree@^9.3.2, espree@^9.3.3:
     acorn-jsx "^5.3.2"
     eslint-visitor-keys "^3.3.0"
 
+espree@^9.6.0, espree@^9.6.1:
+  version "9.6.1"
+  resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
+  integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==
+  dependencies:
+    acorn "^8.9.0"
+    acorn-jsx "^5.3.2"
+    eslint-visitor-keys "^3.4.1"
+
 esprima@^4.0.0, esprima@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
@@ -4754,6 +5052,13 @@ esquery@^1.4.0:
   dependencies:
     estraverse "^5.1.0"
 
+esquery@^1.4.2:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b"
+  integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==
+  dependencies:
+    estraverse "^5.1.0"
+
 esrecurse@^4.3.0:
   version "4.3.0"
   resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
@@ -4811,6 +5116,21 @@ execa@^5.0.0:
     signal-exit "^3.0.3"
     strip-final-newline "^2.0.0"
 
+execa@^7.1.1:
+  version "7.2.0"
+  resolved "https://registry.yarnpkg.com/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9"
+  integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==
+  dependencies:
+    cross-spawn "^7.0.3"
+    get-stream "^6.0.1"
+    human-signals "^4.3.0"
+    is-stream "^3.0.0"
+    merge-stream "^2.0.0"
+    npm-run-path "^5.1.0"
+    onetime "^6.0.0"
+    signal-exit "^3.0.7"
+    strip-final-newline "^3.0.0"
+
 exit@^0.1.2:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
@@ -4884,6 +5204,17 @@ fast-glob@^3.2.11, fast-glob@^3.2.9:
     merge2 "^1.3.0"
     micromatch "^4.0.4"
 
+fast-glob@^3.3.0:
+  version "3.3.1"
+  resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4"
+  integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==
+  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"
+
 fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
@@ -4990,6 +5321,11 @@ find-cache-dir@^3.3.1:
     make-dir "^3.0.2"
     pkg-dir "^4.1.0"
 
+find-root@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4"
+  integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==
+
 find-up@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
@@ -5033,11 +5369,16 @@ flatted@^3.1.0:
   resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2"
   integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==
 
-follow-redirects@^1.0.0, follow-redirects@^1.14.0:
+follow-redirects@^1.0.0:
   version "1.15.1"
   resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5"
   integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==
 
+follow-redirects@^1.15.0:
+  version "1.15.2"
+  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13"
+  integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==
+
 fork-ts-checker-webpack-plugin@^6.5.0:
   version "6.5.2"
   resolved "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz#4f67183f2f9eb8ba7df7177ce3cf3e75cdafb340"
@@ -5066,6 +5407,15 @@ form-data@^3.0.0:
     combined-stream "^1.0.8"
     mime-types "^2.1.12"
 
+form-data@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
+  integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "^1.0.8"
+    mime-types "^2.1.12"
+
 forwarded@0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
@@ -5169,7 +5519,7 @@ get-package-type@^0.1.0:
   resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a"
   integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==
 
-get-stream@^6.0.0:
+get-stream@^6.0.0, get-stream@^6.0.1:
   version "6.0.1"
   resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
   integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
@@ -5241,7 +5591,14 @@ globals@^13.15.0:
   dependencies:
     type-fest "^0.20.2"
 
-globby@^11.0.3, globby@^11.0.4, globby@^11.1.0:
+globals@^13.19.0:
+  version "13.21.0"
+  resolved "https://registry.yarnpkg.com/globals/-/globals-13.21.0.tgz#163aae12f34ef502f5153cfbdd3600f36c63c571"
+  integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==
+  dependencies:
+    type-fest "^0.20.2"
+
+globby@^11.0.4, globby@^11.1.0:
   version "11.1.0"
   resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
   integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
@@ -5263,6 +5620,11 @@ grapheme-splitter@^1.0.4:
   resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e"
   integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==
 
+graphemer@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6"
+  integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
+
 gzip-size@^6.0.0:
   version "6.0.0"
   resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462"
@@ -5333,19 +5695,7 @@ he@^1.2.0:
   resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
   integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
 
-history@^4.9.0:
-  version "4.10.1"
-  resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3"
-  integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==
-  dependencies:
-    "@babel/runtime" "^7.1.2"
-    loose-envify "^1.2.0"
-    resolve-pathname "^3.0.0"
-    tiny-invariant "^1.0.2"
-    tiny-warning "^1.0.0"
-    value-equal "^1.0.1"
-
-hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.2:
+hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2:
   version "3.3.2"
   resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
   integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
@@ -5496,6 +5846,11 @@ human-signals@^2.1.0:
   resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
   integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
 
+human-signals@^4.3.0:
+  version "4.3.1"
+  resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2"
+  integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==
+
 hyphenate-style-name@^1.0.3:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d"
@@ -5537,6 +5892,11 @@ ignore@^5.2.0:
   resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
   integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
 
+ignore@^5.2.4:
+  version "5.2.4"
+  resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324"
+  integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==
+
 immer@^9.0.7:
   version "9.0.15"
   resolved "https://registry.yarnpkg.com/immer/-/immer-9.0.15.tgz#0b9169e5b1d22137aba7d43f8a81a495dd1b62dc"
@@ -5586,7 +5946,7 @@ inflight@^1.0.4:
     once "^1.3.0"
     wrappy "1"
 
-inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3:
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
   integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -5671,6 +6031,11 @@ is-docker@^2.0.0, is-docker@^2.1.1:
   resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
   integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
 
+is-docker@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200"
+  integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==
+
 is-extglob@^2.1.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
@@ -5698,6 +6063,13 @@ is-in-browser@^1.0.2, is-in-browser@^1.1.3:
   resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835"
   integrity sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==
 
+is-inside-container@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4"
+  integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==
+  dependencies:
+    is-docker "^3.0.0"
+
 is-module@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591"
@@ -5725,6 +6097,11 @@ is-obj@^1.0.1:
   resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
   integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==
 
+is-path-inside@^3.0.3:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
+  integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
+
 is-plain-obj@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7"
@@ -5765,6 +6142,11 @@ is-stream@^2.0.0:
   resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
   integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
 
+is-stream@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac"
+  integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==
+
 is-string@^1.0.5, is-string@^1.0.7:
   version "1.0.7"
   resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
@@ -5798,11 +6180,6 @@ is-wsl@^2.2.0:
   dependencies:
     is-docker "^2.0.0"
 
-isarray@0.0.1:
-  version "0.0.1"
-  resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
-  integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==
-
 isarray@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
@@ -5947,16 +6324,6 @@ jest-config@^27.5.1:
     slash "^3.0.0"
     strip-json-comments "^3.1.1"
 
-jest-diff@^26.0.0:
-  version "26.6.2"
-  resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394"
-  integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==
-  dependencies:
-    chalk "^4.0.0"
-    diff-sequences "^26.6.2"
-    jest-get-type "^26.3.0"
-    pretty-format "^26.6.2"
-
 jest-diff@^27.5.1:
   version "27.5.1"
   resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def"
@@ -5967,16 +6334,6 @@ jest-diff@^27.5.1:
     jest-get-type "^27.5.1"
     pretty-format "^27.5.1"
 
-jest-diff@^28.1.3:
-  version "28.1.3"
-  resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.3.tgz#948a192d86f4e7a64c5264ad4da4877133d8792f"
-  integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==
-  dependencies:
-    chalk "^4.0.0"
-    diff-sequences "^28.1.1"
-    jest-get-type "^28.0.2"
-    pretty-format "^28.1.3"
-
 jest-docblock@^27.5.1:
   version "27.5.1"
   resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0"
@@ -6020,21 +6377,11 @@ jest-environment-node@^27.5.1:
     jest-mock "^27.5.1"
     jest-util "^27.5.1"
 
-jest-get-type@^26.3.0:
-  version "26.3.0"
-  resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0"
-  integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==
-
 jest-get-type@^27.5.1:
   version "27.5.1"
   resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1"
   integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==
 
-jest-get-type@^28.0.2:
-  version "28.0.2"
-  resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203"
-  integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==
-
 jest-haste-map@^27.5.1:
   version "27.5.1"
   resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f"
@@ -6096,16 +6443,6 @@ jest-matcher-utils@^27.5.1:
     jest-get-type "^27.5.1"
     pretty-format "^27.5.1"
 
-jest-matcher-utils@^28.0.0:
-  version "28.1.3"
-  resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz#5a77f1c129dd5ba3b4d7fc20728806c78893146e"
-  integrity sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==
-  dependencies:
-    chalk "^4.0.0"
-    jest-diff "^28.1.3"
-    jest-get-type "^28.0.2"
-    pretty-format "^28.1.3"
-
 jest-message-util@^27.5.1:
   version "27.5.1"
   resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf"
@@ -6387,6 +6724,11 @@ jest@^27.4.3:
     import-local "^3.0.2"
     jest-cli "^27.5.1"
 
+js-sha3@0.8.0:
+  version "0.8.0"
+  resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840"
+  integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==
+
 "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
@@ -6501,70 +6843,70 @@ jsonpointer@^5.0.0:
   resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559"
   integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==
 
-jss-plugin-camel-case@^10.5.1:
-  version "10.9.0"
-  resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.9.0.tgz#4921b568b38d893f39736ee8c4c5f1c64670aaf7"
-  integrity sha512-UH6uPpnDk413/r/2Olmw4+y54yEF2lRIV8XIZyuYpgPYTITLlPOsq6XB9qeqv+75SQSg3KLocq5jUBXW8qWWww==
+jss-plugin-camel-case@^10.10.0:
+  version "10.10.0"
+  resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz#27ea159bab67eb4837fa0260204eb7925d4daa1c"
+  integrity sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw==
   dependencies:
     "@babel/runtime" "^7.3.1"
     hyphenate-style-name "^1.0.3"
-    jss "10.9.0"
+    jss "10.10.0"
 
-jss-plugin-default-unit@^10.5.1:
-  version "10.9.0"
-  resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.9.0.tgz#bb23a48f075bc0ce852b4b4d3f7582bc002df991"
-  integrity sha512-7Ju4Q9wJ/MZPsxfu4T84mzdn7pLHWeqoGd/D8O3eDNNJ93Xc8PxnLmV8s8ZPNRYkLdxZqKtm1nPQ0BM4JRlq2w==
+jss-plugin-default-unit@^10.10.0:
+  version "10.10.0"
+  resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz#db3925cf6a07f8e1dd459549d9c8aadff9804293"
+  integrity sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ==
   dependencies:
     "@babel/runtime" "^7.3.1"
-    jss "10.9.0"
+    jss "10.10.0"
 
-jss-plugin-global@^10.5.1:
-  version "10.9.0"
-  resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.9.0.tgz#fc07a0086ac97aca174e37edb480b69277f3931f"
-  integrity sha512-4G8PHNJ0x6nwAFsEzcuVDiBlyMsj2y3VjmFAx/uHk/R/gzJV+yRHICjT4MKGGu1cJq2hfowFWCyrr/Gg37FbgQ==
+jss-plugin-global@^10.10.0:
+  version "10.10.0"
+  resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz#1c55d3c35821fab67a538a38918292fc9c567efd"
+  integrity sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A==
   dependencies:
     "@babel/runtime" "^7.3.1"
-    jss "10.9.0"
+    jss "10.10.0"
 
-jss-plugin-nested@^10.5.1:
-  version "10.9.0"
-  resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.9.0.tgz#cc1c7d63ad542c3ccc6e2c66c8328c6b6b00f4b3"
-  integrity sha512-2UJnDrfCZpMYcpPYR16oZB7VAC6b/1QLsRiAutOt7wJaaqwCBvNsosLEu/fUyKNQNGdvg2PPJFDO5AX7dwxtoA==
+jss-plugin-nested@^10.10.0:
+  version "10.10.0"
+  resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz#db872ed8925688806e77f1fc87f6e62264513219"
+  integrity sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA==
   dependencies:
     "@babel/runtime" "^7.3.1"
-    jss "10.9.0"
+    jss "10.10.0"
     tiny-warning "^1.0.2"
 
-jss-plugin-props-sort@^10.5.1:
-  version "10.9.0"
-  resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.9.0.tgz#30e9567ef9479043feb6e5e59db09b4de687c47d"
-  integrity sha512-7A76HI8bzwqrsMOJTWKx/uD5v+U8piLnp5bvru7g/3ZEQOu1+PjHvv7bFdNO3DwNPC9oM0a//KwIJsIcDCjDzw==
+jss-plugin-props-sort@^10.10.0:
+  version "10.10.0"
+  resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz#67f4dd4c70830c126f4ec49b4b37ccddb680a5d7"
+  integrity sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg==
   dependencies:
     "@babel/runtime" "^7.3.1"
-    jss "10.9.0"
+    jss "10.10.0"
 
-jss-plugin-rule-value-function@^10.5.1:
-  version "10.9.0"
-  resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.9.0.tgz#379fd2732c0746fe45168011fe25544c1a295d67"
-  integrity sha512-IHJv6YrEf8pRzkY207cPmdbBstBaE+z8pazhPShfz0tZSDtRdQua5jjg6NMz3IbTasVx9FdnmptxPqSWL5tyJg==
+jss-plugin-rule-value-function@^10.10.0:
+  version "10.10.0"
+  resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz#7d99e3229e78a3712f78ba50ab342e881d26a24b"
+  integrity sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g==
   dependencies:
     "@babel/runtime" "^7.3.1"
-    jss "10.9.0"
+    jss "10.10.0"
     tiny-warning "^1.0.2"
 
-jss-plugin-vendor-prefixer@^10.5.1:
-  version "10.9.0"
-  resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.9.0.tgz#aa9df98abfb3f75f7ed59a3ec50a5452461a206a"
-  integrity sha512-MbvsaXP7iiVdYVSEoi+blrW+AYnTDvHTW6I6zqi7JcwXdc6I9Kbm234nEblayhF38EftoenbM+5218pidmC5gA==
+jss-plugin-vendor-prefixer@^10.10.0:
+  version "10.10.0"
+  resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz#c01428ef5a89f2b128ec0af87a314d0c767931c7"
+  integrity sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg==
   dependencies:
     "@babel/runtime" "^7.3.1"
     css-vendor "^2.0.8"
-    jss "10.9.0"
+    jss "10.10.0"
 
-jss@10.9.0, jss@^10.5.1:
-  version "10.9.0"
-  resolved "https://registry.yarnpkg.com/jss/-/jss-10.9.0.tgz#7583ee2cdc904a83c872ba695d1baab4b59c141b"
-  integrity sha512-YpzpreB6kUunQBbrlArlsMpXYyndt9JATbt95tajx0t4MTJJcCJdd4hdNpHmOIDiUJrF/oX5wtVFrS3uofWfGw==
+jss@10.10.0, jss@^10.10.0:
+  version "10.10.0"
+  resolved "https://registry.yarnpkg.com/jss/-/jss-10.10.0.tgz#a75cc85b0108c7ac8c7b7d296c520a3e4fbc6ccc"
+  integrity sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw==
   dependencies:
     "@babel/runtime" "^7.3.1"
     csstype "^3.0.2"
@@ -6718,7 +7060,7 @@ lodash.uniq@^4.5.0:
   resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
   integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==
 
-lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0:
+lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0:
   version "4.17.21"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
   integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -6736,7 +7078,7 @@ loglevel@^1.4.1:
   resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.8.0.tgz#e7ec73a57e1e7b419cb6c6ac06bf050b67356114"
   integrity sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==
 
-loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0:
+loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
   integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
@@ -6762,11 +7104,6 @@ luxon@^3.0.1:
   resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.0.1.tgz#6901111d10ad06fd267ad4e4128a84bef8a77299"
   integrity sha512-hF3kv0e5gwHQZKz4wtm4c+inDtyc7elkanAsBq+fundaCdUBNJB1dHEGUZIM6SfSBUlbVFduPwEtNjFK8wLtcw==
 
-lz-string@^1.4.4:
-  version "1.4.4"
-  resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26"
-  integrity sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==
-
 magic-string@^0.25.0, magic-string@^0.25.7:
   version "0.25.9"
   resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c"
@@ -6788,6 +7125,14 @@ makeerror@1.0.12:
   dependencies:
     tmpl "1.0.5"
 
+match-sorter@^6.0.2:
+  version "6.3.1"
+  resolved "https://registry.yarnpkg.com/match-sorter/-/match-sorter-6.3.1.tgz#98cc37fda756093424ddf3cbc62bfe9c75b92bda"
+  integrity sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==
+  dependencies:
+    "@babel/runtime" "^7.12.5"
+    remove-accents "0.4.2"
+
 mdn-data@2.0.14:
   version "2.0.14"
   resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50"
@@ -6838,6 +7183,11 @@ micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5:
     braces "^3.0.2"
     picomatch "^2.3.1"
 
+microseconds@0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/microseconds/-/microseconds-0.2.0.tgz#233b25f50c62a65d861f978a4a4f8ec18797dc39"
+  integrity sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==
+
 mime-db@1.52.0, "mime-db@>= 1.43.0 < 2":
   version "1.52.0"
   resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
@@ -6860,18 +7210,10 @@ mimic-fn@^2.1.0:
   resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
   integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
 
-min-indent@^1.0.0:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
-  integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
-
-mini-create-react-context@^0.4.0:
-  version "0.4.1"
-  resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz#072171561bfdc922da08a60c2197a497cc2d1d5e"
-  integrity sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==
-  dependencies:
-    "@babel/runtime" "^7.12.1"
-    tiny-warning "^1.0.3"
+mimic-fn@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc"
+  integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==
 
 mini-css-extract-plugin@^2.4.5:
   version "2.6.1"
@@ -6892,7 +7234,7 @@ minimatch@3.0.4:
   dependencies:
     brace-expansion "^1.1.7"
 
-minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2:
+minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
   version "3.1.2"
   resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
   integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
@@ -6941,6 +7283,13 @@ multicast-dns@^7.2.5:
     dns-packet "^5.2.2"
     thunky "^1.0.2"
 
+nano-time@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/nano-time/-/nano-time-1.0.0.tgz#b0554f69ad89e22d0907f7a12b0993a5d96137ef"
+  integrity sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==
+  dependencies:
+    big-integer "^1.6.16"
+
 nanoid@^3.3.4:
   version "3.3.4"
   resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
@@ -7013,6 +7362,13 @@ npm-run-path@^4.0.1:
   dependencies:
     path-key "^3.0.0"
 
+npm-run-path@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00"
+  integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==
+  dependencies:
+    path-key "^4.0.0"
+
 nth-check@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c"
@@ -7107,6 +7463,11 @@ object.values@^1.1.0, object.values@^1.1.5:
     define-properties "^1.1.3"
     es-abstract "^1.19.1"
 
+oblivious-set@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/oblivious-set/-/oblivious-set-1.0.0.tgz#c8316f2c2fb6ff7b11b6158db3234c49f733c566"
+  integrity sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==
+
 obuf@^1.0.0, obuf@^1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e"
@@ -7138,6 +7499,13 @@ onetime@^5.1.2:
   dependencies:
     mimic-fn "^2.1.0"
 
+onetime@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4"
+  integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==
+  dependencies:
+    mimic-fn "^4.0.0"
+
 open@^8.0.9, open@^8.4.0:
   version "8.4.0"
   resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8"
@@ -7147,6 +7515,16 @@ open@^8.0.9, open@^8.4.0:
     is-docker "^2.1.1"
     is-wsl "^2.2.0"
 
+open@^9.1.0:
+  version "9.1.0"
+  resolved "https://registry.yarnpkg.com/open/-/open-9.1.0.tgz#684934359c90ad25742f5a26151970ff8c6c80b6"
+  integrity sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==
+  dependencies:
+    default-browser "^4.0.0"
+    define-lazy-prop "^3.0.0"
+    is-inside-container "^1.0.0"
+    is-wsl "^2.2.0"
+
 optionator@^0.8.1:
   version "0.8.3"
   resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
@@ -7171,6 +7549,18 @@ optionator@^0.9.1:
     type-check "^0.4.0"
     word-wrap "^1.2.3"
 
+optionator@^0.9.3:
+  version "0.9.3"
+  resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64"
+  integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==
+  dependencies:
+    "@aashutoshrathi/word-wrap" "^1.2.3"
+    deep-is "^0.1.3"
+    fast-levenshtein "^2.0.6"
+    levn "^0.4.1"
+    prelude-ls "^1.2.1"
+    type-check "^0.4.0"
+
 p-limit@^1.1.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
@@ -7301,6 +7691,11 @@ path-key@^3.0.0, path-key@^3.1.0:
   resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
   integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
 
+path-key@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18"
+  integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==
+
 path-parse@^1.0.7:
   version "1.0.7"
   resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
@@ -7311,13 +7706,6 @@ path-to-regexp@0.1.7:
   resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
   integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==
 
-path-to-regexp@^1.7.0:
-  version "1.8.0"
-  resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a"
-  integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==
-  dependencies:
-    isarray "0.0.1"
-
 path-type@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
@@ -7367,11 +7755,6 @@ pkg-up@^3.1.0:
   dependencies:
     find-up "^3.0.0"
 
-popper.js@1.16.1-lts:
-  version "1.16.1-lts"
-  resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1-lts.tgz#cf6847b807da3799d80ee3d6d2f90df8a3f50b05"
-  integrity sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==
-
 postcss-attribute-case-insensitive@^5.0.1:
   version "5.0.2"
   resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz#03d761b24afc04c09e757e92ff53716ae8ea2741"
@@ -7959,11 +8342,16 @@ prettier-linter-helpers@^1.0.0:
   dependencies:
     fast-diff "^1.1.2"
 
-prettier@^2.5.1, prettier@^2.7.1:
+prettier@^2.5.1:
   version "2.7.1"
   resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64"
   integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==
 
+prettier@^3.0.0:
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.3.tgz#432a51f7ba422d1469096c0fdc28e235db8f9643"
+  integrity sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==
+
 pretty-bytes@^5.3.0, pretty-bytes@^5.4.1:
   version "5.6.0"
   resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb"
@@ -7985,16 +8373,6 @@ pretty-format@^23.0.1:
     ansi-regex "^3.0.0"
     ansi-styles "^3.2.0"
 
-pretty-format@^26.0.0, pretty-format@^26.6.2:
-  version "26.6.2"
-  resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93"
-  integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==
-  dependencies:
-    "@jest/types" "^26.6.2"
-    ansi-regex "^5.0.0"
-    ansi-styles "^4.0.0"
-    react-is "^17.0.1"
-
 pretty-format@^27.5.1:
   version "27.5.1"
   resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e"
@@ -8004,7 +8382,7 @@ pretty-format@^27.5.1:
     ansi-styles "^5.0.0"
     react-is "^17.0.1"
 
-pretty-format@^28.0.0, pretty-format@^28.1.3:
+pretty-format@^28.1.3:
   version "28.1.3"
   resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5"
   integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==
@@ -8058,6 +8436,11 @@ proxy-addr@~2.0.7:
     forwarded "0.2.0"
     ipaddr.js "1.9.1"
 
+proxy-from-env@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
+  integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
+
 psl@^1.1.33:
   version "1.9.0"
   resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7"
@@ -8186,54 +8569,49 @@ react-error-overlay@^6.0.11:
   resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb"
   integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==
 
-react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0:
+react-is@^16.13.1, react-is@^16.7.0:
   version "16.13.1"
   resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
   integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
 
-"react-is@^16.8.0 || ^17.0.0", react-is@^17.0.1:
+react-is@^17.0.1:
   version "17.0.2"
   resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
   integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
 
-react-is@^18.0.0:
+react-is@^18.0.0, react-is@^18.2.0:
   version "18.2.0"
   resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b"
   integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==
 
+react-query@^3.39.3:
+  version "3.39.3"
+  resolved "https://registry.yarnpkg.com/react-query/-/react-query-3.39.3.tgz#4cea7127c6c26bdea2de5fb63e51044330b03f35"
+  integrity sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==
+  dependencies:
+    "@babel/runtime" "^7.5.5"
+    broadcast-channel "^3.4.1"
+    match-sorter "^6.0.2"
+
 react-refresh@^0.11.0:
   version "0.11.0"
   resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.11.0.tgz#77198b944733f0f1f1a90e791de4541f9f074046"
   integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==
 
-react-router-dom@^5.2.0:
-  version "5.3.3"
-  resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.3.3.tgz#8779fc28e6691d07afcaf98406d3812fe6f11199"
-  integrity sha512-Ov0tGPMBgqmbu5CDmN++tv2HQ9HlWDuWIIqn4b88gjlAN5IHI+4ZUZRcpz9Hl0azFIwihbLDYw1OiHGRo7ZIng==
+react-router-dom@^6.0.0:
+  version "6.15.0"
+  resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.15.0.tgz#6da7db61e56797266fbbef0d5e324d6ac443ee40"
+  integrity sha512-aR42t0fs7brintwBGAv2+mGlCtgtFQeOzK0BM1/OiqEzRejOZtpMZepvgkscpMUnKb8YO84G7s3LsHnnDNonbQ==
   dependencies:
-    "@babel/runtime" "^7.12.13"
-    history "^4.9.0"
-    loose-envify "^1.3.1"
-    prop-types "^15.6.2"
-    react-router "5.3.3"
-    tiny-invariant "^1.0.2"
-    tiny-warning "^1.0.0"
+    "@remix-run/router" "1.8.0"
+    react-router "6.15.0"
 
-react-router@5.3.3:
-  version "5.3.3"
-  resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.3.3.tgz#8e3841f4089e728cf82a429d92cdcaa5e4a3a288"
-  integrity sha512-mzQGUvS3bM84TnbtMYR8ZjKnuPJ71IjSzR+DE6UkUqvN4czWIqEs17yLL8xkAycv4ev0AiN+IGrWu88vJs/p2w==
-  dependencies:
-    "@babel/runtime" "^7.12.13"
-    history "^4.9.0"
-    hoist-non-react-statics "^3.1.0"
-    loose-envify "^1.3.1"
-    mini-create-react-context "^0.4.0"
-    path-to-regexp "^1.7.0"
-    prop-types "^15.6.2"
-    react-is "^16.6.0"
-    tiny-invariant "^1.0.2"
-    tiny-warning "^1.0.0"
+react-router@6.15.0:
+  version "6.15.0"
+  resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.15.0.tgz#bf2cb5a4a7ed57f074d4ea88db0d95033f39cac8"
+  integrity sha512-NIytlzvzLwJkCQj2HLefmeakxxWHWAP+02EGqWEZy+DgfHHKQMUoBBjUQLOtFInBMhWtb3hiUy6MfFgwLjXhqg==
+  dependencies:
+    "@remix-run/router" "1.8.0"
 
 react-scripts@^5.0.1:
   version "5.0.1"
@@ -8290,17 +8668,17 @@ react-scripts@^5.0.1:
   optionalDependencies:
     fsevents "^2.3.2"
 
-react-toastify@^7.0.4:
-  version "7.0.4"
-  resolved "https://registry.yarnpkg.com/react-toastify/-/react-toastify-7.0.4.tgz#7d0b743f2b96f65754264ca6eae31911a82378db"
-  integrity sha512-Rol7+Cn39hZp5hQ/k6CbMNE2CKYV9E5OQdC/hBLtIQU2xz7DdAm7xil4NITQTHR6zEbE5RVFbpgSwTD7xRGLeQ==
+react-toastify@^9.0.0:
+  version "9.1.3"
+  resolved "https://registry.yarnpkg.com/react-toastify/-/react-toastify-9.1.3.tgz#1e798d260d606f50e0fab5ee31daaae1d628c5ff"
+  integrity sha512-fPfb8ghtn/XMxw3LkxQBk3IyagNpF/LIKjOBflbexr2AWxAH1MJgvnESwEwBn9liLFXgTKWgBSdZpw9m4OTHTg==
   dependencies:
     clsx "^1.1.1"
 
-react-transition-group@^4.4.0:
-  version "4.4.2"
-  resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.2.tgz#8b59a56f09ced7b55cbd53c36768b922890d5470"
-  integrity sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==
+react-transition-group@^4.4.5:
+  version "4.4.5"
+  resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1"
+  integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==
   dependencies:
     "@babel/runtime" "^7.5.5"
     dom-helpers "^5.0.1"
@@ -8315,6 +8693,13 @@ react@^17.0.2:
     loose-envify "^1.1.0"
     object-assign "^4.1.1"
 
+react@^18.2.0:
+  version "18.2.0"
+  resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5"
+  integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
+  dependencies:
+    loose-envify "^1.1.0"
+
 read-cache@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774"
@@ -8358,14 +8743,6 @@ recursive-readdir@^2.2.2:
   dependencies:
     minimatch "3.0.4"
 
-redent@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f"
-  integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==
-  dependencies:
-    indent-string "^4.0.0"
-    strip-indent "^3.0.0"
-
 regenerate-unicode-properties@^10.0.1:
   version "10.0.1"
   resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56"
@@ -8383,6 +8760,11 @@ regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.9:
   resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"
   integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==
 
+regenerator-runtime@^0.14.0:
+  version "0.14.0"
+  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45"
+  integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==
+
 regenerator-transform@^0.15.0:
   version "0.15.0"
   resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.0.tgz#cbd9ead5d77fae1a48d957cf889ad0586adb6537"
@@ -8438,6 +8820,11 @@ relateurl@^0.2.7:
   resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
   integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==
 
+remove-accents@0.4.2:
+  version "0.4.2"
+  resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.4.2.tgz#0a43d3aaae1e80db919e07ae254b285d9e1c7bb5"
+  integrity sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==
+
 renderkid@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a"
@@ -8486,11 +8873,6 @@ resolve-from@^5.0.0:
   resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
   integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
 
-resolve-pathname@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd"
-  integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==
-
 resolve-url-loader@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz#d50d4ddc746bb10468443167acf800dcd6c3ad57"
@@ -8535,7 +8917,7 @@ reusify@^1.0.4:
   resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
   integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
 
-rimraf@^3.0.0, rimraf@^3.0.2:
+rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
   integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
@@ -8559,6 +8941,13 @@ rollup@^2.43.1:
   optionalDependencies:
     fsevents "~2.3.2"
 
+run-applescript@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-5.0.0.tgz#e11e1c932e055d5c6b40d98374e0268d9b11899c"
+  integrity sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==
+  dependencies:
+    execa "^5.0.0"
+
 run-parallel@^1.1.9:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
@@ -8689,6 +9078,13 @@ semver@^7.3.2, semver@^7.3.5, semver@^7.3.7:
   dependencies:
     lru-cache "^6.0.0"
 
+semver@^7.5.4:
+  version "7.5.4"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e"
+  integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
+  dependencies:
+    lru-cache "^6.0.0"
+
 send@0.18.0:
   version "0.18.0"
   resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be"
@@ -8786,7 +9182,7 @@ side-channel@^1.0.4:
     get-intrinsic "^1.0.2"
     object-inspect "^1.9.0"
 
-signal-exit@^3.0.2, signal-exit@^3.0.3:
+signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7:
   version "3.0.7"
   resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
   integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
@@ -8834,14 +9230,6 @@ source-map-loader@^3.0.0:
     iconv-lite "^0.6.3"
     source-map-js "^1.0.1"
 
-source-map-resolve@^0.6.0:
-  version "0.6.0"
-  resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.6.0.tgz#3d9df87e236b53f16d01e58150fc7711138e5ed2"
-  integrity sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==
-  dependencies:
-    atob "^2.1.2"
-    decode-uri-component "^0.2.0"
-
 source-map-support@^0.5.6, source-map-support@~0.5.20:
   version "0.5.21"
   resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
@@ -8855,6 +9243,11 @@ source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, sourc
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
   integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
 
+source-map@^0.5.7:
+  version "0.5.7"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+  integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
+
 source-map@^0.7.3:
   version "0.7.4"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656"
@@ -9053,12 +9446,10 @@ strip-final-newline@^2.0.0:
   resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
   integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
 
-strip-indent@^3.0.0:
+strip-final-newline@^3.0.0:
   version "3.0.0"
-  resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001"
-  integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==
-  dependencies:
-    min-indent "^1.0.0"
+  resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd"
+  integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==
 
 strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
   version "3.1.1"
@@ -9078,6 +9469,11 @@ stylehacks@^5.1.0:
     browserslist "^4.16.6"
     postcss-selector-parser "^6.0.4"
 
+stylis@4.2.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51"
+  integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==
+
 supports-color@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
@@ -9159,6 +9555,14 @@ symbol-tree@^3.2.4:
   resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
   integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
 
+synckit@^0.8.5:
+  version "0.8.5"
+  resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.5.tgz#b7f4358f9bb559437f9f167eb6bc46b3c9818fa3"
+  integrity sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==
+  dependencies:
+    "@pkgr/utils" "^2.3.1"
+    tslib "^2.5.0"
+
 tailwindcss@^3.0.2:
   version "3.1.8"
   resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.1.8.tgz#4f8520550d67a835d32f2f4021580f9fddb7b741"
@@ -9265,16 +9669,16 @@ thunky@^1.0.2:
   resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d"
   integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==
 
-tiny-invariant@^1.0.2:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.2.0.tgz#a1141f86b672a9148c72e978a19a73b9b94a15a9"
-  integrity sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==
-
-tiny-warning@^1.0.0, tiny-warning@^1.0.2, tiny-warning@^1.0.3:
+tiny-warning@^1.0.2:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754"
   integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==
 
+titleize@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53"
+  integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==
+
 tmpl@1.0.5:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc"
@@ -9330,6 +9734,11 @@ tryer@^1.0.1:
   resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8"
   integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==
 
+ts-api-utils@^1.0.1:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331"
+  integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==
+
 tsconfig-paths@^3.14.1:
   version "3.14.1"
   resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a"
@@ -9350,6 +9759,11 @@ tslib@^2.0.3:
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3"
   integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==
 
+tslib@^2.5.0, tslib@^2.6.0:
+  version "2.6.2"
+  resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae"
+  integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==
+
 tsutils@^3.21.0:
   version "3.21.0"
   resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
@@ -9471,6 +9885,14 @@ universalify@^2.0.0:
   resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
   integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
 
+unload@2.2.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/unload/-/unload-2.2.0.tgz#ccc88fdcad345faa06a92039ec0f80b488880ef7"
+  integrity sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==
+  dependencies:
+    "@babel/runtime" "^7.6.2"
+    detect-node "^2.0.4"
+
 unpipe@1.0.0, unpipe@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
@@ -9481,6 +9903,11 @@ unquote@~1.1.1:
   resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544"
   integrity sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==
 
+untildify@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b"
+  integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==
+
 upath@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"
@@ -9545,11 +9972,6 @@ v8-to-istanbul@^8.1.0:
     convert-source-map "^1.6.0"
     source-map "^0.7.3"
 
-value-equal@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c"
-  integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==
-
 vary@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
@@ -9604,10 +10026,10 @@ wbuf@^1.1.0, wbuf@^1.7.3:
   dependencies:
     minimalistic-assert "^1.0.0"
 
-web-vitals@^1.0.1:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-1.1.2.tgz#06535308168986096239aa84716e68b4c6ae6d1c"
-  integrity sha512-PFMKIY+bRSXlMxVAQ+m2aw9c/ioUYfDgrYot0YUa+/xa0sakubWhSDyxAKwzymvXVdF4CZI71g06W+mqhzu6ig==
+web-vitals@^3.0.0:
+  version "3.4.0"
+  resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-3.4.0.tgz#45ed33a3a2e029dc38d36547eb5d71d1c7e2552d"
+  integrity sha512-n9fZ5/bG1oeDkyxLWyep0eahrNcPDF6bFqoyispt7xkW0xhDzpUBTgyDKqWDi1twT0MgH4HvvqzpUyh0ZxZV4A==
 
 webidl-conversions@^3.0.0:
   version "3.0.1"